티스토리 뷰

RestClient를 애플리케이션의 http client로 활용할 수 있다. 이때 MediaType이 application/json 인 경우 RestClient는 ObjectMapper를 이용해 body의 직렬화/역직렬화를 수행한다. Http MediaType은 종류가 여러가지인만큼 RestClient는 ObjectMapper를 직접 이용하는게 아니라 각 MediaType을 MessageConverter라는 인터페이스로 추상화하여 활용한다.

 

다만 최근에는 json이 표준처럼 사용되고 있는만큼 다른 타입에 비해 json을 핸들링해야하는 경우가 많은데, 이때 내부 ObjectMapper의 설정을 변경해줘야할때가 있다. ObjectMapper의 default naming 전략은 camel case인데 snake case로 변경한다거나 직접 구현한 Serializer/Deserializer를 등록한다거나 하는 경우가 그렇다.

 

1. MessageConverter 변경

// 원하는 설정의 ObjectMapper 생성
public ObjectMapper create() {                                        
    SimpleModule module = new SimpleModule();                                   
    module.addSerializer(); // custom serializer                                
    module.addDeserializer(); // custom deserializer                            
                                                                                
    JsonMapper jsonMapper = JsonMapper.builder()                                
            // property naming strategy                                         
            .propertyNamingStrategy(PropertyNamingStrategies.LOWER_CAMEL_CASE)  
            .addModule(module)                                                  
            .build();
            
    return jsonMapper;
}
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(create()); 

// MessageConverter list를 교체하는 방식
RestClient.builder()                                                         
        .messageConverters(List.of(converter))                                                       
        .build();

// MessageConverter list를 변경하는 방식
RestClient.builder()                       
        .messageConverters(converters -> { 
            converters.clear();            
            converters.add(converter);     
        })                                 
        .build();

 

RestClient는 내부에 미리 정의된 MessageConverter list를 갖게 된다. 이를 통해 각 MediaType에 알맞은 MessageConverter 구현체를 사용하게 되는 것이다. 위에 소개한 방법은 RestClient의 builder를 이용해서 MessageConverter list를 변경하는 방식이다.

다만 위 방식은 json 이외 다른 MessageConverter를 모두 지우게 된다. 뭔가 바람직해 보이는 방식은 아니다.

 

2. 클래스에 메타 정보 선언

ObjectMapper를 이용할때 설정을 변경하는 방법은 두가지다. ObjectMapper 자체를 변경하거나 그게 아니라면 각각 클래스에 선언해주면 된다.

@JsonNaming(PropertyNamingStrategies.LowerCamelCaseStrategy.class)
class Person {
    @JsonSerialize(using = NameSerializer.class)
    @JsonDeserialize(using = NameDeserializer.class)
    private Name name;
    @JsonSerialize(using = AgeSerializer.class)
    @JsonDeserialize(using = AgeDeserializer.class)
    private Age age;
}

이 방식은 설정을 클래스쪽으로 옮기는 대신 ObjectMapper는 건드릴 필요 없다는 장점이 있지만 저 설정들을 매번 복붙해야한다는 문제가 있다.

 

3. 자동구성된 RestClient.Builder 사용

spring에서는 RestClient.Builder를 기본적으로 빈에 등록해주고 있다. 그리고 이 빈은 ObjectMapper를 주입받게 되는데 이때 spring 빈으로 등록된 ObjectMapper를 주입하게 된다.

// spring 빈 등록
@Bean
public ObjectMapper objectMapper() {
  return create();
}

@Component
@AllArgsConstructor
class SomeClass {
  private RestClient.Builder builder; // 이미 등록돼있던 Builder가 주입됨
}

ObjectMapper도 미리 자동 구성되어 빈으로 등록되기 때문에 ObjectMapper를 빈으로 등록하는 것도 필요하지 않을 수 있다. 자동 구성되는 ObjectMapper의 설정을 변경해야한다면 이전 포스팅( https://multifrontgarden.tistory.com/300 )을 참고하면 된다.

 

참고로 공식문서에서도 빈으로 등록된 Builder 사용을 권장하고 있다( https://docs.spring.io/spring-boot/reference/io/rest-client.html#io.rest-client.restclient ). 자동구성되는 내용은 여기서( https://github.com/spring-projects/spring-boot/blob/main/module/spring-boot-restclient/src/main/java/org/springframework/boot/restclient/autoconfigure/RestClientAutoConfiguration.java ) 확인할 수 있다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함