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
)
참고
'Programming > Spring' 카테고리의 다른 글
RequestBody 자바 객체 매핑 (0) | 2024.12.11 |
---|---|
MapStruct & Lombok 적용 (0) | 2022.05.04 |
Entity, DTO, VO 차이 (0) | 2022.02.04 |
REST API (0) | 2022.01.25 |
Spring Security: Authentication (0) | 2022.01.21 |