Lombok 추가

박찬미·2021년 4월 11일
0

Spring Boot

목록 보기
6/17

롬복은 Getter, Setter, 기본생성자, toString 등을 어노테이션으로 자동 생성해주는 아주 편한 라이브러리다.(그래도 이것만 쓰지 말고 실제로 다 해보고 써라)

롬복 설치하기

1. build.gradle dependency

compile('org.projectlombok:lombok')

위 코드를 추가한다.

2. 롬복 플러그인 설치

[Ctrl + Shift + A]로 액션창 열어서 plugins 검색하고 lombok 검색해 설치(나는 이미 설치되어 있어서 생략)

3. 롬복 설정

Enable annotation processing 체크
이제 롬복을 사용할 수 있다.

롬복은 프로젝트마다 설정해야 한다.
build.gradle 추가와 Enable annotation processing 체크는 매번 진행해야 한다.



롬복으로 리팩토링하기

롬복으로 변경하고 먼저 테스트 코드만 실행해봐야 한다.

1. HelloResponseDto 생성

web 패키지 아래에 dto 패키지 생성하고 HelloResponseDto 클래스를 생성해준다.

package com.springboot.example.ex1.web.dto;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

// 선언한 모든 필드의 get 메소드 생성
@Getter
// 선언된 모든 final 필드가 포함된 생성자 생성(final 없으면 제외)
@RequiredArgsConstructor
public class HelloResponseDto {
    
    private final String name;
    private final int amount;
}

2. HelloResponseDtoTest

package com.springboot.example.ex1.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
        // assertj라는 테스트 검증 라이브러리의 검증 메소드
        // 검증하고 싶은 대상을 메소드 인자로 받는다.
        // 메소드 체이닝이 지원되어 isEqualTo와 같이 메소드를 이어서 사용 가능
        assertThat(dto.getName()).isEqualTo(name);
        assertThat(dto.getAmount()).isEqualTo(amount);
        // isEqualTo는 assertj의 동등 비교 메소드로 값이 같으면 성공
        
        // getName()과 getAmount()는 어디서 왔나? 바로 롬복에서 자동으로 만들어준거
    }
}

JUnit의 assertThat말고 assertj 것을 이용했다.

와 롬복 적용 안 되고 파일 못찾고(excution 오류) 난리부르스였다. 결국 해결했다.
일단 그레이들 버전 안 맞는거는 gradlew wrapper --gradle-version 4.8로 바꾸고
file -> setting -> build, excution, deployment -> build toos -> build and run using, run test using을 IntelliJ IDEA로 바꾸어줬더니 해결!!
이헌주씨께 감사를 표합니당...

제대로 테스트가 완료되었다. 이렇게 생성자와 게터, 세터를 생성해주지 않았는데도, 제대로 작동하는 것을 볼 수 있었다.

HelloController에도 적용해보자!



3. HelloController

package com.springboot.example.ex1.web;

import com.springboot.example.ex1.web.dto.HelloResponseDto;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

// JSON을 반환하는 컨트롤러로 만들어준다.(API)
// 과거 @ResponseBody를 각 메소드마다 선언하지 않고, 한 번에 사용하는 거라고 보면 된다.
@RestController
public class HelloController {
    // Get 요청시 매핑되는 곳
    // 과거 @RequestMapping(method = RequestMethod.GET)
    @GetMapping("/hello")
    public String hello(){
        return "hello";
    }

    // RequestParam은 외부에서 API로 넘긴 파라미터를 가져오는 어노테이션(GET 할 때 넣는 파라미터
    @GetMapping("/hello/dto")
    public HelloResponseDto helloResponseDto(@RequestParam("name") String name,
                                             @RequestParam("amount") int amount){
        return new HelloResponseDto(name, amount);
    }
}

4. HelloControllerTest

package com.springboot.example.ex1.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.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
import static org.hamcrest.Matchers.is;

// 테스트를 진행할 때 JUnit에 내장된 실행자 외에 다른 실행자 실행(SpringRunner)
// 스프링 부트 테스트와 JUnit 사이의 연결자
@RunWith(SpringRunner.class)
// Web(Spring MVC)에 집중할 수 있는 스프링 테스트 어노테이션
// @Controller, @ControllerAdvice 등 사용 가능(@Service, @Component, @Repository 등 사용 불가)
@WebMvcTest(controllers = HelloController.class)
public class HelloControllerTest {
    // 빈 자동 주입(IoC)
    @Autowired
    private MockMvc mvc; // 웹 API 테스트시 사용(HTTP GET/POST 등 API 테스트 가능), 스프링 MVC 테스트 시작점

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

        // MockMvc를 통해 /hello 주소로 HTTP GET 요청
        // 여러 검증 기능 선언 가능
        mvc.perform(get("/hello"))
                // (결과 검증(상태 검증 = 200, 404, 500 등)
                // isOk는 200
                .andExpect(status().isOk())
                // 결과 검증(응답 내용 검증 = hello로 리턴되는지)
                .andExpect(content().string(hello));
    }

    @Test
    public void helloDto() throws Exception{
        String name = "hello";
        int amount = 1000;

        // .param은 API 테스트할 때 사용될 요청 파라미터 설정(String만 허용)
        // jsonPath는 JSON 응답값을 필드별로 검증할 수 있는 메소드($ 기준으로 필드명 명시)
        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))
        );

    }
}

제대로 된다.

0개의 댓글