Spring Boot 설정 값 핫 리로드 비교 및 적용 방법
DevTools와 Spring Cloud Config를 활용해 Spring Boot 설정 값을 실시간 반영하는 방법과 적용 시 주의사항, 설정 예제와 동작 원리를 사례 중심으로 정리
목차
개요
애플리케이션 설정을 수정한 뒤 재시작 없이 반영하면 개발 생산성이 크게 높아진다. 이 글은 개발 환경에서 자주 쓰이는 두 가지 접근법을 다룬다. 첫째는 로컬 변경을 자동으로 적용하는 DevTools, 둘째는 중앙 설정 서버를 사용해 분산 환경에서 동적 갱신을 지원하는 Spring Cloud Config이다. 기본 개념과 설정 예제, 동작 방식, 장단점을 사례 중심으로 정리한다.
핵심 개념
핵심은 변경 감지와 설정 반영의 범위다. DevTools는 로컬 파일 변경을 감지해 애플리케이션을 빠르게 재시작하거나 속성값을 재로딩한다. 반면 Spring Cloud Config는 설정 서버에서 설정을 관리하고 클라이언트가 변경을 감지하거나 수동으로 갱신하는 방식이다. 용도에 따라 두 방식은 상호 보완적이다.
DevTools 설정과 동작
의존성 추가
간단한 의존성 추가로 개발 모드에서 자동 재시작과 캐시 무시 기능을 사용할 수 있다. build.gradle 또는 pom.xml에 DevTools를 추가한다.
// Gradle
implementation 'org.springframework.boot:spring-boot-devtools'
// Maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
핫 리로드 방식
- 클래스패스 변경 시 자동 재시작으로 애플리케이션 컨텍스트 초기화
- 속성 파일 변경은 일부 경우 즉시 반영되지만, 복잡한 빈은 재시작이 필요
- devtools property reload spring boot 관련 문서를 참고하면 상세 동작을 확인할 수 있다
간단한 application.properties 예
spring.devtools.restart.enabled=true
spring.devtools.livereload.enabled=true
management.endpoints.web.exposure.include=refresh,health
Spring Cloud Config 설정과 동작
구성 요소
- Config Server: 중앙 저장소(예: Git, 파일 시스템)와 클라이언트를 중개
- Config Client: 애플리케이션에서 설정을 가져오고 갱신 트리거를 처리
간단한 서버 설정
// application.yml for config server
spring:
cloud:
config:
server:
git:
uri: https://github.com/example/config-repo
// Enable server
<!-- Spring Boot application class with @EnableConfigServer -->
클라이언트에서 설정 갱신
클라이언트는 기본적으로 부트 시 서버에서 설정을 가져온다. 변경 반영은 두 가지 방식으로 이루어진다.
- 수동 호출: 관리 엔드포인트로 /actuator/refresh 호출
- 이벤트 기반: Spring Cloud Bus를 이용해 여러 인스턴스에 브로드캐스트
// 예: curl로 refresh 호출
curl -X POST http://localhost:8080/actuator/refresh
이 방법은 spring cloud config refresh 기능을 통해 분산 환경에서 설정을 동기화하는 표준 패턴이다.
코드 예: @RefreshScope 사용
설정 변경 시 빈의 속성만 다시 주입받고 싶다면 @RefreshScope를 사용한다.
// 예시 컨트롤러
@org.springframework.web.bind.annotation.RestController
public class SampleController {
@org.springframework.beans.factory.annotation.Value("${app.message}")
private String message;
@org.springframework.web.bind.annotation.GetMapping("/msg")
public String msg() {
return message;
}
}
// 이 빈을 동적으로 갱신하려면 @RefreshScope로 감싸기
@org.springframework.cloud.context.config.annotation.RefreshScope
@org.springframework.stereotype.Component
public class RefreshableBean { ... }
비교: 언제 무엇을 선택할까?
- 로컬 개발 중이면 DevTools로 빠른 피드백 루프 구성
- 운영 환경이나 여러 인스턴스가 존재하면 Spring Cloud Config와 Bus로 중앙 관리
- 두 방식을 혼합해 개발은 DevTools, 통합/운영은 Config Server로 분리 가능
주의사항
- DevTools는 production 환경에서 제외하는 것이 안전하다. runtime scope로 제한 필요
- Spring Cloud Config 사용 시 보안과 인증을 반드시 고려해야 한다
- @RefreshScope는 빈 재생성 비용이 있으므로 빈 설계에 유의한다
- 설정 이름 변경이나 타입 변경은 재시작이 필요할 수 있다
실무 적용 팁
설정 변경 빈도를 기준으로 전략을 세운다. 자주 바뀌는 값은 외부화하고, 민감 정보는 암호화하거나 Vault 같은 비밀 관리 솔루션과 결합한다. 또한 spring boot config hot reload 관련 로깅과 모니터링을 설정해 변경 이력을 추적한다. 운영에서는 spring cloud config refresh 호출을 자동화해 일관된 배포를 유지한다.
결론
DevTools와 Spring Cloud Config는 서로 다른 목적에 최적화되어 있다. devtools property reload spring boot는 로컬 생산성 향상에 초점을 맞춘다. 반면 spring cloud config refresh는 분산 환경에서 설정 일관성을 확보한다. 요구사항과 환경을 고려해 적절히 조합하면 설정 관리와 반영을 안정적으로 운영할 수 있다.