[feat] Swagger 커스텀 ApiResponse 어노테이션 적용 #42
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
✅ 작업 내용
프로젝트를 진행하면서 API 문서를 swagger로 작업하고 있었습니다.
API 마다 각각의 성공, 실패 Response가 존재하게 됩니다. 이때, Swagger에서는 성공의 경우 DTO에
@Schema
를 통해 쉽게 example을 설정할 수 있지만, 예외 Response의 경우 Controller에 content를 모두 입력하고 구현된 스키마까지 작성해야하기에 이를 개선해보고 합니다.목표는
@CustomApiResponse
와@CustomApiResponses
를 커스텀 어노테이션으로 정의함으로써, 코드의 가독성을 높이고 유지 보수를 용이하는 것입니다.이 글에서는
@CustomApiResponses
와@CustomApiResponse
어노테이션의 작동 방식과 기능, 사용법에 대해 다룹니다.최종적으로 적용된 코드
적용 전
적용 후
어노테이션 정의
@CustomApiResponse
**
@CustomApiResponse
**은 개별 API 응답을 정의하는 데 사용됩니다. 각 응답에는 오류 유형, 상태 코드, 메시지, 설명이 포함됩니다.@Target({ElementType.METHOD})
- 어노테이션 적용 타입@Retention(RetentionPolicy.RUNTIME)
- 어노테이션의 보존 정책@Documented
- Javadoc 같은 도구에 의해 문서화되어야 함을 의미@Repeatable(CustomApiResponses.class)
- 이 어노테이션이 동일한 요소에 여러 번 사용할 수 있음각 속성의 의미
@CustomApiResponses
**
@CustomApiResponses
**은 여러@CustomApiResponse
를 그룹화하는 역할을 수행합니다.적용 방법
전체 적용된 코드
성공인 경우
Response DTO 클래스 예시
예외에 Response에 적용
SwaggerConfig 설정
OperationCustomizer 빈 등록
handleCustomApiResponses 메서드
addContent 메서드
결론
annotation에 대해 공부해보는 좋은 경험이라는 마음으로 시작한 작업이었는데 생각보다 가독성 측면과 결과에서는 유의미한 결과를 냈다는 생각이 들었습니다.
NestJS로 개발하던 때에도 decorator를 Custom해봤던 경험을 살려서 작업했는데 아직 사이드이펙트는 떠오르는 것이 없지만, 애초에 API 문서를 보기 쉽도록 하고, 작성하는데에 귀찮음을 굉장히 줄일 수 있었다는 점에서 꽤나 성공적이라고 생각했습니다.
Java의 annotation을 좀더 이해했으니 필요한 상황에 좀더 적용해보고자 합니다. (WebClient를 annotation으로 작성했던 적이 있었는데 AOP까지 적용하고나니 정말 큰 사이드 이펙트가 예상되어 접었던..적이 있으니 다시..?)
Reference