꾸준히 하고싶은 개발자

Java & SpringBoot로 시작하는 웹 프로그래밍 : 자바 인강 6주차 본문

패스트캠퍼스 Java&spring

Java & SpringBoot로 시작하는 웹 프로그래밍 : 자바 인강 6주차

프라우스 2022. 7. 6. 12:09

객체지향

객체 지향이란 1970년대에 말이 정의가 됬으며 이는 50여년이 넘는 역사을 가지지만 이전에는 C언어 처럼 실행하고자 하는 순서대로 명령어를 입력해서 실행하는 절차지향을 주로 이뤘고 이런 코딩 방식을 절차지향 언어라고 한다.

이때에는 프로그램의 단위가 크지 않았고 대체적으로 심플한 로직을 순차적으로 처리하여 결과를 얻는데 그쳤지만 점점 컴퓨터의발전과 프로그램밍 발전으로 인해서 프로그램의 복잡도 증가하고 이에 들어가는유지보수 개발기간, 다양한 부분에서 비효율이 발생 하였습니다.

이런 어려움을 해결하기위해 선택한 방법이 효과적인 개발방식을 선택하게 되었고 이는 이전에 쓰던 개발방식에서 벗어나서 객체지향의

특성인 추상화 은닉 상속 인테페이스 재사용등 여러곳에서 객체지향을 개발하기 시작한다.

 

객체지향을 쓰면서 함수의 활용으로도 충분히 좋은 프로그램을 개발 할수 있으나 새로운 시각으로 바라보기 시작했으며 객체지향이 현실에 존재하는 사물을 있는 그대로 모델링해서 이들의 행위와 속성을 정의하고 절차적이 아닌 객체가 중심이 되어 실제사물이 동작하는 방식으로 설계하기 시작하였습니다.

이는 사물에 대해서는 객체 라고 부르며,해당사물이 하는 행위를 Method로 정의하고 해당사물이 가지는 속성을 변수라고 정의한다.

실제 사물을 중심으로 설계하기 때문에 옛날 절차지향방식보단 더 편리하고 설계가 가능 해졌다.

Java는 1995년 Sun MIcrosystems 작은 어를 지향하는 객체지향언어로 Java를 소개했으며 이는 당시에 C++언어와 유사하게 구문을 채택 했고 C++이 가지고있는 시스템 레벨 접근 메모리 직접 할당 및 해제 포인터등 복잡한 개발 방식을 사용하지 않고 어떠한 운영체제에서도 자바 가상 머신만 독립적으로 실행 될 수있도록 설계 되서 여러가지의 플랫폼에서 호환성을 제공하는 장점이있다.

 

객체의 3가지 요소

상태유지(객체의 상태) 

객체는 상태정보를 저장하고 유지하면서 이런 속성을 변수로 정의되어야하며 이런 변수값이 변경으로인해서 객체의 상태가 변경될수있다.

기능제공 (객체의 첵임)

객체는 기능 을 제공하해야하면 이부분을 Method의 제공으로 이루어진다.

이부분을 캡슐화와 연관이 있으며, 외부로 부터 직접 속성에 접근해서 변경하는 것이 아닌 객체가 제공하는 함수로 기능이 제공 되어야한다.

고유 식별자 제공(객체의 유일성)

각각 객체는 고유한 식별자를 가지며

ex)카드번호 주민번호 자동차번호 같은 속성을 통해 각각의 고유한 값을 줄 수있으며 이는 빅데이터에서 Unique Key, or Primary Key로 작성 할수있다.

 

물리객체 

물리적 객체는 실제로 사물이 존재하며, 이를 클래스로 정의한 객체를 의미한다.

개념객체

이후 우리가 개발한 웹 시스템에서 서비스에 해당되며 이는 비지니스 로직을 처리하는 부분을 의미하며 

비지니스 로직에서는 여러객체를 서로 상호작용 하도록 하며 객체가 제공하는 오퍼레이션 Method를 통해 객체의 속성을 변경합니다.

객체지향에서의 대부분의 코딩은 각 객체에 기능을 정의하고 이를 비지니스로직을 처리한는 서비스에서 객체의 Method를 활용하여,

여러가지의 조건을 확인하여, 객체의속성을 변경하는 작업이 주된 코딩이되며  이러한 작업을  하기위해서는 각 객체의변수 이러한 속성을 변경하거나 상태를 변경할수있는 오퍼레이션 을 잘 정의해야한다.

 

캡슐화는 객체의 속성(Variable)을 보호하기위해서 사용합니다.

