@JsonProperty, @JsonNaming

2022. 4. 29. 18:41·Programming/Spring

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

'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
'Programming/Spring' 카테고리의 다른 글
  • RequestBody 자바 객체 매핑
  • MapStruct & Lombok 적용
  • Entity, DTO, VO 차이
  • REST API
사랑우주인
사랑우주인
  • 사랑우주인
    lovelyAlien
    사랑우주인
  • 전체
    오늘
    어제
  • 글쓰기
    관리
    • 분류 전체보기 (209)
      • Programming (4)
        • Spring (28)
        • Java (46)
        • JPA (2)
        • 디자인 패턴 (5)
        • 개발&아키텍처 (0)
      • Network (14)
      • OS (19)
      • Database (1)
      • Kubernetes (0)
      • Kafka (2)
      • Algorithm (49)
        • BaekJoon (1)
        • Programmers (19)
        • Algorithm (5)
        • Socar (2)
        • LeetCode (19)
      • Interview (2)
      • Issues (2)
      • DotJoin (1)
      • Git (4)
      • 독서 (3)
      • 끄적끄적 (1)
      • 외부활동 (26)
        • 항해플러스 (2)
        • JSCODE 네트워크 (19)
        • JSCODE 자바 (5)
      • SQL (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • GitHub
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    pacific atlantic water flow
    AuthenticationSuccessHandler
    LinkedList
    wildcards
    Generic
    JSCode
    BFS
    minimum number of arrows to burst balloons
    Reorder List
    rotting oranges
    준영속 엔티티
    OS
    Thread
    fcfs
    제네릭
    디자인 패턴
    socar
    runner 기법
    트랜잭션
    Oauth2
    Process
    lower bounded wildcards
    @JsonNaming
    @JsonProperty
    Climbing Stairs
    운영체제
    추상화 클래스
    algorithm
    RR
    clone graph
  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.1
사랑우주인
@JsonProperty, @JsonNaming
상단으로

티스토리툴바