Programming/Spring

@JsonProperty, @JsonNaming

사랑우주인 2022. 4. 29. 18:41

REST API 방식으로 서버와 클라이언트가 데이터를 통신할 때 JSON 형식을 주로 사용한다.

서버는 카멜 방식(Camel Case), 클라이언트는 스네이크 방식(Snake Case)을 사용한다.

 

카멜 방식

- 첫 글자는 소문자, 중간 글자들은 대문자 표기법

ex)phoneNumber

 

스네이크 방식

- 언더바가 포함된 표현 방식

ex) phone_number

 

서버와 클라이언트의 JSON 표현의 방식의 차이로 데이터의 key가 달라지는 상황이 발생한다.

이러한 문제를 @JsonProperty, @JsonNaming을 사용하여 해결할 수 있다.


예제

UserRequest

package org.juhyun.kotlinspringboot.model

data class UserRequest (
        var name:String?=null,
        var age:Int?=null,
        var email:String?=null,
        var address:String?=null,
        var phoneNumber:String?=null
)

Controller

package org.juhyun.kotlinspringboot.controller

import org.juhyun.kotlinspringboot.model.UserRequest
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController

@RestController
@RequestMapping("/api")
class PostApiController {

    @PostMapping("/post-mapping")
    fun postMapping(): String {
        return "post-mapping"
    }

    @PostMapping("/post-mapping/object")
    fun postMappingObject(@RequestBody userRequest: UserRequest): UserRequest {
        println(userRequest) // json -> object
        return userRequest   // object -> json
    }

}

 

요청

 

응답

 

phoneNumber이 null

- phone_number와 phoneNumber은 변수명이 다르기 때문에 매핑이 되지 않았다.

- @JsonProperty로 해결 가능하다.


@JsonProperty

객체를 JSON 형식으로 변환할 때 Key의 이름을 설정 가능

package org.juhyun.kotlinspringboot.model

import com.fasterxml.jackson.annotation.JsonProperty

data class UserRequest (
        var name:String?=null,
        var age:Int?=null,
        var email:String?=null,
        var address:String?=null,
        
        @JsonProperty("phone_number")
        var phoneNumber:String?=null // json에서는 phone_number
)

 

응답


@JsonNaming

@JsonProperty는 개별 필드에 적용시켜야 했지만, @JsonNaming은 한번 선언하면 모든 필드에 적용 시킬 수 있다.

package org.juhyun.kotlinspringboot.model

import com.fasterxml.jackson.databind.PropertyNamingStrategies
import com.fasterxml.jackson.databind.PropertyNamingStrategy
import com.fasterxml.jackson.databind.annotation.JsonNaming

// JSON 네이밍 전략
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy::class)
// @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy::class) deprecated
data class UserRequest (
        var name:String?=null,
        var age:Int?=null,
        var email:String?=null,
        var address:String?=null,
        var phoneNumber:String?=null
)


참고

https://zzang9ha.tistory.com/380