24.11.19 TIL HTTP Message Converter

신성훈·2024년 11월 19일
0

TIL

목록 보기
81/162

1. HTTP Message Converter란?

HTTP Message Converter는 Spring Framework에서 클라이언트와 서버 간의 HTTP 요청 및 응답 데이터를 변환하는 데 사용됩니다. 주로 컨트롤러의 매개변수 또는 리턴값 을 HTTP 메시지의 Body로 변환하거나 그 반대로 변환합니다.

Spring MVC는 기본적으로 다양한 Message Converter를 제공하며, JSON, XML, 문자열 등 여러 형식의 데이터를 처리할 수 있습니다.


2. HTTP Message Converter의 동작 원리

컨트롤러에서 데이터를 반환하거나 클라이언트로부터 데이터를 받을 때 다음과 같은 과정을 거칩니다:
1. 요청 데이터를 읽어 Java 객체 로 변환 (Request Body → Java 객체)
2. Java 객체를 HTTP 응답으로 변환 (Java 객체 → Response Body)

Spring MVC는 요청/응답의 Content-TypeAccept 헤더 를 확인해 적합한 Message Converter를 선택합니다.


3. 기본 제공 HTTP Message Converter

Spring은 여러 기본 구현체를 제공하여 다양한 데이터 형식을 처리할 수 있습니다.

3.1 주요 Message Converter

  • MappingJackson2HttpMessageConverter
    • JSON 데이터를 처리 (ObjectMapper 사용)
    • application/json
  • StringHttpMessageConverter
    • 문자열 데이터를 처리
    • text/plain
  • FormHttpMessageConverter
    • HTML 폼 데이터를 처리
    • application/x-www-form-urlencoded
  • Jaxb2RootElementHttpMessageConverter
    • XML 데이터를 처리
    • application/xml

4. 컨트롤러에서의 활용 예시

4.1 Request Body 처리

클라이언트가 JSON 데이터를 서버로 보낼 때, HTTP Message Converter는 이를 Java 객체로 변환합니다.

예제:

@PostMapping("/users")
public ResponseEntity<String> createUser(@RequestBody User user) {
    // HTTP 요청 Body의 JSON을 User 객체로 변환
    userService.save(user);
    return ResponseEntity.ok("User created successfully");
}
  • 클라이언트 요청 (JSON):
    {
      "id": 1,
      "name": "John Doe"
    }

4.2 Response Body 처리

서버가 Java 객체를 JSON으로 변환해 클라이언트로 응답을 보냅니다.

예제:

@GetMapping("/users/{id}")
public ResponseEntity<User> getUser(@PathVariable Long id) {
    User user = userService.findById(id);
    return ResponseEntity.ok(user); // User 객체를 JSON으로 변환
}
  • 서버 응답 (JSON):
    {
      "id": 1,
      "name": "John Doe"
    }

5. 커스텀 HTTP Message Converter

기본 제공 Converter 외에 특정 요구사항이 있는 경우 사용자 정의 Converter를 구현할 수 있습니다.
HttpMessageConverter 인터페이스를 구현해 직접 등록합니다.

예제:

public class CustomMessageConverter implements HttpMessageConverter<MyCustomObject> {
    @Override
    public boolean canRead(Class<?> clazz, MediaType mediaType) {
        return clazz == MyCustomObject.class;
    }

    @Override
    public boolean canWrite(Class<?> clazz, MediaType mediaType) {
        return clazz == MyCustomObject.class;
    }

    // 읽기 및 쓰기 로직 구현
}

커스텀 Converter 등록:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(new CustomMessageConverter());
    }
}

6. 마무리

  • HTTP Message Converter를 통해 HTTP 요청과 응답 데이터를 처리하는 방식이 매우 유연하다는 것을 배웠습니다.
  • 특히 JSON 데이터와 Java 객체 간의 매핑을 자동으로 처리해주는 MappingJackson2HttpMessageConverter는 REST API 개발에서 핵심적인 역할을 합니다.
  • 프로젝트에서 다양한 데이터 형식을 처리해야 하는 경우, 기본 제공 Message Converter 외에 커스텀 Converter를 구현할 필요성을 느꼈습니다.
  • 앞으로 데이터 변환 과정에서 발생할 수 있는 문제(예: JSON 파싱 오류)를 잘 이해하고 이를 디버깅할 수 있는 능력을 키우는 것이 중요하다고 생각합니다.
profile
조급해하지 말고, 흐름을 만들고, 기록하면서 쌓아가자.

0개의 댓글