@ConfigurationProperties를 통한 속성 직접 읽기, Spring Cloud Config 서버를 이용한 속성 새로 고침 및 Git 연동 활용

2025. 3. 9. 11:02Spring Microservice

📚 Spring Cloud Configuration 활용 가이드

🛠️ @ConfigurationProperties를 이용한 프로퍼티 직접 읽기

🎯 핵심 개념

@ConfigurationProperties는 Spring에서 프로퍼티 값을 쉽게 클래스 단위로 묶어서 사용할 수 있게 해주는 기능입니다.

🔧 코드 예시:

@ConfigurationProperties(prefix = "example")
@Component
public class ServiceConfig {
    private String property;

    public String getProperty() {
        return property;
    }

    public void setProperty(String property) {
        this.property = property;
    }
}
  • prefix="example"는 프로퍼티 파일에 정의된 프로퍼티 중 접두사가 example인 것들을 가져옵니다.
  • Spring이 자동으로 프로퍼티와 클래스 내 필드를 매핑해줘서 직접 config.getProperty() 등을 호출하지 않아도 됩니다.

TIP: 개별 클래스마다 프로퍼티를 직접 주입(@Value 사용)하기보다는, 하나의 설정 클래스에 모아서 관리하는 것이 관리하기 편리합니다!

 

🌟 Spring Cloud Config를 활용한 프로퍼티 새로고침(Refresh)

Spring Boot 앱은 기본적으로 시작 시 프로퍼티를 읽고, 이후 변경된 프로퍼티는 자동으로 감지하지 않아요. 그래서 Spring Cloud Config Server를 사용해도 애플리케이션이 변경사항을 인지하도록 별도의 작업이 필요합니다.

해결책: @RefreshScope

  • Spring Boot Actuator의 /refresh 엔드포인트를 통해 변경된 프로퍼티를 다시 불러올 수 있습니다.

🔖 코드 예시:

@SpringBootApplication
@RefreshScope
public class LicenseServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(LicenseServiceApplication.class, args);
    }
}

🔖 주의사항:

  • /refresh 엔드포인트는 Actuator가 활성화되어 있어야 사용할 수 있습니다.
  • @RefreshScope로 지정한 빈만 재로드되며, 전체 컨텍스트가 재시작되는 건 아닙니다.

 

🌐 다중 인스턴스 프로퍼티 갱신 전략

Spring Cloud Config로 관리하는 프로퍼티가 변경되었을 때, 여러 서버 인스턴스의 프로퍼티를 모두 업데이트하려면 어떻게 해야 할까요?

📡 방법 1: Spring Cloud Bus 활용

  • Spring Cloud Bus를 사용하면 Config Server가 메시지를 모든 클라이언트에 전파합니다.
  • Kafka나 RabbitMQ 같은 미들웨어가 필요합니다.

🛠️ 방법 2: 직접 엔드포인트 호출

  • 간단한 스크립트로 서비스 디스커버리(Eureka 등)에 등록된 인스턴스를 모두 조회한 후 /refresh 엔드포인트를 호출합니다.

📦 방법 2: Rolling Restart 방식

  • 새로운 프로퍼티로 설정된 인스턴스를 먼저 띄운 후 트래픽을 전환하고 이전 인스턴스를 종료합니다.
  • 클라우드 환경에서 자주 사용되는 방법입니다.

 

🌿 Git 기반 Spring Cloud Config Server 구성하기

클라우드 환경에서는 프로퍼티 파일을 로컬 파일 시스템 대신 Git 저장소에 두는 것이 훨씬 효율적입니다.

🗃️ 설정 예시(bootstrap.yml):

