본문 바로가기

Development/Spring

[Spring] 스프링 부트의 동작 방식

스프링 부트의 동작 구조

이미지 출처: https://user-images.githubusercontent.com/13410737/178304203-73309bc8-8e24-4c90-81e6-dd645acd09ee.png

  • 스프링 부트에서 spring-boot-starter-web 모듈을 사용하면 기본적으로 톰캣(Tomcat)을 사용하는 스프링 MVC 구조를 기반으로 동작함 
  • 서블릿(Servelt)은 클라이언트의 요청을 처리하고 결과를 반환하는 자바 웹 프로그래밍 기술로, 클라이언트로부터 온 HTTP 요청에서 URL, header, 요청 파라미터를 추출한다.
    그리고 애플리케이션 로직과 상호작용하며 response를 생성한다.
  • 서블릿들은 서블릿 컨테이너에서 관리함
  • 서블릿 컨테이너는 서블릿 인스턴스를 생성하고 관리하는 역할을 수행하는 주체
  • 톰캣은 WAS의 역할과 서블릿 컨테이너의 역할을 수행하는 대표적인 컨테이너 

서블릿 컨테이너의 특징은 다음과 같다.

  • 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기를 관리함
  • 서블릿 객체는 싱글톤 패턴으로 관리됨
  • 멀티 쓰레딩을 지원

스프링에서는 DispatcherServlet이 서블릿의 역할을 수행함

일반적으로 스프링은 톰캣을 임베드해 사용하기 때문에, 서블릿 컨테이너와 DispatcherServlet이 자동 설정된 web.xml의 설정값을 공유 

DispatcherServlet의 동작 방식

이미지 출처: https://velog.velcdn.com/images/zioo/post/aee6d803-13f2-4246-b0f4-a2a2d5a2b2f3/image.png

 

  • DispatcherServlet으로 들어온 요청(HttpServletRequest)이 들어오면 Dispatcher Servlet은 핸들러 매핑(Handler Mapping)을 통해 요청 URI에 매핑된 핸들러를 탐색함, 여기서 핸들러는 컨트롤러를 의미
  • 그 후 핸들러 어댑터로 컨트롤러를 호출
  • 핸들러 어댑터에 컨트롤러의 응답이 돌아오면 ModelAndView로 응답을 가공해 반환 
  • 뷰(View) 형식으로 리턴하는 컨트롤러를 사용할 때는 뷰 리졸버(View Resolver)를 통해 뷰(View)를 받아 리턴함 

 

핸들러 매핑은 요청 정보를 기준으로 어떤 컨트롤러를 사용할지 선정하는 인터페이스

뷰가 없는 REST 형식의 @ResponseBody는 뷰 리졸버를 호출하지 않고, MessageConverter를 거쳐 JSON 형식으로 변환해서 응답함 

이미지 출처: https://user-images.githubusercontent.com/13410737/178307708-c258722d-4700-42b6-a23a-a287dc315373.png

  • 여기서 MessageConverter는 요청과 응답에 대해 Body 값을 변환하는 역할을 수행함
  • 스프링부트의 HttpMessageConverter 인터페이스를 사용하고 있음
  • Content-Type을 참고하여 Converter를 선정

참고 자료

스프링 부트 핵심 가이드 "스프링 부트를 활용한 애플리케이션 개발 실무" , 장정우, 2022