[스프링부트와 AWS로 혼자 구현하는 웹 서비스] 롬복 추가 및 테스트

세이라·2023년 7월 21일
0

스터디를 통해 스프링부트와 AWS로 혼자 구현하는 웹 서비스(저자 이동욱) 서적을 공부하는 중입니다.

공부/실습한 내용을 정리한 포스팅입니다.
책에 모르는 부분이 있으면 구글링하거나 챗gpt에 물어봐서 보충하였습니다.
(아직 초보라 모르는 부분이 많아 이것저것 다 적었습니다.)

참고한 사이트 출처는 포스팅 맨 하단에 적었습니다.

Lombok

자바 개발의 필수 라이브러리 롬복.
자주 사용하는 코드 Getter, Setter, 기본생성자, toString 등을 어노테이션으로 자동 생성.

설치 및 설정

  • build.gradle 의존성에 아래와 같이 작성(gradle 5.X 이상)
dependencies {
  compileOnly 'org.projectlombok:lombok'
  annotationProcessor 'org.projectlombok:lombok'
}

※ 참고 포스팅 : 스프링부트 롬복 @RequiredArgsConstructor 사용 시 에러 발생(variable name not initialized in the default constructor) + IntelliJ gradle 버전 확인

  • 플러그인의 경우, IntelliJ 2020.03 이후 버전에서는 기본 Plugin으로 Lombok이 설치되어 있음. 따로 설치하지 않아도 됨.

※ 플러그인 설치 이유 : 플러그인이 없어 빨간줄이 그어져도 빌드에 문제는 없지만, 자동완성 등 기능을 지원받기 위해 설치.

  • File>Settings>Build,Execution,Deployment>Compiler>Anntation Processor에서 Enable annotation processer에 체크를 해야 프로젝트에서 롬복을 사용할 수 있다고 하나...
    2020.03 버전 이후론 롬복 플러그인이 IntelliJ에 내장됨에 따라 체크하지 않아도 동작이 정상적으로 됨.(정상적으로 코드는 실행되지만 설정을 하라는 경고창이 출력이 됨)

코드 적용

1. HelloResponseDto 코드 작성

과정 및 코드

  1. web 패키지에 dto 추가
  2. HelloResponseDto 생성
  3. 아래와 같이 코드 작성
package com.webservice.springboot.springboot_board.web.dto;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public class HelloResponseDto {
    private final String name;
    private final int amount;

}

설명

  • @Getter : 선언된 모든 필드의 get 메서드 생성
  • @RequiredArgsConstructor : 선언된 모든 final 필드가 포함된 생성자 생성(final 없는 필드는 생성자에 포함X)

2. HelloResponseDtoTest 작성 후 실행(테스트)

코드

package com.webservice.springboot.springboot_board.dto;

import com.webservice.springboot.springboot_board.web.dto.HelloResponseDto;
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 : assertj라는 테스트 검증 라이브러리의 검증 메서드로, 검증받고 싶은 대상을 인자로 받음. 메서드 체이닝 지원.
  • isEqualTo : assertj의 동등 비교 메서드. assertThatisEqualTo와 비교하여 같을 때 테스트 성공.

※ JUnit의 기본 assertThat이 아닌 assertj의 assertThat 사용 이유

  • CoreMatchers와 달리 추가적으로 라이브러리가 필요하지 않음.(is())
  • 자동완성이 확실하게 지원됨(CoreMatchers와 같은 Matcher 라이브러리 자동완성 지원이 약함)

3. HelloController에 ResponseDto 사용하도록 코드 추가 후 테스트

HelloController 추가 코드

    @GetMapping("/hello/dto")
    public HelloResponseDto helloDto(@RequestParam("name") String name, @RequestParam("amount") int amonut){
        return new HelloResponseDto(name,amonut);
    }

HelloController 테스트 코드

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

설명

  • @RequestParam : 외부에서 API로 넘긴 파라미터를 가져오는 annotation. annotation을 적용한 매개변수에 값이 저장된다.
  • param : API 테스트 시 사용될 요청 파라미터 설정. 값은 String만 허용.
  • jsonPath : JSON 응답값을 필드별로 검증할 수 있는 메서드. $를 기준으로 필드명 명시.

※ DTO(Data Transfer Object) : 프로세스 사이에서 데이터를 전송하는 객체

출처

IntelliJ - Lombok 설치 방법 & 오류 해결
[Spring] IntelliJ Lombok Plugin 설치
인프런 질문-enable annotation processor에 체크가 안 되어있는데 롬복이 멀쩡히 잘 적용돼요
데이터 전송 객체(DTO) 정의 및 사용 방법

0개의 댓글