Config

2025. 3. 2. 13:14Spring Microservice

🛠️ 마이크로서비스에서 환경별 설정(Config) 관리 방법

마이크로서비스를 구축할 때, 환경별 설정(Configuration)은 소스 코드에서 분리해야 합니다.
잘못된 설정 관리 방식은 배포와 유지보수를 어렵게 만들 수 있습니다.
이 섹션에서는 Twelve-Factor App 원칙 중 "Config(설정)" 항목을 기반으로, 올바른 환경별 설정 관리 방법을 설명합니다.

🔹 1. 환경별 설정(Config) 관리의 중요성

마이크로서비스 환경에서는 다양한 환경(Development, Test, Staging, Production)에서 실행됩니다.
각 환경마다 데이터베이스 연결 정보, API 키, 로그 레벨 등의 설정이 다를 수 있습니다.
따라서 설정을 소스 코드에서 분리하고, 별도의 환경 설정 파일이나 중앙 집중식 설정 서버(Spring Cloud Config 등)를 활용하는 것이 중요합니다.

❌ 잘못된 방식: 소스 코드에 설정을 포함하는 경우

@Configuration
public class AppConfig {
    @Value("${database.url}")
    private String databaseUrl = "jdbc:mysql://localhost:3306/prod-db";  // 하드코딩된 값 ❌
}

📌 문제점:
✅ 설정 변경 시 애플리케이션을 다시 빌드하고 배포해야 함
✅ 환경마다 다른 값을 설정하기 어려움
✅ 보안 위험 (API 키, DB 비밀번호가 소스 코드에 노출될 가능성)

🔹 2. 올바른 환경별 설정 관리 방법

✅ 방법 1: 환경 변수(Environment Variables) 활용

환경 변수는 실행 시점에 동적으로 설정을 적용할 수 있는 가장 쉬운 방법입니다.
Docker, Kubernetes와 같은 컨테이너 환경에서도 환경 변수를 통해 설정을 주입할 수 있습니다.

export DATABASE_URL="jdbc:mysql://localhost:3306/dev-db"
export API_KEY="secret-key-123"
@Configuration
@PropertySource("classpath:application.properties")
public class AppConfig {
    @Value("${database.url}")
    private String databaseUrl;  // 소스 코드에서 하드코딩된 값을 제거 ✅
}

📌 장점:
✅ 배포 없이 설정 변경 가능
✅ 환경별로 다른 값을 쉽게 적용할 수 있음

✅ 방법 2: 프로파일(Profile) 기반 설정 (Spring Boot @Profile 활용)

Spring Boot에서는 application.yml 또는 application.properties를 사용하여 환경별 설정을 쉽게 관리할 수 있습니다.

# 기본 설정 (공통 설정)
spring:
  application:
    name: my-service
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver

---
# 개발 환경 설정 (application-dev.yml)
spring:
  config:
    activate:
      on-profile: dev
  datasource:
    url: jdbc:mysql://localhost:3306/dev-db
    username: dev_user
    password: dev_pass

---
# 운영 환경 설정 (application-prod.yml)
spring:
  config:
    activate:
      on-profile: prod
  datasource:
    url: jdbc:mysql://db-server:3306/prod-db
    username: prod_user
    password: prod_pass

📌 장점:
spring.profiles.active=dev 와 같이 환경을 변경할 수 있음
✅ 설정을 코드와 분리하여 유지보수 용이
✅ Spring Boot에서 기본 지원 (별도 라이브러리 불필요)

✅ 방법 3: 중앙 집중식 설정 관리 (Spring Cloud Config 사용)

Spring Cloud Config를 사용하면 설정을 중앙 집중화하여 여러 마이크로서비스에서 공유할 수 있습니다.
Git, Consul, Zookeeper와 연동하여 설정을 동적으로 변경할 수 있습니다.

1️⃣ Spring Cloud Config Server 설정

server:
  port: 8888
spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          uri: https://github.com/my-org/config-repo  # Git 저장소에서 설정 로드

2️⃣ Spring Cloud Config Client 설정

spring:
  application:
    name: my-microservice
  cloud:
    config:
      uri: http://config-server:8888

📌 장점:
✅ 모든 마이크로서비스에서 동일한 설정을 공유
✅ Git을 활용하여 설정 변경 사항을 추적 가능
✅ 런타임에서 설정 변경 가능 (@RefreshScope 활용)

🔹 3. 환경별 설정과 배포 프로세스

아래 다이어그램은 설정(Configuration)과 환경(Environment) 간의 관계를 나타냅니다.

출처 : Spring Microservices in Action 2nd Edition

 

각 환경(Development, Test, Staging, Production)에 맞는 설정을 유지해야 합니다.
✅ 코드베이스는 하나지만, 환경별 설정을 분리하여 적용할 수 있어야 합니다.
✅ 이를 위해 환경 변수, Spring Profile, Spring Cloud Config 등을 활용하면 효과적입니다.

📌 결론: 클라우드 네이티브 애플리케이션의 올바른 설정 관리 방법

1️⃣ 설정은 소스 코드에서 분리해야 함 → 환경별 설정을 적용 가능
2️⃣ 환경 변수, Spring Profile, Spring Cloud Config 등을 활용하면 효과적
3️⃣ 설정을 변경할 때마다 애플리케이션을 다시 배포하지 않도록 설계
4️⃣ Git, Consul, Zookeeper와 연동하여 설정 변경을 중앙에서 관리할 수도 있음

 

🔹 이를 통해 마이크로서비스의 확장성과 유지보수성을 극대화할 수 있습니다! 🚀

'Spring Microservice' 카테고리의 다른 글

Dependencies  (0) 2025.03.02
Codebase  (0) 2025.03.02
How to build a cloud-native microservice  (0) 2025.03.02
Spring Cloud by example  (1) 2025.03.02
What is Spring Cloud?  (0) 2025.03.02