Spring MVC
WebApplicationContext
- applicationContext를 상속
- WebApplicationContext = applicationContext + servletContext에 접근 기능
- servletContex
- servlet container에서 생성
- 여러 servlet의 공용 자원
- 다수의 Dispatcher Servlet에서도 접근 가능
- 각각의 Dispatcher Servlet에는 각각의 WebApplicationContext 존재 → 모든 WebApplicationContext에서 접근 가능한 Root WebApplicationContext가 필요
Root WebApplicationContext
- servletContex가 만들어질 때 생성
- By XML
- By 코드 - ContextLoaderListener
스프링 구조1) WebApplicationContext
- 하나에 applicationContext에 모든 빈들을 등록한다.
- HandlerMapping, HandlerAdopter, View Resolver...
- Service, Repository
스프링 구조2) WebApplicationContext + Root WebApplicationContext
- 만약 서비스 규모가 엄청 커서 Service만 100개, 1000개라면?
- applicationContext에서 Bean을 모두 관리하기가 버겁다!
- 그렇다면 applicationConText를 나누자!
- Servlet WebApplicationContext + Root applicationContext
- application에는 여러개의 Dispatcher Servlet이 있을 수 있다.
- 다수의 Dispatcher Servlet에 따라 다수의 Servlet applicationContext를 만들고 하나의 Root applicationContext를 참조한다. (Root applicationContext가 Servlet applicationContext를 참조하는 것은 불가능하다.)
- Servlet ApplicationContext
HandlerMapping, HandlerAdopter, ViewResolver, Controller 등 web과 관련된 빈들을 관리
- Root WebApplicationContext
Service, Repository 등 관리
- loadOnStratUp을 통해 서블릿 로드 시점을 관리할 수 있다.
- -1로 설정하면 사용될 때 서블릿을 로드할 수 있도록 할 수 있다.
- 이를 이용하여 Servlet WebApplicationContext는 요청이 들어오면 로드되게 할 수 있다.
(서버 초기 가동을 조금 빠르게 할 수 있다.)
REST API
REST API
- REST API는 REST 아키텍쳐 스타일을 따르는 API
REST
- REST는 월드 와이드 웹과 같은 분산 하이퍼미디어 시스템을 위한 소프웨어 아키텍처의 한 형식
- REST는 네트워크 아키텍처 원리의 모음
API
- 자원을 정의하고 자원에 대한 주소를 지정하는 방법
- 다양한 소프트웨어 어플리케이션이 통신하는 방법
REST 아키텍쳐 스타일
- 클라이언트와 서버
- 스테이트리스
- 캐시
- 균일한 인터페이스
URI로 지정한 리소스에 대한 조작을 통일되고 한정적인 인터페이스로 수행하는 아키텍처 스타일을 말한다.
- 계층화된 시스템
Richardson Maturity Model
- Level 0
REST API가 아니고 HTTP를 이용한 API
- Level 1
resource 단우의 여러 엔드포인트를 가진다
- Level 2
HTTP 메서드 사용
- Level 3
- resource들이 연결성을 가질 수 있도록 해당 resource를 가지고 무엇을 할 수 있는지 명시한다.
- HATEOAS(Hypermedia as the Engine of Application State)
API 설계
- 명사를 사용한다.
- URI에 자원에 대한 행위를 명시하지 말고 HTTP method를 이용해 표현한다.
- 구분자는 계층 관계를 나타내는데 사용한다.
- URI 마지막 문자로 슬래시(/)를 포함하지 않는다.
- 하이픈은(-) URI 가독성을 높이는데 사용한다 .
RestController
- controller + response body
- 모든 메서드에 response body가 적용된다.
message converter를 통해서 JSON → 객체(REQUEST), 객체 → JSON(RESPONSE)을 한다.
- 메세지 converter @override
메세지 converter를 XML용으로 override 한다.
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
var messageConverter = new MarshallingHttpMessageConverter();
var xStreamMarshaller = new XStreamMarshaller();
messageConverter.setMarshaller(xStreamMarshaller);
messageConverter.setUnmarshaller(xStreamMarshaller);
converters.add(messageConverter);
}
- 메세지 converter 추가
XML conveter를 추가한다.
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
var messageConverter = new MarshallingHttpMessageConverter();
var xStreamMarshaller = new XStreamMarshaller();
messageConverter.setMarshaller(xStreamMarshaller);
messageConverter.setUnmarshaller(xStreamMarshaller);
converters.add(0, messageConverter);
var javaTimeModule = new JavaTimeModule();
javaTimeModule.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ISO_DATE_TIME));
var module = Jackson2ObjectMapperBuilder.json().modules(javaTimeModule);
converters.add(1, new MappingJackson2HttpMessageConverter(module.build()));
}