๐ค ์คํ๋ง ํด๋ผ์ฐ๋ ์๋ฆฌ์ฆ!
์คํ๋ง ํด๋ผ์ฐ๋ ์ปจํผ๊ทธ ์๋ฒ๋ฅผ ์ธํ ํ๊ณ ํ์ธํด๋ณด์
์คํ๋ง ํด๋ผ์ฐ๋ ์ปจํผ๊ทธ ์๋ฒ๋ ๋ฌด์์ธ๊ฐ?
ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ์ 12 factor (https://12factor.net/ko/ ) ์์ ์ค ํ๋๊ฐ ์ค์ ์ ์ฝ๋์์ ์๊ฒฉํ๊ฒ ๋ถ๋ฆฌํ๋ ๊ฒ ์ด๋ค
์คํ๋ง ํด๋ผ์ฐ๋ ์ปจํผ๊ทธ๋ ์ด ๊ธฐ๋ฅ์ ์คํ๋ง ๋ถํธ ํ๋ ์์ํฌ ๊ธฐ๋ฐ์์ ์ ๊ณตํ๋ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ MSA ํ๊ฒฝ์์ ์ฌ๋ฌ ์๋ฒ์ ๋ํ ์ค์ ์ ๊ณตํต์ผ๋ก ๊ด๋ฆฌํ๋ฉฐ ์ฝ๋ ์ค๋ณต์ ์ค์ฌ์ค๋ค.
"Config Server" ์ "Config Client", ์ค์ ํ์ผ(์ฃผ๋ก ๊น์ ๊ด๋ฆฌํ๋ค) ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ, git์ ์ฌ๋ฆฐ ์ค์ ํ์ผ์ Config Server๊ฐ ๋์ด์ ๋์์ฃผ๊ณ , ์ฐ๋ฆฌ๊ฐ ์์ฑํ ์ ํ๋ฆฌ์ผ์ด์ ์ ( Config Client) ๋ ๋์์ง ์ค์ ํ์ผ์ ๊ฐ์ ธ์ ์ฌ์ฉํ๋ค.
์ด์ ์ฝ๋๋ฅผ ์์ฑํด๋ณด์!
๋จผ์ , Config Server ๋ฅผ ์ธํ ํด๋ณด์!
์คํ๋ง ๋ถํธ ์คํํฐ์์ https://start.spring.io/ ์์ ์๋์ ๊ฐ์ด ๋ง๋ค์ด ์คฌ๋ค.
gradle
java 11
springboot version : 2.5.6
packaging : jar
dependency : web
gradle ์์กด์ฑ์ ์ธํ ํด์ฃผ์
plugins {
id 'org.springframework.boot' version '2.5.6'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'com.springcloud'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
apply plugin: 'io.spring.dependency-management'
repositories {
mavenCentral()
}
ext {
set('springCloudVersion', "2020.0.4")
}
apply plugin: "io.spring.dependency-management"
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
//actuator
implementation 'org.springframework.boot:spring-boot-starter-actuator:2.1.8.RELEASE'
//config
implementation 'org.springframework.cloud:spring-cloud-config-server'
}
test {
useJUnitPlatform()
}
์ด๋ค ์์กด์ฑ์ ์ถ๊ฐํ๋์ง ํ์ธํด๋ณด๋ฉด, "Config Server" ๋ก์ ๊ธฐ๋ฅ์ ์ ๊ณตํ ์์กด์ฑ spring-cloud-config-server
๋ฅผ ์ถ๊ฐํ์๊ณ
implementation 'org.springframework.cloud:spring-cloud-config-server'
์ ํ๋ฆฌ์ผ์ด์
์ ๋ชจ๋ํฐ๋งํ๊ณ ์ํ๋ฅผ ์ ๊ณตํด์ฃผ๋ spring-boot-starter-actuator
๋ฅผ ์ถ๊ฐํด์ค๋ค. (์ ํ์ฌํญ)
implementation 'org.springframework.boot:spring-boot-starter-actuator:2.1.8.RELEASE'
github ์ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ์์ฑํ๊ณ ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ก
โโโ dev
โ โโโ profile-dev.yml
โโโ prd
โ โโโ profile-prd.yml
โโโ stg
โโโ profile-stg.yml
๋ค์ ๋ด์ฉ์ ํ์ผ์ ์ฌ๋ ค์ฃผ์๋ค.
config:
name: dev
info:
description: Spring Cloud Dev
resources ๋ฐ์ application.yml ํ์ผ์ ์์ฑํ๊ณ
์๋์ ๊ฐ์ด ๊ฐ์ ์ง์ด ๋ฃ์๋ค
(Tmi : ํ์ฌ ์ธํ
ํ ์คํ๋ง๋ถํธ ๋ฒ์ ์์๋ bootstrap.yml์ด ์ง์์๋๋ค)
Application.yml
server:
port: 8888
spring:
application:
name: configserver
cloud:
config:
server:
git:
uri: https://github.com/bo-yoon/springcloud-config-profiles.git
basedir: target/config
searchPaths: dev, stg, prd
management:
endpoints:
enabled-by-default: false
endpoint:
info:
enabled: true
์ค์ ์ ํ๋ํ๋ ์ดํด๋ณด์
main์ @EnableConfigServer
์ ๋ถ์ฌ ์ค๋ค.
@EnableConfigServer
@SpringBootApplication
public class ConfigApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigApplication.class, args);
}
}
์ด๋ ๊ฒ ์ธํ ํ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ฉด ๋๋ค!
localhost:8888/application/dev ๋ก ์ ๊ทผํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ธํ ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ด๋ฒ์๋ "Config Client" ๋ฅผ ์ธํ ํด๋ณด์!
Config Server ๋์ ๋ง์ฐฌ๊ฐ์ง๋ก ์คํ๋ง ๋ถํธ ์คํํฐ์์ https://start.spring.io/ ์์ ์๋์ ๊ฐ์ด ๋ง๋ค์ด ์คฌ๋ค.
gradle
java 11
springboot version : 2.5.6
packaging : jar
dependency : web
๊ทธ๋ฆฌ๊ณ gradle ์์กด์ฑ์ ์ธํ
ํด์ค๋ค.
์ฌ๊ธฐ์ ์ฐธ๊ณ ํ ์ ์ mvn repository ์์ ์์กด์ฑ์ ์ฐพ์ ๋ "Spring Cloud Starter config"์ "Spring Cloud Config Client" ๊ฐ ๋ณด์ด๋๋ฐ ์ฌ์ค ์ด ๋๋ค Config Client ๋ฅผ ์ค์ ํ๋ ๊ฒ์ผ๋ก ๋ ์ค ํ๋๋ง ์ธํ
ํด์ฃผ๋ฉด ๋๋ค. ๋์ ์ฐจ์ด๋ Spring Cloud Starter Config๊ฐ Spring Cloud Config client ๋ฅผ ํฌํจํ๊ณ ์๋ค.
๋ํ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๊ธฐ ์ ์ config ์ ๋ณด๋ฅผ localhost:8888์ ๋ ์๋ config server์์ ๊ฐ์ ธ์์ผ ํด์ application.yml ๋ณด๋ค ์ฐ์ ์์๊ฐ ๋๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์์์ ์คํ๋๋ bootstrap starter๋ ์ง์ด ๋ฃ์ด์ค๋ค.
์ฐธ๊ณ ๋ก bootstrap๊ฐ์ ๊ฒฝ์ฐ ํ์ฌ ์ธํ ํ ์คํ๋ง 2.5.6๋ฒ์ ์์๋ ๋ฐ๋ก ์์กด์ฑ์ ์ง์ ํด์ผํ์ง๋ง 2.3.x ๋ ๋ฒ์ ์ด์ ๊ฐ์ ๊ฒฝ์ฐ ์์กด์ฑ์ ์ถ๊ฐํ ํ์๊ฐ ์๋ค.
๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด Gradle์์กด์ฑ์ ์ธํ ํด์ค๋ค.
plugins {
id 'org.springframework.boot' version '2.5.6'
id 'io.spring.dependency-management' version '1.0.11.RELEASE'
id 'java'
}
group = 'com.springcloud'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '11'
apply plugin: 'io.spring.dependency-management'
repositories {
mavenCentral()
}
ext {
set('springCloudVersion', "2020.0.4")
}
apply plugin: "io.spring.dependency-management"
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
//actuator
implementation 'org.springframework.boot:spring-boot-starter-actuator:2.1.8.RELEASE'
// config
implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-config', version: '3.0.5'
implementation group: 'org.springframework.cloud', name: 'spring-cloud-starter-bootstrap', version: '3.0.4'
}
test {
useJUnitPlatform()
}
์ด์ config server๋ฅผ ๋ฐ๋ผ๋ณด๋ bootstrap.yml์ ๋ง๋ค์ด๋ณด์.
Application.yml
server:
port: 9090
spring:
application:
name: api-member
cloud:
config:
uri: http://localhost:8888
ํด๋น ์์น์ ๊ฐ๋จํ Config ํ ์คํธ์ฉ ์ปจํธ๋กค๋ฌ๋ฅผ ์์ฑํ๋ค.
@RestController
public class ConfigClient {
@Value("${config.name}")
private String profile;
@GetMapping( value = "/config/profile", produces = "application/json; charset=UTF8")
public String configConnection() {
return profile;
}
}
์ด์ ์ ๋ถ ์ธํ ์ด ์๋ฃ๋์์ผ๋ ์คํํด๋ณด์
๋จผ์ ๋ฐ๋ก profile ์ธํ
์ ํ์ง ์์์ผ๋ฏ๋ก ์ธํ
๋ฆฌ์ ์ด์์ VM options์ ์ฌ์ฉํด์ profile์ ์ก์๋ณด์
๊ทธ๋ฆฌ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํด์ค๋ค.
๊ทธ๋ฌ๋ฉด profile๊ฐ dev๋ผ๊ณ ๋ค์ด๊ฐ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ ํด๋น url ์ ํธ์ถํด๋ณด๋ฉด config.name์ ์ ์์ผ๋ก ์ฝ์ด์ค๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๋ค์์๋ ์คํ๋ง ํด๋ผ์ฐ๋ ๋ทํ๋ฆญ์ค oss์ ๋ํด ์์๋ณด์