객체의 캡슐화는 현실에서도 볼수있고 컴퓨터 본체 안에 수많은 부품이 있지만 전원을on위해서는 메인보드에 전기신호를 직접주는 것이 아닌,외부 케이스에 있는 전원 버튼을 통해서 상태 속성ON Off하도록 변경합니다.

Method 설계

속성이 선언되었으나, 이의 상태를 변경하는 Method가 없다면, 잘못 선언된 속성이다.

즉 자신이 가지고 있는 속성에 대해서는 해당 상태를 변경하는 기능을 제공해야 한다.

실물 객체가 가진 기능을 모두 제공 해야 한다.

ex) 자동차의 렌탈,반납 주행거리 계산등등

각각의 Method는 서로 관련성이 있어야하며 차량의렌탈?반납,자동차 등록증 등록/해지 등 각 속성의 상대 되는 기능을 제공해야한다.

객체안의 Method는 객체안의속성을 처리 해야 하며, 다른 객체를 전달 받아 해당 다른 객체에 정의 된 속성을 직접 처리 하면 안된다.

단 Method에 실행에 필요한값들을 객체의 형태가 아닌 매개변수의 형태로 전달 되어져야한다.

Getter/ Setter Method 

외부에서 내부 속성에 직접 접근하는것이 아닌 Getter/ Setter Method 통해서 접근하도록 적용

CRUD Method

데이터처리를 위한 기본적인 CRUD Method를 제공한다.

Business Logic Method 

비즈니스 로직 처리를 위한 Method 를 제공한다.

객체의 생명 주기 처리

흔히 destory(), discounnect()등quit()등 소멸에 대한 Method

객체의 영구성관리 Method 

영구성(유효성) 속성에 대한 변경이 필요한 경우 외부에서는 접근이 불가능 하도록 private로 선언하고 내부의 다른 Method 를 통해서 사용된다.

Method 의 속성은 반드시 1개에 속할 필요는 없으며,여러속성에 해당 될 수있다.

장점

객체지향의 패러다임 중 하나인 추상화를 제공한다.

실제로 Method가 어떻게 동작하는지는 외부에서는 이해할 필요가 없으며, 이를 단순 호출만으로 해당 기능을 실행 할 수 있고, 이를 통해서 객체 단위로 프로그램 설계가 가능하다.

 

재 사용성 향상

한 객체에 관련된 속성 및 Method 는 모두 캡슐화의 형태로 제공됨으로, 객체의 모듈성과 응집도가 높아진다. 이를 통하여 재 사용성이 높아지며 만일 절차적 프로그래밍 Method 를 재사용한다며, 함수가 참조하고 있는 전역 변수 및 내부에서 호출하는 Method가 미치는 영향을 모두체크 해야 하나, 객체의 경우는 단일 객체에만 영향을 주기에 재 사용성이 높다.

앞선 이유로 인하여, 유지보수의 효율성이 향된다.

 

캡슐화 

무결성: 보통캡슐화 코딩이라고 한다면, 주로 변수는 private로 선언하고 Method를 public으로 선언하는 형태를 많이 가지게되며 

이는 객체의 무결성을 위함 입니다. Getter/ Setter를 제외 하고는 public method는 입력된 매개변수를 Vaildation을 한 후에 실행하는 것을 기본으로 합니다.

Validation을 통하여,객체의값을 바꾸거나, 값의 대한 유효성을 가질 수 있습니다.

 

상속의 효과 

프로그램 구조에 대한 이해도 향상

최상위 클래스의 구조를 보고, 하위 클래스의 동작을 이해 할 수있다.

재사용성 향상 

상속을 이용하여, 해당 클래스에 필요한 속성 및 메소드를 모두 정의 하지 않고, 상속을 받아서 사용 할 수있다.

확장성향상

일관된 형태의 클래스 객체를 추가 할 수있어, 간단하게 프로그램 확장이 가능하다.

 

유지보수성향상

각 객체마다,자신의 메소드를 정의하고 있다면, 코드수정에서 많은 작업이 필요 하지만, 상속을 사용한 경우 일관된 형태로 작성이 가능하다.

다형성 

다형성은 하나의 개체가 여러개의 형태로 변화 하는 것을 말하며, 이를 객체지향 에서도 유사하게 사용을 하고 있다.

다형성을 하기위해서는 오버라이딩을 통해서 가능하다.

추상화

객체지향에서의 추상화는 모델링이다.

구체적으로 공통적인 부분, 또는 특정 특성을 분리해서 재조합 하는 부분이 추상화이며

앞에 배운다형성, 상속 모두 추상화에 속한다.

 

객체지향 객체지향 설계 5원칙

