Spring rest docs의 API 문서가 자동으로 덮어쓰기
build.gradle에 아래 코드를 추가하면 된다. asciidoctor.doFirst { delete file('src/main/resources/static/docs') }
build.gradle에 아래 코드를 추가하면 된다. asciidoctor.doFirst { delete file('src/main/resources/static/docs') }
의존성 추가 <dependency> <groupId>org.springframework.restdocs</groupId> <artifactId>spring-restdocs-mockmvc</artifactId> <version>2.0.4.RELEASE</version> </dependency> Spring REST Docs는 문서화할 REST 서비스의 테스트를 처리해야 문서가 생성된다. 테스트를 실행하면 request와 response를 통해 문서 스니펫이 생성된다. @ExtendWith({RestDocumentationExtension.class, SpringExtension.class}) @SpringBootTest public class ApiDocumentationJUnit5IntegrationTest { //... } @BeforeEach public void setUp(WebApplicationContext webApplicationContext, RestDocumentationContextProvider restDocumentation) { this.mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext) .apply(documentationConfiguration(restDocumentation)).build(); } 컨트롤러(CRUDController)의 엔드 포인트에 대한 링크가 있는 페이지를 반환하는 컨트롤러 생성 @RestController @RequestMapping("/") public class IndexController { static class CustomRepresentationModel extends RepresentationModel<CustomRepresentationModel> { public CustomRepresentationModel(Link initialLink) { super(initialLink); } } @GetMapping public CustomRepresentationModel index() { return new CustomRepresentationModel(linkTo(CRUDController....
MockMvc로 사용중인 Spring rest docs를 RestAssured로 바꿔보자. 의존 추가 testImplementation 'org.springframework.restdocs:spring-restdocs-restassured' 테스트 코드 private RequestSpecification spec; @BeforeEach public void setUp(RestDocumentationContextProvider restDocumentation) { this.spec = new RequestSpecBuilder() .addFilter(documentationConfiguration(restDocumentation)) .build(); } body 내용을 예쁘게 표시하고 싶다면 아래와 같이 구성하면된다. @BeforeEach protected void setUp(final RestDocumentationContextProvider restDocumentation) throws Exception { this.specification = new RequestSpecBuilder() .addFilter(documentationConfiguration(restDocumentation).operationPreprocessors() .withResponseDefaults(prettyPrint())) .build() ; rest api 호출 RestAssured.given(this.spec) .accept("application/json") .filter(document("index")) .when().get("/") .then().assertThat().statusCode(is(200)); 필드 설명을 추가하고 싶다면 아래와 같이 필터를 지정하면 된다....
의존 추가 없이 구현이 가능했다. asciidoctor에서 최종 문서가 저장되는 위치를 설정하는 방법이 적혀있어서 참고했다. outputDir를 통해 자신이 원히는 경로를 지정할 수 있다. jar 파일을 만들기 전에 build/resources/main/static/docs 경로에 rest docs 파일을 추가하여 수동으로 문서를 커밋하지 않아도 빌드시에 만들어지도록 구현했다. // build.gradle asciidoctor { attributes 'snippets': snippetsDir inputs.dir snippetsDir outputDir "build/resources/main/static/docs" dependsOn test } bootJar { dependsOn asciidoctor } 참고 자료 https://asciidoctor.github.io/asciidoctor-gradle-plugin/development-3.x/user-guide/
multipart 를 통해 파일을 body로 보내는데, 이미지라서 바이트 데이터로 보내게된다. rest-docs에서는 이를 굳이 보여줄 필요가 없기 때문에, body내용을 바꾸는 기능이 필요했다. 이를 위해서는 preprocessRequest 라는 것을 사용하면 된다. // MockMvc 테스트 중에 .andDo(document("save-image", preprocessRequest(new ImageBodyPreprocessor()), responseFields( fieldWithPath("[]").description("파일 경로")))); public class ImageBodyPreprocessor implements OperationPreprocessor { private static final String FILE = "file"; private static final OperationRequestPartFactory PART_FACTORY = new OperationRequestPartFactory(); private static final OperationRequestFactory REQUEST_FACTORY = new OperationRequestFactory(); @Override public OperationRequest preprocess(final OperationRequest request) { List<OperationRequestPart> parts = new ArrayList<>(); for (OperationRequestPart part : request....