``` Swagger = API 문서화 + 테스트 도구 (현재 OpenAPI) └── 이름 유래: “swagger” = 뽐내다, 자신있게 걷다 └── API를 “뽐내듯이” 보여준다는 의미
API 문서화의 고통:
이 주제를 이해하고 적용해야 하는 이유를 정리한다.
작성일: 2026-01-28 카테고리: Backend / Development Tools 포함 내용: Swagger(OpenAPI), H2 Database, 개발 환경 설정
Swagger = API 문서화 + 테스트 도구 (현재 OpenAPI)
└── 이름 유래: "swagger" = 뽐내다, 자신있게 걷다
└── API를 "뽐내듯이" 보여준다는 의미
H2 = 자바 기반 인메모리 데이터베이스
└── 이름 유래: 수소(Hydrogen)의 화학 기호
└── 가볍고 빠르다는 의미
직접적인 연관은 없음!
하지만 Spring Boot 개발 시 "로컬 개발 환경 3종 세트"로 자주 함께 사용:
┌─────────────────────────────────────────────────────────────┐
│ Spring Boot 로컬 개발 환경 │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Swagger │ │ H2 │ │ Spring Boot │ │
│ │ (API 문서) │ │ (가벼운 DB) │ │ DevTools │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │ │ │ │
│ └────────────────┼────────────────┘ │
│ ▼ │
│ 로컬에서 빠르게 개발/테스트 │
└─────────────────────────────────────────────────────────────┘
프로덕션에서는:
- Swagger → 비활성화 또는 인증 추가
- H2 → MySQL, PostgreSQL 등으로 교체
API 문서화의 고통:
옛날 방식:
├── Word/Wiki에 API 명세 작성
├── 코드 변경 → 문서 수동 업데이트 (자주 잊음)
├── 문서 ≠ 실제 코드 (싱크 안 맞음)
└── API 테스트하려면 Postman/curl 따로 사용
2011: Swagger 등장
"코드에서 API 문서 자동 생성하자!"
2015: OpenAPI Initiative 설립
Swagger 스펙 → OpenAPI Specification으로 표준화
(Linux Foundation 산하)
현재:
├── OpenAPI = 스펙/표준 (3.0, 3.1)
├── Swagger = 도구 이름 (Swagger UI, Swagger Editor)
└── Springdoc/Springfox = Spring 연동 라이브러리
1. API 문서 자동 생성
코드의 어노테이션 → HTML 문서
2. API 테스트 UI 제공
브라우저에서 바로 API 호출 가능
3. API 스펙 정의 (OpenAPI JSON/YAML)
다른 도구와 연동 가능 (코드 생성 등)
┌─────────────────────────────────────────────────────────────┐
│ http://localhost:8080/swagger-ui.html │
│─────────────────────────────────────────────────────────────│
│ │
│ My API │
│ ═══════════════════════════════════════════════ │
│ │
│ ▼ User Controller │
│ ┌─────────────────────────────────────────────┐ │
│ │ GET /api/users 사용자 목록 조회 │ │
│ │ POST /api/users 사용자 생성 │ │
│ │ GET /api/users/{id} 사용자 상세 조회 │ │
│ │ PUT /api/users/{id} 사용자 수정 │ │
│ │ DELETE /api/users/{id} 사용자 삭제 │ │
│ └─────────────────────────────────────────────┘ │
│ │
│ [Try it out] 버튼으로 바로 API 테스트 가능! │
└─────────────────────────────────────────────────────────────┘
// build.gradle.kts
// Springdoc OpenAPI (권장, 최신)
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0")
// 또는 Springfox (레거시, 유지보수만)
// implementation("io.springfox:springfox-boot-starter:3.0.0")
# application.yml
springdoc:
api-docs:
path: /api-docs # OpenAPI JSON 경로
swagger-ui:
path: /swagger-ui.html # Swagger UI 경로
tags-sorter: alpha # 태그 알파벳 정렬
operations-sorter: alpha # API 알파벳 정렬
@RestController
@RequestMapping("/api/users")
@Tag(name = "User", description = "사용자 관리 API")
class UserController(
private val userService: UserService
) {
@Operation(
summary = "사용자 목록 조회",
description = "등록된 모든 사용자를 조회합니다"
)
@ApiResponses(
ApiResponse(responseCode = "200", description = "성공"),
ApiResponse(responseCode = "401", description = "인증 실패")
)
@GetMapping
fun getUsers(): List<UserResponse> {
return userService.findAll()
}
@Operation(summary = "사용자 생성")
@PostMapping
fun createUser(
@Parameter(description = "생성할 사용자 정보")
@RequestBody request: CreateUserRequest
): UserResponse {
return userService.create(request)
}
@Operation(summary = "사용자 상세 조회")
@GetMapping("/{id}")
fun getUser(
@Parameter(description = "사용자 ID", example = "1")
@PathVariable id: Long
): UserResponse {
return userService.findById(id)
}
}
@Schema(description = "사용자 생성 요청")
data class CreateUserRequest(
@Schema(description = "사용자 이름", example = "홍길동")
val name: String,
@Schema(description = "이메일", example = "hong@example.com")
val email: String,
@Schema(description = "나이", minimum = "0", maximum = "150")
val age: Int
)
| 어노테이션 | 용도 | 위치 |
|---|---|---|
@Tag |
컨트롤러 그룹 이름 | 클래스 |
@Operation |
API 설명 | 메서드 |
@Parameter |
파라미터 설명 | 파라미터 |
@Schema |
모델/필드 설명 | DTO 클래스/필드 |
@ApiResponse |
응답 설명 | 메서드 |
@Hidden |
문서에서 숨김 | 클래스/메서드 |
// 프로덕션에서 Swagger 비활성화
@Profile("!prod") // prod 프로필이 아닐 때만 활성화
@Configuration
class SwaggerConfig {
@Bean
fun openAPI(): OpenAPI {
return OpenAPI()
.info(Info()
.title("My API")
.version("1.0.0")
.description("API 문서"))
}
}
# application-prod.yml
springdoc:
api-docs:
enabled: false # 프로덕션에서 비활성화
swagger-ui:
enabled: false
개발 환경 DB의 고통:
옛날 방식:
├── 로컬에 MySQL/PostgreSQL 설치
├── 개발자마다 DB 설정 다름
├── 테스트 데이터 관리 어려움
└── CI/CD에서 DB 연결 문제
H2 등장:
├── 설치 필요 없음 (JAR 하나)
├── 인메모리 모드 (앱 시작 시 생성, 종료 시 삭제)
├── 파일 모드도 지원
└── 웹 콘솔 제공 (브라우저에서 DB 조회)
✅ 장점:
├── 설치 불필요 (의존성 추가만으로 사용)
├── 초고속 (인메모리)
├── 웹 콘솔 제공
├── MySQL/PostgreSQL 호환 모드
└── 테스트에 최적
❌ 단점:
├── 프로덕션 부적합
├── 인메모리 = 재시작하면 데이터 사라짐
└── 실제 DB와 미묘한 차이 가능
용도:
├── 로컬 개발
├── 단위 테스트
└── 통합 테스트
1. 인메모리 모드 (개발/테스트용)
jdbc:h2:mem:testdb
└── 앱 종료 시 데이터 삭제
2. 파일 모드 (데이터 유지)
jdbc:h2:file:./data/mydb
└── 파일로 저장, 재시작해도 유지
3. 서버 모드 (여러 앱에서 접근)
jdbc:h2:tcp://localhost/~/mydb
└── 별도 H2 서버 실행 필요
// build.gradle.kts
runtimeOnly("com.h2database:h2")
# application.yml (개발 환경)
spring:
datasource:
url: jdbc:h2:mem:testdb # 인메모리 DB
driver-class-name: org.h2.Driver
username: sa
password:
h2:
console:
enabled: true # 웹 콘솔 활성화
path: /h2-console # 콘솔 경로
settings:
web-allow-others: false # 외부 접근 차단
jpa:
hibernate:
ddl-auto: create-drop # 시작 시 생성, 종료 시 삭제
show-sql: true # SQL 로그 출력
┌─────────────────────────────────────────────────────────────┐
│ http://localhost:8080/h2-console │
│─────────────────────────────────────────────────────────────│
│ │
│ H2 Console │
│ │
│ JDBC URL: jdbc:h2:mem:testdb │
│ User Name: sa │
│ Password: (빈칸) │
│ │
│ [Connect] │
│─────────────────────────────────────────────────────────────│
│ │
│ 접속 후: │
│ ┌─────────────────┬───────────────────────────────┐ │
│ │ Tables │ SQL 입력창 │ │
│ │ ├── USERS │ │ │
│ │ ├── ORDERS │ SELECT * FROM users; │ │
│ │ └── PRODUCTS │ │ │
│ │ │ [Run] │ │
│ └─────────────────┴───────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ 개발 환경 워크플로우 │
│ │
│ 개발자 │
│ │ │
│ ├──► http://localhost:8080/swagger-ui.html │
│ │ └── API 문서 확인 + 테스트 │
│ │ │
│ ├──► http://localhost:8080/h2-console │
│ │ └── DB 데이터 직접 확인/수정 │
│ │ │
│ └──► IDE에서 코드 수정 │
│ └── Spring DevTools로 자동 재시작 │
│ │
└─────────────────────────────────────────────────────────────┘
# application-dev.yml (개발)
spring:
datasource:
url: jdbc:h2:mem:devdb
h2:
console:
enabled: true
springdoc:
swagger-ui:
enabled: true
---
# application-prod.yml (프로덕션)
spring:
datasource:
url: jdbc:postgresql://prod-db:5432/myapp
h2:
console:
enabled: false # H2 콘솔 비활성화!
springdoc:
swagger-ui:
enabled: false # Swagger 비활성화!
// build.gradle.kts
dependencies {
// Spring Boot
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
// Swagger (API 문서)
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0")
// H2 (개발용 DB)
runtimeOnly("com.h2database:h2")
// 프로덕션 DB
runtimeOnly("org.postgresql:postgresql")
// DevTools (자동 재시작)
developmentOnly("org.springframework.boot:spring-boot-devtools")
}
┌─────────────────────────────────────────────────────────────┐
│ │
│ Swagger (OpenAPI) │
│ ├── 역할: API 문서 자동 생성 + 테스트 UI │
│ ├── 접속: /swagger-ui.html │
│ └── 프로덕션: 비활성화 또는 인증 필요 │
│ │
│ H2 Database │
│ ├── 역할: 가벼운 인메모리 DB (개발/테스트용) │
│ ├── 접속: /h2-console │
│ └── 프로덕션: 절대 사용 X (PostgreSQL 등으로 교체) │
│ │
│ 둘의 관계: │
│ ├── 직접적 연관 없음 │
│ ├── "개발 환경 편의 도구"로 함께 자주 사용 │
│ └── 프로덕션에서는 둘 다 비활성화 │
│ │
│ 비유: │
│ Swagger = API 설명서 + 시험장 │
│ H2 = 연습용 공책 (지우면 사라짐) │
│ │
└─────────────────────────────────────────────────────────────┘
Swagger, OpenAPI, Springdoc, API 문서, H2, 인메모리 DB, 개발 환경, Spring Boot, DevTools