본문 바로가기

스프링부트와 AWS로 구현하는 웹서비스

[스프링부트/AWS] 2장 스프링 부트에서 테스트 코드를 작성하자(2/2) - Lombok

- 룸복(Lombok) 소개 및 설치하기(자바 개발자들의 필수 라이브러리)

룸복은 자바 개발할 때 자주 사용하는 코드 Getter, Setter, 기본생성자, toString 등을 어노테이션으로 자동 생성해 줍니다. 이클립스의 경우 롬복 설치가 번거롭지만, 인텔리제이에선 플러그인 덕분에 쉽게 설정이 가능합니다.

 

※ IntelliJ 2020.2 버전과 Lombok은 호환이 안된다고합니다. 다른버전으로 진행해야한다고 하네요;

github.com/mplushnikov/lombok-intellij-plugin/issues/829#issuecomment-660442053

 

IntelliJ 2020.2 PluginException : Psi is outdated · Issue #829 · mplushnikov/lombok-intellij-plugin

Short description May be similar to another question #827 #821 Download log file Version information IDEA Version: IntelliJ IDEA 2020.2 Beta Build #IU-202.6250.13 JDK Version: IDE JDK: 11.0.7; VM: ...

github.com

1) 라이브러리 다운로드

compile('org.projectlombok:lombok')

build.gradle 의존성 추가 후 Reload All Gradle Projects(Gradle Sync)

2) 플러그 인 설치

검색 Ctrl + Shift + A(윈도우)에서 Plugins Action을 실행 시킨 후 Lombok 설치

Lombok install 후 restart IDE

3) Lombok 설정

Enable Annotation Processing 체크 후 Apply 클릭

룸복은 프로젝트마다 설정해야 합니다. 플러그인 설치는 한 번만 하면 되지만, build.gradle에 라이브러리를 추가하는 것과 Enable Annotation Processing를 체크하는 것은 프로젝트마다 진행해야 합니다.

 

- Hello Controller 코드를 롬복으로 전환하기

큰 규모의 프로젝트의 경우 롬복으로 전환하기 쉽지 않습니다. 왜냐하면 어떤 기능이 제대로 작동될지 안 될지 예측할 수 없기 때문입니다. 하지만, 테스트 코드를 작성했다면 문제를 예측하고 해결할 수 있습니다.

package 생성

package com.jordy.books.springboot.web.dto;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter //1)
@RequiredArgsConstructor // 2)
public class HelloResponseDTO {

    private final String name;
    private final int amount;

}

1) @Getter

  • 선언된 모든 필드의 get 메소드를 생성해 줍니다.

2) @RequiredArgsConstructor

  • 선언된 모든 final 필드가 포함된 생성자를  생성해 줍니다.

- Dto에 롬복이 잘 작동하는 지 테스트 코드 작성

package 생성

package com.jordy.books.springboot.dto;

import com.jordy.books.springboot.web.dto.HelloResponseDTO;
import org.assertj.core.api.Assertions;
import org.junit.Test;

public class HelloResponseDTOTest {

    @Test
    public void 룸복_기능_테스트(){
        //given
        String name = "test";
        int amount = 1000;

        //when
        HelloResponseDTO dto = new HelloResponseDTO(name, amount);

        //then
        Assertions.assertThat(dto.getName()).isEqualTo(name); // 1), 2)
        Assertions.assertThat(dto.getAmount()).isEqualTo(amount);
    }
}

1) assertThat

  • assertj라는 테스트 검증 라이브러리의 검증 메소드 입니다.
  • 검증하고 싶은 대상을 메소드 인자로 받습니다.
  • 메소드 체이닝이 지원되어 isEqualTo와 같이 메소드를 이어서 사용할 수 있습니다.

2) isEqualTo

  • assertj의 동등 비교 메소드 입니다.
  • assertThat에 있는 값과 isEqualTo의 값을 비교해서 같을 때만 성공입니다.

작성된 테스트 메소드 실행 시 에러가 발생할 경우 아래의 블로그를 확인해야 합니다.

책 제공 이슈 블로그

github.com/jojoldu/freelec-springboot2-webservice/issues/2

 

P74 테스트코드에서 에러가 발생합니다. · Issue #2 · jojoldu/freelec-springboot2-webservice

HelloResponseDtoTest.java에서 메소드 실행 시 아래와 같은 에러가 발생합니다. Testing started at 오후 11:08 ... Task :cleanTest UP-TO-DATE Task :compileJava FAILED C:\Users\ssooy\Desktop\dev\springboot-book\src\main\java\c...

github.com

 

저의 경우 IntelliJ 2020.2(현재는 Lombok 플러그인 이슈로 인한 2020.3으로 업그레이드함)에서 자동 세팅된 Gradle 버전 6를 사용하고 있어서 테스트코드에서 에러가 발생했었습니다. 그래서 Gradle 4.10.2로 다운 그레이드를 진행했습니다.

Gradle 4.10.2 다운 그레이드 진행
Terminal 열기, Alt + f12 (윈도우) 후 아래 명령어 실행

gradlew wrapper --gradle-version 4.10.2

 

위처럼 에러 해결 후 다시 테스트 메소드를 실행하면 정상적으로 되는 것을 확인 할 수 있습니다.

 

- HelloController(Test 포함)에서 ResponseDto를 사용하도록 코드 추가

1. HelloController

@GetMapping("hello/dto")
public HelloResponseDTO helloDto(@RequestParam("name") String name, @RequestParam("amount") int amount){// 1)
	return new HelloResponseDTO(name, amount);
}

1) @RequestParam

  • 외부에서 API로 넘긴 파라미터를 가져오는 어노테이션입니다.
  • 여기서는 외부에서 name (@RequestParam("name"))이란 이름으로 넘긴 파라미터를 메소드 파라미터 name(String name)에 저장하게 됩니다.

2. HelloControllerTest

import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static  org.hamcrest.Matchers.is;
...
    @Test
    public void helloDto가_리턴된다() throws Exception{
        String name = "hello";
        int amount = 1000;

        mvc.perform(
                    get("/hello/dto")
                        .param("name", name) // 1)
                        .param("amount", String.valueOf(amount)))
                    .andExpect(status().isOk())
                    .andExpect(jsonPath("$.name", is(name))) // 2)
                    .andExpect(jsonPath("$.amount", is(amount)));
    }

1) param

  • API 테스트할 때 사용된 요청 파라미터를 설정합니다.
  • 단, 값은 String만 허용됩니다.
  • 그래서 숫자/날짜 등의 데이터도 등록할 때는 문자열로 변경해야만 가능합니다.

2) jsonPath

  • JSON 응답값을 필드별로 검증할 수 있는 메소드입니다.
  • $를 기준으로 필드명을 명시합니다.
  • 여기서는 name과 amount를 검증하니 $.name, $.amount로 검증합니다.

3. API 테스트

dto API 테스트 결과

JSON이 리턴되는 API역시 정상적으로 테스트가 통과하는 것을 확인 할 수 있습니다.

url :  http://localhost:8080/hello/dto/?name=jordy&amount=1000

출처 :

jojoldu.tistory.com/463

 

[스프링 부트와 AWS로 혼자 구현하는 웹 서비스] 출간 후기

(출판사: 프리렉, 쪽수: 416, 정가: 22,000원) 서적 링크 오프라인 서점에는 2019.12.04 (수) 부터 올라갈 예정입니다. 강남 교보문고나 광화문 교보문고는 주말에도 올라올 순 있겠지만, 혹시 모르니

jojoldu.tistory.com