[Spring Cloud] - 1. Configuration Server ๊ตฌ์ฑ
์ง๋ ๊ธ์์ MSA(Micro Service Architecture)์ ๋ํ ๊ธฐ๋ณธ์ ์ธ ๋ด์ฉ์ ๋ํด์ ์์๋ดค์๋๋ฐ์. ํน์๋ผ๋ ์ด ๊ธ์ ์ฝ์ด๋ณด์ง ๋ชปํ๋ค๋ฉด, ์๋์ ๋งํฌ๋ฅผ ํตํด์ ์ง์ ์ฝ์ด๋ณด์ค ์ ์์ต๋๋ค.
์ด๋ฒ ํํธ์์๋ Java ์ธ์ด์ ์น ๊ฐ๋ฐ ํ๋ ์์ํฌ์ธ Spring์ ์ด์ฉํด์ ์ด Micro Service Architecture๋ฅผ ๊ตฌ์ฑํ๋ ์๊ฐ์ ๊ฐ์ ธ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ๊ทธ ์ฒซ ๋ฒ์งธ๋ ๋ฐ๋ก Configuration Server๋ฅผ ๊ตฌ์ฑํ๋ ๊ฒ์ ๋๋ค.
Configuration Server์ ํ์์ฑ
์น ์๋ฒ๋ฅผ ๊ฐ๋ฐํ ๋ ์ฐ๋ฆฌ๋ ์ด ์๋ฒ์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฃผ๊ธฐ ์ํด์ Configuration์ ์ค์ ํฉ๋๋ค. Spring์ ๊ฒฝ์ฐ, application.properties ํ์ผ์, Flask์์๋ env.py, Node.js์์๋ package.json ๋ฑ์ ์ด์ฉํ๋ ๊ฒ์ด์ฃ .
๊ทธ๋ฐ๋ฐ, Micro Service Architecture๋ฅผ ๊ตฌ์ฑํ๋ ค๋ Configuration Server๋ฅผ ๊ตฌ์ฑํด์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ๊ฐ MSA๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ ์๋น์ค๋ฅผ ๋ถ์ฐํ๋ ๋ฐ ์์ต๋๋ค. ๋น์ฆ๋์ค ๋ก์ง์ ํ ์๋ฒ์ ๋ชฐ์๋ด์ง ์๊ณ , ๊ธฐ๋ฅ๋ง๋ค ์ชผ๊ฐ์ด ์๋ฒ๋ฅผ ๊ฐ๋ฐํ๊ธฐ ๋๋ฌธ์ ๊ทธ์ ๋ฐ๋ฅธ ํ๊ฒฝ๋ ๋ค ์ ๊ฐ๊ฐ์ผ ์ ์์ต๋๋ค.
ํ์ง๋ง ์๋ฒ๋ฅผ ํ ๊ฐ ๊ฐ๋ฐํ ๋๋ Config๋ฅผ ํ ๊ฐ๋ง ์ค์ ํ๋ฉด ๋์ง๋ง ์๋น์ค ๋จ์๋ก ์ชผ๊ฐ์ด ๊ฐ๋ฐํ ๊ฒฝ์ฐ์๋ ๊ทธ ์ค์ ๋ค์ ์ผ์ผ์ด ํ๋์ฉ ๋ค ์ก์์ค์ผ ํฉ๋๋ค. ๊ต์ฅํ ๋ถํธํ ์ผ์ด์ฃ .
๊ทธ๋์ ์ฐ๋ฆฌ๋ Configuration Server๋ฅผ ์ค์ ํ ํ์๊ฐ ์์ต๋๋ค. ๊ฐ ์๋น์ค๋ณ๋ก ์ค์ ์ ๋ค๋ฅด๊ฒ ์ฃผ์ด์ฃผ๋ ๊ฒ์ ๊ทธ๋ฆฌ ์ด๋ ค์ด ์ผ์ ์๋์ง๋ง ์ด๋ค์ ์๋ฒ๋ณ๋ก ๊ฐ๋ฐ์๊ฐ ์ผ์ผ์ด ์์ผ๋ก ์ฃผ์ด์ฃผ๋ ๊ฒ์ ์์ด ๋ง์ด ํ์ํฉ๋๋ค. ๋ฐ๋ผ์ Configuration Server๋ฅผ ๊ตฌ์ถํ์ฌ ๊ฐ WAS์์ ์ด๋ฅผ Pull ํ๋๋ก ๊ตฌ์ถํ๋ ๊ฒ์ด์ฃ .
๊ทธ๋ฆผ์ผ๋ก ๋ณด์๋ฉด ์์ ๊ฐ์ ๊ตฌ์ฑ์ด ๋ฉ๋๋ค. ๋ฉ๋ชจ์ฅ๊ณผ ๊ฐ์ ๋ ธํธ ์๋น์ค๋ฅผ ๊ฐ๋ฐํ๋ค๊ณ ๊ฐ์ ํ์ ๋ ๊ฐ์ฅ ๊ฐ๋จํ๊ฒ ๊ตฌ์ฑํ ์ ์๋ ๋น์ฆ๋์ค ๋ก์ง์ผ๋ก ํ์(Member)๊ณผ Note(๋ฉ๋ชจ)๋ฅผ ๊ตฌ์ฑํ ๊ฒ์ ๋๋ค. ๊ฐ ์๋น์ค๋ณ๋ก ์น ์๋น์ค๋ฅผ ๋ณ๋๋ก ๊ฐ๋ฐํ์์ ๋, ๊ฐ ์ค์ ์ Configuration Server์์ ๋ฐ๋ ๋ฐฉ์์ธ ๊ฒ์ด์ฃ .
์ด๋ ๊ฒ ๊ตฌ์ฑํด์ ์ป์ ์ ์๋ ๋ ๋ค๋ฅธ ์ด์ ์ผ๋ก๋ ์๋ฒ์ ์ค๋จ์์ด ์ค์ ์ ๋ฐ๊ฟ ์ ์๋ค๋ ์ ์ ๋๋ค. Tomcat์ด๋ JBoss ๋ฑ์ผ๋ก WAS๋ฅผ ์ด์ํด๋ณด์ ๋ถ๋ค์ ๋๋ผ์๋ ๊ฒ์ด์ง๋ง ์๋ฒ์ ๊ตฌ์ฑ์ด ๋ณ๊ฒฝ๋๋ฉด ์๋น์ค๊ฐ ์ค๋จ๋ ์ํ๋ก ์ฌ์์์ด ๋ฉ๋๋ค. ์๋น์ค์ ๋ฆฌ์คํฌ๊ฐ ๊ต์ฅํ ํฌ๋ค๋ ๋จ์ ๊ณผ ํจ๊ป ๊ณค๋ํ ๋ฌธ์ ์ค ํ ๊ฐ์ง์ ๋๋ค.
Configuration Server ๋ง๋ค๊ธฐ
์ด๋ป๊ฒ ๊ตฌ๋๋๋์ง ๊ตฌ์กฐ๋ฅผ ์์์ผ๋ ์ด์ ์ง์ ๋ง๋ค์ด๋ณด๋ ์๊ฐ์ ๊ฐ์ ธ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์ด ๊ธ์์๋ ์๋์ ํด์ ์ฌ์ฉํ ๊ฒ์์ ์๋ ค๋๋ฆฝ๋๋ค.
- JetBrains IntelliJ IDEA
- Java 1.8.0
- Gradle
์ฃผ๋ก ์ ๊ฐ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ IDE ๋๊ตฌ, ๋น๋ ๋๊ตฌ๋ฅผ ์ ํํ์์ต๋๋ค.
ext {
set('springCloudVersion', 'Hoxton.SR1')
}
dependencies {
implementation 'org.springframework.cloud:spring-cloud-config-server'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
build.gradle์์ Spring Cloud Config Server์ ํจํค์ง๋ฅผ ๋ฐ์ ์ ์๋๋ก ์์ ๊ฐ์ ์ค์ ์ ์ถ๊ฐํฉ๋๋ค.
package xyz.neonkid.configserver;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
@EnableConfigServer
@SpringBootApplication
public class ConfigServerApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigServerApplication.class, args);
}
}
๊ทธ๋ฌ๊ณ ๋ ๋ค, EnableConfigServer ์ด๋ ธํ ์ด์ ๋ง ๋ถ์ฌ์ฃผ๋ฉด ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์ฑ ์๋ฒ์ ํ์ ์์ฑ์ ๋๋ค.
# Configuration Server ๊ธฐ๋ณธ ์ค์ ๊ณผ ํ๋กํ์ผ
server:
port: 9000
spring:
profiles:
active: native, local
resources/bootstrap.yml
์ด์ ์ด ์๋ฒ๊ฐ ์ด๋ ํฌํธ๋ฅผ ์ฌ์ฉํ ์ง, ๊ทธ๋ฆฌ๊ณ , ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋์ ์๋ ๊ตฌ์ฑ ํ์ผ์ ์ฝ์์ง๋ฅผ ์ค์ ํด์ค๋๋ค. ๋ณ๋์ ํ๋ผ๋ฏธํฐ๊ฐ ์์ ๊ฒฝ์ฐ์๋ ์๋ฒ ์์ ์ ํ์ผ์ ์ฝ๋๋ก ๋จผ์ ๊ตฌ์ฑํด์ค๋๋ค.
# ๋ก์ปฌ ํ์ผ์ ์ฌ์ฉํ ๋์ ์ฝ์ ํ์ผ์ ๊ฒฝ๋ก.
spring:
profiles: local
cloud:
config:
server:
native:
search-locations: classpath:/server-configs
resources/bootstrap-local.yml
search-locations๊ฐ ๋ฐ๋ก ์ค์ ํ์ผ๋ค์ด ์๋ ๊ฒฝ๋ก๋ฅผ ๊ฐ๋ฆฌํต๋๋ค. ์ด ๊ฒฝ๋ก๋ Java์ Package ๊ฒฝ๋ก, JVM์์ ์ฌ์ฉํ๋ ํ๊ฒฝ ๋ณ์ ๋ชจ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์์๋ฅผ ๋ช ๊ฐ ๋ค์ด๋ณด๋ฉด..
* OS X / Linux
- file://${user.home}/server-configs
* Windows
- file:///${user.home}/server-configs
์ด๋ ๊ฒ๋ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด์ฃ . ๋ง์ฝ ์๋ฒ ๋ด์ ๊ตฌ์ฑ ํ์ผ์ ์ค์ ํ๊ธฐ ๊น๋ค๋ก์์ ์ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ์ฌ์ฉํ๋ ๋ฑ์ ๋ฐฉ๋ฒ๋ ์๊ฒ ์ง๋ง ๊ฐ๋ฅํ ์์ ๋ฐฉ๋ฒ์ ์ฐ๋ ๊ฒ์ด ํ๋ช ํฉ๋๋ค.
Config์ Configuration ์๋ฒ์ ๋ถ์ด๊ธฐ
์ด์ ๊ตฌ์ฑ ์๋ฒ๋ ์์ฑ๋์์ผ๋ ๊ฐ ์๋น์ค๋ณ๋ก ์ค์ ์ ๊ตฌ์ฑํ๊ณ , ์ด๋ฅผ ์๋ฒ์์ ๋๊ธฐํ ํ ์ ์๋๋ก ๊ตฌ์ฑํด๋ด ์๋ค. ์์์ ์ฐ๋ฆฌ๋ ๋ก์ปฌ ํ๊ฒฝ์ ์๋ ํ๊ฒฝ ์ค์ ์ ๋ถ๋ฌ์์ ๋๊ธฐํ ์ํค๋ ๋ฐฉ๋ฒ์ ์ ํํ์ผ๋ฏ๋ก ์ด ๋ฐฉ๋ฒ์ ๊ทธ๋๋ก ์ฌ์ฉํด๋ณด๋๋ก ํ์ฃ .
spring:
profiles: dev
message: Loaded MemberService for Development Mode..
server-configs/member-service-dev.properties
๋จผ์ ํ์ ์๋น์ค์ ๋ํ ๊ฐ๋ฐ ์๋ฒ์ ๊ตฌ์ฑ ์ค์ ์ ๋ํ๋ธ ๊ฒ์ ๋๋ค. ๋ฐ๋๋ก ๋ฐฐํฌ/์ด์ ์๋ฒ์ ๊ฒฝ์ฐ, profiles๋ง ๋ค๋ฅด๊ฒ ์ฃผ๊ณ ์ค์ ํ ์๋ ์์ต๋๋ค.
spring:
profiles: prod
message: Loaded MemberService for Production Mode...
server-configs/member-service-prod.properties
์... ๊ทธ๋ฐ๋ฐ, ์ฐ๋ฆฌ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก Spring Boot 2.0์ ์ฌ์ฉํ์ฌ ์ง์ ์๋ฒ์ ํ๊ฒฝ ์ค์ ์ ๋ฃ์์ ๋๋ง ํด๋ properties๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ๊ทธ๋ฐ๋ฐ, Configuration Server๋ฅผ ์ฌ์ฉํ ๋๋ YML ํ์ผ ํฌ๋งท์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
๋ ๋ฐฉ์์ ์ฐจ์ด๋ ์ค์ ์ ์ด๋ป๊ฒ ๊ตฌ์ฑํ๋๋์ ๋ฐ๋ผ ๋๋์ด์ง๋๋ค. ์์์ Properties ํ์ผ ํฌ๋งท์ ์ฌ์ฉํ์ ๋๋ ๊ฐ๋ฐ ํ๊ฒฝ๊ณผ ๋ฐฐํฌ ํ๊ฒฝ์ ์๋ก ๋ค๋ฅธ ํ๊ฒฝ ์ค์ ํ์ผ๋ก ๋๋์ด ๊ตฌ์ฑ๋ง ๊ฐ๋ฅํฉ๋๋ค.
๊ทธ๋ฌ๋ YML์ ๊ฒฝ์ฐ, ํ ๊ฐ์ ์๋น์ค์ ๋ชจ๋ ํ๊ฒฝ์ ํ๊ฒฝ ์ค์ ์ ํ ํ์ผ์ ๋ฃ์ ์ ์์ต๋๋ค.
spring:
profiles: dev
message: Loaded MemberService for Development Mode..
---
spring:
profiles: prod
message: Loaded MemberService for Production Mode..
server-configs/member-service.yml
๊ฐ๋ฐ์๋ง๋ค ์ฐจ์ด๊ฐ ์์ ์ ์๊ฒ ์ง๋ง ์ค์ ํ์ผ์ด ์ปค์ง ๊ฒฝ์ฐ, ํ์์ ๋ฐฉ๋ฒ์ ๊ฑฐ์ ์ฌ์ฉ๋์ง ์๊ณ , ์ ์์ ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค. ๋ ํ์์ ๊ฒฝ์ฐ, '---' ๊ตฌ๋ถ์๋ฅผ ํตํด์ Spring Cloud Configuration Server๊ฐ ํ์ฑํ์ฌ ์ฝ๊ธฐ ๋๋ฌธ์ ๊ตฌ๋ถ์๋ฅผ ๋ฐ๋์ ๋ถ์ฌ์ค์ผ ํ๋ค๋ ์ .
์์ ๊ฐ์ ๋ฐฉ์์ผ๋ก Note ์๋น์ค๋ ๋๊ฐ์ด ๋ง๋ค์ด์ฃผ๋ฉด ๋์ ๋๋ค.
Test
์ ์ด์ ํ๊ฒฝ ์ค์ ์๋ฒ๊ฐ ๋ง๋ค์ด์ก์ผ๋ ์ด์ ์ด๋ฅผ ์ ๋ถ๋ฌ์ค๋์ง ํ ์คํธํด๋ณด๋ก ํ๊ฒ ์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Configuration Server๋ REST API์ GET ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ JSON ํํ๋ก ํ๊ฒฝ ์ค์ ์ ๊ฐ์ ธ์ค๊ฒ ๋ฉ๋๋ค.
๋ฐ๋ผ์ ์๋์ ์ปค๋งจ๋๋ฅผ ์ด์ฉํ์ฌ ๋ฉ์๋๊ฐ ์ ๋์ํ๋์ง ํ์ธํด๋ณด๋ฉด ๋ฉ๋๋ค.
$ curl http://localhost:9000/member-service/dev | json_pp
OS X / Linux์์ curl ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ํ ์คํธํ๊ฒ ๋๋ฉด ์๋์ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋ฉ๋๋ค.
{
"profiles" : [
"local"
],
"version" : null,
"name" : "member-service",
"propertySources" : [
{
"source" : {
"spring.message" : "Loaded MemberService for Development Mode..",
"spring.profiles" : "dev"
},
"name" : "file:///home/neonkid/server-configs/member-service-dev.properties"
}
],
"label" : null,
"state" : null
}
๊ฒฐ๊ณผ๊ฐ์ JSON ํํ๋ก ์ถ๋ ฅ๋๋ฉฐ propertySources ํ๋ผ๋ฏธํฐ ๊ฐ์ด ์์ ๊ฐ์ด ๋์ค๋ฉด ์ ์์ ์ผ๋ก ๊ตฌ์ฑ ์๋ฒ๊ฐ ๋ง๋ค์ด์ง ๊ฒ์ ๋๋ค. ๋ค๋ฅธ API ๋ํ ์์ ๊ฐ์ ํํ๋ก ํ ์คํธ ํด ๋ณผ ์ ์์ต๋๋ค.
๋ง์น๋ฉฐ...
๋ก์ปฌ ํ๊ฒฝ์์ Spring Cloud์ ํ๊ฒฝ ์ค์ ์๋ฒ๋ฅผ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ดค์ต๋๋ค. ์ด ์ธ์๋ ํ๊ฒฝ ์ค์ ์๋ฒ๋ฅผ ๊ตฌ์ฑํ๋ ๋ด์ฉ์ด ๋ ๋ง์ด ์์ง๋ง ์ด๋ฒ ๊ธ์์๋ ๋ก์ปฌ ํ๊ฒฝ์ ์ค์ ํ์ผ์ ์ ์ฅํ๊ณ , ๋ถ๋ฌ์ค๋ ๋ฐฉ์์ผ๋ก ๋ง๋ฌด๋ฆฌ๋ฅผ ์ง๊ฒ ๋์์ต๋๋ค.
๋ค์ ํํธ์์๋ Configuration Server ๊ตฌ์ฑ 2๋ฒ์งธ ์ฃผ์ ๋ก ์ ์ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
'Programming > Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring Cloud] - 3. API ์๋ฒ๋ก ์ค์ ๊ฐ ๋ถ๋ฌ์ค๊ธฐ (0) | 2019.12.29 |
---|---|
[Spring Cloud] - 2. Github and Configuration Server (0) | 2019.12.26 |
[GP] Spring boot์์ REST API ๊ฐ๋ฐ ์์ํด๋ณด๊ธฐ (0) | 2019.11.08 |
[GP] Spring boot์์ DBMS๋ฅผ ์ฐ๋ํ๋ ๋ฐฉ๋ฒ JPA ๊ณ ๊ธํธ (0) | 2019.11.08 |
[GP] Spring boot์์ DBMS๋ฅผ ์ฐ๋ํ๋ ๋ฐฉ๋ฒ - JPA ๊ธฐ๋ณธํธ (0) | 2018.06.06 |