홍차의 미로찾기

JAVA 객체를 camel case나 snake case로 변경 (1) 본문

프로그래밍/SPRING 입문

JAVA 객체를 camel case나 snake case로 변경 (1)

홍차안디 2021. 12. 29. 23:33
반응형

Spring Boot에서 클라이언트로부터 json 형식으로 데이터를 주고받을 때, key의 naming을 설정해야 한다.

보통 초기에 어떤 형식을 사용할 것인지 정하고 시작하기도 하지만

개발을 하다보면 형식을 자유롭게 넘나들어야 할 때가 있다.

 


 

 

이 글에서는 camel case로 받고, snake case json String으로 전달하는 방법에 대해 작성했다.

만약 snake case json String이 아닌, snake case 객체로 전달하는 방법을 알고싶다면 2편을 참고하면 도움이 될 것이다.

 

2022.01.04 - [프로그래밍/SPRING 입문] - JAVA 객체를 camel case나 snake case로 변경 (2)

 

JAVA 객체를 camel case나 snake case로 변경 (2)

지난 글에서는 camel case로 받고, snake case json String으로 전달하는 방법에 대해 작성했다면 이번 글은 camel case로 받고 snake case로 전달하는 방법을 작성하려고 한다. 물론 반대로 가능하다. 1편 보러

aandi.tistory.com

 



나 같은 경우는 클라이언트로부터 camel case로 받고, db로 전달할 때는 snake case json String으로 전달해줘야하는 경우가 있었다.


처음에는 @JsonNaming과 @JsonProperty를 사용하려고 했는데 같은 객체에 대해서 요청과 응답을 다르게 설정할 수 없다는 단점이 있었다.
즉, @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy::class) 이러한 어노테이션을 class에 설정한다면
파라미터를 받을 때도, 응답으로 보낼때도 snake case로 할 수 밖에 없었다.

 

@JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy::class)
public class User{
	private String userId;
	private String userName;
}

위와 같은 설정은 user_id 나 user_name을 키값으로 요청을 받고, 응답을 보낼 수 있지만

user_id / user_name으로 요청을 받고, 다시 userId / userName 형태의 json string으로 응답을 보내거나 할 수 없다.

 

하지만! 구글링으로 좀 더 찾아보니 jackson의 ObjectMapper 를 사용하면 손쉽게 변경할 수 있었다.

jackson을 사용하기 위해서는 dependencies를 추가해야한다.

다만, spring boot을 사용하고 있다면 따로 추가할 필요는 없다.

 

jackson의 ObjectMapper 객체를 사용해서 네이밍을 변경해보자

 

 

 

1) camel case 객체 -> snake case JSON 문자열

 

//요청

[POST] localhost:8080/test
application/json

{
    "userName" : "testname",
    "userId" : "testid"
}

//코드

package com.example.excepTest.JsonTest;

import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class JsonDTO {
    private String userName;
    private String userId;
}
package com.example.excepTest.JsonTest;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import lombok.SneakyThrows;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class JsonController {

    @PostMapping("/test")
    @SneakyThrows
    public void test(@RequestBody JsonDTO req) {
        System.out.println(req); //JsonDTO(userName=testname, userId=testid)
        ObjectMapper objectMapper = new ObjectMapper()
        	.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
        System.out.println(objectMapper.writeValueAsString(req));//{"user_name":"testname","user_id":"testid"}
    }
}

요청은 camel case로 보냈고

camel case로 된 객체를 snake case의 json String 으로 변환했다.

 

ObjectMapper 를 이용해서 객체를 String 형태로 변환할 수 있는데

이때 ObjectMapper의 naming 형식을 snake로 바꾸면 json String을 snake case로 설정할 수 있다.

 

ObjectMapper objectMapper = new ObjectMapper()  .setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);

 

 

반응형
Comments