[인프라] - Docker Compose 구성 (DB, Redis, MinIO) - Spring Boot 3.5.9 + Kotlin + Gradle 설정 [인증/보안] - Spring Security 및 JWT 필터 설정 - RTR(Refresh Token Rotation) 방식의 토큰 재발급 로직 구현 - Redis를 활용한 Refresh Token 및 이메일 인증 코드 관리 [기능 구현] - 회원가입 (이메일 인증 포함) - 로그인/로그아웃/토큰재발급 API 구현 - 공통 응답(ApiResponse) 및 전역 예외 처리(GlobalExceptionHandler) 적용
92 lines
2.5 KiB
YAML
92 lines
2.5 KiB
YAML
services:
|
|
# 1. 백엔드 애플리케이션
|
|
blog-api:
|
|
build: .
|
|
container_name: blog-api
|
|
restart: always
|
|
ports:
|
|
- "8080:8080"
|
|
environment:
|
|
# Database
|
|
- SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/blog_db
|
|
- SPRING_DATASOURCE_USERNAME=${DB_USER}
|
|
- SPRING_DATASOURCE_PASSWORD=${DB_PASS}
|
|
# Redis
|
|
- SPRING_DATA_REDIS_HOST=redis
|
|
- SPRING_DATA_REDIS_PORT=6379
|
|
# AWS S3 / MinIO (Docker 내부 통신용)
|
|
- CLOUD_AWS_CREDENTIALS_ACCESS_KEY=admin
|
|
- CLOUD_AWS_CREDENTIALS_SECRET_KEY=password
|
|
- CLOUD_AWS_REGION_STATIC=ap-northeast-2
|
|
- CLOUD_AWS_S3_ENDPOINT=http://minio:9000
|
|
# SMTP 메일 설정
|
|
- SPRING_MAIL_HOST=smtp.gmail.com
|
|
- SPRING_MAIL_PORT=587
|
|
- SPRING_MAIL_USERNAME=${MAIL_USER}
|
|
- SPRING_MAIL_PASSWORD=${MAIL_PASS}
|
|
# SMTP 세부 설정
|
|
- SPRING_MAIL_PROPERTIES_MAIL_SMTP_AUTH=true
|
|
- SPRING_MAIL_PROPERTIES_MAIL_SMTP_STARTTLS_ENABLE=true
|
|
- SPRING_MAIL_PROPERTIES_MAIL_SMTP_STARTTLS_REQUIRED=true
|
|
- SPRING_MAIL_PROPERTIES_MAIL_SMTP_CONNECTIONTIMEOUT=5000
|
|
- SPRING_MAIL_PROPERTIES_MAIL_SMTP_TIMEOUT=5000
|
|
- SPRING_MAIL_PROPERTIES_MAIL_SMTP_WRITETIMEOUT=5000
|
|
depends_on:
|
|
db:
|
|
condition: service_healthy
|
|
redis:
|
|
condition: service_healthy
|
|
networks:
|
|
- blog-net
|
|
|
|
# 2. 데이터베이스 (PostgreSQL)
|
|
db:
|
|
image: postgres:17-alpine
|
|
container_name: blog-db
|
|
restart: always
|
|
ports:
|
|
- "5432:5432"
|
|
environment:
|
|
POSTGRES_USER: ${DB_USER}
|
|
POSTGRES_PASSWORD: ${DB_PASS}
|
|
POSTGRES_DB: blog_db
|
|
volumes:
|
|
- ./postgres_data:/var/lib/postgresql/data
|
|
healthcheck:
|
|
test: [ "CMD-SHELL", "pg_isready -U ${DB_USER} -d blog_db" ]
|
|
interval: 5s
|
|
retries: 5
|
|
networks:
|
|
- blog-net
|
|
|
|
# 3. 캐시 서버 (Redis)
|
|
redis:
|
|
image: redis:7-alpine
|
|
container_name: blog-redis
|
|
restart: always
|
|
healthcheck:
|
|
test: [ "CMD", "redis-cli", "ping" ]
|
|
interval: 5s
|
|
retries: 5
|
|
networks:
|
|
- blog-net
|
|
|
|
# 4. 오브젝트 스토리지 (MinIO)
|
|
minio:
|
|
image: minio/minio
|
|
container_name: minio
|
|
ports:
|
|
- "9000:9000" # API 통신
|
|
- "9001:9001" # 웹 콘솔
|
|
environment:
|
|
MINIO_ROOT_USER: "admin"
|
|
MINIO_ROOT_PASSWORD: "password"
|
|
command: server /data --console-address ":9001"
|
|
volumes:
|
|
- ./minio_data:/data
|
|
networks:
|
|
- blog-net
|
|
|
|
networks:
|
|
blog-net:
|
|
driver: bridge |