2022년 4월 20일 TIL

yshjft·2022년 4월 20일
1

데브코스 TIL

목록 보기
23/45

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 설계

  1. 명사를 사용한다.
  2. URI에 자원에 대한 행위를 명시하지 말고 HTTP method를 이용해 표현한다.
  3. 구분자는 계층 관계를 나타내는데 사용한다.
  4. URI 마지막 문자로 슬래시(/)를 포함하지 않는다.
  5. 하이픈은(-) 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()));
}
profile
꾸준히 나아가자 🐢

0개의 댓글