[SpringBoot] @RestControllerAdvice와 Swagger 충돌
2025. 2. 10. 10:41ㆍTrouble Shootings/Web
❌사건의 발단
⚙️환경
- SpringBoot 4.3.2
- Swagger: org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2
개발을 하다가 API마다 예외 처리 코드를 작성하는 게 너무 귀찮고 시간이 많이 들기도 해서 어떻게 방법이 없나 고민하던 찰나에, `@RestControllerAdvice` 어노테이션을 스프링부트에서 제공한단 사실을 알게 되었습니다.
예외처리 핸들러 클래스를 지정하여 해당 어노테이션을 붙이면, 지정한 패키지 경로에 있는 클래스들에서 던진 예외를 받아서 처리할 수 있더라구요. 이렇게 전역적인 핸들러 클래스를 지정하니, `Controller`에서 `try-catch`를 쓸 필요가 없었습니다. 😊
근데 문제는 `@RestControllerAdvice`를 적용하고 나니까 Swagger가 접속이 안 됐습니다.
"Failed to load API Definition"
"Fetch Errors - response status is 403. /v3/api-docs"
찾아보니까 SpringDoc(Swagger)은 API 문서를 자동으로 생성하기 위해, 모든 컨트롤러와 관련된 클래스들을 스캔한다고 합니다. 그런데 @RestControllerAdvice는 전역적으로 예외를 처리하는 특별한 컨트롤러이므로, SpringDoc이 이를 일반 컨트롤러처럼 문서화하려고 시도하면서 충돌이 발생하는 것 같아요.
✅해결 방법
1. `@Hidden` 어노테이션을 붙여, SpringDoc에게 이 클래스는 문서화하지 말라고 명시하기
@RestControllerAdvice(basePackages = "domain.controller.auth")
@Slf4j
@Order(Ordered.HIGHEST_PRECEDENCE)
@Hidden // Swagger 문서에서 이 클래스 제외
public class AuthExceptionHandler {
...
}
저는 이 방법으로 해결했습니다.
2. SwaggerConfig에서 @RestControllerAdvice가 있는 경로를 제외하고 문서 생성
728x90
반응형
'Trouble Shootings > Web' 카테고리의 다른 글
[MySQL] SpringBoot에서 Point, Polygon 데이터를 자바 객체에 담기 (with MyBatis) (0) | 2025.02.16 |
---|---|
[MySQL] Error: Data too long for column "컬럼명" (0) | 2025.02.08 |
[MyBatis] parameterType에 중첩 클래스 타입을 넣을 경우 (1) | 2025.02.08 |