spring:
  application:
    name: config-server
  profiles:
    active: native, git  # 활성화할 프로파일을 나열 (쉼표로 구분)
  cloud:
    config:
      server:
        native:
          search-locations: classpath:/config # Native 프로파일 사용 시 프로퍼티 파일 위치
        git:
          uri: https://github.com/ihuaylupo/config.git # Git 백엔드의 저장소 URL
          searchPaths: licensingservice # Git 저장소에서 구성 파일을 찾을 디렉토리 경로
          default-label: main # 디폴트 브랜치 지정 (생략 시 디폴트 값은 master 또는 main?)
          clone-on-start: true # 애플리케이션 시작 시 Git 저장소를 클론할지 여부 (기본값 true)
          timeout: 5 # Git 서버 연결 시간 초과 (초 단위, 기본값은 5초)
          username: YOUR_GIT_USERNAME # Git 접근 사용자 이름 (private 저장소일 경우 필수)
          password: YOUR_GIT_TOKEN_OR_PASSWORD # Git 접근 토큰 또는 암호 (private 저장소일 경우 필수)
          skip-ssl-validation: false # SSL 검증 여부 설정 (자체 서명 인증서 사용 시 true로 설정)

server:
  port: 8071 # Config Server가 실행될 포트 설정 (기본 포트: 8888)

🔍 각 설정 상세 설명

  • spring.application.name
    • 애플리케이션의 이름 지정 (여기서는 config-server로 명시).
  • spring.profiles.active
    • 활성화할 프로파일 목록을 지정합니다.
    • 여러 프로파일을 쉼표로 구분하여 명시 가능 (native, git, 등).
    • 프로파일 순서는 중요하며, 뒤쪽 프로파일이 우선순위를 가집니니다.
    • 예: native, git로 설정하면 git 프로파일 설정이 우선 적용됩니다.
  • Native 프로파일 (native)
    • Config Server가 Git 저장소 대신 로컬의 파일 시스템에서 프로퍼티를 읽어오는 방식입니다.
    • search-locations는 프로퍼티 파일이 위치한 로컬 경로를 지정하며, classpath 또는 절대 경로로 설정 가능합니다.
    • 주로 로컬 개발 환경에서 빠르게 설정을 확인할 때 사용됩니다.
  • Git 프로파일 (git)
    • Config Server가 Git 저장소를 백엔드로 사용하는 방식입니다.
    • uri: 사용할 Git 저장소의 URL을 지정합니다.
    • searchPaths: Git 저장소 내에서 프로퍼티 파일이 위치한 상대 경로를 설정합니다.
      • 여러 디렉토리를 지정할 경우 쉼표로 구분할 수 있습니다.
    • default-label: Git의 기본 브랜치를 설정합니다.
      • 명시하지 않으면 기본 브랜치는 master를 사용합니다.
    • clone-on-start: Config Server 시작 시 Git 저장소를 즉시 클론할지 여부를 설정합니다.
      • 기본적으로 true이며, 애플리케이션 구동과 동시에 최신 설정을 받아옵니다.
    • timeout: Git 저장소에 연결하는데 걸리는 최대 시간(초 단위)을 지정합니다. 기본값은 5초입니다.
    • username 및 password: Git 저장소가 비공개(private)일 경우 인증 정보가 필수입니다.
      • GitHub 등에서 개인 접근 토큰(Personal Access Token)을 발급받아 설정합니다.
      • GitHub의 경우 개인 토큰을 password 항목에 입력합니다.
    • skip-ssl-validation: 자체 서명 인증서를 사용하는 Git 서버의 SSL 검증을 무시할지 여부입니다.
      • 일반적인 공개 저장소는 false로 두고 사용하며, 특정 사내 서버 등에서는 true로 설정하기도 합니다.
  • server.port
    • Config Server가 실행될 포트를 명시합니다.
    • 기본 포트는 8888이지만, 본 예시에서는 8071로 변경하여 사용 중입니다.

💡 장점:

  • 설정 파일 변경 이력을 Git으로 관리 가능
  • 빌드 및 배포 파이프라인과 쉽게 통합
  • 개발 및 운영환경 간의 설정 공유가 간편함

 

🎯 Summary:

  • @ConfigurationProperties로 설정 값을 쉽고 깔끔하게 관리하세요.
  • @RefreshScope와 Spring Cloud Config를 통해 동적으로 설정을 변경하고 적용 가능!
  • Git을 백엔드 저장소로 사용하면 설정 관리가 더 간편하고 효율적입니다.

이렇게 하면 Spring 환경에서 프로퍼티를 효과적으로 관리할 수 있습니다. ✨😊