Swagger는 REST API를 설계, 빌드, 문서화, 소비하는 데 유용한 도구입니다. Spring Boot에서는 Springdoc OpenAPI 라이브러리를 사용하여 Swagger UI를 쉽게 설정할 수 있습니다.
build.gradle 파일에 다음 의존성을 추가합니다:
dependencies {
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.6.0'
}
Springdoc OpenAPI는 기본적으로 /swagger-ui/index.html 경로에서 API 문서를 제공합니다. 일반적인 설정은 추가로 필요하지 않지만, 필요에 따라 설정 파일에 커스터마이징을 할 수 있습니다.
또는 application.properties 파일에 추가:
springdoc.api-docs.path=/api-docs
springdoc.swagger-ui.path=/swagger-ui
Swagger는 REST 컨트롤러에서 작성된 API를 자동으로 탐지합니다.
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/v1")
public class SampleController {
@GetMapping("/hello")
public String sayHello() {
return "Hello, Swagger!";
}
@PostMapping("/echo")
public String echo(@RequestBody String message) {
return message;
}
}
Spring Boot 애플리케이션을 실행한 후, 브라우저에서 다음 URL에 접속하여 Swagger UI를 확인합니다:
http://localhost:8080/swagger-ui/index.htmlhttp://localhost:8080/api-docsSwagger 문서에 제목, 설명 등을 추가하려면 아래와 같은 설정을 적용할 수 있습니다.
import io.swagger.v3.oas.models.info.Info;
import io.swagger.v3.oas.models.OpenAPI;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class OpenApiConfig {
@Bean
public OpenAPI customOpenAPI() {
return new OpenAPI()
.info(new Info()
.title("Sample API")
.version("v1.0")
.description("This is a sample Spring Boot REST API with Swagger"));
}
}
API Documentation & Design Tools for Teams | Swagger
REST API Documentation Tool | Swagger UI
http://localhost:8080/swagger-ui/index.html
http://localhost:8080/v3/api-docs
Spring Boot에서 Swagger를 활용하여 REST API를 문서화할 때 사용하는 다양한 어노테이션과 그 목적을 설명합니다. OpenAPI Specification 기반으로 문서를 작성할 때 유용합니다.
import io.swagger.v3.oas.annotations.OpenAPIDefinition;
import io.swagger.v3.oas.annotations.info.Info;
import io.swagger.v3.oas.annotations.servers.Server;
@OpenAPIDefinition(
info = @Info(
title = "User API",
version = "1.0",
description = "사용자 관리를 위한 REST API"
),
servers = @Server(url = "http://localhost:8080", description = "Local Server")
)
public class SwaggerConfig {
// 빈 설정 또는 설정 클래스
}
import io.swagger.v3.oas.annotations.tags.Tag;
@Tag(name = "User Management", description = "사용자 관리 관련 API")
@RestController
@RequestMapping("/users")
public class UserController {
// API 메서드
}
| 속성 | 설명 | 예시 |
|---|---|---|
| summary | 엔드포인트의 간략한 설명. | "사용자 목록 조회" |
| description | 상세 설명. | "모든 사용자의 목록을 반환합니다." |
| tags | 엔드포인트가 속한 태그 목록. | {"User Management"} |
| responses | 가능한 HTTP 응답 설명. | @ApiResponse |
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
@RestController
public class UserController {
@Operation(
summary = "사용자 목록 조회",
description = "모든 사용자의 목록을 반환합니다.",
tags = {"User Management"}
)
@ApiResponse(responseCode = "200", description = "성공적으로 사용자 목록을 반환")
@GetMapping("/users")
public List<String> getUsers() {
return List.of("홍길동", "이몽룡");
}
}
| 속성 | 설명 | 예시 |
|---|---|---|
| responseCode | HTTP 상태 코드. | "200" |
| description | 상태 코드 설명. | "요청 성공" |
| content | 응답 데이터 타입과 스키마. | @Content |
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
@ApiResponses({
@ApiResponse(responseCode = "200", description = "성공적으로 반환"),
@ApiResponse(responseCode = "404", description = "사용자를 찾을 수 없음")
})
@GetMapping("/users/{id}")
public String getUserById(@PathVariable int id) {
return "사용자 정보";
}
| 속성 | 설명 | 예시 |
|---|---|---|
| name | 파라미터 이름. | "id" |
| description | 파라미터 설명. | "사용자 ID" |
| required | 필수 여부. | true |
| example | 파라미터의 예제 값. | "1" |
import io.swagger.v3.oas.annotations.Parameter;
@GetMapping("/users/{id}")
public String getUserById(
@Parameter(name = "id", description = "사용자 ID", required = true, example = "1")
@PathVariable int id
) {
return "사용자 정보: " + id;
}
import io.swagger.v3.oas.annotations.media.Schema;
@Schema(description = "사용자 정보 모델")
public class User {
@Schema(description = "사용자 ID", example = "1")
private int id;
@Schema(description = "사용자 이름", example = "홍길동")
private String name;
@Schema(description = "사용자 이메일", example = "hong@example.com")
private String email;
// Getters and Setters
}
import io.swagger.v3.oas.annotations.parameters.RequestBody;
@PostMapping("/users")
public String createUser(
@RequestBody(description = "사용자 생성 정보", required = true)
@io.swagger.v3.oas.annotations.media.Schema(example = "{ \"name\": \"홍길동\", \"email\": \"hong@example.com\" }")
User user
) {
return "사용자 생성: " + user.getName();
}
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
@ApiResponse(
responseCode = "200",
description = "성공적으로 반환",
content = @Content(mediaType = "application/json", schema = @Schema(implementation = User.class))
)
@GetMapping("/users/{id}")
public User getUserById(@PathVariable int id) {
return new User(id, "홍길동", "hong@example.com");
}
import io.swagger.v3.oas.annotations.Hidden;
@Hidden
@GetMapping("/admin")
public String adminEndpoint() {
return "관리자 전용 API";
}
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
@SecurityRequirement(name = "Bearer Authentication")
@GetMapping("/secure-data")
public String secureData() {
return "인증된 사용자만 접근 가능";
}