반응형
레거시 시스템중에선 클라이언트에서 변수가 팟홀(Pothole)표기법(언더바, 예를들면 customer_id 와 같은 방식)를 사용하고 있었다.
그러나 자바(서버)에서는 카멜식(customerId)를 사용하고 있기 때문에 화면에 전달할 때에는 자동으로 변환될 필요가 있었다.
그래서 찾아본 결과 @JsonProperty 를 이용하면 하나의 DTO에 설정이 가능하다.
해당 어노테이션을 사용하기 위해서는 com.fasterxml.jackson.core 패키지를 사용해야한다.
메이븐: https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-annotations
아래는 @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에 등록된 이름으로 내려와있다.
간혹 서버와 클라이언트간에 변수명이 다르게 설정되어 있는 경우도 있는데 응용하면 쉽게 변형이 가능하다.
끝.
반응형
'공부 > 프로그래밍' 카테고리의 다른 글
[spring] jpa와 mybatis 동시 사용시 transactinoManager (multi) 설정하기(xml) 및 내부 살펴보기 (2) | 2019.12.17 |
---|---|
[spring] LocalDateTime 주고받기(Response, Request) (0) | 2019.12.15 |
[spring, jpa] Could not build ClassFile 에러 (0) | 2019.11.27 |
[docker] 공유된 volume 에 접근이 안될 때 (0) | 2019.11.02 |
[test] nGrinder 설치 및 테스트환경 구축(mac) (0) | 2019.10.26 |
댓글