Jeonwoojae / spring-study

0 stars 0 forks source link

스프링 웹 mvc #2

Open Jeonwoojae opened 1 year ago

Jeonwoojae commented 1 year ago

HTTP 요청 메시지

HTTP 응답 메시지

HTTP 특징

스프링 웹 MVC 프레임워크

Jeonwoojae commented 1 year ago
Jeonwoojae commented 1 year ago

자세한 스프링 MVC 컴포넌트

image

  1. 클라이언트의 모든 메시지는 DispatcherServlet이 처리한다.
  2. DispatcherServlet은 요청 메시지의 요청 라인과 헤더를 파악한 후 어떤 컨트롤러의 메소드로 전달할지 HandlerMapping 컴포넌트의 메소드로 확인한다.
  3. 요청에 적합한 컨트롤러 클래스에 전달하기 위해 전달 역할을 하는 HandlerAdapter에 전달한다.
  4. HandlerAdapter는 해당하는 컨트롤러에 요청을 전달한다.
  5. 컨트롤러는 개발자가 만든 비즈니스 로직을 실행한다. 이 로직은 개발자가 정의한 스프링 빈과 일반 자바 객체 조합으로 구성된다. 결과는 다시 컨트롤러로 전달되고 컨트롤러는 어떤 뷰로 전달할지 결정한다.
  6. HandlerAdapter는 처리할 뷰와 뷰에 매핑할 데이터를 ModelAndView 객체에 포함하여 DispatcherServlet에 전달한다.
  7. DispatcherServlet은 처리할 뷰 정보를 ViewResolver에 확인한다.
  8. DispatcherServlet은 View에 데이터를 전달하고, View는 데이터를 HTML, XML 등 적합한 포멧으로 변환한다. 변환한 데이터를 DispatcherServlet으로 전달한다.
  9. 변환된 데이터를 클라이언트에 전달한다.

HadlerAdapter : 이 컴포넌트는 사용자 HTTP 요청 메시지를 추상화한 HttpServletRequest 객체를 받아 요청을 처리하는 핸들러 객체를 조회하는 getHandler()메소드를 제공한다. 리턴받은 핸들러 객체는 HandlerExecutionChain이며, 어떤 컨트롤러 클래스의 메소드인지 알 수 있다. 스프링 부트 프레임워크 기본 설정으로 실행하면 RequestMappingHandlerMapping 구현체가 실행되어 @RequestMapping의 속성 정보를 로딩할 수 있다. HandlerAdapter : 사용자의 요청과 응답을 추상화 한 HttpServletRequest, HttpServletResponse 객체를 컨트롤러 메소드에 전달하는 오브젝트 어댑터 역할을 한다. ModelAndView를 리턴하는 handle() 메소드를 제공한다. @RequestMapping을 처리하는 RequestMappingHandlerMapping 구현체와 한쌍으로 RequestMappingHandlerAdapter 구현체를 많이 사용한다. ModelAndView : 컨트롤러에서 처리한 결과를 어떤 뷰에서 처리할지, 처리할 데이터를 포함한 클래스이다. ViewResolver : 문자열 기반 View 이름을 View 객체로 변경한다. 다양한 템플릿 뷰 엔진이 있으며 적합한 ViewResolver 구현체는 프레임워크에서 제공한다. 이 구현체를 스프링 빈으로 정의하면 된다.

Jeonwoojae commented 1 year ago

서블릿 스택과 스레드 모델

스레드 풀과 어플리케이션 동작

Jeonwoojae commented 1 year ago

spring-boot-starter-web 의존성 추가

Jeonwoojae commented 1 year ago

REST-API를 설계 및 구현하는 세 가지 특성

  1. 무상태성

    • REST-API는 HTTP프로토콜을 사용하는 API이므로 무상태성 또한 이어받는다.
    • 클라이언트는 서버와 커넥션을 맺고 응답하면 커넥션을 끊는 것을 이용하여 고가용성을 구축한다. 로드 밸런서를 사용해도 무상태성 덕분에 서비즈 중에도 서버를 증설하거나 축소하기 쉽다.
    • 이때 하나의 API가 하나의 기능을 완전히 실행해야 한다.
    • 상태를 저장해야 한다면 공용 데이터 저장소에 저장한다.
    • 서버에 저장한다면 데이터가 분산되어 사용자마다 서버를 할당해야한다.
  2. 일관성

    • 같은 형태의 응답 메시지나 일관된 규칙으로 만들어진 HTTP 상태 코드를 정의해야 한다.
    • 규칙에 따라 어떤 정보를 리턴할지 예측할 수 있어야한다.
  3. 멱등성

    • 멱등성이란 함수를 여러 번 적용한 결과와 한 번 적용한 결과가 같음을 의미한다.
    • GET 메소드는 안전한 메소드로 아무리 실행해도 리소스 상태가 변하지 않는다.
    • POST를 제외한 메소드들은 멱등성이 있어야 한다.
    • POST는 요청할 때마다 생성하면 된다.
    • PUT으로 boolean 속성을 변경하는 경우 반대로 업데이트 하도록 설계한다면, 사용자 여러 명이 짧은 시간 내에 false를 기대하며 요청했지만 데이터의 상태가 true가 될 수 있다.
    • DELETE로 삭제하는 과정에 서버에서는 삭제에 성공했지만 패킷 누락으로 클라이언트는 삭제된지 모르는 상황이다.
    • 결과를 못받은 클라이언트는 재시도하고 서버는 삭제되었기 때문에 오류를 리턴한다.
    • 멱등성을 만족한다면 모두 성공을 응답할 것이다.
Jeonwoojae commented 1 year ago

HttpMessageConverter