Spring Boot 설정

허동빈·2026년 1월 27일

docker

목록 보기
5/8
post-thumbnail

Chapter 05: Spring Boot 설정 변경

Docker 컨테이너 환경에서 동작하도록 Spring Boot 설정을 최적화.


1. 왜 설정을 변경하는가?

🎯 현재 상황

Docker Compose로 실행하면 환경 변수가 우선순위가 높음.

우선순위 (높음 → 낮음):
1. docker-compose.yml의 environment ✅ (최우선)
2. .env 파일
3. application-dev.yml
4. application.yml

📊 설정 값 결정 과정

Spring Boot 시작 시:

1. docker-compose.yml 확인
   SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/...
   → 환경 변수 발견 이것을 사용 ✅

2. application-dev.yml 무시됨
   spring.datasource.url: jdbc:mysql://localhost:3306/...
   → 환경 변수가 있으므로 무시

✅ 결과

spring:
  datasource:
    url: ${SPRING_DATASOURCE_URL:jdbc:mysql://localhost:3306/...}
    #     ↑ 환경 변수 우선, 없으면 기본값 사용

이 설정의 장점:

  • ✅ Docker Compose 실행 시: 환경 변수 사용 (mysql:3306)
  • ✅ IntelliJ 로컬 실행 시: 기본값 사용 (localhost:3306)

2. 환경 변수 vs 설정 파일

📊 비교

항목환경 변수설정 파일
우선순위높음 ✅낮음
용도Docker, K8s 환경로컬 개발
장점환경별 다른 설정 쉬움코드로 관리 가능
단점많아지면 관리 복잡하드코딩 위험

🎯 Best Practice

# application-dev.yml
spring:
  datasource:
    url: ${SPRING_DATASOURCE_URL:jdbc:mysql://localhost:3306/DevCourse}
    #     ↑                      ↑
    #   환경 변수 이름           기본값 (환경 변수 없을 때)

이 방식의 장점:

  • Docker에서 실행: 환경 변수로 mysql:3306 주입
  • 로컬에서 실행: 기본값 localhost:3306 사용
  • 한 파일로 두 환경 모두 지원 ✅

3. application-dev.yml 확인

📄 현재 설정 확인

현재 src/main/resources/application-dev.yml은 이미 올바르게 설정되어 있습니다.

spring:
  datasource:
    # Docker Compose 환경: mysql 컨테이너 사용
    # 로컬 환경: localhost:3306으로 접근
    url: ${SPRING_DATASOURCE_URL:jdbc:mysql://localhost:3306/DevCourse?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Seoul&allowPublicKeyRetrieval=true}
    username: ${SPRING_DATASOURCE_USERNAME:root}
    password: ${SPRING_DATASOURCE_PASSWORD:lldj123414}
    driver-class-name: com.mysql.cj.jdbc.Driver

  jpa:
    hibernate:
      ddl-auto: ${SPRING_JPA_HIBERNATE_DDL_AUTO:update}
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MySQLDialect
        format_sql: true
    show-sql: ${SPRING_JPA_SHOW_SQL:true}

  # Redis 설정
  data:
    redis:
      host: ${SPRING_DATA_REDIS_HOST:localhost}
      port: ${SPRING_DATA_REDIS_PORT:6379}

확인 포인트:

  • ✅ 모든 중요 값이 환경 변수로 주입 가능
  • ✅ 기본값이 로컬 개발 환경에 맞게 설정됨
  • ✅ 수정 불필요!

4. Actuator 설정 추가

📝 왜 필요한가?

Actuator는 Spring Boot 애플리케이션의 헬스체크, 메트릭, 모니터링을 제공.

Docker Healthcheck → /actuator/health 호출
Prometheus → /actuator/prometheus 메트릭 수집

✅ 현재 설정 확인

application.yml에 이미 설정되어 있는지 확인:

management:
  endpoints:
    web:
      exposure:
        include: health,info,prometheus
  endpoint:
    health:
      show-details: always

만약 없다면 추가 필요합니다.


🔧 Actuator 설정 추가 (필요 시)

application.yml에 추가

management:
  endpoints:
    web:
      exposure:
        include: health,info,prometheus,metrics
      base-path: /actuator
  endpoint:
    health:
      show-details: always
      show-components: always
  metrics:
    export:
      prometheus:
        enabled: true

설정 설명:

설정역할
include: health,info,prometheus,metrics노출할 엔드포인트 목록
show-details: always헬스체크 상세 정보 표시
prometheus.enabled: truePrometheus 메트릭 수집 활성화

🧪 Actuator 동작 확인

# 헬스체크
curl http://localhost:8080/actuator/health

# 출력 예시:
{
  "status": "UP",
  "components": {
    "db": {
      "status": "UP",
      "details": {
        "database": "MySQL",
        "validationQuery": "isValid()"
      }
    },
    "redis": {
      "status": "UP",
      "details": {
        "version": "7.2.4"
      }
    }
  }
}
# Prometheus 메트릭
curl http://localhost:8080/actuator/prometheus | head -20

# 출력 예시:
# HELP jvm_memory_used_bytes The amount of used memory
# TYPE jvm_memory_used_bytes gauge
jvm_memory_used_bytes{area="heap",id="G1 Eden Space",} 1.2345678E8
...

5. 로깅 설정 최적화

📝 왜 필요한가?

Docker 컨테이너 환경에서는 로그를 표준 출력(stdout)으로 보내야 docker-compose logs로 확인 가능.

🔍 현재 로깅 설정 확인

src/main/resources/logback-spring.xml 파일 확인:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 콘솔 출력 (Docker 환경) -->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!-- 루트 로거 -->
    <root level="INFO">
        <appender-ref ref="CONSOLE" />
    </root>

    <!-- 애플리케이션 로거 -->
    <logger name="com.back" level="DEBUG" />
    <logger name="org.springframework.web" level="DEBUG" />
</configuration>

확인 포인트:

  • ✅ 콘솔 출력 설정 (Docker 호환)
  • ✅ 타임스탬프, 스레드, 로그 레벨 포함
  • ✅ 애플리케이션 로거 DEBUG 레벨

🎨 로그 색상 추가 (선택 사항)

개발 환경에서 로그 가독성 향상:

<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss} %highlight(%-5level) [%thread] %cyan(%logger{36}) - %msg%n</pattern>
    </encoder>
</appender>

Docker 로그에서 확인:

docker-compose logs -f app

# 출력 예시:
2026-01-28 10:30:45 INFO  [main] c.b.DevCource2Application - Starting...
2026-01-28 10:30:46 DEBUG [main] c.b.d.a.service.AuctionService - 경매 조회 - ID: 1

6. 파일 업로드 설정

📝 왜 필요한가?

경매 이미지를 컨테이너 내부 Volume에 저장해야 데이터가 유지.

🔧 설정 확인

application.yml에 파일 업로드 경로 설정:

# 파일 업로드 설정
file:
  upload:
    dir: ${FILE_UPLOAD_DIR:/app/uploads}

환경별 경로:

환경경로
Docker 컨테이너/app/uploads (Volume 마운트됨)
로컬 개발./uploads (프로젝트 루트)

🎯 docker-compose.yml에서 Volume 매핑 확인

services:
  app:
    volumes:
      - uploads-data:/app/uploads  # ← 이 설정이 중요!

동작 방식:

┌─────────────────────────────────┐
│ auction-app 컨테이너             │
│  /app/uploads                   │
└─────────┬───────────────────────┘
          │ Volume 마운트
          ↓
┌─────────────────────────────────┐
│ Docker Volume: uploads-data     │
│  - 컨테이너 삭제해도 유지 ✅     │
│  - 호스트에서도 접근 가능        │
└─────────────────────────────────┘

7. 설정 검증

✅ 체크리스트

1. 환경 변수 주입 확인

# Spring Boot 컨테이너 환경 변수 확인
docker exec auction-app env | grep SPRING

# 출력 예시:
SPRING_PROFILES_ACTIVE=dev
SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/DevCourse...
SPRING_DATASOURCE_USERNAME=root
SPRING_DATASOURCE_PASSWORD=lldj123414
SPRING_DATA_REDIS_HOST=redis
SPRING_DATA_REDIS_PORT=6379

2. 데이터베이스 연결 확인

# Spring Boot 로그에서 Hikari 연결 확인
docker-compose logs app | grep -i hikari

# 출력 예시:
HikariPool-1 - Starting...
HikariPool-1 - Added connection conn0: url=jdbc:mysql://mysql:3306/DevCourse

3. Redis 연결 확인

# Spring Boot 로그에서 Redis 연결 확인
docker-compose logs app | grep -i redis

# 출력 예시:
Lettuce ConnectionFactory initialized

4. Actuator 엔드포인트 확인

# 헬스체크
curl http://localhost:8080/actuator/health

# 메트릭
curl http://localhost:8080/actuator/prometheus | head -10

5. 파일 업로드 경로 확인

# 컨테이너 내부 디렉토리 확인
docker exec auction-app ls -la /app/uploads

# 출력 예시:
drwxr-xr-x 2 spring spring 4096 Jan 28 10:00 .
drwxr-xr-x 3 spring spring 4096 Jan 28 10:00 ..

🎯 핵심 요약

설정 우선순위

1. docker-compose.yml의 environment (최우선)
2. .env 파일
3. application-dev.yml (기본값)
4. application.yml (전역 설정)

환경별 동작

환경MySQL 연결Redis 연결파일 업로드
Docker Composemysql:3306redis:6379/app/uploads
IntelliJ 로컬localhost:3306localhost:6379./uploads

수정 불필요 항목

  • ✅ application-dev.yml (이미 환경 변수 지원)
  • ✅ logback-spring.xml (콘솔 출력 설정됨)
  • ✅ Actuator 설정 (이미 활성화됨)

확인 필요 항목

  • ✅ Actuator 엔드포인트 노출 여부
  • ✅ Prometheus 메트릭 활성화
  • ✅ 로그 출력 형식

📚 참고 자료

profile
백엔드 공부

0개의 댓글