[HATEOAS와 Self-Describtive Message 적용]_06_스프링 REST Docs 문서 빌드
스프링 REST Docs: 문서 빌드
스프링 REST Docs
- https://docs.spring.io/spring-restdocs/docs/2.0.2.RELEASE/reference/html5/
- pom.xml에 메이븐 플러그인 설정
- ★ 문서를 만들고 copy 해야하므로, 플러그인 순서가 중요!! ★
<plugin>
<groupId>org.asciidoctor</groupId>
<artifactId>asciidoctor-maven-plugin</artifactId>
<version>1.5.3</version>
<executions>
<execution>
<id>generate-docs</id>
<phase>prepare-package</phase>
<goals>
<goal>process-asciidoc</goal>
</goals>
<configuration>
<backend>html</backend>
<doctype>book</doctype>
</configuration>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.springframework.restdocs</groupId>
<artifactId>spring-restdocs-asciidoctor</artifactId>
<version>2.0.2.RELEASE</version>
</dependency>
</dependencies>
</plugin>
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>2.7</version>
<executions>
<execution>
<id>copy-resources</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-resources</goal>
</goals>
<configuration>
<outputDirectory>
${project.build.outputDirectory}/static/docs
</outputDirectory>
<resources>
<resource>
<directory>
${project.build.directory}/generated-docs
</directory>
</resource>
</resources>
</configuration>
</execution>
</executions>
</plugin>
- 템플릿 파일 추가
- src/main/asciidoc/index.adoc
문서 생성하기
- mvn package
- test
- prepare-package :: process-asciidoc
- prepare-package :: copy-resources
- 문서 확인
- /docs/index.html
테스트 할 것
- API 문서 만들기
- 요청 본문 문서화
- 응답 본문 문서화
- 링크 문서화
- self
- query-events
- update-event
- profile 링크 추가
- 요청 헤더 문서화
- 요청 필드 문서화
- 응답 헤더 문서화
- 응답 필드 문서화
문서 빌드
-
pom.xml에 메이븐 플러그인 설정
-
템플릿 파일 추가
- src/main/asciidoc/index.adoc
snippets
: 요청과 관련된 스니펫을 끼워넣는다고 정의[[resources-events-create]] === 이벤트 생성 `POST` 요청을 사용해서 새 이벤트를 만들 수 있다. operation::create-event[snippets='request-fields,curl-request,http-request,request-headers,http-response,response-headers,response-fields,links']
-
빌드
- console :
mvn package
- IDE : Lifecycle > package
패키징할 때 maven은 Lifecycle에 따라서 컴파일 → 테스트 컴파일 → 테스트 실행 → 패키징 을 진행한다.
테스트를 실행할 때 우리가 만든 REST Docs 코드로 스니펫(문서조각)들이 생성되고,
앞서 설정한 2개의 플러그인때문에 최종적으로 문서가 생성되고,
문서가 스프링부트가 기본적으로 지원하는 static 디렉토리에 생성돼서 웹서버를 띄우면 API 문서 페이지를 뷰에서 확인할 수 있다.
- console :
-
문서확인
target > generated-docs > , target > classes > static > docs > 경로에 index.html 문서가 생성된다.
Response fields : 응답 본문에 들어있는 필드가 각각 무엇을 의미하는지를 정의
이 문서의 link를 응답에 추가해주면 self-descrive messages 을 만족하는 API가 되는 것이다.
⇒ 웹서버를 띄우면 target > classes > static > docs > 경로에 있는 index.html 파일을 브라우저에서 확인가능하다.
http://localhost:8080/docs/index.html http://localhost:8080/docs/index.html#resources-events-create
응답에 profile 값으로 앵커(Anchor) 링크를 걸어주면 된다.
플러그인 설정 내용
1. asciidoctor-maven-plugin
asciidoctor-maven-plugin 플러그인이 제공하는 기능 중, prepare-package 라는 phse에 process-asciidoc : asciidoc을 처리하는 기능을 끼워넣은 것.
패키지라는 메이븐 goal을 실행할 때, asciidoctor-maven-plugin 플러그인이 제공하는 process-asciidoc 기능이 실행이 된것이고, process-asciidoc 기능은 기본적으로 src > main > ascciidoc 디렉토리에 들어있는 모든 adoc 문서를 target > generated-docs > 안에 html 문서로 만들어준다.
2. maven-resources-plugin
target > classes > static > docs > 경로에 index.html 문서를 옮겨주는 작업은 maven-resources-plugin 플러그인이 가진 기능 중에 copy-resources 기능으로 복사된 것이다.
이 기능을 동일한 prepare-package 라는 동일한 phase에 끼워넣었기 때문에 순서가 중요하다.
★ 문서를 만들고 copy 해야하므로, 플러그인 순서가 중요!! ★
outputDirectory : 붙여넣을 목적지 디렉토리를 설정
resource > directory : 원본데이터 위치. 디렉토리 하위의 모든 문서들을 옮긴다.
<configuration>
<outputDirectory>
${project.build.outputDirectory}/static/docs
</outputDirectory>
<resources>
<resource>
<directory>
${project.build.directory}/generated-docs
</directory>
</resource>
</resources>
</configuration>
3. 스프링 부트가 정적 리소스를 지원하는 기능
- static 디렉토리에 있는 모든 파일은 별도의 설정이 없어도 웹서버가 떴을 때, 해당 디렉토리 경로의 리소스를 요청할 수 있다.
profile 링크 추가
테스트 추가
응답 본문을 확인할 수 있지만 문서를 만들면서도 확인하므로 굳이 추가하지 않음
.andExpect(jsonPath("_links.profile").exists())
문서에서 확인
.andDo(document("create-event",
links(
linkWithRel("self").description("link to self"),
linkWithRel("query-events").description("link to query events"),
linkWithRel("update-event").description("link to update an existing"),
linkWithRel("profile").description("link to update an existing event") // 추가
),
profile 링크 추가
public class EventController {
@PostMapping()
public ResponseEntity createEvent(@RequestBody @Valid EventDto eventDto, Errors errors) {
EventResource eventResource = new EventResource(newEvent);
//...
eventResource.add(new Link("/docs/index.html#resources-events-create").withRel("profile")); // profile 링크 추가
return ResponseEntity.created(createdUri).body(eventResource); //EventResource로 변환해서 전달
}
}