- 서버/springboot

인텔리제이 롬복 추가하기

더모어더베러 2024. 1. 1. 15:09

이번엔 알아볼 내용은 자바 개발자들의 필수 라이브러리인 롬복 (Lombok) 입니다. 

롬복은 자바 개발할 때 자주 사용하는 코드 Getter, Setter, 기본생성자, toString 등을 어노테이션으로 자동 생성해 줍니다.

 

그럼 먼저 프로젝트에 롬복을 추가해 보겠습니다.

 

build.gradle의 dependencies에  다음의 코드를 추가하여 라이브러리를 받아줍니다.

build.gradle

버전 Gradle 5.x 미만

implementation 'org.projectlombok:lombok'

 

버전 Gradle 5.x 이상

  compileOnly 'org.projectlombok:lombok'
  annotationProcessor 'org.projectlombok:lombok'

 

 

gradle 버전을 모르겠다면 아래처럼 확인해주시면 됩니다.

 

File탭 > Settings 를 켜주고

Build, Execution, Deployment 탭 > Build Tools > Maven > Gradle 을 켜줍니다.

Use Gradle from 을 'gradle-wrapper.properties' file 을 선택해줍니다.

 

이제 gradle > wrapper > gradle-wrapper.properties 파일에 들어가서 버전을 확인해줍니다.

 

gradle 버전에 맞게 lombok 라이브러리를 추가하였다면 테스트코드를 통해 제대로 동작 하는지 확인해보겠습니다.

 

HelloResponseDto 코드를 작성합니다.

HelloResponseDto.class

import lombok.Getter;
import lombok.RequiredArgsConstructor;

// @Getter : 선언된 모든 필드의 get 메소드를 생성해 줍니다
// @RequiredArgsConstructor : 선언된 모든 final 필드가 포함된 생성자를 만들어줍니다. final이 없는 필드는 생성자에 포함되지 않습니다.
@Getter
@RequiredArgsConstructor
public class HelloResponseDto {

    private final String name;
    private final int amount;
}

롬복의 어노테이션 2개를 추가 해줬습니다.

 

@Getter

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

 

@RequiredArgsConstructor

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

 

다음 테스트 코드로 생성자와 getter 자동생성이 잘되었는지 확인해보겠습니다.

 

HelloResponseDtoTest.class

import org.junit.Test;

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

public class HelloResponseDtoTest {

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

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

        assertThat(dto.getName()).isEqualTo(name);
        assertThat(dto.getAmount()).isEqualTo(amount);
    }
}

 

제가 생성자를 만들지 않았지만 롬복이 자동으로 만들어줘 new HelloResponseDto(name, amount); 사용이 가능합니다.

 

assertj라는 테스트 검증 라이브러리 메소드 입니다. 검증하고 싶은 대상을 assertThat() 인자로 넣어줍니다. assertThat에 있는 값과 isEqualTo의 값을 비교해서 같을때만 성공입니다. 

 

dto.getName() 우리가 직접 만들지 않고 롬복이 자동으로 만들어준 getter 메소드 입니다. 롬복이 만들어준 getter 메소드가 잘 동작 하는지를 확인하기 위해 assertThat에 getter로 리턴받은 값과 isEqualTo 값을 비교해 줍니다.

 

여기서 Junit의 기본 assertThat이 아닌 assertj의 assertThat을 사용했습니다. assertj를 사용한 장점으론 다음과 같은 이유가 있습니다. 

1. 추가적인 라이브러리가 필요하지 않습니다.
2. 자동완성이 좀 더 확실하게 지원됩니다.

 

테스트 코드를 실행시키면 테스트가 통과되어 롬복이 잘 동작함을 확인할 수 있습니다.

 

 

 

자 그럼 HelloController에도 새로 만든 ResponseDto를 사용해 보겠습니다.

HelloController.class
import jdh.testspringinit.web.dto.HelloResponseDto;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
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("/hello2/dto")
    public HelloResponseDto helloDto(@RequestParam("name") String name, @RequestParam("amount") int amount) {
        return new HelloResponseDto(name, amount);	// json 리턴
    }
}

@RequestParam

  • /hello2/dto?name=yum&amount=20
  • 위처럼 요청이 들어오면, name=yum, amount=20이 바인딩 됩니다
  • @RequestParam(”name”) String name
  • 위의 경우 url에서 name으로 받은 파라미터가 name 변수에 저장됩니다

 

 

HelloControllerTest.class
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)    // SpringRunner라는 스프링 실행자를 사용합니다. 즉 스프링 부트 테스트와 JUnit 사이에 연결자 역할을 합니다.
@WebMvcTest(controllers = HelloController.class)
public class HelloControllerTest {

    @Autowired  // 스프링이 관리하는 빈(Bean)을 주입 받습니다.
    private MockMvc mvc;    // 스프링 MVC테스트의 시작점. 이 클래스를 통해 HTTP GET,POST 등에 대한 API 테스트를 할 수 있습니다

    @Test
    public void helloDto가_리턴된다() throws Exception {
        String name = "hello";
        int amount = 1000;

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

}

.param()

API 테스트 할때 사용될 요청 파라미터를 설정합니다. name, amount 파라미터에 hello, 1000의 값을 설정합니다.

.param("name", ) 여기서 name 파라미터는 HelloController.class 의 @RequestParam("name") 로 들어갑니다.

단 값은 string만 허용되기 때문에 숫자/날짜 등의 데이터를 등록할때도 문자열로 변경해야 합니다.

 

jsonPath

JSON 응답값을 필드별로 검증할 수 있는 메소드 입니다.

$.name, $.amount를 name,amount 와 같은지 검증하여 롬복을 검사 합니다.

$를 기준으로 필드명을 명시합니다. jsonPath("$.name", ) 여기서 name는 HelloResponseDto.class 에 저장되는 변수명인 name을 응답 받는것 입니다.

 

테스트코드를 실행하면 JSON이 리턴되는 API가 정상적으로 테스트 통과 된것을 확인할수 있습니다.

 

 

 

 

 

참고자료 : 이동욱님의 '스프링 부트와 AWS로 혼자 구현하는 웹서비스' 서적