본문 바로가기
공부 기록

[스프링 부트로 게시판 만들기] 02. Lombok(롬복) 설정

by 매트(Mat) 2021. 7. 18.

 

 

Lombok(롬복) 이란

  • Lombok(롬복)이란 Java 라이브러리로 반복되는 getter, setter, toString... 등의 반복 메소드 작성 코드를 줄여주는 코드 다이어트 라이브러리이다. (출처: https://cheershennah.tistory.com/183)
  • 자바 사용하시는 분들은 다 아시겠지만 클래스에서 private으로 선언된 변수들을 사용하기 위해 getter, setter를 주로 선언합니다. 하지만 매번 클래스마다 이를 선언해주는 것은 귀찮은 짓이라 이를 @어노테이션을 제공하고 있습니다. (@Getter, @Setter, @Data...)
  • 즉, Lombok은 @어노테이션 기반의 코드 자동생성을 통한 생산성 향상된다는 것이죠. (사용해보시면 직접 느끼실 겁니다 ㅎㅎ..)




Lombok(롬복) 설정

  • 먼저 intellij에서 Lombok을 사용하려면 lombok 플러그인을 설치해야 합니다.
  • Ctrl + Shift + A -> plugins -> Marketplace에서 lombok을 검색하여 install 해주시면 됩니다.
캡처
  • 마지막으로 File -> Settings -> annotaion 이라고 검색하여 빨간색 부분에 체크를 해줍니다.
  • 그러면 Lombok 세팅은 끝납니다.
캡처




Lombok(롬복) 테스트

  • 먼저 Lombok을 테스트를 하기 위해 의존성을 새로 추가해주어야 합니다.
dependencies {
    ...
    //롬복 설정 시작
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
    testCompileOnly 'org.projectlombok:lombok'
    testAnnotationProcessor 'org.projectlombok:lombok'
    //롬복 설정 끝
}



  • 그 다음으로 롬복 테스트를 위한 DTO를 생성합니다.
캡처
  • DTO를 담을 dto 패키지 생성 -> HelloResponseDto 클래스 생성

HelloResponseDto 클래스

package com.azurealstn.blogproject.dto;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public class HelloResponseDto {

    private final String name;
    private final String nickname;
}
  • @Getter : 선언된 모든 필드의 getter 메소드를 생성합니다.
  • @RequiredArgsConstructor : 선언된 모든 final이 붙은 필드가 포함된 생성자를 생성합니다.

 

HelloResponseDtoTest 클래스

package com.azurealstn.blogproject.dto;

import org.junit.jupiter.api.Test;

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

public class HelloResponseDtoTest {

    @Test
    public void 롬복_기능_테스트() {
        //given
        String name = "minsu";
        String nickname = "babo";

        //when
        HelloResponseDto helloResponseDto = new HelloResponseDto(name, nickname); //필드가 포함된 생성자를 만들어주었습니다.

        //then
        assertThat(helloResponseDto.getName()).isEqualTo(name); //get 메소드를 선언하지 않아도 getName()을 사용할 수 있습니다.
        assertThat(helloResponseDto.getNickname()).isEqualTo(nickname);
    }
}
  • assertThat : assertj라는 테스트 검증 라이브러리로 검증합니다. isEqualTo로 값을 비교합니다.
  • JUnit의 기본 assertThat이 아닌 assertj로 사용했다는 점을 주의해주세요.




HelloController에서도 DTO를 사용해보기

HelloController 클래스

package com.azurealstn.blogproject.controller;

import com.azurealstn.blogproject.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")
    ...

    @GetMapping("/hello/dto")
    public HelloResponseDto helloResponseDto(@RequestParam("name") String name, @RequestParam("nickname") String nickname) {
        return new HelloResponseDto(name, nickname);
    }
}
  • @RequestParam : 외부에서 API로 넘긴 파라미터(@RequestParam("name"), @RequestParam("nickname"))를 가져와 String name, String nickname에 각각 저장

 

HelloControllerTest 클래스

package com.azurealstn.blogproject.controller;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit.jupiter.SpringExtension;
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.*;

@ExtendWith(SpringExtension.class)
@WebMvcTest(controllers = HelloController.class)
public class HelloControllerTest {

    @Autowired
    private MockMvc mvc;

    @Test
    public void hello_Test() throws Exception {...}

    @Test
    public void helloDto_Test() throws Exception {
        String name = "minsu";
        String nickname = "babo";

        mvc.perform(
                get("/hello/dto")
                        .param("name", name)
                        .param("nickname", nickname))
                .andExpect(status().isOk())
                .andExpect(jsonPath("$.name", is(name)))
                .andExpect(jsonPath("$.nickname", is(nickname)));
    }
}
  • param : API 테스트할 때 요청 파라미터를 설정
    • 값은 String 값만 허용됩니다.
  • jsonPath : JSON 응답값을 필드별로 검증할 수 있는 메소드
    • $를 기준으로 필드명 명시



다음으로

  • 역시 테스트 코드까지 정상 동작한다면 롬복 설정까지 된 것입니다.
  • 다음 시간에는 데이터베이스 설정에 대해 알아보겠습니다.







References

댓글