@RestController HTTP요청 처리 방식

심민혁·2025년 4월 6일

weeklypaper

목록 보기
11/18

>2025.03.31일자 위클리 페이퍼

Spring Boot에서 @RestController로 들어온 HTTP 요청이 처리되어 응답으로 변환되는 전체 과정을 설명하세요. 특히 HTTP 메시지 컨버터가 동작하는 시점과 역할을 포함해서 설명하세요.

요청 처리 순서

DispatcherServlet (요청 수신)
HandlerMapping (URL과 컨트롤러 메서드 매핑)
@RestController 실행 (비즈니스 로직 처리)
응답 객체 반환
HttpMessageConverter (객체를 JSON/XML로 변환)
데이터(JSON/XML) 응답

1. DispatcherServlet의 요청 수신

  • 클라이언트가 HTTP 요청을 보내면 Spring MVC의 DispatcherServlet이 가장 먼저 요청을 받습니다.
  • DispatcherServlet은 요청을 처리할 컨트롤러를 찾기 위해 HandlerMapping을 사용하여 요청 URL과 HTTP 메서드에 맞는 핸들러 메서드를 결정합니다.

2. HandlerAdapter를 통해 컨트롤러 호출

  • HandlerAdapter는 선택된 컨트롤러의 메서드를 호출하는 역할을 합니다.
  • 보통은 RequestMappingHandlerAdapter가 사용됩니다.
  • 이 과정에서 URL의 파라미터나 요청 본문(body)이 컨트롤러 메서드의 매개변수로 바인딩됩니다.

3. 컨트롤러(@RestController) 메서드 실행

  • @RestController는 @Controller와 @ResponseBody가 결합된 형태로, 메서드가 반환한 객체를 HTTP 응답 본문(body)으로 변환하도록 합니다.
  • 컨트롤러가 메서드 실행 후 객체나 데이터를 반환하면, 응답 변환 단계로 넘어갑니다.

4. HTTP 메시지 컨버터(HttpMessageConverter) 동작

4.1 HTTP 요청 데이터 읽기

  • HTTP 요청이 오면 컨트롤러 메서드의 @RequestBody 또는 HttpEntity가 붙은 파라미터로 처리된다.
  • Spring은 등록된 메시지 컨버터의 canRead() 메서드를 호출해서 다음 조건을 검사한다.
    • 대상 자바 클래스 타입을 지원하는지 확인한다.
      • 예) byte[], String, HelloData
    • HTTP 요청 헤더의 Content-Type을 지원하는지 확인한다.
      • 예) application/json, text/plain, /
  • 두 조건이 모두 맞으면 해당 컨버터의 read() 메서드를 호출하여 HTTP 요청 데이터를 자바 객체로 변환한다.

4.2 HTTP 요청 데이터 쓰기

  • 컨트롤러 메서드가 데이터를 반환할 때 @ResponseBody, HttpEntity, ResponseEntity로 반환된 값이 처리된다.
  • Spring은 등록된 메시지 컨버터의 canWrite() 메서드를 호출해서 다음 조건을 검사한다.
    • 반환한 자바 클래스 타입을 지원하는지 확인한다.
      • 예) byte[], String, HelloData
    • 클라이언트 요청의 Accept 헤더나 컨트롤러의 produces 속성을 지원하는지 확인한다.
      • 예) 클라이언트 요청: Accept: application/json
      • 예) 컨트롤러 메서드: @GetMapping(produces="application/json")
  • 두 조건이 모두 맞으면 해당 컨버터의 write() 메서드를 호출하여 자바 객체를 HTTP 응답 데이터로 변환한다.

5. 메세지 컨버터 동작 시점

  • 요청을 받을 때(@RequestBody): HTTP 요청 본문(body)을 자바 객체로 변환
  • 응답을 보낼 때(@ResponseBody 또는 @RestController): 자바 객체를 HTTP 응답 본문으로 변환

6. 최종 HTTP 응답 생성 및 반환

  • 메시지 컨버터로 변환된 데이터는 최종적으로 DispatcherServlet을 통해 HTTP 응답으로 만들어져 클라이언트로 전달됩니다.
  • 응답의 상태 코드(200 OK, 400 Bad Request, 404 Not Found 등)는 컨트롤러에서 설정하거나 예외 처리 과정을 통해 결정됩니다.

참고 자료

profile
열심히 하고 싶습니다

0개의 댓글