본문 바로가기

Spring boot - Docker-compose hot loading 환경 설정(with, vscode) 본문

개발/Spring boot

Spring boot - Docker-compose hot loading 환경 설정(with, vscode)

자전하는명왕성 2025. 4. 25. 23:03
반응형

오늘은 몇날 며칠 숙고했던 Spring boot 에서의 Docker 환경 설정에 대해 다룬다.

 

포스팅에 앞서, 겪고 있던 문제에 대해 설명하면, 소스 코드 변경 시 해당 변경 사항이 적용되지 않은 채 docker가 재로딩되는 문제였다.

재로딩 자체는 의도했던 것이었지만, 변경된 소스 코드가 적용되지 않은 채 변경되었다는 게 문제.

 

따라서, 마침내 승리한 기록을 남기고자, 미래에 나에게 전하고자 중점 소스 코드 위주로 해당 포스팅을 남긴다.

 

1. build.gradle 설정을 아래와 같이 추가한다.

// Spring Boot DevTools 의존성 추가
implementation 'org.springframework.boot:spring-boot-devtools'

// bootRun 태스크 설정
bootRun {
    dependsOn 'classes'
    sourceResources sourceSets.main
}

// 소스 코드 변경 감지 태스크
tasks.register('watch') {
    doLast {
        println '소스코드 변경 감지 중'
        exec {
            executable = 'gradle'
            args = ['build', '--continuous']
        }
    }
}

 

2. Dockerfile 을 아래와 같이 수정한다.

# 베이스 이미지 (Gradle + JDK 17 포함)
FROM gradle:8.6-jdk17 as builder 

# 작업 디렉토리 설정
WORKDIR /app

# 의존성 설치를 위해 gradle 관련 파일만 먼저 복사
COPY build.gradle settings.gradle gradlew gradlew.bat ./
COPY gradle ./gradle

# 의존성만 미리 다운 (캐시 최적화)
RUN ./gradlew dependencies --no-daemon || return 0

# 소스 복사
COPY src ./src

# 실행 포트 오픈
EXPOSE 8080

# gradlew 실행권한 부여
RUN chmod +x ./gradlew

# 환경변수 설정 (optional, devtools)
ENV SPRING_DEVTOOLS_RESTART_ENABLED=true
ENV SPRING_DEVTOOLS_LIVERELOAD_ENABLED=true

# 어플리케이션 실행
CMD ["./gradlew", "bootRun", "--continuous", "--no-daemon"]

# --continuous => 소스 코드를 지속적으로 감지
# --no-daemon => grdale 데몬을 사용하지 않고 직접 실행
# (빌드 속도는 빠르나, Docker 컨테이너 자체가 일회성이 잦기에 데몬 유지가 의미 없을 뿐더러 메모리 누수 방지)

 

3. docker-compose.yaml 파일 설정 

version: '3.8'

services:
  app:
    container_name: ${container_name}
    build:
      context: .
      dockerfile: Dockerfile.dev
    ports:
      - "8080:8080"
    environment:
      SPRING_PROFILES_ACTIVE: dev
      SPRING_DATASOURCE_URL: jdbc:mysql://db:3306/${DB_NAME}
      SPRING_DATASOURCE_USERNAME: ${DB_USERNAME}
      SPRING_DATASOURCE_PASSWORD: ${DB_PASSWORD}
    volumes:
      - ./src:/app/src
      - ./gradle:/app/gradle
      - ./build.gradle:/app/build.gradle
      - ./settings.gradle:/app/settings.gradle
      - ./gradlew:/app/gradlew
      - ./gradlew.bat:/app/gradlew.bat
      - ./build:/app/build
      - ~/.gradle:/root/.gradle
    env_file:
      - .env
    depends_on:
      - db
    command: sh -c "./gradlew classes --continuous --no-daemon & ./gradlew bootRun --no-daemon"

// 이하 중략

해당 파일에 대해 설명을 하자면, 

# 볼륨
./src:/app/src => 소스 코드 변경을 실시간으로 반영토록 하는 볼륨
~/.gradle:/root/.gradle => gradle 캐시 공유
기타 => gradle 관련 파일 & 설정 유지

# 명령어
./gradlew classes --continuous --no-daemon: 소스 코드 변경 감지
./gradlew bootRun --no-daemon: 애플리케이션 실행

 

주의 사항

- 소스 코드 변경 시 자동으로 재빌드 되지만, 일부 변경 사항의 경우 서버 재시작이 필요할 수 있음.

추신

- nest.js할 때가 좋았다.

 

 

 

반응형
Comments