🌱JAVA/Spring

[Spring Boot] 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - 04

뉴발자 2022. 11. 11.
728x90

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Lombok

 

 

 

 

롬복 소개 및 설치


 

롬복이란?

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

 


 

 

롬복 설치

롬복 의존성 코드 작성 및 설치

롬복 사용을 위한 의존성 코드 작성

 

우선 위의 화면처럼 build.gradle파일의 dependencies부분에 아래에 코드를 추가해준다.

 

dependencies {
    compile('org.springframework.boot:spring-boot-starter-web')

    compile('org.projectlombok:lombok')

    testImplementation('org.springframework.boot:spring-boot-starter-test')
}

 

교재에는 plugins에서 롬복을 따로 설치해주라고 하지만 IntelliJ 신규 버전을 다운로드 받았다면 따로 설치해줄 필요는 없다.

 

코드를 추가해줬다면 코끼리 모양을 눌러서 라이브러리를 다운로드한다.

 

롬복 라이브러리 다운로드 후 설정 화면

 

롬복 라이브러리의 다운로드가 완료되었다면 롬복에 대한 설정을 해주어야 한다.

 

[설정 -> 빌드, 실행, 배포 -> 컴파일러 -> 어노테이션 프로세서 -> 어노테이션 처리 활성화 체크 후 확인]

 

롬복은 프로젝트마다 설정해주어야 한다.

 

플러그인은 따로 설치하지않아도 되지만,

 

build.gradle에 라이브러리를 추가하는 것과

 

어노테이션 처리 활성화를 체크하는 것은 프로젝트마다 진행해야 된다.

 

 

 

 

Hello Controller 코드를 롬복으로 전환하기

먼저 'web'패키지에 'dto'패키지를 추가한다.

 

앞으로 모든 응답 'Dto'는 이 'Dto'패키지에 추가한다.

 

그리고 이 패키지에 'HelloResponseDto'를 생성해준다.

 

'web'패키지의 하위 패키지인 'dto'와 HelloResponseDto.java 클래스를 생성한다

 

생성한 자바 클래스에 아래와 같이 코드를 작성해준다.

 

package com.tistory.tlseoqja.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이 없는 필드는 생성자에 포함되지 않는다.

 

다음으로 Dto에 적용된 롬복이 잘 작동하는지 간단한 테스트 코드를 작성하겠다.

 

test폴더의 'web'패키지 안에 'dto'패키지를 만들고 HelloResponseDtoTest 자바 클래스 파일을 생성

 

아래와 같이 코드를 작성한다.

 

package com.tistory.tlseoqja.web.dto;

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);

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

}

 

! assertThat은 자동으로 import되지않으므로 직접 import를 작성해주어야 사용된다.

 


코드 설명

 

@assertThat

  • assertj라는 테스트 검증 라이브러리 검증 메소드
  • 검증하고 싶은 대상을 메소드 인자로 받는다.
  • 메소드 체이닝이 지원되어 isEqualTo와 같이 메소드를 이어서 사용할 수 있다.

 

 

@isEqualTo

  • assertj의 동등 비교 메소드
  • assertThat에 있는 값과 isEqualTo의 값을 비교해서 같을 때 성공하는 메소드이다.

 

 

assertThat

  • jUnit의 기본 assertThat과 assertj의 assertThat이 있다.
  • 위 코드에선 기본 assertThat이 아닌 assertj의 assertThat을 사용했다.

 

 

assertj의 assertThat 사용시 장점

  • CoreMatchers와 달리 추가적으로 라이브러리가 필요하지 않다.
  •  + Junit의 assertThat을 쓰게 되면 is()와 같이 CoreMatchers 라이브러리가 필요하다.
  • 자동완성이 조금 더 확실하게 지원된다.
  •  + IDE에서는 CoreMatchers와 같은 Matcher 라이브러리의 자동완성 지원이 약하다.

 

이제 롬복의 @Getter로 get 메소드가, @RequiredArgsConstructor로 생성자가 자동으로 생성된다.

 

'HelloController'에도 새로 만든 'ResponseDto'를 사용하도록 아래와 같이 코드를 추가해보겠다.

 

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }

    @GetMapping("/hello/dto")
    public HelloResponseDto helloDto(@RequestParam("name") String name,
                                     @RequestParam("amount") int amount) {

        return new HelloResponseDto(name, amount);
    }

}

 


코드설명

 

@RequestParam

  • 외부에서 API로 넘긴 파라미터를 가져오는 어노테이션
  • 이 코드에선 외부에서 name(@RequestParam("name"))이란 이름으로 넘긴 파라미터를 메소드 파라미터 name (String name)에 저장하게 된다.

 

그리고 추가된 API를 테스트하는 코드를 HelloControllerTest에 추가해준다.

 

package com.tistory.tlseoqja.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.*;
import static org.hamcrest.Matchers.is;

@RunWith(SpringRunner.class)
@WebMvcTest(controllers = HelloController.class)
public class HelloControllerTest {

    ...
    
    @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)));

    }

}

 

is() 메소드를 사용하려면 위쪽에 import를 직접 작성해서 사용해야 오류가 사라진다.

 


코드설명

 

@param

  • API를 테스트할 때 사용될 요청 파라미터를 설정한다.
  • 단, 값은 String만 허용된다.
  • 숫자/날짜 등의 데이터도 등록할 때는 문자열로 변경해야만 가능하다.

 

 

@jsonPath

  • JSON 응답값을 필드별로 검증할 수 있는 메소드
  • '$'를 기준으로 필드명을 명시한다.
  • 이 코드에서는 name과 amount를 검증하나 $.name, $.amount로 작성하여 검증한다.

 

코드의 작성이 완료되면 HelloControllerTest Class를 실행시키고 정상적으로 테스트가 통과하는 것을 확인하면 된다.

 

'hello_Dto가_리턴된다' 함수가 정상적으로 실행된다

 

 

이상으로 롬복의 적용 방법 및 테스트 코드 작성이 완료됐다.

 

 

 

다음번에는 스프링 부트에서 JPA로 데이터 베이스를 다루는 법을 포스팅 하겠다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90

댓글