Post

3일차 Spring Boot + Swagger 적용 (버전 이슈 문제 발생, 해결), Exception 분리

3일차 Spring Boot + Swagger 적용 (버전 이슈 문제 발생, 해결), Exception 분리

오늘은 드디어 내가 만든 API들을 Swagger로 문서화하고 직접 테스트할 수 있도록 적용해봤다.


✅ 오늘 목표

  • 예외 처리를 위한 GlobalExceptionHandler 적용
  • Swagger(OpenAPI 3)를 프로젝트에 적용해서 API 문서 자동화
  • Postman 없이 API 테스트 가능하게 만들기

🚨 예외 처리 GlobalExceptionHandler로 분리

POST 요청 시 유효성 검사가 실패할 경우, 기본 에러 메시지는 너무 복잡하게 나온다.
그래서 직접 예외처리 클래스를 만들어서 다음처럼 정리된 메시지를 내려주도록 만들었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(MethodArgumentNotValidException.class)
    public ResponseEntity<?> handleValidationErrors(MethodArgumentNotValidException ex) {
        List<String> errors = ex.getBindingResult()
            .getFieldErrors()
            .stream()
            .map(err -> err.getDefaultMessage())
            .collect(Collectors.toList());

        return new ResponseEntity<>(new ErrorResponse(errors), HttpStatus.BAD_REQUEST);
    }

    static class ErrorResponse {
        public List<String> errors;

        public ErrorResponse(List<String> errors) {
            this.errors = errors;
        }

        public List<String> getErrors() {
            return errors;
        }
    }
}

이렇게 예외처리를 분리해두면, 추후에 다른 에러 (RuntimeException, AccessDeniedException 등) 도 쉽게 처리할 수 있다.


🛠 Swagger 적용 + 버전 이슈 해결

Swagger는 정말 편한 도구인데, Spring Boot랑 버전이 살짝 안 맞으면 에러가 났다. 최근 버전에는 정식 지원을 하지 않는다는 것을 발견했다.

처음엔 Spring Boot 3.4.5를 쓰고 있었는데, Swagger 의존성을 추가하고 실행하자마자

“NoSuchMethodError: ControllerAdviceBean.()"

이런 에러가,,,
결론은 springdoc-openapi가 Spring Boot 3.4.5와 충돌이 있었던 거고,
결국 Spring Boot 버전을 3.2.3으로 내리고, Swagger는 2.2.0 버전으로 맞춰서 해결했다.

1
2
3
4
5
6
7
8
9
10
11
12
<!-- pom.xml -->
<parent>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>3.2.3</version> <!-- 기존 3.4.5에서 다운그레이드 -->
</parent>

<dependency>
  <groupId>org.springdoc</groupId>
  <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
  <version>2.2.0</version>
</dependency>

🌐 Swagger UI 접속

서버를 재실행한 후 브라우저에서 아래 주소로 접속!

1
http://localhost:8080/swagger-ui/index.html


📌 Swagger 활용 꿀팁

  • API를 직접 클릭해서 테스트 가능 (“Try it out”)
  • JSON을 입력하면 POST 요청까지 다 가능
  • 응답 코드, 스펙, 파라미터 전부 자동 정리됨
  • 프론트 개발자한테 URL을 공유해서 테스트하기 편함

✨ 오늘 느낀 Swagger의 장점

기능설명
자동 문서화내가 만든 API들을 자동으로 정리해줌
협업 효율프론트 개발자랑 일할 때 API 명세서를 따로 안 써도 될 것 같음
테스트 편의Postman 없이 브라우저에서 다 해볼 수 있음
유지보수 편함API가 늘어나도 문서도 같이 자동 업데이트됨

🔚 마무리

Swagger만 적용한 게 아니라, 버전 충돌도 직접 겪어보고 해결한 경험까지 할 수 있었고,
예외 처리 클래스를 도입해서 유효성 검사 응답도 훨씬 보기 좋게 정리하였다.

다음에는 본격적으로 프론트와 연동 준비를 시작해보자.

Repository : GitHub

This post is licensed under CC BY 4.0 by the author.