java
CHAPTER 79 / 99
읽기 약 2분
FUNCTION
API 문서화: Swagger/OpenAPI
핵심 개념
springdoc-openapi·@Operation·@Parameter·@Schema — API 자동 문서화.
본문
springdoc-openapi 설정
// build.gradle
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0'기본 설정
@Configuration
public class OpenApiConfig {
@Bean
public OpenAPI openAPI() {
return new OpenAPI()
.info(new Info()
.title("OHS API")
.version("v1.0")
.description("OPEN HYPER STEP REST API"))
.components(new Components()
.addSecuritySchemes("bearerAuth",
new SecurityScheme()
.type(SecurityScheme.Type.HTTP)
.scheme("bearer")
.bearerFormat("JWT")
))
.addSecurityItem(new SecurityRequirement().addList("bearerAuth"));
}
}API 어노테이션
@RestController
@RequestMapping("/api/users")
@Tag(name = "User", description = "사용자 관리 API")
@RequiredArgsConstructor
public class UserController {
private final UserService userService;
@Operation(summary = "사용자 조회", description = "ID로 단일 사용자 조회")
@ApiResponses({
@ApiResponse(responseCode = "200", description = "성공",
content = @Content(schema = @Schema(implementation = UserDto.class))),
@ApiResponse(responseCode = "404", description = "사용자 없음",
content = @Content(schema = @Schema(implementation = ProblemDetail.class)))
})
@GetMapping("/{id}")
public UserDto getUser(
@Parameter(description = "사용자 ID", example = "1", required = true)
@PathVariable Long id
) {
return userService.findById(id);
}
@Operation(summary = "사용자 등록")
@PostMapping
public ResponseEntity<UserDto> create(
@Valid @RequestBody
@io.swagger.v3.oas.annotations.parameters.RequestBody(
description = "사용자 등록 정보",
required = true,
content = @Content(schema = @Schema(implementation = SignupRequest.class))
)
SignupRequest req
) {
return ResponseEntity.status(HttpStatus.CREATED)
.body(userService.signup(req));
}
}DTO 스키마 어노테이션
@Schema(description = "사용자 정보")
public record UserDto(
@Schema(description = "사용자 ID", example = "1")
Long id,
@Schema(description = "이메일", example = "alice@example.com")
String email,
@Schema(description = "이름", example = "Alice")
String name,
@Schema(description = "권한", example = "USER",
allowableValues = {"USER", "ADMIN"})
String role,
@Schema(description = "가입일")
LocalDateTime createdAt
) {}
@Schema(description = "회원가입 요청")
public record SignupRequest(
@Schema(description = "이메일", example = "alice@example.com")
@NotBlank @Email
String email,
@Schema(description = "비밀번호 (8자+, 대문자+숫자)", example = "Pass1234")
@NotBlank @Pattern(regexp = "^(?=.*[A-Z])(?=.*\d).{8,}$")
String password,
@Schema(description = "이름", example = "Alice")
@NotBlank @Size(min = 2, max = 50)
String name
) {}환경별 설정
# application.yml
springdoc:
api-docs:
path: /api-docs
enabled: true
swagger-ui:
path: /swagger
operations-sorter: alpha
tags-sorter: alpha
try-it-out-enabled: true
# application-prod.yml — 프로덕션은 비활성
springdoc:
api-docs:
enabled: false
swagger-ui:
enabled: falseAPI 그룹화
@Bean
public GroupedOpenApi userApi() {
return GroupedOpenApi.builder()
.group("user")
.pathsToMatch("/api/users/**")
.build();
}
@Bean
public GroupedOpenApi adminApi() {
return GroupedOpenApi.builder()
.group("admin")
.pathsToMatch("/api/admin/**")
.build();
}다음 모듈
CH.11~20 "테스트와 품질" — JUnit·Mockito·Testcontainers.
AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude
무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6
내 Spring 코드의 Swagger/OpenAPI 부분을 분석해서 문서 자동화 + 일관성와 개선 우선순위를 알려줘.
ChatGPT
무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro
Swagger/OpenAPI vs 다른 패턴 비교를 실전 사례 5개로 보여주고 Swagger vs Postman vs RAML를 알려줘.
Gemini
무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro
내 코드베이스 전체를 분석해서 Swagger/OpenAPI 관련 문서 누락·outdated 위치를 보고해줘.
Grok
무료: Grok 4.1 / SuperGrok $30/mo
2026년 한국 기업의 Swagger/OpenAPI 채택률과 한국 백엔드 API 문서화 표준를 솔직히 알려줘.
⭐ 이것만 기억하세요
API 문서화: Swagger/OpenAPI는 이 3가지만 확실히 잡으세요
1.springdoc-openapi 의존성 + @Operation/@Schema = 자동 문서 + Swagger UI
2.http://localhost:8080/swagger 에서 직접 API 호출 가능 — 프론트엔드 팀 전달용 표준
3.다음 모듈(CH.11~20)에서 테스트 — JUnit/Mockito/Testcontainers
공유하기
진행도 79 / 99