Spring REST Docs

테스트 코드를 통한 API 문서 자동화 도구

REST Docs vs Swagger

REST Docs

장점

  • 테스트를 통과해야 문서가 만들어진다. -> 즉, 신뢰도가 높다

  • 프로덕션 코드에 비침투적이다. -> 문서 내부에서 프로덕션 코드를 실행시킬 수 없다

단점

  • 코드 양이 많다.

  • 설정이 까다롭다.

Swagger

장점

  • 적용이 쉽다.

  • 문서에서 바로 API 호출을 수행 해볼 수 있다.

  • UI 가 상대적으로 깔끔하다.

단점

  • 프로덕션 코드에 침투적이다.

  • 테스트와 무관하기 때문에 실제로 동작하는 것과 코드의 신뢰도가 떨어질 수 있다.

문서 선택 가이드

  • 문서를 보며 바로바로 API 를 호출해야 하는 상황이다 -> Swagger

  • 테스트가 더 중요하며 프로덕션 코드를 건드리지 않는 선에서 문서를 작성하고 싶다 -> REST Docs

REST Docs 를 만들기 위한 테스트 코드 작성 전 알아보기


REST Docs 를 사용하기 위해서 테스트 코드를 작성해야 한다.

하지만, Controller 테스트를 구성 했던 코드에 Docs 를 위한 내용을 추가하여 공통으로 관리하게 되면 프로덕트가 커졌을 때 관리하기 힘들다는 단점이 명백하다.

이러한 이유로 기능 테스트 코드는 기능 테스트끼리 관리하고, 문서를 위한 코드는 따로 작성하여 서로 분리하는 것을 지향한다.

컨트롤러 계층에서 단위 테스트를 돕는 도구 중 자주 선택되는 것은 MockMvc 와 RestAssured 이다.

MockMvc 는 springboot-starter-test 의존성에 포함되어 있어 별도의 의존성을 추가하지 않고 바로 사용할 수 있으며 SpringBootTest 어노테이션 없이 WebMvcTest 어노테이션으로 컨트롤러 계층만 테스트가 가능하다.

RestAssured 는 rest-assured:rest-assured 의존성을 별도로 추가해야 하며 컨트롤러 테스트를 하기 위해 SpringBootTest 어노테이션을 사용해야한다.

어떤 도구가 내게 더 어울릴까?

RestAssured

  • 가독성이 중요한가?

  • 컨트롤러를 테스트 하는 과정에서 Bean 을 많이 사용하여 영향을 받는가?

MockMvc

  • 전체 테스트를 자주 실행하여 빌드 속도에 영향을 받는가?

  • 의존성을 별도로 추가하지 않고 바로 테스트가 가능해야 하는가?

  • 컨트롤러 계층만 단위 테스트가 필요한가?

설정

build.gradle 파일 보기
REST Docs Test Support 추상 클래스 구성하기
REST Docs Index 페이지 구성하기
  • cafekiosk/src/docs/asciidoc/index.adoc

공통 요청, 응답 정의하기

문서화를 위한 테스트 코드 작성

ProductControllerTest 의 createProduct 메서드를 API 문서화를 하는 과정을 진행하며 어떻게 적용할지 mockMvc 를 기준으로 정리하였다.

문서 내 API 항목 URL Slug 설정

이렇게 작성하면 실제 렌더링된 화면에서 API 항목을 클릭 했을 때 docs/../product-create 로 설정된다.

요청 및 응답 JSON 가독성

이 코드를 덧붙이지 않으면 긴 JSON 형식이 한 줄로 표기되어 읽기 힘든 문서가 된다.

요청 값 정의

응답 값 정의

응답 값을 정의할 때 JSON 의 하위 계층을 표시하기 위해서 fieldWithPath 메서드 시그니처를 "a.b" 로 명시해서 하위 계층을 표시할 수 있다.

Last updated