티스토리 뷰

WEB

[Spring Boot] 롬복(Lombok) 설치하기

다스리 2020. 1. 10. 01:26

롬복(Lombok)은 어노테이션(@)을 통해 특정 메소드를 자동으로 생성해주는 라이브러리입니다.

Getter/Setter, 생성자, toString(), close() 등등..의 함수들을 어노테이션으로 생성할 수 있고,
Getter/Setter의 경우, 실제로 작성되는 부분이 없어서 코드가 간결해지고, VO에 멤버가 추가or삭제될 때도 자동으로 Getter/Setter를 추가or삭제 해준다는 장점이 있습니다.

VO 클래스에 멤버를 추가하거나 멤버 변수명을 변경할 때마다 Getter/Setter를 수정하던 번거로움을 제대로 줄여주는 라이브러리입니다 ㅎㅎ


build.gradle을 수정해서 프로젝트에 롬복을 추가하겠습니다.
build.gradle의 dependenciescompile('org.projectlombok:lombok) 코드를 추가합니다.(롬복을 사용하려는 프로젝트 마다 입력)

코드를 추가한 후, 오른쪽의 Gradle을 누르고 왼쪽 상단의 새로고침 버튼을 눌러 라이브러리를 다운받습니다.
잠시후 사진과 같이 lombok이 설치된 것을 확인할 수 있습니다.

Command+Shift+A(윈도우: ctrl + Shift + A) 키를 누르고 plugings를 검색합니다.
그다음 lombok을 검색하고, 설치 후 인텔리제이를 재시작합니다.



인텔리제이가 다시 켜진 후, 오른쪽 하단의 에러에서 파란색 글씨로 된 부분을 클릭, Enable annotation processing을 체크합니다.(롬복을 사용하려는 프로젝트마다 설정)



이제 지난 포스팅에서 작성했던 HelloController를 롬복으로 리팩토링 해보겠습니다~!
controller를 롬복으로 변경한 후, 테스트 코드를 이용해 문제가 없는지 확인하는 순서로 진행하겠습니다.

우선, web패키지(/src/main/java/com.test.springboot/web)에 dto 패키지를 생성하고, HelloResponseDto 클래스를 생성합니다.
그리고 앞으로 모든 응답 DTO(Data Transfer Object)는 이 패키지에 추가하겠습니다.
다음과 같이 코드를 수정합니다.


package com.test.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 없는 필드는 생성자에 포함 X)

 

Dto에 적용한 롬복이 제대로 작동하는지 테스트하기 위해, 테스트 코드를 작성하겠습니다.
/src/test/java/com.test.springboot/ 아래에 dto 패키지를 생성하고, HelloResponseDtoTest 클래스를 생성합니다.
그리고 다음과 같이 코드를 작성합니다.


package com.test.springboot.dto;

import com.ssafy.gdd.web.dto.HelloResponseDto;
import org.junit.Test;

import static org.junit.Assert.assertThat;

public class HelloResponseDtoTest {

    @Test
    public void testLombok(){
        // 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라는 테스트 검증 라이브러리의 검증 메소드. 검증하고자 하는 대상을 인자로 받음

 

테스트 코드를 실행했는데... 띠용 에러가 발생했습니다ㅠㅠ

error: variable name not initialized in the default constructor
검색해보니, build.gradle의 dependencies에 다음과 같은 코드를 추가해주면 된다고 해서 바로 수정!


testCompile('org.projectlombok:lombok')
annotationProcessor('org.projectlombok:lombok')
testAnnotationProcessor('org.projectlombok:lombok')

무사히 테스트를 통과한 것을 확인할 수 있습니다 ㅎㅎ

기존처럼(단축키나 메뉴로 Getter/Setter, 생성자 추가) 코딩을 하지 않았는데도 @Getter, @RequiredArgsConstructor를 사용한 것 만으로 Gettet/Setter, 생성자가 정상적으로 동작하는 것을 확인했습니다!


그럼 ResponseDto를 HelloController에서도 사용해보겠습니다.
다음 코드를 HelloController에 추가합니다.
HelloResponseDto()는 외부로부터 name과 amount 값을 전달받아 HelloResponseDto객체를 생성해 반환하는 함수입니다.

@GetMapping("/hello/dto")
    public HelloResponseDto helloDto(@RequestParam("name") String name, @RequestParam("amount") int amount){
        return new HelloResponseDto(name, amount);
    }
  • @RequestParam: 외부에서 API로 전달한 파라미터(name, amount라는 이름으로 넘어옴)를 가져오는 어노테이션. 가져온 파라미터를 뒤에 나오는 변수(String name, int amount)에 저장

그다음 방금 작성한 HelloResponseDto를 테스트하는 코드를 HelloControllerTest에 작성하겠습니다.

@Test
    public void testHelloDto() 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만 허용 -> String.valueof() 사용)
  • jsonPath: JSON 응답값을 필드별로 검증할 수 있는 메소드($을 기준으로 필드명 명시)

여기서, is()에서 cannot find symbol과 같은 에러가 나타난다면, import static org.hamcrest.Matchers.is; 를 추가해줍니다.

서버가 실행되고, 테스트 코드가 테스트를 통과한 것을 확인할 수 있습니다~
JSON이 반환되는 API도 문제없이 작동되는 것을 확인했습니다.

아직은 하나하나 배우고, 이해하면서 코드를 작성하느라 전보다 복잡하고 어려운 느낌이지만..
이런 부분들(테스트 코드를 통한 메소드 동작 확인과 롬복)이 점점 커지는 프로젝트에서 활용되면 정말정말 편해질 것 같다는 생각이 들기 시작했습니다 ㅎㅎ
(테스트 코드 작성은 일을 두 번 하는 것 같지만,,, 그래도 postman 켜고 서버돌리고 하는것 보단 나은 것 같습니당ㅎ-ㅎ)


*스프링부트와 AWS로 혼자 구현하는 웹 서비스(이동욱 지음) 책을 따라 공부하며 정리하는 포스트입니다.