RestDocs로 테스트를 통과한 API에 대해서 문서화를 할 수 있다. 우리 프로젝트에서는 정상 요청 흐름을 중점으로 API 문서화했다. 하지만 해당 API에서 발생 가능한 애외 상황에 대한 응답도 정리해줘야 했다. 그래서 우리는 백엔드 단에서 발생하는 예외에 매핑되는 예외 코드를 만들어서 예외 상황 발생 시 해당 예외 코드를 바디에 담아서 반환하도록 해서 대해 API 사용자들이 어떤 문제가 발생해는 지 알 수 있도록 했다. 문제는 특정 API에 해당하는 예외 코드들을 어떻게 문서화하는 지 였다.
코드 예시
restDocs 환경 설정은 생략했다.
예시 컨트롤러
만약 id값이 1보다 작으면 예외를 반환하는 아주 간단한 예시 컨트롤러이다.
1 2 3 4 5 6 7 8 9 10 11 12
@RestController publicclassSimpleController{
@GetMapping("/simple/{id}") public ResponseEntity<String> getSimple(@PathVariablefinal Long id){ if (id < 1) { thrownew IllegalArgumentException("id값은 무조건 1보다 커야 합니다."); } final String body = String.format("simple id is %d", id); return ResponseEntity.ok(body); } }
이렇게 하면 다음과 같이 그대로 API 예시 요청과 응답에 해당하는 예시코드를 문서화 할 수는 있다. 문제는 API를 추가로 개발하거나 에러 상황이 바뀌게 되면 일일히 adoc 파일에 들어가서 해당 에러코드를 수정해줘야 한다. 그리고 예외 코드를 직접 적어줘야 하니 헷갈리는 여지가 많았다.
RestDocs의 커스텀 스니펫을 활용해보기
커스텀 스니펫은 사용자가 특정한 데이터를 전달받아서 restDocs에 사용되는 스니펫의 형태를 직접 정해서 렌더링할 수 있게 하는 방법이다.
스니펫 형식 만들기
우리가 문서화할 형식을 먼저 만들어보자. 문서에서 에러코드를 어떤 식으로 표현할지를 만들어주면 된다. 우리는 표 형식으로 에러코드를 만들고자 한다.
이때 mustache 문법을 활용해서 전달받은 error-codes를 순회하면서 표를 만들도록 작성했다. 그리고 이 내용을 src/test/resources/org/springframework/restdocs/templates/asciidoctor 이 경로에 저장해주면 된다. 우리는 src/test/resources/org/springframework/restdocs/templates/asciidoctor/error-code-table.snippet 으로 저장했다.
@Test voidgetSimple()throws Exception { final ResultActions actual = mockMvc.perform(get("/simple/1") .accept(MediaType.APPLICATION_JSON)) .andDo(print()) .andDo(document("get-simple", new ErrorCodeSnippet(ErrorCode.ILLEGAL_ARGUMENT)));
actual.andExpect(jsonPath("$").value("simple id is 1")); } }