Swagger는 Spring Boot 애플리케이션에서 널리 사용되는 API 문서화 도구이고, 개발/테스팅을 지원한다.
REST API의 엔드포인트, 파라미터, 요청/응답 데이터 형식 등을 문서로 정리해주고, UI에서 직접 호출 테스트까지 가능하게 해준다.
Swagger를 사용하면 RESTful API의 엔드포인트, 파라미터, 데이터 형식 등을 쉽고 명확하게 문서화할 수 있다.
Swagger UI는 API 문서를 웹 페이지 형태로 제공하고, 사용자가 직접 API를 호출해볼 수 있는 인터페이스를 제공한다.
즉, Postman 없이도 “문서 + 테스트”를 같이 할 수 있다.
Spring Boot에서는 보통 springdoc-openapi를 사용한다.
Gradle 기준으로 아래 의존성을 추가한다.
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0'
Controller 클래스/메서드에 Swagger(OpenAPI) 어노테이션을 달아서 문서 품질을 올릴 수 있다.
@Operation: 해당 API가 무슨 작업을 하는지 설명하는 용도예시:
@Operation(
summary = "회원가입",
description = "이메일, 비밀번호를 통한 회원가입"
)
(참고) 예전 Swagger2 시절에 보던 value, notes 스타일 설명은 프로젝트에 따라 어노테이션이 다를 수 있는데, SpringDoc(OpenAPI 3) 기준에서는 summary, description을 주로 쓴다.
전역 예외처리용 @RestControllerAdvice는 API 목록에 노출될 필요가 없으므로 Swagger 문서에서 제외할 수 있다.
@RestControllerAdvice
@Hidden // swagger에서 제외
public class GlobalExceptionHandler {
// ...
}
Swagger UI에서 인증이 필요한 API를 호출하려면, Swagger 쪽에 “인증 스키마”를 등록해야 한다.
아래는 Bearer JWT 인증을 Swagger(OpenAPI)에 등록하는 설정이다.
package com.beyond.order_system.common.config;
import io.swagger.v3.oas.models.Components;
import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class SwaggerConfig {
private static final String SECURITY_SCHEME_NAME = "BearerAuth";
@Bean
public OpenAPI customOpenAPI() {
return new OpenAPI()
.addSecurityItem(new SecurityRequirement().addList(SECURITY_SCHEME_NAME))
.components(
new Components().addSecuritySchemes(
SECURITY_SCHEME_NAME,
new SecurityScheme()
.name(SECURITY_SCHEME_NAME)
.type(SecurityScheme.Type.HTTP)
.scheme("bearer")
.bearerFormat("JWT")
)
);
}
}
이렇게 설정해두면 Swagger UI에서 Authorize 버튼을 통해 토큰을 입력하고, 인증이 필요한 API들을 바로 테스트할 수 있다.
운영/개발 환경에서 Swagger 문서 페이지는 인증 없이 접근 가능하게 열어두는 경우가 많다.
그래서 Security 설정에서 아래 경로들을 permitAll()로 예외 처리한다.
.authorizeHttpRequests(a -> a
.requestMatchers(
"/member/create",
"/member/doLogin",
"/product/list",
"/member/refresh-at",
// swagger 사용을 위한 인증 예외처리
"/v3/api-docs/**",
"/swagger-ui/**",
"/swagger-ui.html"
)
.permitAll()
.anyRequest().authenticated()
)
.build();
포인트는 /v3/api-docs/**(스펙 JSON)와 /swagger-ui/**, /swagger-ui.html(UI) 세 가지를 같이 열어줘야 Swagger 화면이 정상 동작한다는 점이다.
로컬 기준으로 Swagger UI는 아래에서 접근한다.
http://localhost:8080/swagger-ui.html/member/doLogin으로 로그인 호출해서 토큰을 발급받는다.
Swagger UI의 Authorize에 Bearer {JWT} 형태로 토큰을 입력한다.
인증이 필요한 API를 Swagger에서 직접 실행해 정상 호출되는지 확인한다.