도서, 스프링 부트와 AWS로 혼자 구협하는 웹 서비스(2019)를 토대로 공부한 내용입니다.
1. 롬복
: 자바 개발시 자주 사용하는 코드 Getter, Setter, 기본생성자, toString등을 어노테이션으로 자동 생성해줌
1.1. 의존성 코드 작성
build.grade > 의존성에 다음 코드 작성
implementation('org.projectlombok:lombok')
annotationProcessor('org.projectlombok:lombok')
testImplementation('org.projectlombok:lombok')
testAnnotationProcessor('org.projectlombok:lombok')
1.2. 롬복 플러그인
2021기준 최신판에서는 lombok이 이미 내장되어 있으니, 좌측창에서 검색
1.3. 롬복 설정
커맨드+, > annotation 검색 > Enable annotation processing 선택
- 이 선택은 프로젝트마다 해주어야 함
2.1. 롬복으로 리팩토링하기
2.1. Dto패키지 > HelloResponseDto.java 작성
- 앞으로 모든 응답 Dto를 이 패이지에 추가할 것
package dto;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
@Getter //선언한 모든 필드의 get메소드를 생성함
@RequiredArgsConstructor //선언한 모든 final 필드가 포함된 생성자를 생성함
public class HelloResponseDto {
private final String name;
private final int amount;
}
- Getter, RequiredArgsConstructor 어노테이션에 집중
2.2. test>java> ... > HelloResponseDtoTest.java 작성
package com.kgyury.practice.springboot;
import dto.HelloResponseDto;
import lombok.RequiredArgsConstructor;
import org.junit.jupiter.api.Test; // Junit5을 위해 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); // asserThat = 테스트 검증 라이브러리(assertj)의 검증 메소드
assertThat(dto.getAmount()).isEqualTo(amount);
}
}
2.3. 실행결과 확인
정상 실행된 이유
- 롬복의 @Getter를 통해 get메소드가 자동 생성되었기 때문
- 롬복의 @RequiredArgsConstructor로 생성자가 자동 생성되었기 때문
3.1. 추가한 사항들 기존 파일에 추가하기
3.2. ‘web > HelloController’에 ResponseDto 적용
package com.kgyury.practice.springboot.web;
import 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";
}
//* Response Dto 적용
@GetMapping("/hello/dto")
public HelloResponseDto helloDto(@RequestParam("name") String name,
@RequestParam("amount") int amount) {
return new HelloResponseDto(name, amount);
}
//*/
}
3.3. ‘test>java>...>HelloControllerTest’ 에 추가
package com.kgyury.practice.springboot;
import org.junit.jupiter.api.Test; // 1. Junit5을 위해 org.junit.Test로부터 대체
import org.junit.jupiter.api.extension.ExtendWith; // 1. Junit5를 위해 runner.RunWith로부터 대체
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit.jupiter.SpringExtension; // 1. junit5를 위해 junit4.SpringRunner로부터 대체
import org.springframework.test.web.servlet.MockMvc;
import static org.hamcrest.Matchers.is; // 2. 추가
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; // 2.추가
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@ExtendWith(SpringExtension.class) //Junit5을 위해 Runwith, SpringRunner로부터 대체
@WebMvcTest
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)));
}
}
3.3. 실행결과
0 containers and 1 tests were Method or class mismatch
= 테스트가 여러 개인데 하나만 실행했다는 경고일 뿐임