Spring

Spring MVC: 클라이언트 요청 처리 흐름

개발자 김마늘 2025. 3. 25. 20:32

Spring MVC에서 클라이언트 요청 처리 흐름을 정리한 글입니다.

 

전반적인 흐름 요약

더보기

1. 사용자 요청
2. DispatcherServlet 수신

3. HandlerMapping 조회하여 적절한 컨트롤러 탐색

4. HandlerAdapter 통해 실제 핸들러 호출
5. 컨트롤러 메서드 실행
6. 반환 타입에 따라 분기
   - @Controller → ViewResolver → HTML
   - @RestController → HttpMessageConverter → JSON
7. 최종 응답 반환

 

1. 사용자 요청

사용자가 웹 브라우저 주소창에 http://어쩌구저쩌구.com을 입력합니다. 이 요청은 이 도메인을 가지고 있는 서버로 갑니다. 가면 문지기가 하나 서있습니다.


2. DispatcherServlet 수신

이 문지기(DispatcherServlet)는 요청이 어디로 가야 할지 전체 지도를 들고 있습니다.

문지기는 지도를 펼치고 이 URL은 어떤 컨트롤러가 처리하지? 확인합니다.

이 지도를 HandlerMapping이라 부릅니다.

 

3. HandlerMapping 조회하여 적절한 컨트롤러 탐색

HandlerMapping은 요청 URL과 일치하는 컨트롤러 메서드를 찾아냅니다.

 

4. HandlerAdapter 통해 실제 핸들러 호출

DispatcherServlet은 Handler(컨트롤러)를 찾았지만 직접 호출하지 않고 요청을 HandlerAdapter에게 넘깁니다.

HandlerAdapter는 컨트롤러를 실행 가능한 형태로 변환하고 호출합니다.

 

5. 컨트롤러 메서드 실행

메서드를 실행하여 결과를 생성합니다.

6. 반환 타입에 따라 분기

이제 컨트롤러 메서드가 실행되고, 결과를 반환하는데 갈림길이 있습니다. 바로

  • @Controller
  • @RestController

@Controller의 경우 반환된 값은 뷰 이름입니다. DispatcherServlet은 이를 ViewResolver에게 넘겨 실제 HTML 파일을 찾아 렌더링하고, 사용자에게 완성된 HTML 페이지를 반환합니다.

 

@RestController의 경우 반환된 객체는 HTML이 아닌 데이터 응답입니다. DispatcherServlet은 "이건 뷰가 아니니까, 응답 본문으로 바꿔줘야 해!"하면서 HttpMessageConverter를 호출합니다.

 

HttpMessageConverter는 반환된 객체를 클라이언트에게 보낼 수 있는 HTTP 응답 형태로 변환해줍니다.

  • 만약 String이면 → StringHttpMessageConverter
  • 만약 정의한 객체면 → MappingJackson2HttpMessageConverter

그리고 MappingJackson2HttpMessageConverter는 내부적으로 Jackson을 사용해 객체를 JSON으로 변환합니다.

 

개발자는 단지 객체를 반환했을 뿐인데 Spring은 이걸 자동으로 JSON으로 바꾸어 응답해줍니다.

 

6. 최종 응답 반환

  • @Controller였다면 HTML 페이지가 렌더링되어 응답됩니다.
  • @RestController였다면 JSON 또는 XML 등 데이터가 응답됩니다.

클라이언트는 이 응답을 받아 화면에 표시하거나 앱에서 처리합니다.