응집도와 결합도

좋은 소프트웨어 설계를 위해서는 결합도(coupling)는  낮추고 응집도(cohesion)는 높여야한다.

모듈(클래스)간의 상호 의존 정도를 나타내는 지표로써 결합도가 낮으면 모듈간의 상호 의존성이 줄어들어서 객체의 재사용 및 유지보수가 유리하다.

응집도 

하나의 모듈 내부에 존재하는 구성요소들의 기능적으로 관련성으로 

응집도가 높은 모듈은 하나의 책임에 집중하고 독립성이 높아져,재사용 및 유지보수가 용이하다.

1.SRP(single Responsibilitay Principle) 단일 책임원칙

어떠한 클래스를 변경해야 하는이유는 한가지 뿐만 이여야한다.

 

2.OCP( Open Closed Principle) 개방 폐쇠 원칙

자신의 확장에는 열려있고, 주변의 변화에 대해서는 닫혀있으야하며 상위클래스 또는 인터페이스를 중간에 둠으로써, 자신은 변호에 대해서는 폐쇠적이지만,인터페이스는 외부의 변화에 확장을 개방 해줄  수 있다.

이러한 부분은 JDBC와 Mybatis,Hibernate등 Java애서는 Stream(input,output)에서 찾아볼 수 있다.

3.LSP(Liskov Substitution Principle) 리스코프 치환 원칙

서브 타입은 언제나 자신의 기반(상위) 타입으로 교체 할 수있어야한다.

4.ISP(Interface Segregation Principe) 인터페이스 분리 원칙

클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안된다.

프로젝트 요구사항 과 설계에 따라서 SRP(단일 책임원칙)/ ISP(인터페이스분리 원칙)를 선택한다.

5.DIP(Dependency Inversion Principle)의존 역전 원칙 

개발 폐쇄 윈칙에서도 살펴본 부분이다.

 SOLID는 객체지향 4대 특성에 기반함으로써 유사한 모양을 가지고 있다.

POJO JAVA란

순수한 자바 오브젝트를 뜻한다.

역사를 거술러 올라가보면 예전 EJB가 인기를 끌고, 많이 사용하던 시절에는 단순한 자바 오브제트를 

사용해서 개발하는 것이 아닌, EJB에 종속적인 부분으로 개발을 진행

그로 인하여, Module의 교체, 시스템업그레이드시 종속성으로 인해 불편함 발생한다.

POJO특징

1. 특정 규약에 종속 되지않고

특정,Libaray, Module에서 정의된 클래스를 상속 받아서 구현 하지 않아도 된다.

POJO가 되기 위해서는 외부의 의존성을 두지않고 , 순수한JAVA로 구성이 가능해야한다.

2.특정 환경에 종속되지 않는다.

만일 특정 비지니스 로직을 처리하는 부분에 외부 종속적인http request, session등 POJO를 위배 한것으로 간주 한다.

또한 많이 사용하고있지만 @Aannotion기반으로 설정하는 부분도 엄연히는 POJO라고 볼 수는 없다.

POJO Framework

1. Spring, Hiberante

하나의 서비스를 개발 하기위해서는, 시스템의 복잡함 비즈니스로직의 복잡함등

다양한 어려움을 맞이 하게 된다.

위의  두프레임워크는 객체지향적인 설계를 하고 있으며, 또한 POJO를 지향하고 있다.

그러므로 개발자가 서비스로직에 집중하고 이를 POJO로 쉽게 개발 할 수있도록 지원한다.

디자인 패턴

자주 사용하는 설계 패턴을 정형화 해서 이를 유형별로 가장 최적의 방법으로 개발을 할 수 있도록 정해둔 설계 알고리즘과 유사 하지만, 명확하게 정답이 있는 형태는 아니며, 프로젝트의 상황에 맞추어 적용 가능하다.

GOf 디지인 패턴

소프트웨어를 설계 할때는 기존에 경험이 매우 중요하지만 모든 사람들이 다양한 경험을 가지고 있을 수는 없다.

이러한 자식을 공유하기 위해서 나온것이(Gang of Four)의 디자인 패턴이다. 객체지향 개념에 따른 설계 중 재사용 할 경우 유용한 설계를 디자인 패턴으로 정리해둔 것이다.

(Gang of Four)의 디자인 패턴은 총 23개이며, 이를 잘 이해하고 활용한다면, 경험이 부족하더라도 좋은 소프트웨어 설계가 가능하다.

디자인 패턴의 장점

개발자(설계자)간의 원활한 소통이며 소프트웨어 구조파악에 용이하며 재사용을 통한 개발 시간이단축되며 설계변경 요청에 대한 유연한 대처한다.

