본문 바로가기

우아한테크코스/코드 리뷰

지하철 3

이번 미션은 이어서 진행하는 지하철 미션이다.

레벨 2의 마지막 미션인 만큼 배울 내용이 많았다.

  • API 테스트
  • 문서 자동화
  • 로그인 프로세스

처음 배우는 내용들이라 머릿속에서 완벽히 정리되지 않았다.
글을 쓰며 차근차근 정리해보려 한다!

API 테스트

  1. API의 명세를 검증하기 위한 테스트
  2. 기능의 전체적인 흐름을 검증하는 인수 테스트와 달리 특정 api의 요청과 응답을 검증하기 위함
  3. 문서 자동화를 위해 사용 가능

Spring에서 API 테스트 서버를 설정하는 방법 두 가지

@SpringBootTest

  • 실제 서버 환경과 동일한 설정(스프링 빈 전체를 활용 가능)
  • 시간이 오래걸릴 수 있다는 단점이 있다.

@WebMvcTest

To test whether Spring MVC controllers are working as expected, use the @WebMvcTest annotation. @WebMvcTest auto-configures the Spring MVC infrastructure and limits scanned beans to @Controller, @ControllerAdvice, @JsonComponent, Converter, GenericConverter, Filter, WebMvcConfigurer, and HandlerMethodArgumentResolver. Regular @Component beans are not scanned when using this annotation.

  • @Contoroller, @ControllerAdvice, @JsonComponent, Converter, GenericConverter, Filter, WebMvcConfigurer, HandlerMethodArgumentResolver 만 스캔한다. @Component는 스캔하지 않는다.
  • 위의 것들 외의 빈을 참조하는 경우 Mock 객체를 사용해야 하기 때문에 번거롭지만 @SpringBootTest에 보다 빠르다.

테스트 시 자원을 아끼는 것은 중요하지만 Web과 관련된 부분을 테스트 한다고 무조건 @WebMvcTest를 사용할 필요는 없다. Controller가 참조하고 있는 많은 빈들을 전부 Mock 객체로 만드는 비용을 생각하면 전체 빈을 사용하는게 좋을 수도 있다.

자주 사용하는 테스트 클라이언트 두 가지

  1. RestAssured
    실제 요청을 위해 사용하기 좋다.
public MemberResponse myInfoWithSession(String email, String password) {
    return
            given().
                    auth().form(email, password, new FormAuthConfig("/login", "email", "password")).
                    accept(MediaType.APPLICATION_JSON_VALUE).
            when().
                    get("/me/session").
            then().
                    log().all().
                    statusCode(HttpStatus.OK.value()).
                    extract().as(MemberResponse.class);
}
  1. MockMvc
    Presentation Layer를 테스트하기 유리, session등에서 세밀한 설정이 가능하기 때문
public void myInfoWithSession() throws Exception {
    String content = this.mockMvc.perform(get("/me/session")
            .session(new MockHttpSession())
            .accept(MediaType.APPLICATION_JSON))
            .andExpect(status().isOk())
            .andReturn().getResponse().getContentAsString();
}

문서 자동화 도구 두 가지

Swagger

  • API를 call하는 테스트 기능에 특화
  • 비개발직군 입장에서는 Spring Rest Docs보다 가독성이 좋음
  • Spring Rest Docs보다 기능이 많다.
  • 프로덕션 코드를 오염시킨다.

Spring Rest Docs

  • 테스트 코드에 작성하므로 프로덕션 코드 오염 적음
  • Swaager의 API call 기능은 intelliJ(local)에서 Http Request하는 기능을 사용하여 대체

미션을 통해 API 테스트와 문서 자동화를 적용해보고 로그인 프로세스도 적용해보았다.

로그인 프로세스는 2019년에 JWT를 적용하면서 고생했던 기억이 있어서 이해하기 수월했다.

코드 리뷰 받은 것들을 정리해보자!


테스트 코드를 작성하면서 의미 없다는 생각이 자주 들었었다. 테스트 결과가 뻔한... 그런 테스트들을 작성하면서 말이다. 그래도 리뷰어님의 답변을 받고, 내가 작성한 코드가 잘 작동하는지.. 예외를 잘 뱉는지는 테스트 해주는게 옳은 일이라고 생각했다. 내가 작성한 코드는 책임감을 가지고 테스트하는게 맞다. 꼼꼼히 테스트하는 습관을 들이자.


항상 쿼리를 최소한으로 날리는게 참 중요한데, 편하게 코딩하려고 이를 무시했던 경향이 있다. 습관을 잘 들여야겠다.. 쿼리는 항상 최소한으로 날리려고 노력하자.


이번 미션에서는 코드 리뷰를 통해서는 많은 학습을 하지 못했지만, 페어와 미션을 진행하며 작성했던 코드에서 학습할 것이 아직 많이 남아있다.

새로운 것을 배우는 것도 참 중요하지만, 배운 것을 깊이있게 확실히 아는것도 중요하다고 생각한다. 내가 확실히 알지 못하면 금방 까먹는 사람이라 그런 것 같다.

'우아한테크코스 > 코드 리뷰' 카테고리의 다른 글

점진적인 리팩토링  (0) 2020.12.23
지하철 2  (0) 2020.05.13
지하철 1  (0) 2020.05.10
체스 게임 3  (0) 2020.05.05
체스 게임 2  (0) 2020.04.25