들어가기 전에
하기 포스팅은 스프링 부트와 AWS로 혼자 구현하는 웹 서비스(이동욱 저)를 공부하여 작성한 내용입니다.
롬복(lombok)
롬복은 자바 개발을 할 때에 자주 사용하는 코드인 Getter, Setter, 기본생성자, toString 등을 어노테이션으로 자동 생성해줍니다. Eclipse의 경우 롬복 설치가 번거로웠지만, IntelliJ에서는 플러그인을 이용해 손쉽게 설치가 가능합니다.
먼저 프로젝트에 롬복을 추가해보도록 하겠습니다. build.gradle에 하기와 같이 코드를 추가합니다. 그 후 Gradle을 리프레시하여 라이브러리(의존성)를 내려받습니다.
compile('org.projectlombok:lombok')
라이브러리 다운로드가 완료되면, 롬복 플러그인을 설치합니다. 기존에 .ignore 플러그인을 설치했을 때와 마찬가지로 단축키로 플러그인 Action을 검색합니다. 맥에서는 Command + Shift + A를 클릭하면 됩니다. plugins에서는 lombok을 검색하고 설치해주면 됩니다.
이때, 설치가 완료되면 인텔리제이를 재시작해야 합니다.
- 추가적으로, IntelliJ 2020.03 버전 이후부터는 롬복이 기본적으로 설치되어 있습니다.
롬복이 설치되면, 이제 프로젝트에서 롬복을 사용하도록 설정해주어야 합니다. IntelliJ IDEA > Preferences > Build, Execution, Deployment > Compiler > Annotation Processors 내의 Enable annotation processing을 체크합니다.
이제부터는 이 프로젝트에서 롬복을 사용할 수 있게 된 것입니다.
기존 코드 롬복(lombok)으로 전환하기
이전 포스팅에서 만들었던 Hello Controller 코드를 롬복으로 전환해보겠습니다. 이전 포스팅은 아래 url을 참고하시면 됩니다.
earth-95.tistory.com/79?category=915270
규모가 큰 코드라면, 롬복으로 전환하는 것이 어려울 수 있습니다. 하지만, 현재 코드의 경우는 작은 규모이기도 하고 test code 역시 작성해두었기 때문에 안심하고 전환을 진행할 수 있습니다.
먼저 web 패키지에 dto 패키지를 추가합니다. 모든 응답 dto는 이 dto 패키지에 추가할 것입니다. dto 패키지 내에 HelloResponseDto를 생성하고, 아래와 같이 코드를 작성해줍니다.
package com.earth.study.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이 없는 필드는 생성자에 포함되지 않습니다.
위에서 생성한 dto에 롬복이 잘 작동하는지 간단한 테스트 코드를 작성해보겠습니다.
test 패키지 내에 main 패키지와 동일하게 web 패키지 내에 dto 패키지를 생성하고, HelloResponseDtoTest 클래스를 생성합니다. 생성한 HelloResponseDtoTest 클래스에는 하기와 같이 소스 코드를 작성합니다.
package com.earth.study.springboot.web.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와 같은 메소드를 이어서 사용할 수 있습니다.
- isEqualTo
- assertj의 동등 비교 메소드입니다.
- assertThat에 있는 값과 isEqualTo의 값을 비교해서 같을 때만 성공입니다.
위 테스트 코드에서는, Junit의 기본 assertThat이 아닌 assertj의 assertThat을 사용했습니다. Junit과 비교했을 때의 assertj 장점은 아래와 같습니다.
- CoreMatchers와 달리 추가 라이브러리가 필요하지 않습니다.
- Junit의 assertThat을 쓰게 되면 is()와 같이 CoreMatchers 라이브러리가 필요합니다.
- 자동완성이 좀 더 확실하게 지원됩니다.
- IDE에서는 CoreMatchers와 같은 Matcher 라이브러리 자동완성 지원이 약합니다.
위에서 작성된 테스트 메소드를 실행하면, 아래와 같은 결과를 확인할 수 있습니다.
위 테스트 메소드 실생시 발생 가능한 에러 : variable name not initialized in the default constructor
만약, 테스트 메소드 실행 시 하기와 같은 에러가 발생하면 두 가지 방법으로 해결할 수 있습니다.
해결 방안 1
build.gradle 내의 dependencies 부분에 annotationProcessor('org.projectlombok:lombok')를 추가하고 gradle을 refresh해줍니다.
해결 방안 2
gradle 버전을 4.10.2로 다운그레이드 합니다. 현재 공부하고 있는 책에서 사용하는 gradle 버전과 맞추기 위해 저는 방안 2를 택하여 진행했습니다.
IntelliJ 하단의 Terminal을 클릭(Option + F12)하고 ./gredlew wrapper --gradle-version 4.10.2를 실행하면 됩니다.
위 dto 테스트가 정상적으로 진행되었다면, 롬복의 @Getter로 get 메소드가 생성되고 @RequiredArgsConstructor로 생성자가 자동으로 생성되는 것을 알 수 있습니다.
이제 HelloController에도 새로 만든 ResponseDto를 사용하도록 코드를 추가해보겠습니다. 기존 코드에 /hello/dto 부분이 추가되면 됩니다.
package com.earth.study.springboot.web;
import com.earth.study.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
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);
}
}
- @RequestParam
- 외부에서 API로 넘긴 파라미터를 가져오는 어노테이션입니다.
- 여기서는 외부에서 name이란 이름으로 넘긴 파라미터를 메소드 파라미터 name에 저장하게 됩니다.
HelloController에서 받은 name과 amount는 API를 호출하는 곳에서 넘겨준 값들입니다. 따라서, HelloControllerTest 코드에 API 호출과 함께 파라미터를 넘겨보도록 하겠습니다. 기존 코드에 helloDto가_리턴된다 메소드를 추가하면 됩니다.
package com.earth.study.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만 허용되므로 int 타입인 amount는 String으로 변환해주어야 합니다.
- jsonPath
- JSON 응답값을 필드별로 검증할 수 있는 메소드입니다.
- $를 기준으로 필드명을 명시합니다.
'DEVELOPMENT TOOLS > IntelliJ' 카테고리의 다른 글
[IntelliJ] JAVA Usages 표시하는 법 (0) | 2022.10.28 |
---|---|
[IntelliJ] LiveTemplate을 활용해서 test 메소드 쉽게 만들기 (0) | 2021.10.30 |
[IntelliJ, Git] 빨간색으로 뜬 파일들 Git에 push & commit하기 (0) | 2021.09.18 |
[IntelliJ, Git] IntelliJ IDEA, Git 이용하여 springboot 프로젝트 생성 및 초기 설정하기(Gradle 사용) (0) | 2021.04.13 |
[IntelliJ] IntelliJ IDEA 설치하기 (0) | 2021.04.13 |