디자인 패턴의 단점

객체지향설계/ 구현되며 초기 투자비용부담된다.

 

생성패턴

객체를 생성하는 것도 관련된 패턴으로,객체의 생성과 변경이 전체 시스템에 미치는 영향을 최소화하고, 코드의 유연성을 높인다.

구조패턴

프로그램내의 자료구조나 인터페이스 구조등 프로그램구조를 설계하는데 활용 될 수 있는 패턴 클래스, 객체들의 구성을 통해서 더 큰 구조를 만들 수 있게 해준다.

큰 규모의 시스템에서는 많은 클래스들이 서로 의존성을 가지게 되는게, 이런 복잡한 구조를 개발 하기 쉽게 만들고 주고, 유지보수 하기 쉽게 만들어 준다.

행위 패턴

반복적으로 사용되는 객체들의 상호작용을 패턴화 한것으로 클래스나 객체들이 상호작용 하는 방법 과 책임을 분산하는 방법을 제공한다. 행위 패턴은 행위 관련 패턴을 사용하여 독립적으로 일을 처리하고자 할 때 사용한다.

SIngleton pattern

Singleton 패턴은 어떠한 클래스(객체)가 유일하게 1개만 존재 할때 사용한다.

이를 주로 사용하는 곳은 서로 자원을 공유할때 사용하는 실물 세계에서는 프린터 가 해당되며, 실제 프로그래밍에서 TCP Socket통신 에서 서버와 연결된 connet 객체에 주로 사용한다.

 

 

Adpater pattan

Adapter는 실생활에서는 100V를 220V로 변경해주거나,그 반대로 해주는 흔히 돼지코라고  불리는 변환기를 예로 들 수있다.

호환성이 없는 기존 클래스의 인터페이스를 변환하여 재사용 할 수 있도록한다. 

SOLID중에서 개방 폐쇄 원칙 (OCP)를 따른다.

프록시 패턴

프록시는 대리인 이라고하며 무언가를 대신해서 처리하는 일을  프록시패턴이라고한다.

프록시클래스를 통해서 대신 전달하는 형태로 설계되며,실제 클라이언트는 프록시로부터 결과를 받으며 

Cache의 기능으로도 활용이 가능하다.

솔리드중에서 개방폐쇠 원칙(OCP)과 의존역전 원칙(DIP)를 따른다.

 

데코레이터 패턴 기존 뼈대에(클래스)는 유지하되. 이후에 필요한 형태로 꾸밀 때 사용되며 확장이 필요한 경우 상속의 대안으로도 활용한다. 

솔리드중에서 개방폐쇠 원칙(OCP)과 의존 역전 원칙(DIP)를 따른다.

웹이란 

World Wide Web, WWW W3은 인터넷에 연결된 컴퓨터를 통해 사람들이 정보를 공유할 수 있는 전 세계적인 정보를 공간을 말하며 Web의 용도는 다양하게 나눌  있습니다.

Web Site 

google naver daum fackbook등 HTML로 구성된 여러 사이트를 API (어플리케이션 프로그래밍 인터페이스)HTML 로 구성된 여러 사이트들 

API Web Service 카카오 오픈API 구글 오픈API 네이버 오픈API 와 User Interface 크롬 사파리 익스플로어 스마트워치 IP TV

URl

Uniform Resource Identifier 라소스 식별자 

특정 사이트, 특정 쇼핑, 목록 동영상목록등 모든 정보에 접근 할 수있는 정보이다.

HTTP

Hypertext Transfer Protocol 어플리케이션 컨트롤

GET ,POST, PUT, DELETE, OPTIONS ,HEAD, TRACE ,CONNECT등이 있다.

HTML

Hyper Text Markup Language 

하이퍼미디어 포맷  XML을 바탕으로한 범용 문서 포맷 이를 이용하여 크롬 사파리 익스플로어에서 사용자 알아보기 쉬운 표현한다.

REST API를 개발 할때 단순히 클리어언트 요청에 대한 데이터만 응답 해주는 것이 아닌 관련된 라소스에 대한 링크정보까지 같이 포함되어져야한다.

이러한 조건들을 잘 갖춘 경우 RestFul하다고표현하고,이를 RestAPI라고 한다.

REST(Representational State Transfer:자원의 상태 전달) - 네트워크 아키텍처

클라이언트 서버 : 클라이언트와 서버가 서로 독립적으로 분리 되어있어야한다.

Stateless: 요청에 대해서 클라이언트 의 상태를 서버에 저장하지 않는다.

