-
Java JSON 처리 실전 시리즈 6화 – Spring MVC에서 JSON 요청과 응답 처리 흐름: Jackson과 HttpMessageConverter 작동 원리기술과 산업/언어 및 프레임워크 2025. 5. 19. 10:51728x90
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 데이터를 처리합니다:
- 클라이언트 → JSON 요청 전송
- DispatcherServlet → HandlerAdapter → Controller 진입
- @RequestBody를 통해 JSON → Java 객체로 변환
- Controller 메서드 실행 후 반환값을 JSON으로 변환
- 응답은 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'기술과 산업 > 언어 및 프레임워크' 카테고리의 다른 글