[Spring Boot] 스프링 부트 롬복

2020. 9. 15. 17:55Spring/Spring Boot

1. 롬복 (Lombok)

1) 롬복 설치

롬복은 자바 개발자의 필수 라이브러리로, 자주 사용하는 Getter, Setter,기본 생성자, toString, 등을 어노테이션으로 자동 생성해준다. 롬복을 사용하기 위해 롬복 플러그인과 프로젝트 build.gradle 파일의 dependencies 의존성을 추가하고 Load 하여 라이브러리를 받는다. 플러그인은 한번만 다운받으면 되지만, build.gradle에 라이브러리를 추가하는 것과 'Enable annotation procession' 설정을 프로젝트마다 적용해주어야 한다.

compile('org.projectlombok:lombok')

build.gradle, Preference

2) 롬복 리팩토링

기존 코드를 롬복으로 전환하고 테스트 코드로 전환하면서 생기는 문제를 확인할 수 있다. web 패키지 하위에 모든 응답을 처리하는 dto 패키지를 추가하고 HelloResponseDto를 생성한다.

어노테이션 및 코드 설명
@Getter 선언된 모든 필드의 get 메서드를 생성해준다.
@RequiredArgsConstructor final 필드로 선언된 필드가 포함된 생성자를 생성해준다.
package com.springbook.biz.web.dto;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public class HelloResponseDto {

    private final String name;
    private final int amount;
}

HelloResponseDto.java

3) Dto 테스트 코드

동일하게 dto 패키지와 HelloResponseDtoTest 클래스를 생성해준다.

어노테이션 및 코드 설명
assertThat assertj 테스트 검증 라이브러리의 검증 메서드이다. 검증하고 싶은 대상을 메서드 인자로 받고 메서드 체이닝이 지원되어 isEqualTo와 같이 메서드를 이어서 사용이 가능하다.

※ JUnit에도 assertThat을 지원하나 assertj를 사용하는 이유는 is()와 같은 CoreMatchers 라이브러리가 불필요하며, 자동완성이 확실하게 지원되기 때문이다.

package com.springbook.biz.web.dto;

import org.junit.Test;

import static org.assertj.core.api.Assertions.assertThat;

public class HelloResponseDtoTest {

    @Test
    public void lombokTest() {
        // 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);
    }
}

HelloResponseDtoTest.java

테스트 실패 , 'gradle/wrapper/gradle-wrapper.properties' 파일의 distributionUrl의 Gradle 버전이 5인지 확인해본다. 버전이 5일 경우나 그 상위 버전일 경우, 프로젝트의 루트 디렉토리 터미널에서 4.10.2 버전으로 수정 명령어를 적용한다. 적용이 완료될 경우, 프로젝트의 Gradle 버전이 변경이 되었는지 확인한다. (Gradle 5 버전으로 상향 되면서 롬복 설정이 변경이 되었다.)

./gradlew wrapper --gradle-version 4.10.2

gradle-wrapper.properties

4) Controller 수정

테스트를 통해 롬복 어노테이션이 정상적으로 동작할 경우 ResponseDto를 이용하여 HelloController를 수정해주고, HelloControllerTest에도 테스트 코드를 작성하고 확인한다.

어노테이션 및 코드 설명
@RequestParam 외부에서 API로 넘긴 파라미터를 가져오는 어노테이션이다.
package com.springbook.biz.web;

import com.springbook.biz.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);
    }
}

HelloController.java

5) Controller 테스트 코드

어노테이션 및 코드 설명
param API에 사용될 요청 파라미터로 String만 허용된다.
jsonPath JSON 응답을 필드별로 검증할 수 있는 메서드이다. $ 기준으로 필드명을 명시한다.
package com.springbook.biz.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.result.MockMvcResultMatchers.*;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*;

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HelloController.class)
public class HelloControllerTest {

    @Autowired
    private MockMvc mvc;

    @Test
    public void helloReturn() throws Exception {
        String hello = "hello";

        mvc.perform(get("/hello"))
                .andExpect(status().isOk())
                .andExpect(content().string(hello));
    }
    
    @Test
    public void hellodtoReturn() 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)));
    }
}

HelloControllerTest.java


[참고] 스프링 부트와 AWS로 혼자 구현하는 웹 서비스

728x90