MVC 폼 처리
@GetMapping
부트 스트랩에서 가져올 수 있다.
- 서비스를 컨트롤러가 사용한다.
컨트롤러는 어플리케이션의 입구.
외부, 클라이언트(브라우저)에서 데이터를 받아온다.(HTTP)
컨트롤러는 HTTP에 대한 것들을 핸들링한다.
실제 도메인 로직은 서비스와 엔터티에서 다룬다.
Web Application Context
- Application Context를 상속.
- Servlet Context에 접근할 수 있는 기능이 추가된 Application Context
서블릿 컨텍스트는 Servlet Container에 의해 만들어짐.
- 여러 서블릿의 공유가 가능한 정보를 담고 있는 일종의 객체.
여러 서블릿에서 접근해서 공용 자원처럼 사용됨.
- 서블릿 컨테이너가 만들어지며 서블릿 컨텍스트가 만들어지고, 개별 서블릿 컨텍스트가 만들어질때 전체 필요한 정보를 담게 됨.
디스패쳐 서블릿도 일종의 서블릿. 생성할 때 Web Application Context를 전달함.
- 서블릿 컨텍스트는 즉 여러 서블릿에서 접근이 가능하니까 여러 디스패쳐 서블릿에서도 접근 가능함.
디스패쳐 서블릿과 웹 어플리케이션 컨텍스트는 여러개가 만들어짐.
여러 디스패쳐 서블릿이 만들어지고, 개별적으로 웹 어플리케이션 컨텍스트가 만들어짐.
- 서블릿이 서블릿 컨텍스트에 접근할 수 있듯이, 모든 어플리케이션 컨텍스트가 접근 가능한 Root Application Context가 필요함.
- 루트 어플리케이션 컨텍스트는 언제 만들어지냐, 바로 서블릿 컨텍스트가 만들어질 때 루트 어플 컨텍스트가 만들어지고 setAttribute()를 통해 서블릿 컨텍스트에 들어가짐.
디스패쳐 서블릿은 서블릿 컨텍스트에 접근하고 거기서 웹 어플 컨텍스트를 갖고와 디스패쳐 서블릿에 만들어진 어플 컨텍스트랑 부모자식 관계를 만들어줌.
Root Application Context의 생성
- 두가지 방법.
- 스프링은 ServletContextListener을 구현한 ContextLoaderListener을 제공함.
서블릿 컨텍스트 리스너는 서블릿 컨텍스트가 만들어질 때 같이 만들어지고 호출돼서 특정한 서블릿 컨텍스트 상태가 변경될 때 호출되어지는 일종의 Listener.
- ContextLoaderListener를 통해 웹 어플리케이션 전체에서 사용 가능한 웹 어플리케이션 컨텍스트 생성. 이것을 편의상 Root Application Context라고 함.
그냥 어플리케이션 컨텍스트의 차이점은 서블릿 컨텍스트에 접근할 수 있느냐, 없느냐.
파라미터에 대한 정의가 컨텍스트 로더 리스너에 되어있음.
웹 환경에서 스프링 어플리케이션이 동작하는 방식
- 서블릿 컨테이너 안에 (동작하는)웹 어플리케이션이 들어가 있음. 이 안에 서블릿과 서블릿 컨텍스트가 존재한다.
- 웹 어플리케이션에서 웹 어플리케이션 컨텍스트를 생성하고 여기에서 디스패쳐 서블릿이 필요시 웹 어플리케이션 컨텍스트에 등록되어져 있는 빈들을 가져옴.
웹 어플 컨텍스트에 등록되어져 있는 컨트롤러가 있다면 디스패쳐 서블릿이 컨트롤러에게 요청을 위임함. Bean 오브젝트 생성.
- ApplicationContext.xml에는 Bean을 생성하기 위한 메타데이터가 있다.
-
프레젠테이션 계층에서는 사용자의 요청에 대해 처리하는 부분이 위치. 외부와 상호작용하는 기능이 많이 있다.
-
서비스 계층은 실제 비즈니스 로직을 담당하게 됨.
-
데이터 액세스 계층에서는 DAO나 레포지토리를 이용해서 DB에 접근함.
- 예전에 DAO를 많이 썼다면 지금은 레포지토리를 많이 사용함.
-
클라이언트의 요청을 디스패쳐 서블릿이 받음. 디스패쳐 서블릿은 컨트롤러에 위임.
-
컨트롤러는 서비스를 검색, 호출해서 요청을 처리하고, 서비스는 데이터를 저장하거나 데이터를 불러와 컨트롤러에 전달함.
-
디스패쳐 서블릿은 JSP view를 만들고, view가 HTML을 만들고 바디에 실어서 브라우저로 보내면 브라우저는 그것을 랜더링 해 출력함.
- Spring MVC 모듈이 프레젠테이션 계층에 해당.
전체에 spring 컨테이너 IOC기술 적용.
- 디스패쳐 서블릿은 여러개가 만들어질 수 있음.
컨트롤러는 해당 디스패쳐 서블릿에 매핑되어 있음.
- 디스패쳐 서블릿이 사용하는 컨트롤러는 디스패쳐 서블릿을 만들 때 전달된 웹 어플리케이션 컨텍스트, 즉 서블릿 어플리케이션 컨텍스트라고 부르는 IOC컨테이너가 생김.
여기에 컨트롤러를 등록하고 디스패쳐 서블릿이 필요한 빈들이 다 등록됨.
여러개가 만들어짐.
- 서비스와 DAO영역은 여러 서블릿에서 공통적으로 사용되며, root applicationContext라 부를 수 있음.
하나만 만들어진다.
- 서블릿을 하나로 만들어버릴 수 있다.
하나의 컨테이너에 모든 빈들을 등록.
모놀릭 아키텍쳐
- 하나의 어플리케이션에 모든 빈들을 등록해서 사용.
- 모든 기능이 한 어플에 있고 수직확장이 가능하다.
사용자가 많아지고, 트래픽이 커지면 하드를 업그레이드(램 업글. cpu 증가. 디스크 확장 등.).
가용성을 높이기 위해 여러 대를 사용할 수 있음. 로드 밸런서 삽입.
- 한대의 서버가 여러개 처리, 수평적으로 확장될 수 있지만, 실질적으로 한 곳에서 기능이 처리가 됨.
마이크로 서비스 아키텍쳐
- 최근의 트렌드.
- 로직의 서비스를 여러 어플에 분산, 나눠서 처리하는 방법이 발달.
- 하나의 서버가 하나의 서비스나 기능만 담당하며, 소스 코드 레포지토리, DB 기술 등이 분리된다.
- 서비스들을 텍부터, DB기술, 텍 스택, 운영, 소프트웨어 라이프사이클 까지 분리.
- 서블릿 컨텍스트를 하나만 만듦.
- 한계 : 큰 프로젝트를 하면 service, controller가 너무 많아지고, root aplicationContext의 크기도 너무 커진다.
REST(ful) API
월드 와이드 웹과 같은 분산 하이퍼미디어 시스템을 위한 소프트웨어 아키텍처의 한 형식.
- 로이 필딩(Roy Fielding)의 2000년 박사학위 논문에서 소개되었고 필딩은 HTTP의 주요 저자 중 한 사람.
- 엄격한 의미로 REST는 네트워크 아키텍처 원리의 모음.
- '네트워크 아키텍처 원리'란 자원을 정의하고 자원에 대한 주소를 지정하는 방법
- 간단한 의미로는, 웹 상의 자료를 HTTP위에서 SOAP이나 쿠키를 통한 세션 트랙킹 같은 별도의 전송 계층 없이 전송하기 위한 간단한 인터페이스 말함.
- protocols이나 subroutine. 어플리케이션을 만들기 위한 하나의 subroutine definitions. 다양한 소프트웨어 컴포넌트가 커뮤니케이션하기 위해서 정의된 방법들.
- 어플리케이션을 만들 때 여기에 다양한 기능들이 있는데, 다른 소프트웨어 컴포넌트들과 커뮤니케이션하기 위한 방법들.
커뮤니케이션하기 위해선 규약이 필요하한데, 이것을 REST로 정의한 것이 REST API.
- REST아키텍쳐 스타일을 따르는 API가 REST API.
웹 상에서 리소스를 전달하기 위한 것.
리소스를 전달할 때 SOAP해서 전달하면 HTTP를 사용한거지만, 아키텍쳐 스타일을 따르면 REST.
REST 아키텍쳐 스타일
-
클라이언트 - 서버 (client-server)
- 사용자 인터페이스에 대한 관심을 데이터 저장에 대한 관심으로부터 분리함으로써 클라이언트의 이식성과 서버의 규모확정성을 개선.
-
스테이트리스 (stateless)
- 클라이언트 서버의 통신에 상태가 없다. 모든 요청에는 필요한 모든 정보를 담고 있어 가시성이 좋고 요청 실패시 복원이 쉽기 때문에 신뢰성이 좋음. 상태를 저장할 필요가 없어 규모확장성이 개선됨.
-
캐시 (cache)
- 캐시가 가능해야 함. HTTP가 가진 캐싱 기능이 적용 가능하다. HTTP 프로토콜 표준에서 사용하는 Last-Modified태그나 E-Tag를 이용하면 캐싱 구현이 가능.
-
균일한 인터페이스 (uniform interface)
- URI로 지정한 리소스에 대한 조작을 통일되고 한정적인 인터페이스로 수행하는 아키텍쳐 스타일을 말함.
-
상속도 모델.
-
레벨이 3이면 가장 REST 아키텍쳐 스타일에 근접하게 API를 만들었다.
레벨 0은 REST API가 아니다. 그냥 HTTP이다.
-
레벨 0 : 가장 하위의 레벨. HTTP로 리소스를 전달했다는 것에 의의.
REST는 아니다.
SOAP 기반의 프로토콜. 단 하나의 엔드 포인트만 존재하며 URL도 하나. 요청을 xml로 정의함. 포스트로 호출. 서버가 xml을 전달받고 그 응답을 xml로 줌. 하나의 URL에 xml로 왔다갔다 한다.
이것은 REST API가 아니다. REST API는 URL로 균일한 인터페이스를 제공해야하기 때문.
- 일종의 remote procedure call(리모트 프로시저 호출). 외부에 있는 메서드를 호출한다.
-
레벨 1 : Resources 추가.
리소스 단위로 여러 개의 엔드포인트 추가. 그러한 엔드포인트는 리소스 중심으로 설계됨.
-
Representation data : 리소스가 어떻게 표현되어야 하는 것을 나타낸 것.
Representations : 하나의 information이 다양한 방식으로 표출할 수 있다는 것을 의미. 하나의 리소스에 대해 다양한 형식으로 표현할 수 있음.
어떠한 리소스의 특정 시점의 상태를 반영하고 있는 정보이고 representation data와 representation metadata로 구성.
-
레벨 2 : HTTP 메서드 도입. (Verbs는 동사인데, 메서드를 의미.)
적절한 HTTP메서드를 사용함.
-
레벨 3 :
HATEOAS
Hypermedia as the Engine of Application State (hey-dee-us)
API에서 resource에 대한 응답을 받았는데, 리소스가 모든 리소스에 대한 연결성을 가져야함.
- Hypermedia : 초월된, 연결된. 모든 것이 연결되어있다는 의미.
-
계층화된 시스템 (layered system)
- REST 서버는 다중 계층으로 구성될 수 있으며 보안, 로드 밸런싱, 암호화 계층을 추가해 구조상의 유연성을 둘 수 있고 PROXY, 게이트웨이 같은 네트워크 기반의 중간매체를 사용할 수 있게 합니다.
API 설계
- URI는 정보의 자원을 표현해야 한다. (리소스 명은 동사보다는 명사를 사용.)
GET /members/delete/1
> 이런식은 X
- 자원에 대한 행위는 HTTP Method(GET, POST, PUT, DELETE 등)로 표현.
DELETE /members/1 O
GET /members/show/1 X
GET /members/1 O
POST /task/1/run O
- 슬래시 구분자
/
는 계층 관계를 나타내는데 사용.
- URI 마지막 문자로 슬래시
/
를 포함하지 않는다.
- 하이픈
-
은 URI 가독성을 높이는데 사용.
- 액션은 맨 마지막에 붙이자. (특정한 verve를 표현할 때가 있다. 실행시키는 액션 등. 그럴 때는 맨 마지막에 붙이자.)
스프링에서 REST API 사용하기
- 에노테이션 추가
@RequestBody
: 전달받은 요청 메세지를 원하는 형태로 변환.
@ResponseBody
: 정의한 모델 클래스를 ResponseBody 형태로 변환.
@Restontroller
: 컨트롤러에 ResponseBody추가.
RequestBody
HttpEntity
@ResponseBody
등으로 리턴하게 되면, HTTP 메세지 컨버터가 동작함.
HTTP 메세지 컨버터는 반환된 HTTP 메세지로 변환시켜줌.