스프링은 다 알고 있다! - 평범한 개발자의 Swagger 어노테이션 지옥 탈출기
안녕하세요, 평범한 서버 개발자입니다.
발단
사이드 프로젝트 하다가 Swagger 문서화를 하게 됐는데요.
@Operation(summary = "유저 조회", description = "ID로 유저를 조회합니다")
@ApiResponses({
@ApiResponse(responseCode = "200",
description = "성공",
content = @Content(schema = @Schema(implementation = UserDto.class))),
@ApiResponse(responseCode = "404", description = "유저 없음")
})
@Parameter(name = "id", description = "유저 ID", required = true)
@GetMapping("/users/{id}")
public UserDto getUser(@PathVariable Long id) {
return userService.findById(id);
}3줄짜리 메서드에 어노테이션이 10줄...
이거 엔드포인트마다 달다가 문득 이런 생각이 들었습니다.
"잠깐, 이거 스프링이 이미 다 알고 있는 정보 아니야?"
전개
생각해보면:
경로?
@GetMapping에 있음. 스프링이 앎.HTTP 메서드?
@GetMapping이니까 GET. 스프링이 앎.파라미터?
@PathVariable Long id. 스프링이 앎.응답 타입?
UserDto반환. 스프링이 앎.
스프링은 이미 다 알고 있습니다.
RequestMappingHandlerMapping이라는 놈이 런타임에 모든 매핑 정보를 들고 있거든요. 근데 우리는 Swagger한테 이걸 또 알려주고 있었던 겁니다. 수동으로. 하나하나.
위기 (빡침)
그래서 빡쳐서 만들었습니다.
SASA (Spring API Spec Analyzer)
스프링한테 "야 너 API 정보 다 알고 있잖아, 그거 좀 줘" 하고 물어보는 라이브러리입니다.
절정 (사용법)
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
var context = SpringApplication.run(MyApplication.class, args);
var mapping = context.getBean(RequestMappingHandlerMapping.class);
// 스프링아 API 스펙 줘
SasaApplication.generateApiSpec(mapping, context);
}
}실행하면:
build/api-spec.json- JSON 스펙build/api-spec.html- 인터랙티브 HTML 문서
어노테이션 추가 없이요.
결말 (뭘 뽑아주냐면)
스프링한테 물어봐서 자동으로 추출하는 것들:
모든 엔드포인트 (경로, HTTP 메서드)
Path Variable, Query Parameter, Request Header
Request Body, Response Body (DTO 스키마까지)
Validation 어노테이션 (
@NotBlank,@Size등)@ControllerAdvice예외 핸들러까지
springdoc-openapi랑 뭐가 달라요?
springdoc도 좋은 라이브러리입니다. 근데 상세한 문서화를 하려면 결국 어노테이션을 추가해야 해요.
SASA의 철학은 다릅니다: "스프링이 아는 건 개발자가 또 쓸 필요 없다"
트레이드오프가 있긴 합니다:
✅ 어노테이션 제로
✅ 실제 런타임 매핑 기반이라 항상 정확
⚠️ 커스텀 설명이나 예제는 못 넣음 (아직은)
현재 상태
0.0.1-SNAPSHOT입니다. (aka "제 컴퓨터에서는 돌아갑니다" 단계)
피드백 주시면 감사하겠습니다:
이런 접근 방식 어떻게 생각하세요?
어떤 기능이 있으면 실제로 쓰실 것 같나요?
런타임 인트로스펙션 방식에 우려되는 점이 있나요?
GitHub
https://github.com/bigdaditor/SASA
어노테이션 지옥에서 탈출하고 싶었던 한 개발자의 발악이었습니다.
질문 환영합니다! 🙇
댓글을 남기려면 로그인이 필요합니다.
로그인 후 이 페이지로 돌아와 바로 댓글을 남길 수 있습니다.