Springboot swagger 사용법 / 백엔드 API 문서 자동 생성 및 설정

스프링부트 스웨거 사용법

Gradle 의존성 추가

implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.6.0'

스웨거 사용을 위해서 build.gradle 파일에 Springdoc OpenAPI 라이브러리 의존성을 추가합니다.

Swagger UI 접속

http://localhost:8080/swagger-ui/index.html
또는
http://localhost:8080/swagger-ui.html
서버를 실행하면 Springdoc OpenAPI가 API 명세를 자동 생성하고,
Swagger UI가 시각화하여 API 문서를 제공합니다.

API 실행 테스트

API URL 클릭 > 펼쳐진 Parameters 우측 Try it out 클릭 > 파라미터 선택 및 입력 > Execute


스웨거 API 문서 작성 방법

컨트롤러 작성 예시

@Tag(name = "관리자", description = "관리자 전용 회원 관리 API (권한 필요)") // API 제목
@RestController
@RequestMapping("/api/v1/admin/members") // 공통 URL 매핑
public class AdminMemberController {

    @Operation(
      summary = "회원 상세 조회", // URL 우측 API 설명
      description = "관리자가 특정 회원의 상세 정보를 조회합니다.", // API를 펼치면 나오는 상세 설명
      security = @SecurityRequirement(name = "bearerAuth") // bearerAuth 인증 후 API 테스트 가능
    )
    @GetMapping("/{memberId}") // 상세 URL 매핑
    @PreAuthorize("hasAuthority('MEMBER_READ')") // 현재 로그인 사용자가 API 실행 시 필요한 권한 (필터에서 JWT 토큰을 파싱하고, Authentication 생성 시 세팅한 권한(authorities) 체크)
    @RateLimit(type = "general")
    public ResponseEntity<CommonResponse<AdminMemberDetailResponse>> getMemberDetail( // API 응답 예시 클래스 반환 설정. 클래스 내부 @Schema(example = "응답값 예시") 가 작성된 필드들을 모아서 JSON 형태로 표현
      @Parameter(description = "회원 ID", example = "1") // 파라미터 설명 및 입력값 예시 수동 추가
      @PathVariable Long memberId // 타입 + 이름으로 추론하여 파라미터 입력 폼 자동 추가
    ) {
      return ResponseEntity.ok(CommonResponse.success(adminMemberService.getMemberDetail(memberId)));
    }
}

컨트롤러에 어노테이션을 추가하여 스웨거에 보여질 내용들을 작성할 수 있습니다.

security = @SecurityRequirement(name = “bearerAuth”) 설정으로 Authorize 버튼이 API 문서 우측 상단에 표시되며,
버튼 클릭 시 나오는 팝업에 JWT 액세스 토큰을 입력하면 이후 요청들 헤더에 토큰이 자동으로 추가됩니다.

enum 파라미터 추가 방법

@RequestParam(required = false) MemberStatus status

컨트롤러 파라미터로 Enum 클래스를 받으면 파라미터 Selectbox 선택 폼이 자동 추가됩니다.

enum 클래스 작성 예시

package com.membership.member.domain.enums;

/**
 * 회원 계정 운영 상태
 * 인증 가능 여부와 운영 조치 판단 기준
 */
public enum MemberStatus {
    /** 정상 이용 상태 */
    ACTIVE,
    /** 장기 미사용 상태 */
    DORMANT,
    /** 운영 정지 상태 */
    SUSPENDED,
    /** 로그인 실패 누적 잠금 상태 */
    LOCKED,
    /** 탈퇴 처리 상태 */
    WITHDRAWN
}

파라미터 디스크립션 Available values : ACTIVE, DORMANT, SUSPENDED, LOCKED, WITHDRAWN가 자동 추가됩니다.

API 응답 예시 여러개 추가 방법

import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.ExampleObject;

