2022-09-26 @이영훈
Kotlin SpringBoot에서 Jackson Library 동작법을 기록으로 남겨둡니다.
제가 가장 헷갈렸던 부분인 DTO에 val이 없는 경우에 반환값에 해당 필드가 포함되지 않는 부분을 살펴보고, Kotlin Jackson Library의 핵심 내용을 정리합니다.
DTO의 필드에 val(또는 var)이 없으면 serializer가 getter로 호출할 때 해당 필드를 호출하지 못하기 때문에 해당 필드는 표시되지 않습니다.
Response DTO에서 반환하고 싶지 않은 필드는 접근자를 표시하지 않으면 (val, var을 붙이지 않으면) 됩니다.
반환 DTO로 확인해보기
Test #1
다음과 같이 pen의 목록을 가져오는 API는 MultipleItemsDTO<PenDTO>를 반환합니다.
// PenController.kt
@GetMapping("/v1/pens")
fun getPens(): MultipleItemsDTO<PenDTO> {
val pens = listOf(
PenDTO(1, "Signo 0.28 Black"),
PenDTO(2, "SARASA 0.4 Black"),
)
return MultipleItemsDTO(pens)
}
// DTO.kt
class MultipleItemsDTO<T>(
val items: List<T>,
) {
val count: Int = items.size
}
class PenDTO(
val id: Long,
val name: String,
)
Kotlin
복사
Response
{
"items": [
{
"id": 1,
"name": "Signo 0.28 Black"
},
{
"id": 2,
"name": "SARASA 0.4 Black"
}
],
"count": 2
}
JSON
복사
Test #2
이번에는 PenDTO의 id 필드에서 getter를 삭제(val을 삭제)해보겠습니다.
(java에서 @JsonIgnore 를 사용한 것과 동일한 결과를 반환합니다)
// PenController.kt
@GetMapping("/v1/pens")
fun getPens(): MultipleItemsDTO<PenDTO> {
val pens = listOf(
PenDTO(1, "Signo 0.28 Black"),
PenDTO(2, "SARASA 0.4 Black"),
)
return MultipleItemsDTO(pens)
}
// DTO.kt
class MultipleItemsDTO<T>(
val items: List<T>,
) {
val count: Int = items.size
}
class PenDTO(
id: Long, // ⭐️ val 삭제
val name: String,
)
Kotlin
복사
Response
반환값에 id 필드가 없어진 것을 확인할 수 있습니다.
{
"items": [
{
"name": "Signo 0.28 Black"
},
{
"name": "SARASA 0.4 Black"
}
],
"count": 2
}
JSON
복사
Kotlin Jackson 살펴보기
serialize와 deserialize는 jackson 라이브러리를 사용합니다.
1.
Serializer/Deserializer 시 필드명을 제외하고 싶은 경우: @JsonIgnore
위에서 서술했던 것처럼 val (또는 var)에서 제외하면 됩니다.
또는 @JsonIgnore 를 사용하면 됩니다.
class PenDTO(
@get:JsonIgnore // ⭐️
val id: Long,
val name: String,
)
Kotlin
복사
2.
필드명을 변경하고 싶은 경우: @JsonProperty
class PenDTO(
val id: Long,
@JsonProperty("penName")
val name: String,
)
Kotlin
복사
Response
{
"items": [
{
"id": 1,
"penName": "Signo 0.28 Black" // ⭐️ 필드명이 변경되었습니다
},
{
"id": 2,
"penName": "SARASA 0.4 Black" // ⭐️ 필드명이 변경되었습니다
}
],
"count": 2
}
Kotlin
복사
3.
Serialize시 포함할 필드 지정하기: @JsonInclude
다음과 같이 sellers라는 필드가 추가되었습니다.
class PenDTO(
val id: Long,
val name: String,
) {
val sellers: List<String> = emptyList() // ⭐️ 추가되었습니다
}
Kotlin
복사
Response
{
"items": [
{
"id": 1,
"name": "Signo 0.28 Black",
"sellers": []
},
{
"id": 2,
"name": "SARASA 0.4 Black",
"sellers": []
}
],
"count": 2
}
JSON
복사
이와 같은 경우에, empty를 serialize를 하고 싶지 않은 경우가 있습니다.
@JsonInclude(JsonInclude.Include.NON_EMPTY) // 기본값은 ALWAYS 입니다.
class PenDTO(
val id: Long,
val name: String,
) {
val sellers: List<String> = emptyList()
}
Kotlin
복사
Response
다음 결과와 같이 empty 결과는 삭제되었습니다
{
"items": [
{
"id": 1,
"name": "Signo 0.28 Black"
},
{
"id": 2,
"name": "SARASA 0.4 Black"
}
],
"count": 2
}
Kotlin
복사