1. 글을 작성하게 된 계기
RestAssured를 사용하며 직렬화 및 출력 양식을 어떻게 설정하는지 알고 싶어졌습니다. 이 과정에서 내부 구현을 들여다 볼 일이 생겼고, 이를 정리해두고 싶어 해당 글을 작성하게 되었습니다.
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 포맷에 관한 설정을 살펴보았습니다. 이를 통해 직렬화 과정에서 어떤 정보를 담을지, 출력 양식은 어떻게 지정할지에 대한 상세한 설정을 할 수 있습니다. 별것 아닌 내용이지만, 출력 양식을 깔끔하게 하면 필요한 정보가 바로 눈에 들어와서 개인적으론 한 번 정리해 두고 싶었습니다.