
개발을 진행하면서,
FrontEnd와 BackEnd 사이에 Naming Rule을 맞춰야하는 경우가 발생할 것이다.
다음과 같은 상황이 있다고 가정해보자.
Java 세상에서는 camelCase로 변수명을 작성하는데, 프론트에서 snake_case로 RequestBody를 요청하면 어떻게 처리해줘야 할까?
위 문제를 해결하기 위해
Jackson Library의 두 어노테이션인
@JsonProperty와 @JsonNaming을 사용해보았다.
package com.example.shoppingmall.Member;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
//@JsonNaming(value = PropertyNamingStrategies.SnakeCaseStrategy.class)
public class Member {
@JsonProperty("user_id")
private String userId;
private String pw;
private String name;
private String email;
private String contact;
@Override
public String toString() {
return "Member{" +
"userId='" + userId + '\'' +
", pw='" + pw + '\'' +
", name='" + name + '\'' +
", email='" + email + '\'' +
", contact='" + contact + '\'' +
'}';
}
}

위 사진에서와 같이 이번에는 userId 까지 정상적으로 파싱 되어 전달된 것을 확인할 수 있었다.
그러나, 1~2개 정도인 경우에는 해당 어노테이션을 사용하여 해결할 수 있겠지만 10~20개 이상이 된다면 필드 하나하나 추가하는 것은 코드도 길어지고 유지보수 면에서도 번거로운 작업이 된다.
이럴 때에 사용하는 것이 @JsonNaming 어노테이션이다.
위 같은 상황을 한번 테스트해보았다.
비즈니스 로직은 다음과 같다.
1. 프론트에서 회원가입에 대한 정보를 camelCase 필드명으로 RequestBody에 JSON을 담아 요청한다.

Spring에서 해당 JSON 데이터를 받는 타입은 다음과 같다.

localhost:8080/join 요청으로 위 RequestBody 데이터를 스프링에서 요청받는 Controller를 작성한다.

Controller에서 @RequestBody를 Member 타입의 변수로 담고, 이를 저장하는 요청을 Service로 보낸다. 그리고, Service에서는 다음과 같은 코드로 Repository에 요청한다.

현재 프로젝트에서는 DB를 사용하지 않아, Repository 클래스에서 FrontEnd로 부터 전달받은 RequestBody를 Map에 저장한 후, Service로 반환한다. Service는 다시 Controller로 응답을 반환한다.
현재 코드에서는 회원가입을 Map에 put으로 저장하고, get을 통해 저장된 Member 객체를 조회하여 반환하도록 구성하였다.

위 코드로 @JsonNaming 어노테이션을 적용하기 전에 테스트를 진행해본 결과는 다음과 같다.

두 부분에서 동일하게 camelCase로 네이밍할 경우에는 요청에 대해 올바른 처리가 된 것을 확인할 수 있다.

FrontEnd에서 Request Body로 snake_case 형식으로 요청할 경우 (user_id) 그에 대한 처리가 되지 않은 것을 확인할 수 있다.
("userId": null) 반환
이러한 문제를 해결하기 위해 등장한 것이
Jaskson Library이다.
위 라이브러리는 JSON <-> Java Object 간에 Mapping을 편하게 시켜주는 라이브러리이다.
이제 Jackson Library의 @JsonNaming 어노테이션을 추가한 후,
위에 에러 케이스를 테스트 해보겠다.
추가한 부분은 DTO 클래스인 Member 클래스에 해당 어노테이션을 추가하였다.

위 어노테이션을 추가 후 테스트를 진행해보니
다음과 같이
회원가입 로직이 이루어진 이후에, DTO의 userId 필드명이 user_id로 변경 되어 응답이 이루어 진 것을 확인할 수 있었다.

위 어노테이션을 테스트 해본 결과 두 어노테이션 다 원하는 기능을 수행할 수는 있다.
그러면, 차이점은 뭘까?
@JsonProperty는 필드에 key를 입력하여 적용할 수 있다.
@JsonNaming은 클래스에 적용할 수 있다.
만약에 필드가 100개 이런식이면 어떻게 해야할까?
일일히 @JsonProperty를 작성하는 것보다 @JsonNaming을 적용하는 것이 편할 것 이다.