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할 때가 좋았다.
반응형
'개발 > Spring boot' 카테고리의 다른 글
Spring boot - Custom Global exception Handler 적용 (1) | 2025.05.04 |
---|---|
Spring boot - Api docs 설정 (Swagger + OpenAPI) (3) | 2025.05.01 |
Spring boot - 패키지가 정상 빌드되지 않을 때(Gradle) (1) | 2025.04.11 |
Java - 버전이 정상적으로 지정되지 않을 때 (셀 스크립트) (0) | 2025.04.07 |
Comments