스프링

Spring MVC 내부 구조와 HttpMessageConverter 완전 정복

148june 2025. 4. 15. 20:11

 


🔍 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>

변환 우선순위 (기본 설정 기준)

  1. byte[]
  2. String
  3. 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