Spring MVC, web, webflux

위성구·2024년 9월 21일

Spring MVC 작동원리

  1. 클라이언트 요청

    • 사용자가 브라우저 또는 다른 HTTP 클라이언트에서 URL을 입력하거나 API 요청을 전송하면, 이 요청이 서버로 전달됩니다.
  2. 디스패처 서블릿(DispatcherServlet)

    • spring MVC 애플리케이션의 핵심 구성 요소인 DispatcherServlet이 모든 요청을 받아들이는 프론트 컨트롤러 역할을 합니다.
    • 클라이언트의 요청이 들어오면, DispatcherServlet이 요청을 처리하는 첫 번째 진입점입니다.
    • 서블릿 컨테이너안에 서블릿이 있고 DispatcherServlet은 서블릿의 종류 중 하나이다. 서블릿 컨테이너는 tomcat이나 jetty가 될 수 있다.
  3. 핸들러 매핑(Handler Mapping)

    • DispatcherServlet은 요청을 처리할 핸들러를 찾기 위해 HandlerMapping을 사용합니다.
    • @Controller 또는 @RestController로 정의된 클래스에서 URL 매핑과 일치하는 메소드를 찾아냅니다. 이 때, @RequestMapping, @GetMapping, @PostMapping 등의 어노테이션을 사용하여 URL과 HTTP 메서드에 따라 핸들러를 결정합니다.
  4. 핸들러 어댑터(Handler Adapter)

    • 핸들러를 찾으면, HandlerAdapter가 요청을 해당 핸들러(컨트롤러 메서드)로 전달하여 실행합니다.
    • HandlerAdapter는 핸들러가 다양한 유형일 수 있기 때문에, 각 핸들러를 적절하게 처리할 수 있는 어댑터 역할을 합니다.
  5. 컨트롤러에서 비즈니스 로직 처리

    • 컨트롤러(Controller) 메서드는 비즈니스 로직을 처리하고, 결과 데이터를 생성합니다.
    • 이때 데이터를 가공하거나, 서비스 계층을 호출하여 데이터를 처리합니다.
  6. 뷰 리졸버(View Resolver) 또는 HTTP 응답 생성

    • 컨트롤러에서 반환된 값은 뷰(View)응답(Response)로 변환됩니다.
      • 만약 @RestController 또는 @ResponseBody를 사용했다면, 반환된 데이터는 JSON 또는 XML로 직렬화되어 응답 본문에 포함됩니다.
      • 일반적인 @Controller는 JSP나 Thymeleaf와 같은 템플릿 엔진을 통해 HTML 뷰로 변환됩니다.
    • 이 때 ViewResolver가 반환된 논리적인 뷰 이름을 실제 뷰 파일로 변환합니다.
  7. 뷰 렌더링 또는 응답 생성

    • 뷰(View)를 사용할 경우, JSP, Thymeleaf 등의 템플릿 엔진이 최종 HTML 페이지를 생성합니다.
    • API 응답일 경우, @ResponseBody 또는 @RestController가 JSON 형식으로 응답을 만들어 반환합니다.
  8. HTTP 응답 반환

    • 최종적으로 렌더링된 HTML 또는 JSON 응답이 DispatcherServlet을 거쳐 클라이언트에게 HTTP 응답으로 전달됩니다.

Tomcat

스프링은 Tomcat을 사용한다.
spring mvc는 외장 tomcat, spring boot는 내장 tomcat을 사용한다.
이 둘의 차이점은 뭐가 있을까?

운영 환경

  • Spring MVC의 외장 Tomcat:

    • 외장 Tomcat 서버는 대규모 애플리케이션 서버 환경에 적합합니다. 서버 설정을 세부적으로 관리할 수 있으며, 여러 애플리케이션을 같은 서버에서 동시에 구동할 수 있습니다.
    • 운영 중인 여러 애플리케이션을 관리하고 유지보수하는 데 용이합니다.
  • Spring Boot의 내장 Tomcat:

    • 내장 Tomcat은 마이크로서비스 또는 단일 애플리케이션 배포에 적합합니다. 각 애플리케이션이 독립적으로 실행되며, 개별 애플리케이션이 자체 서버를 구동하므로 간편하게 운영할 수 있습니다.
    • 빠른 개발, 배포, 독립적인 서비스 운영에 적합합니다.
profile
안녕하세요.

0개의 댓글