on
[Spring] DTO와 롬복 만들고 적용하기
[Spring] DTO와 롬복 만들고 적용하기
이동욱 님의 스프링 부트와 AWS로 혼자 구현하는 웹 서비스책을 공부하며 정리한 내용입니다. 틀린 정보가 있을 수 있으니 주의하시고 댓글로 남겨주시길 바랍니다.
DTO란?
Data Transfer Object로, 계층간 데이터 이동을 위한 자바 Beans라고 이해하시면 됩니다.
package com.hwanld.book.springboot.web.dto; import lombok.Getter; import lombok.RequiredArgsConstructor; @Getter @RequiredArgsConstructor public class HelloResponseDto { private final String name; private final int amount; }
@Getter : 선언된 모든 필드의 get 메소드를 생성해 줍니다.
@RequiredArgsConstructor : 선언된 모든 final 필드가 포함된 생성자를 생성해 줍니다. 따라서 final이 없는 필드는 생성자를 생성하지 않습니다.
다음과 같이 해당 정보를 받을 필드 값을 저장하고, getter/setter 등을 포함한 클래스라고 생각하면 되는데, 일반적으로 DTO는 getter, setter, toString(), equals 외에 다른 로직을 갖고 있지 않습니다.
DTO에 적용한 롬복 테스트하기
위 코드에서 볼 수 있드시, DTO에 롬복을 적용해서 getter와 setter를 자동으로 생성해 주었습니다. 그러면 이러한 기능이 정상적으로 작동하는지를 확인할 수 있는 아래 테스트 코드를 추가합니다.
package com.hwanld.book.springboot.dto; import org.junit.Test; import static org.assertj.core.api.Assertions.assertThat; public class HelloResponseDtoTest { @Test public void 롬복_기능_테스트() { //given String name = "test"; int amount = 1000; //when HelloResponseDto dto = new HelloResponseDto(name, amount); //then assertThat(dto.getName()).isEqualTo(name); assertThat(dto.getAmount()).isEqualTo(amount); } }
assertThat : assertj라는 테스트 검증 라이브러리의 검증 메소드입니다. 검증하고 싶은 대상을 메소드 인자로 받고, 메소드 체이닝이 지원되어 이어서 다른 메소드를 사용할 수 있습니다.
isEqualTo : assertj의 비교 메소드입니다. assertThat에 있는 값과 isEqualTo의 값을 비교해서 같을 때만 성공입니다.
컨트롤러에서 롬복 사용하기
작성한 테스트 메소드를 실행해서 성공적인 결과를 얻었다면 dto에서 롬복이 정상적으로 작동하고 있다는 것을 알 수 있기에 컨트롤러도 dto를 사용하는 형태로 코드를 추가합니다.
package com.hwanld.book.springboot.web; import com.hwanld.book.springboot.dto.HelloResponseDto; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @GetMapping("/hello") public String hello() { return "hello"; } @GetMapping("/hello/dto") public HelloResponseDto helloDto(@RequestParam("name") String name, @RequestParam("amount") int amount) { return new HelloResponseDto(name, amount); } }
이어서, 위 메소드를 검증하기 위해서 테스트 코드도 추가적으로 작성해줍니다.
package com.hwanld.book.springboot.web; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.test.web.servlet.MockMvc; import static org.hamcrest.Matchers.is; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @RunWith(SpringRunner.class) @WebMvcTest(controllers = HelloController.class) public class HelloControllerTest { @Autowired private MockMvc mvc; @Test public void hello가_리턴된다() throws Exception { String hello = "hello"; mvc.perform(get("/hello")) .andExpect(status().isOk()) .andExpect(content().string(hello)); } @Test public void helloDto가_리턴된다() throws Exception { String name = "hello"; int amount = 1000; mvc.perform( get("/hello/dto") .param("name", name) .param("amount", String.valueOf(amount))) .andExpect(status().isOk()) .andExpect(jsonPath("$.name", is(name))) .andExpect(jsonPath("$.amount", is(amount))); } }
param : API 테스트할 때 사용될 요청 파라미터를 설정합니다. 단, 값은 String만 허용되기 때문에 숫자/날짜 등의 기타 데이터도 등록 시에는 모두 문자열로 변경해야만 가능합니다.
jsonpath : JSON 응답값을 필드별로 검증할 수 있는 메소드입니다. $를 기준으로 필드명을 명시합니다.
from http://hwanld.tistory.com/5 by ccl(A) rewrite - 2021-12-26 00:27:44