포스트

2024-07-15-TIL

2024-07-15-TIL

Today I Learned

Spring Web MVC

  • https://github.com/spring-projects/spring-framework/tree/main/spring-webmvc
  • https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/mvc.html
  • https://docs.spring.io/spring-framework/reference/web/webmvc.html
  • https://www.tutorialspoint.com/spring/spring_web_mvc_framework.htm
  • https://www.geeksforgeeks.org/spring-mvc-framework/
  • https://www.javatpoint.com/spring-mvc-tutorial

Spring MVC는 프론트 컨트롤러(front controller) 패턴으로 설계되어 있다. 모든 요청을 DispatcherServlet이라는 서블릿 하나가 먼저 받고, 요청을 처리하는 공통 흐름은 이 서블릿이 갖는다. 실제 일은 설정으로 바꿀 수 있는 위임 컴포넌트들이 나눠 맡는다.

요청 하나가 처리되는 흐름을 컴포넌트 이름으로 따라가면 이렇다.

  1. HandlerMapping이 요청 URL에 맞는 핸들러(보통 @RequestMapping이 붙은 컨트롤러 메서드)를 찾는다.
  2. HandlerAdapter가 그 핸들러를 실제로 호출한다. 파라미터 바인딩과 반환값 처리가 여기서 일어난다.
  3. 예외가 나면 HandlerExceptionResolver가 처리한다. @ExceptionHandler도 이 경로로 동작한다.
  4. 뷰 이름을 돌려줬다면 ViewResolver가 실제 뷰를 찾아 렌더링하고, @ResponseBody라면 메시지 컨버터가 객체를 JSON 등으로 바로 써 준다.

링크 중 3.2.x 문서는 오래된 버전이지만, 이 구조 자체는 지금 문서와 크게 다르지 않다. 현재 소스는 spring-framework 저장소의 spring-webmvc 모듈에 있다.


Spring MVC vs Spring WebFlux

  • https://velog.io/@shdrnrhd113/Spring-MVC-Vs.-Spring-WebFlux

두 스택의 차이는 스레드를 막을(block) 수 있다고 가정하느냐에서 출발한다. Spring 문서에 따르면 Spring MVC를 포함한 서블릿 애플리케이션은 원격 호출 같은 작업에서 현재 스레드가 막힐 수 있다고 가정한다. 그래서 서블릿 컨테이너는 큰 스레드 풀로 이 대기를 흡수한다. 반대로 WebFlux 같은 논블로킹 서버는 애플리케이션이 막히지 않는다고 가정하고, 작은 고정 크기 스레드 풀(이벤트 루프 워커)로 요청을 처리한다.

WebFlux가 나온 이유도 문서에 정리되어 있다. 적은 스레드로 동시성을 처리하고 더 적은 하드웨어로 확장할 수 있는 논블로킹 웹 스택이 필요했고, Java 8 람다로 함수형 API를 쓸 수 있게 됐기 때문이다. WebFlux는 Reactor를 기본 리액티브 라이브러리로 쓰고, 0~1개의 값을 다루는 Mono와 0~N개를 다루는 Flux 타입으로 비동기 흐름을 조합한다.

어느 쪽을 고를지에 대해 문서는 꽤 분명하다. 잘 동작하는 Spring MVC 애플리케이션이라면 바꿀 필요가 없다. 명령형 코드가 작성하고 이해하고 디버깅하기 가장 쉽다. 또 JPA, JDBC 같은 블로킹 영속성 API를 쓴다면 일반적인 구조에서는 Spring MVC가 가장 좋은 선택이라고 한다. WebFlux로 바꾼다고 성능이 저절로 좋아지는 것이 아니라, 전 구간이 논블로킹일 때 의미가 생긴다는 뜻으로 읽었다.


AI 키워드: Spring AI

Spring 팀이 5월 30일 Spring AI 1.0.0 M1(첫 마일스톤)을 발표했다. 핵심은 ChatClient라는 fluent API로, 프롬프트를 만들어 AI 모델에 보내는 코드를 WebClient, RestClient, JdbcClient와 비슷한 모양으로 쓰게 한다. Spring Boot 자동 설정으로 ChatClient.Builder를 주입받을 수 있다. 익숙한 Spring 방식 그대로 LLM 호출을 애플리케이션에 붙일 수 있게 하려는 프로젝트라는 말이구나.

참고한 자료외부 출처 4

외부 출처

이 글은 저작권자의 CC BY 4.0 라이선스를 따릅니다.

댓글

아직 댓글이 없습니다