[springboot-webserivce] 롬복을 이용한 DTO 생성과 테스트
Updated:
[2020.12.28] 부터 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 책을 통해 스프링 공부를 시작했다.
공부한 내용을 글로 정리하려고 한다.
그래야 나중에 다시 찾아보며 공부 할 수 있을테니까 !!
🍢 DTO 클래스 생성
DTO 는 Data Transfer Object 로써 말 그대로 데이터들을 받아와 전송할 때 사용하는 객체를 의미한다.
DTO 클래스는 아무런 메소드를 가지지 않고 필드와 Get, Set 만 가지고 있다.
하지만 대부분 DB 에서 꺼낸 값을 가져오는 용도로 사용하기 때문에 값을 변경 할 일은 없어 Set 은 없다고 한다.
[Spring] GET API test 코드 작성 에 이어서 모든 응답에 대한 DTO 를 저장할 dto 패키지를 web 패키지에 생성한다.
그리고 name 과 amount 를 가져 올 DTO 클래스를 HelloResponseDto 이름으로 생성한다.
코드는 다음과 같다.
package com.boks.springboot.web.dto;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Getter // 선언된 모든 필드의 get 메소드 생성
@RequiredArgsConstructor // 선언된 모든 final 필드가 포함 된 생성자 생성
public class HelloResponseDto {
private final String name;
private final int amount;
}
DTO 는 분명히 Get 을 가지고 있어야 한다고 했는데 지금 클래스를 보면 아무런 메소드가 없다.
바로 롬복을 이용해 생성했기 때문이다.
어노테이션을 보면 @Getter, @RequiredArgsConstructor 가 있는데
각각 선언된 모든 필드의 get 메소드를 생성해주고, 선언된 모든 final 필드가 포함 된 생성자를 만들어 준다.
final 이 아닌 필드는 생성자에 추가하지 않는다.
물론 인텔리제이 자체도 Getter Setter 를 만들어 주지만 롬복을 사용하면 다른 것들도 어노테이션을 통해 생성 할 수 있다.
🍪 프로젝트에 롬복 적용하기
롬복은 모든 프로젝트에 적용 되는 것이 아니라 적용 하고 싶은 프로젝트에 적용을 해줘야 한다.
지금 하고있는 프로젝트에 롬복을 적용하기 위해 build.gradle 파일에 코드를 추가해 줘야한다.
프로젝트에 라이브러리를 추가하기 위해 dependencies 안에 compile(‘org.projectlombok:lombok’) 코드를 추가하자.
dependencies 를 실행하면 롬복 라이브러리를 받아온다.
그리고 플러그인에서 롬복을 검색 후 적용한 뒤 인텔리제이를 재시작 하면 된다.
재시작 하는 경우 Enable Annotation Processing 을 체크하라는 이벤트 로그가 나오니 꼭 체크하도록 하자.
🍯 롬복 적용 DTO 테스트
이제 @Getter 와 @RequiredArgsConstructor 어노테이션을 통해 잘 생성이 되는지 테스트 할 시간이다.
기존 테스트 코드를 작성할 때 와 같이 test 폴더에도 dto 패키지와 HelloResponseDtoTest 패키지를 만들자.
테스트 코드는 다음과 같다.
package com.boks.springboot.web.dto;
import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
public class HelloResponseDtoTest {
@Test
public void testLombokFunction() {
// 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 메소드를 통해 테스트를 하게 되는데 getName 과 name 이 같으면 테스트를 통과한다.
이때 JUnit 의 assertThat 을 사용하지 않고 assertj 의 것을 사용했는데 장점이 더 많다고 한다.
코드를 보면 name 과 amount 로 test, 1000 을 넘겨주어 dto 객체를 생성하게 된다.
그리고 get 을 통해 생성한 객체의 값을 가져온다.
이때 롬복을 통해 생성자와 get 이 잘 만들어졌다면 테스트는 통과 할 것이다.
결과는 통과!
🍧 API 생성 후 테스트
롬복을 통해 DTO 가 잘 생성 되는 것을 알았으니 API 를 만들어 테스트 할 시간이다.
[Spring] GET API test 코드 작성 에서 만든 HelloController 에 DTO 를 가져다 주는 API 를 만들자.
package com.boks.springboot.web;
import com.boks.springboot.web.dto.HelloResponseDto;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController // 컨트롤러를 JSON을 반환하는 컨트롤러로 만들어 줌.
public class HelloController {
@GetMapping("/hello") // GET 요청을 받을 수 있는 API를 만들어 줌.
public String hello() {
return "hello";
}
@GetMapping("/hello/dto")
public HelloResponseDto helloDto(@RequestParam("name") String name,
@RequestParam("amount") int amount) {
return new HelloResponseDto(name, amount);
}
}
127.0.0.1:8080/hello/dto 의 주소에 요청을 보내면 DTO 를 반환 해 주는 API 를 만들었다.
@RequestParam 을 통해 외부에서 API 에 넣어준 name, amount 를 통해 String name, int amout 에 저장 한다.
그리고 DTO 를 생성해 반환한다
API 를 만들었으니 테스트 코드를 통해 잘 동작하는지 확인해야 한다.
HelloControllerTest 파일에 이 테스트를 추가해 주도록 하자.
package com.boks.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) // 스프링 부트 테스트와 JUnit 사이의 연결자 역할
@WebMvcTest(controllers = HelloController.class) // 여러 스프링 테스트 어노테이션 중 web에 집중
public class HelloControllerTest {
@Autowired // 스프링이 관리하는 bean을 주입
private MockMvc mvc; // 웹 API를 테스트 하는 경우 사용, 테스트의 시작점
@Test
public void returnHello() throws Exception {
String hello = "hello";
mvc.perform(get("/hello")) // MockMvc를 통해 /hello 주소로 GET 요청
.andExpect(status().isOk()) // 이 요청의 상태를 검증, 이 경우 OK 즉 200 인지 확인
.andExpect(content().string(hello)); // GET을 통해 받은 값이 hello 인지 확인
}
@Test
public void returnHelloDto() throws Exception {
String name = "test";
int amount = 100;
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 에 test, 100 의 값을 전달 해 줄것이다.
여기서 String 의 값으로 밖에 전달을 할 수 없으니 꼭 String 으로 바꾸어 전달 해야한다.
우선 응답 코드가 200인지 확인을 하고 다음으로 jsonpath 를 통해 name, amout 값을 비교한다.
정상적으로 진행이 됐다면 API 에 test, 100 을 넘겨주어 DTO 를 생성하고 받아온 JSON 과 같은지 테스트 할 것이다.
결과는 통과!
📕 정리
롬복을 이용해 클래스를 쉽게 만들 수 있는 방법을 알게 됐다.
이를 통해 DTO 를 생성하고, 생성이 잘 되는지 테스트 코드를 통해 확인했다.
생성이 잘 되는지 확인했기 때문에 다음으로 DTO 를 반환하는 GET API 를 만들었다.
API 도 테스트 코드를 통해 정상 작동이 되는 것을 확인했다.
다음에는 드디어 데이터베이스를 연동하는 방법에 대해서 공부한다.
Leave a comment