툴/스웨거
[Swagger API] 스프링부트-그래들 스웨거 적용 방법 (3) 어노테이션으로 API 문서 정리하기
believekim
2025. 6. 19. 12:41
📄 시스템 환경
항목 | 내용 |
문서화 도구 | Swagger (OpenAPI 3) |
라이브러리 | org.springdoc:springdoc-openapi-starter-webmvc-ui:2.7.0 |
문서 UI 경로 | http://localhost:8080/swagger-ui/index.html |
인증 방식 | JWT Bearer Token (Authorization: Bearer <token>) |
문서 기본 설정 위치 | SwaggerConfig.java (@Configuration 기반 Bean 등록) |
보안 스키마 | SecurityScheme.Type.HTTP - bearer, 형식: JWT |
1. Controller 관련 어노테이션
어노테이션 | 설명 | 적용 위치 |
@Tag | API 그룹 지정 및 설명 | 클래스 (Controller 상단) |
@Operation | 개별 API 설명 및 요약 제공 | 메서드 |
@ApiResponse | 응답 코드별 설명, 스키마 설정 | 메서드 |
@ApiResponses | 여러 @ApiResponse를 묶어서 사용 | 메서드 |
@Parameter | 개별 파라미터에 대한 설명 | 메서드 파라미터 |
@Hidden | Swagger 문서에서 제외 | 클래스, 메서드, 파라미터 등 |
@RestController
@RequestMapping("/api/users")
@Tag(name = "User API", description = "사용자 관련 API") // API 그룹 지정 및 설명
public class UserController {
@GetMapping("/{id}")
@Operation(
summary = "사용자 조회", // API 요약 설명
description = "사용자 ID를 통해 특정 사용자 정보를 조회합니다." // 상세 설명
)
@ApiResponse(
responseCode = "200",
description = "성공적으로 사용자 정보를 반환했습니다.",
content = @Content(
mediaType = "application/json",
schema = @Schema(implementation = UserResponse.class) // 응답 DTO 스키마 지정
)
)
public UserResponse getUserById(
@Parameter(
description = "조회할 사용자 ID", // 파라미터 설명
example = "1" // 파라미터 예시
)
@PathVariable Long id
) {
return new UserResponse(id, "user@example.com");
}
@Hidden // 이 메서드는 Swagger 문서에서 숨겨짐
@DeleteMapping("/{id}")
public void deleteUser(@PathVariable Long id) {
// 삭제 로직
}
}
2. DTO 관련 어노테이션
어노테이션 | 설명 | 적용 위치 |
@Schema | DTO 필드에 대한 설명 및 예시 | DTO 클래스 및 필드 |
@ArraySchema | 배열 형태의 데이터 스키마 설정 | 배열 타입 DTO 필드 |
@Hidden | 특정 DTO 필드를 문서에서 숨김 | DTO 필드 |
@Schema(description = "사용자 등록 요청 DTO")
public class UserRequest {
@Schema(description = "사용자의 이름", example = "홍길동")
private String name;
@Schema(description = "사용자의 이메일 주소", example = "hong@example.com")
private String email;
@Schema(description = "사용자의 나이", example = "25")
private int age;
@ArraySchema(schema = @Schema(description = "사용자 권한 목록", example = "ROLE_USER"))
private List<String> roles;
@Schema(hidden = true) // 문서에서는 보이지 않게 숨김
private String internalMemo;
}
3. 보안/요청/응답 설정 관련 어노테이션
어노테이션 | 설명 | 적용 위치 |
@SecurityRequirement | 인증이 필요한 API임을 명시 (JWT 등) | 클래스 또는 메서드 |
@RequestBody | 요청 바디에 들어오는 객체 설명 | 메서드 파라미터 |
@Content | 응답 또는 요청에 포함되는 데이터의 타입 및 예시 | @ApiResponse 내 |
@MediaType | 컨텐츠 타입 지정 (application/json, 등) | 내부 속성으로 사용됨 |
@RestController
@RequestMapping("/users")
@SecurityRequirement(name = "JWT") // 이 컨트롤러의 모든 메서드가 JWT 인증을 요구함
public class UserController {
@Operation(
summary = "사용자 등록",
description = "새로운 사용자를 등록합니다.",
security = { @SecurityRequirement(name = "JWT") }, // 메서드 개별 적용도 가능
requestBody = @RequestBody(
required = true,
description = "등록할 사용자 정보",
content = @Content(
mediaType = MediaType.APPLICATION_JSON_VALUE, // 요청이 JSON 타입임을 명시
schema = @Schema(implementation = UserRequest.class),
examples = @ExampleObject(
name = "사용자 예시",
value = "{ \"name\": \"홍길동\", \"email\": \"hong@example.com\", \"age\": 25 }"
)
)
),
responses = {
@ApiResponse(
responseCode = "200",
description = "등록 성공",
content = @Content(
mediaType = MediaType.APPLICATION_JSON_VALUE, // 응답도 JSON
schema = @Schema(implementation = UserResponse.class),
examples = @ExampleObject(
name = "응답 예시",
value = "{ \"id\": 1, \"name\": \"홍길동\", \"email\": \"hong@example.com\" }"
)
)
),
@ApiResponse(responseCode = "400", description = "잘못된 요청")
}
)
@PostMapping
public UserResponse createUser(@org.springframework.web.bind.annotation.RequestBody UserRequest request) {
// 등록 로직
return new UserResponse(1L, request.getName(), request.getEmail());
}
}