개요
이번에는 Spring Boot 프로젝트의 설정 정보를 Spring Cloud Config 서버를 통해 외부 저장소(Github)에서 가져와보려 합니다.
저번 글에서는 Spring Cloud Config 서버를 만들었으니 이번에는 예시로 서버(Product 서버)를 하나 만든 다음 Spring Cloud Config를 통해 연결해보겠습니다.
예시 서버 구현
의존성 추가
의존성 추가 중 bootstrap이 있습니다.
이 의존성을 추가하면 bootstrap.yml 사용한다는 의미입니다. bootstrap.yml은 application.yml 보다 먼저 실행되어지는 파일입니다. bootstrap.yml이 먼저 실행되면 로컬값보다 Spring Cloud Config에 의한 중앙저장소(외부 저장소, Github) 값이 우선시 되므로 중앙에서 관리되는 설정값을 사용할 수 있습니다.
// spring cloud config
implementation 'org.springframework.cloud:spring-cloud-starter-config'
implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap'
의존성 앞에 ext, dependencyManageMent 추가
Spring Cloud 라이브러리를 사용하기 위해 추가합니다.
ext {
set('springCloudVersion', "2021.0.6")
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
전체 설정 파일
plugins {
id 'java'
id 'org.springframework.boot' version '2.7.15'
id 'io.spring.dependency-management' version '1.0.15.RELEASE'
}
group = 'com.dotd'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '11'
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
ext {
set('springCloudVersion', "2021.0.6")
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
dependencies {
// web
implementation 'org.springframework.boot:spring-boot-starter-web'
// spring cloud config
implementation 'org.springframework.cloud:spring-cloud-starter-config'
implementation 'org.springframework.cloud:spring-cloud-starter-bootstrap'
// jpa
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'com.mysql:mysql-connector-j'
// redis
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
// 직렬화, 역직렬화
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'
// cache
implementation 'org.springframework.boot:spring-boot-starter-cache'
// aop
implementation 'org.springframework.boot:spring-boot-starter-aop'
// kafka
implementation 'org.springframework.kafka:spring-kafka'
// lombok
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
// test
testImplementation 'org.springframework.boot:spring-boot-starter-test'
// JUnit 5 의존성 추가
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
}
tasks.named('test') {
useJUnitPlatform()
}
bootstrap.yml 파일 설정
boostrap.yml은 application.yml 보다 먼저 실행됩니다. 주로 Spring Cloud 설정과 관련된 초기 설정을 담담합니다.
여기서 Spring Cloud Server와 가져올 yml 파일을 설정합니다.
spring:
application:
name: product-service
cloud:
config:
uri: http://127.0.0.1:8888
name: product
profiles:
active: dev
cloud.config.uri : Spring Cloud Config 서버 주소를 입력
cloud.config.name : 중앙저장소에서 가져올 yml 파일 이름 입력
profiles.active : yml 파일 중 어떤 용도 인지 입력 (DEV : 개발 UAT : 테스트 PROD 배포 등...)
이 양식에 따라 입력하여 가져오고 싶은 yml 파일을 선택합니다.
저의 예시는 8888v포트에 있는 Spring Cloud Config 서버에 연결하여 product-dev.yml 이라는 설정 파일을 가져오는 것 입니다.
yml 파일 확인
설정한데로 yml 파일을 가져오는지 확인해보겠습니다.
yml 파일의 정보를 가져오는 메소드를 Controller에 추가합니다.
// yml 파일 확인
@GetMapping("health_check")
public ResponseEntity<?> status() {
StringBuilder sb = new StringBuilder();
sb.append("Product Server 설정 정보 : \n")
.append("env 상태 : ").append(env.getProperty("status")).append("\n")
.append("기본값 : ").append(env.getProperty("commonValue")).append("\n");
return ResponseEntity.ok(sb.toString());
}
status와 commonValue 값을 확인해보려 합니다.
저는 총 3개의 yml 파일을 만들었습니다.
product.yml product-dev.yml product-prod.yml
product.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/dotd?serverTimezone=UTC&useUniCode=yes&characterEncoding=UTF-8
username: root
password: 비밀번호
jpa:
hibernate:
ddl-auto: create
cache:
type: redis
redis:
host: localhost
port: 6379
password: 비밀번호
status: "default"
commonValue: "updateValue"
product-dev.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/dotd?serverTimezone=UTC&useUniCode=yes&characterEncoding=UTF-8
username: root
password: 비밀번호
jpa:
hibernate:
ddl-auto: create
cache:
type: redis
redis:
host: localhost
port: 6379
password: 비밀번호
status: "dev"
product-prod.yml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/dotd?serverTimezone=UTC&useUniCode=yes&characterEncoding=UTF-8
username: root
password: 비밀번호
jpa:
hibernate:
ddl-auto: create
cache:
type: redis
redis:
host: localhost
port: 6379
password: 비밀번호
status: "prod"
dev 상태인 것을 알 수 있습니다.
기본값이 updateValue인 것으로 product-dev.yml 없이도 product.yml에 있으면 값을 가져온다는 것을 알 수 있습니다.
마무리
다음에는 Spring Cloud Config를 이용해서 설정값을 바뀌었을 때, 서버를 다시 빌드하지 않아도 설정값을 반영하는 내용을 정리해 보겠습니다.