본문 바로가기

기록/스프링 부트와 AWS로 혼자 구현하는 웹 서비스

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

728x90
SMALL

큰 규모의 프로젝트라도 롬복으로 전환 가능

-> 테스트 코드가 기존의 코드를 지켜주기 때문

 

web 패키지에 dto 패키지 추가 후 HelloReponseDto 생성

package com.jojoldu.book.springboot.web;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

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

    private final String name;
    private final int amount;

}

 

롬복이 잘 작동하는지 테스트 코드 작성

package com.jojoldu.book.springboot.web;

import org.junit.Test;

import static org.assertj.core.api.Assertions.assertThat; // Junit의 기본 assertThat이 아닌 assertj의 assertThat을 사용. assertj 역시 Junit에서 자동으로 라이브러리 등록을 해줌.

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); // assertj라는 테스트 검증 라이브러리의 검증 메소드. 검증하고 싶은 대상을 메소드 인자로 받는다. 메소드 체이닝 지원
        assertThat(dto.getAmount()).isEqualTo(amount); // isEqualTo : assertj의 동등 비교 메소드. assertThat에 있는 값과 isEqualTo의 값을 비교해서 같을 때만 성공


    }
}

 

HelloController에도 새로 만든 ResponseDto 사용하도록 코드 추가

package com.jojoldu.book.springboot.web;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController // JSON을 반환하는 컨트롤러로 만들어줌. @ResponseBody를 각 메소드마다 선언했던 것을 한번에 사용할 수 있게 해준다
public class HelloController {

    @GetMapping("/hello") // Http Method인 Get의 요청을 받을 수 있는 API를 만들어줌. 이 프로젝트는 /hello 로 요청이 오면 문자열 hello를 반환하는 기능을 가지게 되었다
    public String hello(){
        return "hello";
    }

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

 

추가된 API를 테스트하는 코드를 HelloControllerTest에 추가

package com.jojoldu.book.springboot;

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) //테스트를 진행할 때 JUnit에 내장된 실행자 외에 다른 실행자를 실행시킨다. 여기서는 SpringRunner라는 스프링 실행자를 사용. 즉, 스프링 부트 테스트와 JUnit 사이에 연결자 역할.
@WebMvcTest // Web(Spring MVC)에 지중할 수 있는 어노테이션. 선언할 경우 @Controller, @ControllerAdvice 등을 사용할 수 있다. (단, @Service, @Component, @Repository 등은 사용할 수 없다)
public class HelloControllerTest {

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

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

        // MockMvc를 통해 /hello 주소로 HTTP GET 요청을 한다. 체이닝 지원->아래와 같이 여러 검증 기능을 이어서 선언 가능
        mvc.perform(get("/hello"))
                .andExpect(status().isOk())
                .andExpect(content().string(hello));
        // mvc.perform의 결과를 검증. HTTP Header의 Status를 검증. 200,404,500 등의 상태 검증.(여기선 OK 즉, 200인지 아닌지 검증)
        // mvc.perform의 결과를 검증. 응답 본문의 내용을 검증. Controller에서 "hello"를 리턴하기 때문에 이 값이 맞는지 검증
    }

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

        mvc.perform(
                get("/hello/dto")
                        .param("name",name) // API 테스트할 때 사용될 요청 파라미터를 설정. 단, 값은 String일 때만 허용.
                        .param("amount", String.valueOf(amount))) // 숫자/날짜 등의 데이터도 등록할 때는 문자열로 변경해야 가능

                        .andExpect(status().isOk())
                        .andExpect(jsonPath("$.name",is(name))) // jsonPath : JSON 응답값을 필드별로 검증할 수 있는 메소드. $를 기준으로 필드명 명시.
                        .andExpect(jsonPath("$.amount", is(amount)));

    }
}

JSON이 리턴되는 API 정상적으로 테스트 통과 확인

728x90