Cache 클라이언트는 서버의 응답을 Cache(임시저장) 할  수있어야한다.

클라이언트가 Cache를 통해서 응답을 재사용 할 수 있어야하며 이를 통해서 서버의 부하를 낮춘다.

 계층화(Layered System) : 서버와 클라이언트 사이에 방화벽 게이트웨이 프록시 등 다양한 계층형태로 구성이 가능해야하며 이를 확장 할 수있어야한다.

인터페이스를 일관성 : 인터페이스의 일관성을 지키고 아키텍처를 단순화 시켜 작은 단위로 분리하여, 클라이언트 서버가 독립적으로 개선 될수 있어야한다.

Code on Demaned (Optional): 자바 애플릿 자바스크립트 플래시등 특정한 기능을 서버로 부터 클라이언트가 전달 받아서 코드를 진행 시킬 수있어야한다.

인터페이스의 일관성이 잘 지켜는지 REST사용하여 판단할수있다.

1. 자원의 식별 2. 메세지를 통한 리소스 조작 3. 자기 서술적 메시지 4. 애플리케이션 상태에 대한 엔진으로써 하이퍼미디어등으로 확인한다.

지원의식별

웹 기반의 REST에서는 리소스 접근을 할때 URl를 사용한다.

메세지를 통한 리소스 조작

Web에서는 다양한 방식으로 데이터를 전달 할 수있습니다.

그중에서 가장 많이 사용하는 방식은 HTML, XML, JSON, TEXT등이 있으며 이중에서 어떠한 타입의 데이터인지를 알려주기 위해서 HTTP Header부분에 content-type을 통해서 데이터의 타입을 지정해 줄 수 있으며 리소스조작을 위해서데이터 전체를 전달하지 않고 이를 메세지로 전달한다.

자기 서술적 메시지 

요청한 데이터가 어떻게 처리 되어져야 하는지 충분한 데이터를 포함 할 숭있어야한다.

 애플리케이션 상태에 대한 엔진으로써 하이퍼미디어

REST API를 개발 할 때 단순히 클라이언트 요청에 대한 데이터만 응답 해주는 것이 아닌 관련된 리소스에 대한 링크 정보까지 같이 포함 되어져야하며 이러한 조건들을 잘 갖춘 경우 RESTAFul하다고 표현하고 이를 REST API라고한다.

 

URI 

인터넷에서 특정 자원을 나타내는 주소값 해당 값은 유일하지만 응답이 달라질 수도 있다.

URL

인터넷 상에서의 자원, 특정 파일이 어디에 위치하는지 식별 하는 주소이며URL은 URI에 하위개념이다.

슬래시 구분자 /는 계층관계를 나타내는데 사용한다.

URI마지막문자로 슬래시/ 는 포함되지않으며하이픈(-)은 URI 가독성을 높이는데 사용하며 밑줄(_)은 사용하지않는다.

URl 경로엔 소문자가 적합하며 파일 확장자엔URI에포함되지않으며프로그래밍 언어에 의존적인 확장자를 사용하지않으며

구현에 의존적인 경로를 사용하지않으며 세션 ID를 포함하지 않으며 프로그래밍 언어의 Method명을 이용하지않으며

명사에 단수형보다 복수형을 사용해야 한다. 컬렉션에 대한 표현은 복수로 사용하며 컨트롤러 이름이 동사나 동사구를 사용되며

경로 부분 중 변하는 부분은 유일 한 값으로 대체하며 CRUD기능을 나타내는 것은 URI에 사용하지 않으며 URI 쿼리 파라매터 디자인

URI 쿼리 부분으로 컬렉션 결과에 대해서 필터링이 할 수있다.

URI 쿼리는 컬렉션의 결과를 페이지로 구분하여 나타내는데 사용하며 API에 있어서 서브 도메인은 일관성있게 사용되야하며 

클라이언트 개발자 포탈 서브 도메인은 일관성 있게 만든다.

 

HTTP(하이퍼 텍스트 트랜스펄 프로토콜)로 RFC2616에서 규정된 웹에서 데이터를 주고 받는 프로토콜이며

이름에는 하이퍼텍스트 전송용 프로토콜 정의되어있지만 실제로는 HTML XML JSON 이미지 비디오 목소리 자바스크립트 PDF등 다양한 컴퓨터에서 다룰 수있는 것은 모두 전송 할 수있으며 HTTP는 TCP를 기반으로 한 REST의 특징을 모두 구현하고 있는 웹 기반의 포로토콜이다.

 

HTTPsms 메시지를 주고 바든 형태의 통신이다.