🔍 Spring MVC 내부 구조와 HttpMessageConverter 완전 정복
Spring에서 웹 요청과 응답을 처리할 때 내부적으로 어떤 구조가 작동하고, 개발자가 어떤 부분을 확장할 수 있는지 이해하면 보다 유연하고 강력한 애플리케이션을 만들 수 있습니다.
이 글에서는 HttpMessageConverter, ArgumentResolver, ReturnValueHandler, 그리고 Converter, Formatter의 개념을 정리하고, 개발자가 확장할 수 있는 포인트에 대해서도 살펴봅니다.
📨 HttpMessageConverter란?
HttpMessageConverter는 HTTP 요청/응답의 본문(body) 데이터를 Java 객체로 변환하거나, 반대로 Java 객체를 HTTP 응답 본문으로 변환하는 역할을 합니다.
사용되는 위치
역할 사용 예시
HTTP 요청을 객체로 변환 | @RequestBody, HttpEntity<T>, RequestEntity<T> |
객체를 HTTP 응답으로 변환 | @ResponseBody, HttpEntity<T>, ResponseEntity<T> |
변환 우선순위 (기본 설정 기준)
- byte[]
- String
- JSON (ex. MappingJackson2HttpMessageConverter)
📌 JSON 변환은 보통 Jackson 라이브러리를 통해 이루어지며, 필요 시 @JsonFormat, Custom Deserializer 등을 사용해 커스터마이징 가능합니다.
🧱 Spring 내부 구조
Spring MVC가 요청을 처리하고 응답을 반환하는 과정에는 여러 내부 컴포넌트가 관여합니다.
핵심 인터페이스
📥 ArgumentResolver
- 역할: 컨트롤러의 파라미터를 알맞은 객체로 변환
- 사용 예시: @RequestParam, @PathVariable, @ModelAttribute, @RequestBody 등
📤 ReturnValueHandler
- 역할: 컨트롤러 메서드의 반환 값을 HTTP 응답 형식으로 가공
- 사용 예시: @ResponseBody, ModelAndView 등
이 둘은 모두 확장 가능합니다. 직접 구현해서 WebMvcConfigurer를 통해 등록하면 나만의 로직도 적용 가능!
🔁 Converter vs Formatter
Converter
- 두 타입 간 변환 로직만 담당 (String -> Enum, String -> 객체 등)
- 포맷을 신경쓰지 않음
Formatter
- 문자열 ↔ 객체 변환 + 포맷 적용 (날짜, 숫자 등 형식 처리)
- 예: @DateTimeFormat("yyyy-MM-dd")
함께 사용하는 도구: ConversionService
- Converter, Formatter를 일관되게 사용할 수 있도록 도와주는 어댑터 역할
- 주로 @RequestParam, @ModelAttribute, @PathVariable에서 사용됨
- HttpMessageConverter에는 적용되지 않음 (본문 기반 처리라 별도로 동작)
등록 방법: WebMvcConfigurer
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addFormatters(FormatterRegistry registry) {
registry.addConverter(new MyCustomConverter());
registry.addFormatter(new MyCustomFormatter());
}
}
📌 핵심 정리
- Spring의 대부분 기능은 인터페이스 기반으로 설계되어 있고, 다양한 기본 구현체를 제공
- 개발자는 기본 기능을 잘 활용하면 되고, 필요한 경우 인터페이스를 구현해 확장 가능
- 확장을 위해서는 Spring 내부 구조에 대한 이해가 필수
확장 가능한 주요 포인트
기능 확장 방법
요청 파라미터 처리 | HandlerMethodArgumentResolver 구현 |
응답 처리 | HandlerMethodReturnValueHandler 구현 |
본문 변환 | HttpMessageConverter 커스터마이징 |
타입 변환 | Converter, Formatter 구현 후 등록 |
🎯 마무리
Spring은 유연한 확장이 가능하도록 잘 설계된 프레임워크입니다. 내부 구조를 이해하면 "왜 이렇게 동작하는가?"에 대한 감을 잡을 수 있고, 나아가 요구사항에 맞는 기능을 직접 만들어 넣을 수도 있습니다.
'스프링' 카테고리의 다른 글
AOP (0) | 2025.04.17 |
---|---|
HttpServletRequest (0) | 2025.04.17 |
kpt (0) | 2025.04.14 |
뉴스피드 프로젝트 (1) | 2025.04.11 |
뉴스피드 프로젝트 예외처리 (0) | 2025.04.08 |