ํด๋น ๊ธ์ Spring Cloud Config ๋ก Application์ ์ค์ ์ ๋ณด๋ฅผ ์ค์์์ ๊ด๋ฆฌํ๊ธฐ์ ์์กดํ๋ ๊ธ์ ๋๋ค. ์ค์ต ํ๊ฒฝ์ ๋ฐ๋ผํ์๋ ค๋ฉด ์ด์ ๊ธ์ ๋์จ ์ค์ต์ ๋ฐ๋ผํ์๊ธธ ๊ถ๊ณ ๋๋ฆฝ๋๋ค.
๋ชฉ์ฐจ
- ์ธ๋ถ ์ค์ ๊ด๋ฆฌ ๋ฐฉ๋ฒ
- ๊ธฐ๋ณธ
- ๋ง์ฝ ์ค์ ํ์ผ์ด ์ฌ๋ฌ ๊ฐ๋ผ๋ฉด? ๊ฒ๋ค๊ฐ ๊ฐ๊ฐ ๋จ๊ณ๋ณ๋ก ๊ตฌ์ฑํด์ผ ํ๋ ํ์ผ์ด ๋ค๋ฅด๋ค๋ฉด?
- ์ด๋ด ๋ profiles ๊ฐ ๋ฑ์ฅ
- profiles
- Spring boot ์์ profiles ์ ๋ฐ๋ฅธ ์ค์
- ๊ฐ๊ธฐ ๋ค๋ฅธ ์ค์ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
- naming ์ ๋ต
- config ์๋ฒ url ์ ๋ฐ๋ฅธ ์ค์ profile
- Config ์๋ฒ์ Git Remote Repository ์ฐ๋ํ์ฌ ์ค์ ํ์ผ ๊ด๋ฆฌํ๊ธฐ
- Git Repository ์์ฑ
- Git ์ ์ฅ์ ์์ฑ
- Config ์๋ฒ์์ git url ์ฐ๊ฒฐ
- User service fetch from config server
- Config Client ์์ profiles ์ ๋ฐ๋ผ์ ๋ค๋ฅธ config ํ์ผ ๋ถ๋ฌ์ค๊ธฐ
Spring Cloud Config ์๋ฒ๊ฐ ๊ฐ๊ธฐ ๋ค๋ฅธ ์ค์ ํ์ผ์ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ณด๊ธฐ ์ ์ ๊ธฐ๋ณธ์ ์ผ๋ก Spring Boot ์์ ์ธ๋ถ ์ค์ ์ ์ด๋ป๊ฒ ๊ด๋ฆฌํ๊ณ ๊ตฌ๋ถํ๋ฉฐ ์ฌ์ฉํ๋์ง ๋จผ์ ์์ฃผ ๊ฐ๋ตํ๊ฒ ์์๋ณด๋๋ก ํ์.
์คํ๋ง ๋ถํธ์ ์ธ๋ถ ์ค์ ๊ด๋ฆฌ ๋ฐฉ๋ฒ
Spring Boot Application ์์ ์ธ๋ถ ์ค์ ์ ๊ฐ์ ์ฃผ์ ํ ๋๋ ์ ์๋ค์ถ์ด application.properties๋ application.yml๋ก ๊ตฌ์ฑํ๊ณค ํ๋ค.
Spring boot application ์ด ๋น๋๋๊ณ ์คํ๋ ์์ ์ ๊ฐ์ฅ ๋จผ์ application.yml ์ด๋ application.properties ํ์ผ์ ์ฐพ๊ณ , ํด๋น ํ์ผ์ ๊ธฐ์ ๋ ๋ด์ฉ์ ํ ๋๋ก ์ธ๋ถ ์ค์ ์ ์ฃผ์ ํ๊ฒ ๋๋ค.
๊ทธ๋ผ ๋ง์ฝ ํ ์คํธ ํ๊ฒฝ๊ณผ Production ํ๊ฒฝ์์ ์ฐ์ผ ์ค์ ์ ๋ค๋ฅด๊ฒ ํ๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น?
์๋ฅผ ๋ค์ด Test ํ๊ฒฝ์์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๊ฐ๋ณ๊ฒ ๋์๊ฐ๋ h2 ๋ก ๊ตฌ์ฑํ๊ณ ์ถ๊ณ Production ํ๊ฒฝ์์๋ ์์ ์ ์ธ maria db๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด?
๋ฌผ๋ก ๊ฐ๊ฐ ์ค์ ํ์ผ์ ๋ค์ด๊ฐ ์ค์ ์ ๋ณด๋ฅผ ํ๊ฒฝ์ ๋ฐ๋ผ์ ๊ฐ๊ธฐ ๋ค๋ฅธ ๋ด์ฉ์ ์ ๋ ฅํ๋ฉด ๋๊ฒ ์ง๋ง, ๊ทธ ๋ฐฉ๋ฒ์ ๋งค์ฐ ์์์ ์ธ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค.
์ด๋ฐ ์ํฉ์์ ์กฐ๊ธ ๋ ์ฐ์ํ๊ฒ ์ค์ ์ ๋ณด๋ฅผ ๊ต์ฒดํ ์ ์๋ ๋ฐฉ๋ฒ์ด ๋ฐ๋ก Spring Profiles ๋ผ๊ณ ์๊ฐํ๋ค.
Spring Profiles ๋?
Spring Profiles ๋ ์ฐ๋ฆฌ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ์ ํ๊ณ ํน์ ํ๊ฒฝ์์๋ง ๋์๊ฐ๊ฒ ํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
๋ณดํต ํด๋๋ ๋จ์ผ๋ก ๊ฐ์๋ @Component
๋ @Configuration
์์ @Profiles
์ด๋
ธํ
์ด์
์ ํตํด ํ๋กํ์ ๊ตฌ๋ถํ๋๋ฐ, ์ฝ๊ฒ ๋ง ํด์
Spring ์ Profiles ๋ฅผ ์ด์ฉํ๋ค๋ฉด Application ์ด ์คํ๋๋ ํ๊ฒฝ์ ๋ฐ๋ผ์ ๋ค๋ฅธ Bean ๋ค์ ๋งคํํ ์ ์๊ฒ ๋๋ค.
ํ์ฌ๋ Spring Cloud Config ์ ๋ํ ์ค๋ช ์ด ๊ฐ์ฅ ํฐ ๋ชฉ์ ์ด๋ Spring Boot ์์ Profiles ๋ฅผ ์ด์ฉํ ๊ฐ๊ธฐ ๋ค๋ฅธ ํ๊ฒฝ ๊ตฌ์ฑ์ Profile.active ์ ์ด์ฉํ์ฌ ๋ค๋ฅธ ์ค์ ์ ๋ณด(application.properties) ๋ถ๋ฌ์ค๊ธฐ ์ ํ์ธํด์ฃผ์๊ธฐ ๋ฐ๋๋๋ค.
Spring Cloud Config ์์ ๊ฐ๊ธฐ ๋ค๋ฆฐ ์ค์ ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ
์ด์ ๋ค์ ๋ณธ๋ก ์ผ๋ก ๋์๊ฐ์ Spring Cloud Config ์์๋ ์ด๋ป๊ฒ profiles ๋ฅผ ์ด์ฉํ ๊น?
์ ๋ต์ URL์ ์๋ค.
Spring Cloud Config ๋ ๋ค์๊ณผ ๊ฐ์ ์ธ๋ถ ์ค์ ํ์ผ์ 3๊ฐ์ง ์ ๋ณด(name, profiles, label)๋ฅผ URL ๊ฒฝ๋ก์ ๋ฐ๋ผ์ ๊ตฌ๋ถ์ง์ด๋์๋ค.
๋ง์ฝ application.yml ํ์ผ์ด ์ค์ ์ ๋ณด์ ์กด์ฌํ๋ค๋ฉด Global ํ๊ฒ ์ ์ฉ๋๋ค.
์ฆ, ์ค์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ๊ฐ๋ ๋ชจ๋ URL์ application.yml ์ด ์ ์ฉ๋๋ค๋ ๊ฒ์ด๋ค.
์๋ฅผ ๋ค์ด์ ๊ทธ๋ผ
์๋ฅผ ๋ค์ด์ ๋ค์๊ณผ ๊ฐ์ ์ค์ ํ์ผ์ด ์กด์ฌํ๋ค๊ณ ๊ฐ์ ํด๋ณด์.
- application.yml
- user-service.yml
- user-service-test.yml
- user-service-prod.yml
- order-service-prod.yml
๊ทธ๋ผ ๊ฐ๊ฐ์ name๊ณผ profiles ์ ๋ณด๋ก ๋๋ ์ ์๋ค.
- application.yml
- name: none
- profiles: none
- user-service.yml
- name: user-service
- profiles: default
- user-service-test.yml
- name: user-service
- profiles: test
- user-service-prod.yml
- name: user-service
- profiles: profiles
- order-service-prod.yml
- name: order-service
- profiles: prod
๊ทธ๋ผ ๊ฐ๊ฐ ์ด๋ค url๋ก ํธ์ถ์ ํด์ผ์ง ์ํ๋ ํ์ผ์ด ๋์ฌ๊น?
์ฌ์ค์ ์์ ํ์ผ์ Config ์๋ฒ์์ name์ด user์ด ๋ ์๋ ์๊ณ user-service๊ฐ ๋ ์ ๋ ์์ผ๋ฉฐ user-service-test ๋ ๋ ์ ์๋ค. ์ด๋ ์ ํ๋ ์ฐ๋ฆฌ์ ์ญ๋์ด๋ ์ฐ๋ฆฌ๋ user-serive ๊ฐ ํ๋์ name์ด๋ผ๊ณ ๊ฐ์ ํ์
์ด๋ฅผ ๊ตฌ๋ถํ๋ ํ์ name ์ด ๋์ผํ profiles๋ ๋ชจ๋ ๊ธฐ๋ณธ์ ์ผ๋ก name.yml ํ์ผ์ ๊ฐ๋๊ฒ์ด๋ค.
์ฆ, ์์ ๊ฐ์ ์ํฉ์ ๋ค์๊ณผ ๊ฐ์ ํํ๋ก ๊ตฌ์ฑ๋๋ค.
Config ์๋ฒ์ Git Remote Repository ์ฐ๋ํ์ฌ ์ค์ ํ์ผ ๊ด๋ฆฌํ๊ธฐ
๊ฐ๋ณ๊ฒ Config ์๋ฒ์ name๊ณผ profiles ์ ๋ํด์ ์์๋ณด์์ผ๋ ์ด์ ์ง์ ์ค์ตํด๋ณด๋๋ก ํ์.
์ง๋ ์๊ฐ์ ์ฐ๋ฆฌ๋ Config ์๋ฒ๋ฅผ ๊ตฌ์ฑํ์๊ณ Native File System์ ์กด์ฌํ๋ Local File ๋ค์ Config ์๋ฒ๊ฐ ๋ก๋ํ์ฌ ๊ฐ๊ธฐ ์๋ฒ๋ก ๋ฟ๋ ค์ฃผ๋ ๊ฒ์ ๊ตฌํํ์๋ค.
Config Server์ ๊ธฐ๋ณธ๊ณผ ์ค์ ๋ฐฉ๋ฒ์ ์์ ๋ค๋ฉด ๋ฌด๋ฐฉํ์ง๋ง ๋ง์ฝ ์ฒ์์ด์๊ณ ์ ํํ๊ฒ ์ค์ต์ ๋ฐ๋ผํ์๊ณ ์ถ๋ค๋ฉด Spring Cloud Config ๋ก Application์ ์ค์ ์ ๋ณด๋ฅผ ์ค์์์ ๊ด๋ฆฌํ๊ธฐ ์ ์ฐธ๊ณ ํด์ฃผ์ธ์
๊ฑฐ์ ๋๋ถ๋ถ์ MSA ํ๋ก์ ํธ์์ Local ํ๊ฒฝ์ Config ํ์ผ์ ๊ด๋ฆฌํ๋ ๊ณณ์ ์์ ๊ฒ ๊ฐ๋ค.
๋๋ถ๋ถ Git์ ์ด์ฉํด์ ๊ด๋ฆฌํ๋๋ก ํ๋๋ฐ, ์ฐ๋ฆฌ๋ Native File System ์์ Git ์ผ๋ก ์ค์ ์ ๋ณด ์ ์ฅ์๋ฅผ ์ฎ๊ฒจ๋ณด์.
์์
- Git Remote Repository ์์ฑ & Local Git ์ ์ฅ์ ์์ฑ
- ์ค์ ํ์ผ ์ถ๊ฐ
- Config Server ์์ Git URL ์ฐ๊ฒฐ
- User-Service ์์ Config Server ๋ก ๋ถํฐ ๋ฐ์ ์ค์ ํ์ผ ์ด์ฉํ๊ธฐ
Git Remote Repository ์์ฑ & Local Git ์ ์ฅ์ ์์ฑ
์ฐ์ github ์ ๋ค์ด๊ฐ์ ์๊ฒฉ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ์์ฑํ๋๋ก ํ์.
์ด๋ฆ์ ๊ฐ๋จํ๊ฒ msa-configurations ๋ผ๊ณ ์ง์ ํ๊ฒ ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ก์ปฌ ํ์ผ์์ ๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ด๋ก git Local ์ ์ฅ์๋ฅผ ์์ฑํ์
mkdir git-msa-config
cd git-msa-config
git init
git remote add origin https://github.com/์ ์ฅ์ ์ด๋ฆ.git
์ค์ ํ์ผ ์ถ๊ฐ
๊ทธ๋ฆฌ๊ณ ๊ฐ๊ธฐ ๋ค๋ฅธ ์ค์ ํ์ผ๋ค์ ์ ์ฅํ์.
- application.yml
- user-service.yml
- user-service-test.yml
# application.yml
default:
owner: config-service's git folder
content: :) ์๋
ํ์ธ์ ๊ฐ๊ฐ์ ๋ง์ดํฌ๋ก์๋น์ค์์ ์ฌ์ฉ๋ ๋ฐ์ดํฐ์
๋๋ค. :)
# user-service.yml
spring:
datasource:
driver: com.h2.Driver
url: dbUrl
username: admin
password: admin
token:
key: my_token_secret_key
default:
message: user-service ์์ global profiles ์์ ์ฌ์ฉํ ์ค์ ์ ๋ณด๋ค
# user-service-test.yml
spring:
datasource:
driver: com.mysql.jdbc.Driver
url: dbUrl
username: test
password: test
default:
message: test profiles ์์ ์ฌ์ฉํ ์ค์ ์ ๋ณด๋ค
๊ทธ๋ฆฌ๊ณ ์๊ฒฉ ๋ ํฌ์งํ ๋ฆฌ์ ์๋ก ์์ฑ๋ ํ์ผ๋ค์ push ํด๋ณด์.
git add -A
git commit -m"initial commit"
git push origin master
๊ทธ๋ผ ๋ค์๊ณผ ๊ฐ์ด ์ ์ ์ฅ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
Config Server ์์ Git URL ์ฐ๊ฒฐ
์ด์ Config Server ์์ ์ฐ๋ฆฌ์ ์ค์ ์ ๋ณด๋ค์ด ์ ์ฅ๋ ์ ์ฅ์์ ์ฐ๊ฒฐ์ ํด๋ณด์.
Config Server ์ ์๋ application.yml ์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํด๋ณด์.
๋ง์ฝ ์ง๋ ์๊ฐ์ ์ค์ต์ ๋ฐ๋ผํ๋ค๋ฉด native active profiles ์ด ์กด์ฌํ ํ ๋ฐ, ํด๋น ํ๋กํ์ผ์ ์ง์์ผ ํ๋ค.
server:
port: 8888
spring:
application:
name: config-service
cloud:
config:
server:
git:
uri: https://github.com/dhslrl321/mas-configurations
๊ทธ๋ฆฌ๊ณ api tester ๋ ๋ธ๋ผ์ฐ์ ๋ก http://localhost:8888/user-service/test
๋ก ์ ๊ทผํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ๋์ฌ ๊ฒ์ด๋ค.
token.key๋ ์ถํ์ ์ถ๊ฐํ ๋ฐ์ดํฐ๋ผ ์์ ๋ฐ์ดํฐ์๋ token.key ์ ๋ณด๊ฐ ์๋์ ์ํด๋ฐ๋๋๋ค.
์ฌ์ค ๋ฏผ๊ฐ ์ ๋ณด๋ git private repository๋ก ์ง์ ํ๋๊ฒ ๋ง๋ค. ๋ ๋์๊ฐ์๋ ์ํธํ๋ฅผ ํด์ผํ๋๋ฐ, ์ด๋ ๋ค์ ์๊ฐ์ ์์๋ณด๋๋ก ํ์
๊ทธ๋ด ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด git ๊ณ์ ์ ๋ณด๋ฅผ ๋ฑ๋กํ ์๋ ์๋ค.
server:
port: 8888
spring:
application:
name: config-service
cloud:
config:
server:
git:
uri: https://github.com/dhslrl321/mas-configurations
username: uname123
password: pwd1234
Config Client ์์ profiles ์ ๋ฐ๋ผ์ ๋ค๋ฅธ config ํ์ผ ๋ถ๋ฌ์ค๊ธฐ
์ด์ Config Client ์ธก, ์ฆ User-Service ์์ ์๋์ ๊ฐ์ด controller ๋ฅผ ๊ตฌ์ฑํด์ ์ด๋ค ๊ฒฐ๊ณผ๊ฐ ๋์ค๋์ง ์ถ๋ ฅํด๋ณด์.
@SpringBootApplication
@EnableDiscoveryClient
@RestController
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class, args);
}
@GetMapping("/config/database")
public String database(@Value("${spring.datasource.driver}") String driver,
@Value("${spring.datasource.url}") String url,
@Value("${spring.datasource.username}") String username,
@Value("${spring.datasource.password}") String password,
@Value("${token.key}") String tokenKey) {
return "driver: " + driver + "\n"
+ "url: " + url + "\n"
+ "username: " + username + "\n"
+ "password: " + password + "\n\n"
+ "token key: " + tokenKey;
}
}
๊ทธ๋ผ user-service์ ์๋ token ์ ๋ณด์ user-service-test ์ ์๋ datasource ์ ๋ณด๋ฅผ ์ ๋ฐ์์ค๋ ๊ฒ์ผ๋ก ํ์ธ๋๋ค.
๋๊ธ