노트

Spring MVC 요청 흐름

Spring MVC Request Processing Flow

백엔드#spring#http · 연결된 개념 12개

쉽게 말하면

Spring MVC 요청 흐름은 회사 대표 전화번호 같아요. 모든 전화를 DispatcherServlet 하나가 받아 담당 부서인 컨트롤러 메서드로 돌려 주고, 답을 손님이 알아듣는 형태로 바꿔 전해 줘요.

비유가 깨지는 곳 대표번호 앞에도 관문이 있어요. 인증·인가는 DispatcherServlet에 닿기 전 필터 체인에서 일어나고, JSON API라면 ViewResolver 대신 메시지 컨버터가 반환값을 직렬화해요.

Spring MVC는 모든 HTTP 요청을 DispatcherServlet 하나가 받아, 알맞은 컨트롤러 메서드로 보내고 결과를 응답으로 바꾸는 프론트 컨트롤러(Front Controller) 구조다. 스프링 이전에는 URL마다 서블릿을 직접 만들고 매핑했다.

흐름

클라이언트
  → 서블릿 컨테이너(Tomcat): HTTP 메시지를 HttpServletRequest로
  → 필터 체인(보안·인코딩 등)
  → DispatcherServlet
      ① HandlerMapping: URL·메서드로 처리할 컨트롤러 메서드를 찾음
      ② HandlerAdapter: 파라미터를 바인딩하고 메서드를 호출
      ③ 반환값 처리
         - 뷰 이름이면 ViewResolver가 템플릿을 찾아 렌더링
         - @ResponseBody·@RestController면 메시지 컨버터가 JSON으로 직렬화
  → HttpServletResponse → 클라이언트

요청 값 받기

@GetMapping("/orders/{id}")
public OrderDto get(@PathVariable Long id,
                    @RequestParam(defaultValue = "false") boolean detail) { ... }
  • @PathVariable: URL 경로 조각. REST 리소스 식별에 쓴다
  • @RequestParam: 쿼리 문자열이나 폼 필드. required, defaultValue를 준다
  • 필드가 많으면 객체 하나로 바인딩하고 @Valid로 검증한다

MVC 패턴

MVC(Model-View-Controller)는 Model(데이터), View(표현), Controller(흐름 제어)로 나누는 패턴이다. 서버 렌더링(Thymeleaf 등)에서는 컨트롤러가 모델과 뷰 이름을 넘기고, API 서버에서는 뷰 대신 JSON이 응답이 된다. 프론트엔드 쪽의 MVC·MVVM(Model-View-ViewModel) 변형은 MVC·MVP·MVVM, 장고의 대응 구조는 Django MVT 구조를 본다. 스프링 부트가 이 서블릿 설정을 자동으로 해 준다(스프링 부트 자동 설정).

책: 5장. 제대로 된 REST API

출처: Spring Framework 문서: DispatcherServlet

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 스프링에서 외부 API 호출

    스프링 앱에서 다른 서버의 REST API를 부르는 도구는 여러 세대가 있다. 지금 새 코드라면 동기 호출은 RestClient, 리액티브·비동기는 WebClient, 인터페이스 선언 방식은 HTTP Interface나 OpenFeign이 흔한 선택이다(2026 기준).

  • 서버 함수와 서버 액션

    서버 함수(Server Function)는 'use server'로 표시해 서버에서만 실행되지만 클라이언트에서 네트워크 요청으로 호출할 수 있는 async 함수다. 그중 폼 제출이나 데이터 변경처럼 action 맥락(form action, transition)에서 쓰이는 것을 서버 액션(Server Action)이라 부른다. 서버 액션은 서버 함수의 부분집합이다.

  • DRF 뷰 계층

    DRF는 같은 API를 점점 더 적은 코드로 쓰게 해 주는 뷰 계층을 제공한다. 함수 뷰 → APIView → 제네릭 뷰(generic view)와 믹스인(mixin) → 구체 제네릭 뷰 → ViewSet과 Router 순으로 올라갈수록 관례가 많아지고 코드가 줄어든다.

  • Pages Router에서 App Router로

    App Router는 Next.js 13에서 도입된 app/ 디렉터리 기반 라우터로, 서버 컴포넌트·중첩 레이아웃(Nested Layouts)·스트리밍을 기본으로 한다. pages/ 기반의 Pages Router에서 옮길 때 바뀌는 생각을 정리한다.

  • 책임 연쇄 패턴

    요청을 처리할 수 있는 처리자들을 사슬로 잇고, 각 처리자가 직접 처리하거나 다음 처리자에게 넘기게 하는 패턴. 요청을 보내는 쪽은 누가 처리할지 몰라도 된다.

보기 옵션