개발
Spring REST Docs Easy: 효율적인 API 문서화 도구 (spring-restdocs-easy)
syaku
2024. 11. 1. 00:56
반응형
Spring REST Docs Easy: 효율적인 API 문서화 도구
소개
Spring REST Docs Easy는 Spring REST Docs를 확장하여 API 문서화를 더 쉽게 만드는 라이브러리입니다. 테스트 기반 문서화와 국제화 지원을 결합하여 정확하고 관리하기 쉬운 API 문서를 생성할 수 있습니다.
https://github.com/syakuis/spring-restdocs-easy
설치 방법
Gradle
dependencies {
testImplementation 'io.github.syakuis:spring-restdocs-easy:1.0.0'
}
실제 사용 예제
1. 기본 설정
@WebMvcTest(MemberRestController.class)
@AutoConfigureMvcRestDocs
class MemberRestControllerTest {
@Autowired
private MockMvc mockMvc;
@Autowired
private RestDocs restDocs;
private final String RESTDOCS_PATH = "members/{method-name}";
}
2. GET 요청 문서화 (목록 조회)
@Test
void list() throws Exception {
mockMvc.perform(get("/members")
.param("name", "stela")
.param("age", "10")
.param("job", "ENGINEER")
.param("email", "email@email.com")
.accept(MediaType.APPLICATION_JSON))
.andExpect(status().isOk())
.andDo(document(RESTDOCS_PATH,
// 요청/응답 헤더 문서화
restDocs.headers()
.add(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON)
.requestHeaders(),
restDocs.headers()
.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
.responseHeaders(),
// 쿼리 파라미터 문서화
restDocs.params()
.add("name", "name parameter")
.add("age", "{io.github.syakuis.spring.restdocs.easy.examples.adapter.web.controller.model.MemberRequest.age}")
.add("job", restDocs.generate(Job.class).join())
.add("email", "{email}")
.queryParameters(),
// 응답 필드 문서화 (배열 응답)
restDocs.generate("[].", MemberResponse.class)
.addAll("[].locationAddress.", LocationAddress.class)
.responseFields()
));
}
3. POST 요청 문서화 (등록)
@Test
void register() throws Exception {
MemberRequest request = new MemberRequest("John Doe", 30, Job.ACCOUNTANT,
"john@example.com", true, List.of("tag1", "tag2"),
new LocationAddress("123 Main St", "City", "Country"));
mockMvc.perform(post("/members")
.contentType(MediaType.APPLICATION_JSON)
.header(HttpHeaders.AUTHORIZATION, "")
.content(objectMapper.writeValueAsString(request)))
.andExpect(status().isOk())
.andDo(document(RESTDOCS_PATH,
// 요청 헤더 문서화
restDocs.headers()
.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON)
.add(HttpHeaders.AUTHORIZATION, "{http.headers.authorization.BASIC_AUTHORIZATION}")
.requestHeaders(),
// 요청 본문 필드 문서화
restDocs.generate(MemberRequest.class)
.requestFields()
.andWithPrefix("locationAddress.", restDocs.generate(LocationAddress.class).toField()),
// 응답 본문 필드 문서화
restDocs.generate(MemberResponse.class)
.responseFields()
.andWithPrefix("locationAddress.", restDocs.generate(LocationAddress.class).toField())
));
}
4. 단일 조회 문서화 (경로 변수 포함)
@Test
void view() throws Exception {
mockMvc.perform(get("/members/{id}", 953))
.andExpect(status().isOk())
.andDo(document(RESTDOCS_PATH,
// 경로 변수 문서화
restDocs.params().add("id", "id").pathParameters(),
// 응답 필드 문서화
restDocs.generate(MemberResponse.class)
.responseFields()
.andWithPrefix("locationAddress.",
restDocs.generate(LocationAddress.class).toField())
));
}
주요 기능 설명
1. 다양한 문서화 지원
- 요청/응답 헤더 (
headers()
) - 쿼리 파라미터 (
params()
) - 경로 변수 (
pathParameters()
) - 요청/응답 필드 (
requestFields()
,responseFields()
) - 중첩 객체 (
andWithPrefix()
) - 배열 응답 (
[]
표기법)
2. 메시지 소스 활용
- 직접 문자열 설명 사용 가능
- 메시지 키를 통한 국제화 지원 (
{key}
형식) - 클래스의 필드 설명 자동 참조
3. 중첩 구조 처리
addAll()
: 중첩 객체의 필드 추가andWithPrefix()
: 중첩 필드 경로 지정- 배열 표기법(
[].
)을 통한 컬렉션 처리
장점
- 코드 중복 최소화
- 직관적인 API
- 유연한 문서화 옵션
- Spring REST Docs의 장점 유지
- 국제화 지원
결론
Spring REST Docs Easy는 Spring REST Docs의 기능을 확장하면서도 사용하기 쉬운 API를 제공합니다. 특히 중첩된 객체 구조나 배열 응답의 문서화를 간단하게 처리할 수 있어, 복잡한 API의 문서화 작업을 크게 단순화합니다.
반응형