본문 바로가기
공부/프로그래밍

[spring] 데이터 변수명 변경하여 전달하기 (@JsonProperty 사용)

by demonic_ 2019. 12. 14.
반응형

 

레거시 시스템중에선 클라이언트에서 변수가 팟홀(Pothole)표기법(언더바, 예를들면 customer_id 와 같은 방식)를 사용하고 있었다.

그러나 자바(서버)에서는 카멜식(customerId)를 사용하고 있기 때문에 화면에 전달할 때에는 자동으로 변환될 필요가 있었다.

그래서 찾아본 결과 @JsonProperty 를 이용하면 하나의 DTO에 설정이 가능하다.

 

해당 어노테이션을 사용하기 위해서는 com.fasterxml.jackson.core 패키지를 사용해야한다.

메이븐: https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations

 

Maven Repository: com.fasterxml.jackson.core » jackson-annotations

Core annotations used for value types, used by Jackson data binding package. VersionRepositoryUsagesDate2.10.x2.10.1Central589Nov, 20192.10.0Central384Sep, 20192.10.0.pr3Central39Sep, 20192.10.0.pr2Central380Aug, 20192.10.0.pr1Central62Jul, 20192.9.x2.9.10

mvnrepository.com

 

 

아래는 @JsonProperty 를 사용하는 것과 아닌것의 비교샘플이다.

 

HelloDTO

@Getter @Setter
public class HelloDTO {

    private Long customerId;

    private String customerName;

    private String cellPhone;

    private LocalDate birthDay;

    private LocalDateTime registDate;


    public HelloDTO(Long customerId, String customerName, String cellPhone, LocalDate birthDay, LocalDateTime registDate) {
        this.customerId = customerId;
        this.customerName = customerName;
        this.cellPhone = cellPhone;
        this.birthDay = birthDay;
        this.registDate = registDate;
    }
}

HelloDTO2

@Getter @Setter
public class HelloDTO2 {

    @JsonProperty(value="customer_id")
    private Long customerId;

    @JsonProperty(value="customer_name")
    private String customerName;

    @JsonProperty(value="cell_phone")
    private String cellPhone;

    @JsonProperty(value="birth_day")
    private LocalDate birthDay;

    @JsonProperty(value="regist_date")
    private LocalDateTime registDate;

    public HelloDTO2(Long customerId, String customerName, String cellPhone, LocalDate birthDay, LocalDateTime registDate) {
        this.customerId = customerId;
        this.customerName = customerName;
        this.cellPhone = cellPhone;
        this.birthDay = birthDay;
        this.registDate = registDate;
    }
}

 

컨트롤러를 만들고 이 두개를 각각 호출해 보았다

@RestController
public class HelloController {

    @GetMapping("/hello1")
    public HelloDTO hello() {
        HelloDTO hello = new HelloDTO(1L
                , "아이유"
                , "01012345678"
                , LocalDate.now()
                , LocalDateTime.now());

        return hello;
    }


    @GetMapping("/hello2")
    public HelloDTO2 hello2() {
        HelloDTO2 hello2 = new HelloDTO2(2L
                , "백종원"
                , "01012345678"
                , LocalDate.now()
                , LocalDateTime.now());

        return hello2;
    }
}

테스트 작성

@WebMvcTest
public class HelloControllerTest {

    @Autowired
    WebApplicationContext context;

    private MockMvc mockMvc;

    @BeforeEach
    void init() {
        mockMvc = MockMvcBuilders.webAppContextSetup(context)
                .addFilter(new CharacterEncodingFilter("UTF-8", true))
                .build();
    }

    @Test
    public void hello1() throws Exception {
        //given
        String url = "/hello1";

        //when
        ResultActions resultActions = this.mockMvc.perform(get(url));

        //then
        MvcResult mvcResult = resultActions
                .andExpect(status().isOk())
                .andReturn();


        System.out.println(mvcResult.getResponse().getContentAsString());
    }

    @Test
    public void hello2() throws Exception {
        //given
        String url = "/hello2";

        //when
        ResultActions resultActions = this.mockMvc.perform(get(url));

        //then
        MvcResult mvcResult = resultActions
                .andExpect(status().isOk())
                .andReturn();


        System.out.println(mvcResult.getResponse().getContentAsString());
    }
}

 

hello1 결과

{"customerId":1,"customerName":"아이유","cellPhone":"01012345678","birthDay":"2019-12-14","registDate":"2019-12-14T06:34:20.0328"}

hello2 결과

{"customer_id":2,"customer_name":"백종원","cell_phone":"01012345678","birth_day":"2019-12-14","regist_date":"2019-12-14T06:34:20.092659"}

 

 

 

각각의 서비스를 보면 변수명이 바뀌어 있다. hello2를 보면 @JsonProperty에 등록된 이름으로 내려와있다.

간혹 서버와 클라이언트간에 변수명이 다르게 설정되어 있는 경우도 있는데 응용하면 쉽게 변형이 가능하다.

 

끝.

 

반응형

댓글