Home Rest-Assured ObjectMapper
Post
Cancel

Rest-Assured ObjectMapper

1. 글을 작성하게 된 계기


RestAssured를 사용하며 직렬화출력 양식을 어떻게 설정하는지 알고 싶어졌습니다. 이 과정에서 내부 구현을 들여다 볼 일이 생겼고, 이를 정리해두고 싶어 해당 글을 작성하게 되었습니다.

image







2. Rest-Assured ObjectMapper


Rest-Assured 라이브러리를 통해 받은 응답을 객체로 변환할 수 있는데, 이는 Rest-Assured 내의 ObjectMapper가 json구조를 분석해 변환해주기 때문입니다.

1
2
3
4
5
6
7
8
9
private void initRestAssureConfiguration() {
        objectMapper = new ObjectMapper()
            .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES)
            .disable(MapperFeature.USE_ANNOTATIONS);

        RestAssured.config = new RestAssuredConfig().objectMapperConfig(
                new ObjectMapperConfig().jackson2ObjectMapperFactory((clazz, charset) -> objectMapper)
        );
}







이 과정에서 출력되는 로그를 어떤 양식으로 볼지 설정할 수 있습니다. 프로젝트를 진행하며 직렬화 과정에서 어떤 정보를 담는지, 출력 양식은 어떻게 지정하는지에 대한 설정이 필요했는데, 이에 대해 살펴보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@SpringBootTest
class ApiTest {

    @Test
    void test() {
        given().
              
              ......

              .contentType("application/json")
              .log()       // 로그 출력
              .all()
              .statusCode(200)
              
              ......

    }
}







2-1. 직렬화

직렬화에 관한 설정은 다음과 같이 할 수 있습니다. 여기에는 무수히 많은 설정이 있는데, 자세한 내용은 공식 문서를 참조해주세요.

1
2
3
4
5
6
7
private void initRestAssureConfiguration() {
        ObjectMapper objectMapper = new ObjectMapper()
                .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
                
        ......

}

프로젝트에서는 DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES을 사용했는데, 이는 json을 역직렬화 하는 과정에서 모르는 값이 나오면 무시하는 설정입니다. 역직렬화 하는 과정에서 내가 필요한 정보만 담기 위해 이를 사용했습니다.







2-2. JsonInclude

JsonInclude를 통해 ObjectMapper에 출력 양식도 지정할 수 있습니다. 과거에는 disable(MapperFeature.USE_ANNOTATIONS)와 같은 방법으로 이를 설정 했지만, 현재는 Deprecated 되었습니다.

1
2
3
4
5
6
7
8
9
/**
 * @deprecated Since 2.13 use {@code JsonMapper.builder().disable(...)}
*/
@Deprecated
public ObjectMapper disable(MapperFeature... f) {
    _deserializationConfig = _deserializationConfig.without(f);
    _serializationConfig = _serializationConfig.without(f);
    return this;
}







출력 양식을 지정하는 JsonInclude에 대한 설정 값들과 내용은 아래와 같습니다.

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
public enum Include {
        // 모든 값을 출력
        ALWAYS,

        // null 제외
        NON_NULL,

        // Reference 타입의 null 제외 
        NON_ABSENT,

        /**
         * 아래의 경우 모두 제외 
         *  - null, absent값이 포함된 경우
         *  - Collection 값이 empty일 경우 
         *  - Array, String의 길이가 0일 경우 
         */
        NON_EMPTY,

        // 타입의 초기 값일 경우 제외 ex) int(0), String(null) ......
        NON_DEFAULT,
        
        // 커스텀(오버라이딩을 통한 설정 등)
        CUSTOM,
        
        // 기본 설정 
        USE_DEFAULTS
        ;
}









이를 이용해 자신이 출력하고자 하는 양식을 설정할 수 있으며, 최종적으로 아래와 같이 설정할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
private void initRestAssureConfiguration(){
        objectMapper=new ObjectMapper()
        .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

        // 모든 정보 출력
        objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
        
        ......
        
}









3. 정리


Rest-Assured의 직렬화 및 Json 포맷에 관한 설정을 살펴보았습니다. 이를 통해 직렬화 과정에서 어떤 정보를 담을지, 출력 양식은 어떻게 지정할지에 대한 상세한 설정을 할 수 있습니다. 별것 아닌 내용이지만, 출력 양식을 깔끔하게 하면 필요한 정보가 바로 눈에 들어와서 개인적으론 한 번 정리해 두고 싶었습니다.


This post is licensed under CC BY 4.0 by the author.