ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java JSON 처리 실전 시리즈 6화 – Spring MVC에서 JSON 요청과 응답 처리 흐름: Jackson과 HttpMessageConverter 작동 원리
    기술과 산업/언어 및 프레임워크 2025. 5. 19. 10:51
    728x90

    Spring MVC에서 JSON 요청을 수신하고 JSON 응답을 반환하는 내부 흐름을 @RequestBody, @ResponseBody, HttpMessageConverter, Jackson 중심으로 구조적으로 정리합니다.


    Spring Boot 기반 REST API 개발을 하다 보면 다음과 같은 작업이 아주 자연스럽게 이루어집니다:

    @PostMapping("/user")
    public UserResponse register(@RequestBody UserRequest request) {
        return userService.create(request);
    }
    

    이 한 줄에는 다양한 내부 처리 흐름이 숨어 있습니다. 이 글에서는 Spring MVC가 JSON 데이터를 Jackson을 통해 어떻게 처리하는지 구조적으로 설명합니다. 단순 사용법이 아닌, 어떻게 동작하는지를 알고 싶은 분에게 도움이 될 것입니다.


    1. 기본 흐름: Jackson과 HttpMessageConverter

    Spring Boot는 내부적으로 다음과 같은 순서로 JSON 데이터를 처리합니다:

    1. 클라이언트 → JSON 요청 전송
    2. DispatcherServlet → HandlerAdapter → Controller 진입
    3. @RequestBody를 통해 JSON → Java 객체로 변환
    4. Controller 메서드 실행 후 반환값을 JSON으로 변환
    5. 응답은 HttpMessageConverter를 통해 처리되어 클라이언트에게 전달됨

    핵심은 Jackson이 자동으로 등록된 **MappingJackson2HttpMessageConverter**를 통해 변환을 수행한다는 점입니다.


    2. @RequestBody – 요청 바디(JSON)를 Java 객체로 매핑

    @PostMapping("/login")
    public LoginResponse login(@RequestBody LoginRequest request) {
        ...
    }
    
    • @RequestBody가 붙은 파라미터는 HTTP 요청 본문(Body)의 JSON 데이터를 Java 객체로 역직렬화합니다.
    • 이 과정에서 사용되는 것이 HttpMessageConverter입니다.

    어떤 Converter가 선택되는가?

    • Spring MVC는 요청의 Content-Type 헤더가 application/json인 경우,
    • MappingJackson2HttpMessageConverter를 사용하여 Jackson을 통해 JSON → 객체로 변환합니다.

    3. @ResponseBody – Java 객체를 JSON 응답으로 직렬화

    @GetMapping("/profile")
    public @ResponseBody UserDto profile() {
        ...
    }
    
    • @ResponseBody는 반환 객체를 JSON으로 직렬화해 HTTP 응답 바디에 담습니다.
    • @RestController는 @Controller + @ResponseBody의 축약형입니다.

    Spring Boot는 produces: application/json 환경에서 반환 객체를 자동으로 JSON으로 직렬화합니다. 이때도 Jackson 기반의 HttpMessageConverter가 사용됩니다.


    4. 핵심 클래스 – MappingJackson2HttpMessageConverter

    public class MappingJackson2HttpMessageConverter extends AbstractJackson2HttpMessageConverter
    
    • Spring MVC의 HttpMessageConverter 구현체 중 하나
    • 내부적으로 Jackson의 ObjectMapper를 사용하여 JSON ↔ Java 변환을 수행
    • Spring Boot에서는 자동으로 이 Converter를 등록하고, 글로벌 설정(application.yml)을 반영한 ObjectMapper를 주입합니다.

    5. 실전 예시: 요청과 응답 JSON 처리

    요청 JSON

    {
      "email": "test@example.com",
      "password": "pass1234"
    }
    

    Java DTO

    public class LoginRequest {
        private String email;
        private String password;
    }
    

    컨트롤러

    @RestController
    public class AuthController {
    
        @PostMapping("/login")
        public LoginResponse login(@RequestBody LoginRequest request) {
            return authService.authenticate(request);
        }
    }
    

    응답 JSON (자동 직렬화)

    {
      "userId": 1,
      "token": "abcd1234"
    }
    

    6. JSON 처리 실패 시 자주 발생하는 오류

    오류 메시지 원인 해결책

    UnrecognizedPropertyException JSON에 정의되지 않은 필드 존재 FAIL_ON_UNKNOWN_PROPERTIES 비활성화
    InvalidFormatException 날짜, Enum 등의 변환 실패 @JsonFormat, 커스텀 Enum 파서 적용
    HttpMessageNotReadableException JSON 파싱 자체 실패 JSON 형식 확인 또는 DTO 구조 확인

    Jackson은 매우 유연하지만, JSON 구조와 Java 필드 매칭이 정확히 맞아야 합니다.


    7. 고급 설정: Jackson을 커스터마이징한 Converter 등록

    @Bean
    public MappingJackson2HttpMessageConverter customJacksonConverter() {
        ObjectMapper mapper = new ObjectMapper();
        mapper.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        return new MappingJackson2HttpMessageConverter(mapper);
    }
    

    이렇게 하면 커스터마이징된 ObjectMapper를 직접 사용하는 Converter를 등록할 수 있습니다.
    단, Spring Boot에서는 전역 설정이 이미 적용되므로 일반적인 경우에는 필요 없습니다.


    결론: 요청-응답 흐름을 이해하는 것이 유지보수의 시작

    • Spring Boot는 Jackson + HttpMessageConverter를 통해 JSON 처리를 자동화합니다.
    • @RequestBody, @ResponseBody는 이 흐름의 진입점/종료점입니다.
    • 설정 변경 없이도 application.yml에서 포맷, 네이밍 전략 등을 제어할 수 있습니다.
    • 예상치 못한 에러는 대부분 JSON ↔ 객체 매핑 문제이므로, 흐름을 정확히 이해하는 것이 중요합니다.

    다음 회차 예고

    7화에서는 JSON 응답 시 null 값 제거, 조건부 출력, 필드 포함/제외 전략 등 JSON 출력을 더욱 정교하게 제어할 수 있는 @JsonInclude, @JsonView, @JsonFilter 전략을 소개합니다.

    728x90
Designed by Tistory.