안녕하세요..!
이번에는 @JsonProperty / @JsonNaming 2개의 어노테이션에 대해 알아보려고 합니다.
해당 어노테이션은 API 통신 시 객체를 JSON으로 보낼 때(직렬화) 혹은 JSON을 객체로 변환할 때(역직렬화),
실제 클래스의 필드명과 다르게 내보내려고 할 시 사용합니다.
예를 들어, 저희 프로젝트는 camelCase규칙의 codeConvention으로 진행하였고, 상대측 api는 snake_case규칙을 사용하였습니다. 서로의 codeConvention이 동일하지 않아, api통신 DTO객체를 생성 시 codeConvention에 대한 문제가 생겼습니다.
이를 해결하기 위해 @JsonProperty / @JsonNaming을 사용하였고, 해당 내용으로 포스팅 진행하겠습니다!
- camelCase codeConvention
- ex) memberId
- snake_case codeConvention
- ex) member_id
@JsonProperty
public class MemberDto {
@Getter
@Builder
public static class Request {
String username;
int age;
}
@Getter
@Builder
@ToString
public static class Response {
Long memberId;
String username;
int age;
}
}
간단한 예시로,
post - {도메인}/v1/member API에 사용되는 Member의 DTO가 있습니다.
응답값 중 memberId의 값을 member_Id로 변경해 달라는 요청이 있었습니다.(현 프로젝트는 camelCase)
이럴 경우, @JsonProperty을 활용할 수 있습니다.
public class MemberDto {
@Getter
@Builder
public static class Request {
String username;
int age;
}
@Getter
@Builder
@ToString
public static class Response {
@JsonProperty("member_id")
Long memberId;
String username;
int age;
}
}
@JsonProperty("member_id") 어노테이션을 활용하여 응답객체를 member_id로 변경하도록 하였습니다.
//request
{
"username" : "John",
"age" : 27
}
//response
{
"username": "John",
"age": 27,
"member_id": 4
}
위의 response JSON 형식처럼 응답객체에 memberId가 아닌 member_id로 변경됐다는 점을 확인할 수 있습니다.
@JsonNaming
public class MemberDto {
@Getter
@Builder
public static class Request {
@JsonProperty("member_username")
String memberUsername;
@JsonProperty("member_age")
int memberAge;
}
@Getter
@Builder
@ToString
public static class Response {
@JsonProperty("member_id")
Long memberId;
@JsonProperty("member_username")
String memberUsername;
@JsonProperty("member_age")
int memberAge;
}
}
위의 예시로 동일한 상황으로 있다고 가정하겠습니다.
요청과 응답값 전부다 snake_case codeConvention으로 변경해 달라는 요청이 있습니다.
요청을 수행하기 위해 @JsonProperty 어노테이션을 활용하였습니다.
하지만, 모든 객체의 변수에 사용해야 될 뿐만 아니라, 코드자체가 더러워진다는 단점이 있습니다.
이럴 경우, @JsonProperty 이 아닌 @JsonNaming을 효과적으로 활용할 수 있습니다.
public class MemberDto {
@Getter
@Builder
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class Request {
String memberUsername;
int memberAge;
}
@Getter
@Builder
@ToString
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public static class Response {
Long memberId;
String memberUsername;
int memberAge;
}
}
위의 코드처럼 @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) 어노테이션을 사용하여,
'해당 변수를 snake_case codeConvention으로 사용할 거야'라고 표기할 수 있습니다.
//request
{
"member_username" : "John",
"member_age" : 27
}
//response
{
"member_id": 3,
"member_username": "John",
"member_age": 27
}
위의 JSON형식을 확인해 보면 snake_case codeConvention으로 변경된 점을 확인할 수 있습니다.
snake_case 전략 외에 여러 전략들이 있으며, 필요한 부분은 구글링 하여 찾으면 될 것 같습니다.😏😏
끝으로, @JsonProperty / @JsonNaming 두 개의 어노테이션의 사용케이스와 사용법뿐만 아니라
해당 어노테이션을 통한 네이밍규칙과 명명법을 준수할 수 있는 법을 확인하였습니다.
감사합니다 :)
참조📚
https://www.baeldung.com/jackson-annotations#1-jsonproperty
https://www.baeldung.com/jackson-advanced-annotations#jsonnaming
'Spring(boot)' 카테고리의 다른 글
| [Spring Boot] @RequestBody, @RequestParam, @ModelAttribute (0) | 2024.04.24 |
|---|---|
| [Spring Boot] @PathVariable 사용법 (0) | 2024.04.15 |
| [Spring Boot] @RequiredArgsConstructor 의존성 주입 (0) | 2024.04.08 |
| [Spring Boot] H2 DB 연동하기 (0) | 2024.03.28 |
| [Spring Boot] spring initializr를 이용하여 프로젝트 생성하기 (2) | 2024.03.20 |