객체 == 사물 == Object
객체의 3요소
상태 유지
상태정보를 저장, 유지
속성은 변수로 정의
속성값의 변경 -> 객체 상태의 변경
기능 제공
Method의 제공
객체가 제공하는 Method를 통해 속성에 접근해 변경
고유 식별자 제공
고유한 값. Primary Key를 통해 객체의 유일성을 가짐
캡슐화
객체의 속성을 보호하기 위해 사용
Method 설계
Getter/Setter Method
CRUD Method
Business Logic Method
객체의 생명주기처리 Method
destroy(), disconnect(), quit() ?!
객체의 영구성 관리 Method
캡슐화
상속
다형성
하나의 개체가 여러가지 형태로 변화
오버라이딩을 통해 가능
추상화
구체적인 공통적인 부분, 특성을 분리해 재조합
결합도(coupling)는 낮추고, 응집도(cohesion)는 높여야 함
SRP(Single Responsibility Principle) 단일 책임 원칙
어떠한 클래스를 변경해야 하는 이유는 1가지 뿐이어야 함
OCP(Open Closed Principle) 개방 폐쇄 원칙
자신의 확장에는 열려 있고, 주변의 변화에 대해서는 닫혀있어야 함
LSP(Liskov Substitution Principle) 리스코프 치환 원칙
서브 타입은 언제나 자신의 상위 타입으로 교체할 수 있어야 한다.
ISP(Interface Segregation Principle) 인터페이스 분리 원칙
클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안됨
DIP(Dependency Inversion Principle) 의존 역전 원칙
자신보다 변하기 쉬운 것에 의존하지 말아야 함
순수한 자바 오브젝트
1. 특정 규약에 종속 되지 않음
2. 특정 환경에 종속되지 않음
-> Spring, Hibernate
객체지향적인 설계, POJO 지향 프레임워크
Check
if/else, swithch 문 난무하고 있지 않은가?
책임과 역할이 다른 코드가 하나의 클래스에 다 들어가 있지 않은가?
절차지향적으로 한개의 파일에 모든 코드를 넣고 있지 않은가?
내가 만든 객체가 재사용 가능한가?
자주 사용하는 설계 패턴을 정형화 해 유형별로 가장 최적의 방법으로 개발을 할 수 있도록 함
Gof(Gang of Four) 디자인 패턴
객체를 생성하는 것과 관련된 패턴
Factory Method, Prototype, Abstract Factory
Singleton, Builder, Chaining
프로그램 내 자료구조나 인터페이스 구조 등 구조를 설계 관련된 패턴
Composite, Bridge, Flyweight
Adapter, Decorator, Facade, Proxy
반복적으로 사용되는 객체들의 상호작용을 패턴화
Template Method, Interpreter, Iterator, Visitor, Chain of responsibility, Command, Mediator, State, Memento
Observer, Strategy
어떠한 클래스가 유일하게 존재할 때 사용
ex) 실물세계 프린터, TCP Socket 통신에서 서버와 연결된 connect 객체
Spring bean 객체
자기 자신을 객체로 가지고 있어야 함
기본생성자를 통해 생성할 수 없도록 private
static method를 통해 getInstance 제공
실생활 100v -> 200v로 변경 / 변환기
호환성이 없는 기존 클래스의 인터페이스를 변환해 재사용
Proxy class를 통해 대신 전달하는 형태로 설계
실제 client는 proxy로부터 결과를 받는다
cache 기능으로도 활용 가능
기존 뼈대(클래스)는 유지하되, 필요한 형태로 꾸밀 때 사용
확장이 필요한 경우 상속의 대안으로도 활용
변화가 일어났을 때, 미리 등록된 다른 클래스에 통보
eventlistener
Facade = 건물의 앞쪽 정면
여러 객체와 실제 사용하는 서브 객체 사이에 복잡한 의존관계가 있을 때, 중간에 facade 객체를 두고 여기서 제공하는 interface만을 활용해 기능을 사용
ex) FTP client
유사한 행위들을 캡슐화, 전략만 변경해 유연하게 확장
web 3가지 요소 : URI, HTTP, HTML
Client, Server : 클라이언트 - 서버가 서로 독립적으로 분리
Stateless : 요청에 대해 클라이언트의 상태를 서버에 저장 X
Cache : 클라이언트는 서버의 응답을 임시저장 할 수 있어야 함, cache를 통해 응답을 재사용할 수 있어야 함
계층화(Layered System) : 서버와 클라이언트 사이에 다양한 계층 형태로 구성이 가능, 확장할 수 있어야 함
인터페이스 일관성 : 인터페이스의 일관성을 지키고, 클라이언트, 서버가 독립적으로 개선될 수 있어야 함
자원의 식별
웹 기반 REST에서는 리소스 접근을 할 때 URI를 사용
ex) https://foo.co.kr/user(자원)/100(식별자)
메시지를 통한 리소스 조작
HTTP Header부분에 content-type을 통해 데이터 타입 지정
자기 서술적 메시지
요청하는 데이터가 어떻게 처리되어져야 하는지 충분한 데이터를 포함할 수 있어야 함
애플리케이션 상태에 대한 엔진으로써 하이퍼미디어
단순 요청에 대한 데이터만 응답하는게 아니라 관련된 리소스에 대한 Link 정보까지 같이 포함되어져야 한다.
이러한 조건을 갖출 경우 RESTFul하다고 표현, REST API
URI = Uniform Resource Identifier 인터넷에서 특정 자원을 나타내는 주소 값(응답은 달라질 수 있음)
URL = Uniform Resource Locator 인터넷 상에서의 자원이 어디에 위치하는지 식별하는 주소
URL은 URI의 하위 개념
REST를 구현하기 위한 Method
GET, POST, PUT, DELETE
HEAD, OPTIONS, TRACE, CONNECT
응답의 상태를 나타내는 코드
1xx 처리중
2xx 성공
3xx 리다이렉트 - Response의 새로운 주소로 다시 요청
4xx 클라이언트 에러 - 클라이언트 요청에 에러
5xx 서버 에러 - 서버 처리중 에러
@RestController // 해당 class는 REST API 처리하는 Controller
@RequestMapping("/api") // RequestMapping URI를 지정해주는 Annotation
public class ApiController {
@GetMapping("/hello") // http://localhost:9090/api/hello
public String hello(){
return "hello spring boot!";
}
}
@GetMapping("/path-variable/{name}") // http://localhost:9090/api/get/path-variable/{name}
public String pathVariable(@PathVariable(name = "name") String pathName){
System.out.println("PathVariable : " + pathName);
return pathName;
}
@GetMapping("query-param03")
public String queryParam03(UserRequest userRequest) {
System.out.println(userRequest.getName());
System.out.println(userRequest.getEmail());
System.out.println(userRequest.getAge());
return userRequest.toString();
}