OPEN HYPER STEP
← 목록으로 (Java+Spring)
JAVA · 79 / 99
java
CHAPTER 79 / 99
읽기 약 2
FUNCTION

API 문서화: Swagger/OpenAPI


핵심 개념

springdoc-openapi·@Operation·@Parameter·@Schema — API 자동 문서화.

본문

springdoc-openapi 설정

GRADLE📋 코드 (2줄)
// build.gradle
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0'

기본 설정

JAVA📋 코드 (20줄)
@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 어노테이션

JAVA📋 코드 (37줄)
@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 스키마 어노테이션

JAVA📋 코드 (34줄)
@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
) {}

환경별 설정

YAML📋 코드 (17줄)
# 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: false

API 그룹화

JAVA📋 코드 (15줄)
@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