@ApiResponses({ // 여러 응답 케이스를 묶는 컨테이너
  @ApiResponse(
    responseCode = "200", // HTTP 상태 코드 200에 대한 응답 예시
    content = @Content( // 미디어 타입 및 컨텐츠 명세
      mediaType = "application/json", // Media type 명시
      examples = { // 성공 응답 JSON 예시 여러개 작성 (Example selectbox로 선택 확인 가능)
        @ExampleObject( // 성공 응답 케이스 1
          name = "일반 회원", // Example Description
          summary = "USER 권한 회원 조회", // Examples 제목
          value = """
                  {
                    "success": true,
                    "data": {
                      "memberId": 1,
                      "email": "us***@example.com",
                      "role": "USER",
                      "status": "ACTIVE"
                    },
                    "error": null
                  }
                  """
        ),
        @ExampleObject( // 성공 응답 케이스 2
          name = "관리자", // Example Description
          summary = "ADMIN 권한 회원 조회", // Examples 제목
          value = """
                  {
                    "success": true,
                    "data": {
                      "memberId": 2,
                      "email": "ad***@example.com",
                      "role": "ADMIN",
                      "status": "ACTIVE"
                    },
                    "error": null
                  }
                  """
        ),
        @ExampleObject( // 성공 응답 케이스 3
          name = "잠긴 계정", // Example Description
          summary = "LOCKED 상태 회원", // Examples 제목
          value = """
                  {
                    "success": true,
                    "data": {
                      "memberId": 3,
                      "email": "lo***@example.com",
                      "role": "USER",
                      "status": "LOCKED"
                    },
                    "error": null
                  }
                  """
        )
      }
    )
  ),
  @ApiResponse(
    responseCode = "401", // HTTP 상태 코드 401에 대한 응답 예시
    content = @Content( // 미디어 타입 및 컨텐츠 명세
      examples = // 실패 응답 JSON 예시 1개 작성
        @ExampleObject( // 실패 응답 케이스
          value = """
                  { 
                    "success": false,
                    "data": null,
                    "error": {
                      "code": "AUTH_001",
                      "message": "인증에 실패했습니다."
                    }
                  }
                  """
        )
    )
  )
})
@GetMapping("/{memberId}")
public ResponseEntity<CommonResponse<AdminMemberDetailResponse>> getMemberDetailTest(@PathVariable Long memberId) {
  return ResponseEntity.ok(CommonResponse.success(adminMemberService.getMemberDetail(memberId)));
}

컨트롤러 상단에 @ApiResponses 어노테이션을 이용하여 응답값 예시를 수동으로 작성하는 방법입니다.
@Schema(example = “응답값 예시”) 방식보다 우선 적용되며, 다른 방식들도 존재합니다.


스웨거 설정 커스터마이징

SwaggerConfig 생성

@Configuration
public class SwaggerConfig {

  @Bean
  public OpenAPI openAPI() {
    return new OpenAPI()
      .info(new Info()
        .title("API 문서 상단 제목")
        .description("API 요약 및 설명")
        .version("v1.0.0"));
      // 모든 API에 bearerAuth 인증 방식 적용
      .addSecurityItem(new SecurityRequirement().addList("bearerAuth"))
      // bearerAuth 인증 방식 정의
      .components(new Components().addSecuritySchemes(
        "bearerAuth",
        new SecurityScheme()
          .type(SecurityScheme.Type.HTTP) // HTTP 인증 방식
          .scheme("bearer") // Bearer 토큰 방식
          .bearerFormat("JWT") // JWT 토큰 형식
          .description("JWT Access Token을 입력하세요. 'Bearer ' 접두사는 자동으로 추가됩니다.") // 인증 설정 팝업 안내 문구
      ))
      // 동일한 API 서버 리스트 (상단 Servers)
      .servers(List.of(
        new Server().url("https://운영서버도메인").description("Production server url"),
        new Server().url("https://스테이징서버도메인").description("Staging server url"),
        new Server().url("http://개발서버도메인").description("development server url")
      ));
  }
}

SwaggerConfig 파일은 /src/main/java/com.도메인/common/config 폴더에 위치할 수 있습니다.