롬복(Lombok)이란?   

 

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

 


 

    롬복(Lombok) 플러그인 설치하기   

 

 롬복 플러그인을 설치하기 전에 build.gradle에 다음의 코드를 추가해야 한다.

 

 

 

 build.gradle에 코드를 추가했다면 맨 오른쪽에 Gradle 버튼을 누르고 아래 빨간색으로 표시된 새로고침 버튼을 눌러주어 라이브러리(의존성)를 내려 받는다.

 

 

 라이브러리를 다 받았다면 롬복 플러그인을 설치해야 한다. 윈도우는 [ctrl + shift + A], 맥은 [command + shift + A]를 눌러  Action 탭을 선택한다. 그리고 plugins를 검색하고 선택한다. 그 후 Marketplace 탭에서 "lombok"을 검색하고 [install] 버튼을 눌러 설치한다. 설치가 완료되면 아래 오른쪽에 팝업창이 뜨면서 Enable annotation processing이 뜬다. 클릭 해주고 인텔리제이를 재시작 해준다.

 

 

 만약 팝업창이 뜨지 않았다면 [File]-[Settings]-[Build, Execution, Deployment]-[Compiler]-[Annotation Processor]로 가서 [Enable annotation processing]에 체크를 해준다.

 

 


 

    기존 코드 롬복으로 리팩토링 하기   

 

 먼저, main 폴더의 web 패키지에 dto 패키지를 추가하고 HelloResponseDto를 생성하고 다음과 같이 코드를 작성한다.

 

 

package com.daldalhada.springboot.web.dto;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public class HelloResponseDto {
    private final String name;
    private final int amount;
}

 

 

1. @Getter

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

2. @RequiredArgsConstructor

  • 선언된 모든 final 필드가 포함된 생성자를 생성해 준다.
  • final이 없는 필드는 생성자에 포함되지 않는다. 

 

 

 그리고 잘 작동하는지 확인하기 위해 간단한 테스트 코드를 작성한다. test 폴더의 web 패키지에 dto 패키지를 추가하고 HelloResponseDtoTest를 생성하고 다음과 같이 코드를 작성한다.

 

 

 

package com.daldalhada.springboot.web.dto;

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

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

 

1. assertThat

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

2. isEqualTo

  • assertThat에 있는 값과 isEqualTo 값을 비교해서 같을 때만 성공한다.

※참고: 여기서 Junit의 기본 aseertThat이 아닌 assertj의 assertThat을 사용한 이유는 추가적인 라이브러리가 필요하지 않고 자동완성이 좀 더 확실하게 지원되기 때문이다. 

 

작성된 테스트 메소드를 실행해보면 정상적으로 기능이 수행되는 것을 알 수 있다. @Getter로 get 메소드가, @RequiredArgsConstructor로 생성자가 자동으로 생성되었다. 

 

 

 

이제 HelloController에도 새로 만든 ResponseDto를 사용하도록 코드를 추가한다.

 

package com.daldalhada.springboot.web;

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

 

1. @RequestParam

  • 외부에서 API로 넘긴 파라미터를 가져오는 어노테이션이다.
  • 여기서는 name이란 이름으로 넘긴 파라미터를 String name에 저장한다. amount도 마찬가지이다.

 

 이제 HelloController도 테스트를 하기 위해 HelloControllerTest에도 다음과 같이 코드를 추가한다. 

 

 

package com.daldalhada.springboot;

import com.daldalhada.springboot.web.HelloController;
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.*;

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

    @Autowired
    private MockMvc mvc;

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

        mvc.perform(get("/hello"))
                .andExpect(status().isOk())
                .andExpect(content().string(hello));
    }

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

 

1. param

  • API 테스트할 때 사용될 요청 파라미터를 설정한다. (단, 값은 String 값만 허용)
  • 따라서 숫자/날짜 등의 데이터도 문자열로 변경해야 한다.

2. jsonPath

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

 

 

 이제 추가된 API도 테스트를 실행해보면

 

 

 JSON이 리턴되는 API도 통과하는 것을 볼 수 있다.