Casper 생태계의 애플리케이션 설정을 관리하는 Spring Cloud Config Server입니다.
분산 시스템을 위한 외부 설정을 제공하는 중앙집중식 설정 서버입니다. MySQL 데이터베이스에 설정 데이터를 저장하고 민감한 값에 대한 암호화를 지원합니다.
- 데이터베이스 기반 설정 저장 - MySQL에 설정 저장
- 암호화 지원 - 민감한 데이터 암호화/복호화
- 프로필 기반 설정 - 환경별 다른 설정
- REST API - 설정 CRUD 및 표준 Spring Cloud Config 엔드포인트
- 상태 모니터링 - Actuator 엔드포인트를 통한 모니터링
- Java 21+
- MySQL 8.0+
- Gradle 8.0+
환경 변수 파일(.env
또는 시스템 환경변수)에 다음을 설정하세요:
MYSQL_URL=mysql://localhost:3306/casper_config
MYSQL_USER=your_mysql_user
MYSQL_PASSWORD=your_mysql_password
ENCRYPT_KEY=your_encryption_key_here
ENCRYPT_SALT=your_encryption_salt_here
⚠️ 보안 주의사항: 실제 암호화 키와 솔트는 충분히 복잡하고 긴 값을 사용하세요.
- MySQL 데이터베이스 생성:
CREATE DATABASE casper_config;
- 설정 테이블 생성:
CREATE TABLE tbl_environment_configuration (
id BINARY(16) NOT NULL PRIMARY KEY,
application VARCHAR(20) NOT NULL,
profile VARCHAR(24) NOT NULL,
label VARCHAR(100) NOT NULL,
prop_key VARCHAR(100) NOT NULL,
prop_value TEXT NOT NULL
);
- 환경 변수 설정 후 애플리케이션 실행:
./gradlew bootRun
- 서버가
http://localhost:8888
에서 실행됩니다.
POST http://localhost:8888/api/env
Content-Type: application/json
{
"application": "myapp",
"profile": "dev",
"label": "main",
"properties": {
"database.url": "jdbc:mysql://localhost:3306/myapp_dev",
"database.username": "dev_user",
"database.password": "my_secret_password"
}
}
💡 자동 암호화: 평문으로 전송된 모든 값은 서버에서 자동으로 암호화되어 저장됩니다.
{cipher}
접두사를 수동으로 붙일 필요가 없습니다.
GET http://localhost:8888/api/env/myapp/dev/main
응답 예시:
{
"database.url": "jdbc:mysql://localhost:3306/myapp_dev",
"database.username": "dev_user",
"database.password": "decrypted_password"
}
GET http://localhost:8888/api/env/myapp/dev/main/database.url
DELETE http://localhost:8888/api/env/myapp/dev/main/database.url
DELETE http://localhost:8888/api/env/myapp/dev/main
GET http://localhost:8888/myapp/dev
GET http://localhost:8888/myapp/dev/main
응답 예시:
{
"name": "myapp",
"profiles": ["dev"],
"label": "main",
"version": null,
"state": null,
"propertySources": [
{
"name": "myapp-dev-main",
"source": {
"database.url": "jdbc:mysql://localhost:3306/myapp_dev",
"database.username": "dev_user",
"database.password": "decrypted_password"
}
}
]
}
POST http://localhost:8888/encrypt
Content-Type: text/plain
my_secret_password
응답:
AQCKx8xPJ5N8C2YHnBWJ5+nMqpZ8XbWzEqK3...
POST http://localhost:8888/decrypt
Content-Type: text/plain
AQCKx8xPJ5N8C2YHnBWJ5+nMqpZ8XbWzEqK3...
응답:
my_secret_password
GET http://localhost:8888/actuator/health
GET http://localhost:8888/actuator/info
POST http://localhost:8888/actuator/refresh
-
설정 저장:
/api/env
POST 엔드포인트에 평문으로 전송- 서버에서 자동으로 암호화하여 저장
-
설정 조회:
- Spring Cloud Config 표준 엔드포인트 또는 커스텀 엔드포인트 사용
- 암호화된 값은 자동으로 복호화되어 반환
-
설정 관리:
- 필요시 DELETE 엔드포인트로 설정 삭제
1. 설정 저장 (평문으로 전송)
POST /api/env
Content-Type: application/json
{
"application": "user-service",
"profile": "production",
"label": "v1.0",
"properties": {
"spring.datasource.url": "jdbc:mysql://prod-db:3306/userdb",
"spring.datasource.username": "prod_user",
"spring.datasource.password": "my_database_password",
"external.api.key": "secret_api_key_123",
"logging.level.root": "WARN"
}
}
2. 설정 조회 및 확인
GET /user-service/production/v1.0
💡 서버에서 자동으로 민감한 값들을 암호화하여 저장하고, 조회 시에는 복호화된 값을 반환합니다.
Spring Boot 클라이언트에서 사용하려면:
application.yml:
spring:
application:
name: myapp
profiles:
active: dev
config:
import: "configserver:http://localhost:8888"
cloud:
config:
fail-fast: true
retry:
initial-interval: 1000
max-attempts: 6