[3] StringBoot, 롬복 플러그인 적용하기

도서, 스프링 부트와 AWS로 혼자 구협하는 웹 서비스(2019)를 토대로 공부한 내용입니다.

1. 롬복


: 자바 개발시 자주 사용하는 코드 Getter, Setter, 기본생성자, toString등을 어노테이션으로 자동 생성해줌

1.1. 의존성 코드 작성

build.grade > 의존성에 다음 코드 작성

        implementation('org.projectlombok:lombok')
    annotationProcessor('org.projectlombok:lombok')
    testImplementation('org.projectlombok:lombok')
    testAnnotationProcessor('org.projectlombok:lombok')

1.2. 롬복 플러그인

2021기준 최신판에서는 lombok이 이미 내장되어 있으니, 좌측창에서 검색

1.3. 롬복 설정

커맨드+, > annotation 검색 > Enable annotation processing 선택

  • 이 선택은 프로젝트마다 해주어야 함

2.1. 롬복으로 리팩토링하기

2.1. Dto패키지 > HelloResponseDto.java 작성

  • 앞으로 모든 응답 Dto를 이 패이지에 추가할 것
package dto;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter //선언한 모든 필드의 get메소드를 생성함
@RequiredArgsConstructor //선언한 모든 final 필드가 포함된 생성자를 생성함
public class HelloResponseDto {
        private final String name;
        private final int amount;
}
  • Getter, RequiredArgsConstructor 어노테이션에 집중

2.2. test>java> ... > HelloResponseDtoTest.java 작성

package com.kgyury.practice.springboot;
import dto.HelloResponseDto;

import lombok.RequiredArgsConstructor;
import org.junit.jupiter.api.Test;  // Junit5을 위해 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);

        // then
        assertThat(dto.getName()).isEqualTo(name); // asserThat = 테스트 검증 라이브러리(assertj)의 검증 메소드
        assertThat(dto.getAmount()).isEqualTo(amount);
    }
}

2.3. 실행결과 확인

정상 실행된 이유

  • 롬복의 @Getter를 통해 get메소드가 자동 생성되었기 때문
  • 롬복의 @RequiredArgsConstructor로 생성자가 자동 생성되었기 때문

 

3.1. 추가한 사항들 기존 파일에 추가하기

3.2. ‘web > HelloController’에 ResponseDto 적용

package com.kgyury.practice.springboot.web;

import 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";
    }

        //* Response Dto 적용
    @GetMapping("/hello/dto")
    public HelloResponseDto helloDto(@RequestParam("name") String name,
                                     @RequestParam("amount") int amount) {
        return new HelloResponseDto(name, amount);
    }
        //*/
}

3.3. ‘test>java>...>HelloControllerTest’ 에 추가

package com.kgyury.practice.springboot;

import org.junit.jupiter.api.Test;  // 1. Junit5을 위해 org.junit.Test로부터 대체
import org.junit.jupiter.api.extension.ExtendWith; // 1. Junit5를 위해 runner.RunWith로부터 대체

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit.jupiter.SpringExtension; // 1. junit5를 위해 junit4.SpringRunner로부터 대체
import org.springframework.test.web.servlet.MockMvc;

import static org.hamcrest.Matchers.is; // 2. 추가
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.jsonPath; // 2.추가
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@ExtendWith(SpringExtension.class)  //Junit5을 위해 Runwith, SpringRunner로부터 대체
@WebMvcTest
public class HelloControllerTest {
    @Autowired
    private MockMvc mvc;

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

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

    @Test
    public void helloDto가_리턴된다() 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)));
    }
}

3.3. 실행결과

0 containers and 1 tests were Method or class mismatch

= 테스트가 여러 개인데 하나만 실행했다는 경고일 뿐임