SPRINGBOOT
[SPRINGBOOT] 롬복
킴크스
2022. 4. 5. 22:10
참조 : 스프링부트와 AWS로 혼자 구현하는 웹 서비스(이동욱 저)
1. 롬복 소개 및 설치
자바를 개발할 때 자주 사용하는 Getter, Setter, 기본생성자, toString 등을 어노테이션으로 자동 생성해준다.
build.gradle에 코드를 추가하여 롬복을 설치할 수 있다.
gradle 7 버전을 사용하고 있기 때문에 인터넷을 참조하였다.
(dependencies안에 추가한다.)
implementation('org.projectlombok:lombok')
testImplementation('org.projectlombok:lombok')
annotationProcessor('org.projectlombok:lombok')
testAnnotationProcessor('org.projectlombok:lombok')
gradle 새로고침 이후에는 settins > Build > Compiler > Annotation Processors 에서
Enable annotation processing에 체크를 해준다.
2. 롬복으로 전환하기
web 패키지 밑에 Dto 패키지를 생성한 후 DTO를 만들어준다.
package com.study.crystal.test.web.dto;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Getter // 선언된 모든 필드의 get 메소드를 생성해준다.
@RequiredArgsConstructor // 선언된 모든 final 필드가 포함된 생성자를 생성해준다.(final이 없으면 생성자 생성X)
public class HelloResponseDto {
private final String name;
private final int amount;
}
해당 dto에 대한 테스트 코드를 작성한다.
package com.study.crystal.test.web.dto;
import org.junit.Test;
import static org.assertj.core.api.Assertions.assertThat;
public class HelloResponseDtoTest {
@Test
public 롬복_기능_테스트(){
//given
String name = "test";
int amount = 1000;
//when
HelloResponseDto dto = new HelloResponseDto(name, amount);
//then
//assertThat을 통해 검증하고 싶은 대상을 메소드 인자로 받는다.
assertThat(dto.getName()).isEqualTo(name);
assertThat(dto.getAmount()).isEqualTo(amount);
}
}
메소드를 실행하면 테스트 코드 검증에 성공한다.
즉, 롬복의 기능이 정상적으로 작동한다는 의미이다.
이제 Controller에서도 Dto를 사용할 수 있도록 코드를 추가해준다.
package com.study.crystal.test.web;
import com.study.crystal.test.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
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);
}
}
name과 amount는 API를 호출하는 곳에서 보내는 값들이므로 이 API를 테스트할 코드를 테스트 코드로 작성한다.
package com.study.crystal.test.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.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.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.hamcrest.Matchers.is;
@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())
//json의 응답값을 필드별로 검증
// $ 를 기준으로 필드명 명시
.andExpect(jsonPath("$.name", is(name)))
.andExpect(jsonPath("$.amount", is(amount)));
}
}
테스트 코드를 실행하면 검증에 성공하는 것을 알 수 있다.
JSON이 리턴되는 API가 정상적으로 기능하는 것이다.