ํจ๊ปํ๊ฐ์ ์ค์ ์ ์ฅ์์ ๋๋ค. ์๋น์ค 17๊ฐ์ ์ค์ ๊ฐ์ด ์ ๋ถ ์ฌ๊ธฐ ์์ต๋๋ค.
๋จผ์ ์ ์ฒด ๊ทธ๋ฆผ์ ๋ณด๊ณ , ์ด ๋ ํฌ๊ฐ ๊ทธ ์ ์ด๋์ ์๋์ง ๋ณธ ๋ค ์ฝ์ต๋๋ค.
โ ์ ์ฒด ๊ตฌ์กฐ โ ์ธต์ผ๋ก ๋ณธ ๊ฒ. ์์์ ์๋๋ก ์์ฒญ์ด ๋ด๋ ค๊ฐ๊ณ , ์ด๋ ์ธต์ ๋ฌด์์ด ์๋์ง.
โก ์ ์ฒด ๊ตฌ์กฐ โ ์๋น์ค๋ผ๋ฆฌ ๋ฌด์์ ์ฃผ๊ณ ๋ฐ๋์ง. ์ด๋ก ์ค์ ์ด /internal ํธ์ถ, Kafka ํ๊ฐ ์ด๋ฒคํธ, ํ๋์ ์ ์ ์ด VPC ๊ฒฝ๊ณ.
โข ์ด ๋ ํฌ๋ฅผ ์ค์ฌ์ผ๋ก. ์ง์ ์ฐ๊ฒฐ๋ ๊ฒ๋ง ๋จ๊ธด ๊ทธ๋ฆผ.
โ โก ๋
service-template/docs์ ์๋ ๊ฒ์ ๊ฐ๋ฆฌํต๋๋ค. ์๋น์ค๊ฐ ๋์ด๋ ๊ทธ์ชฝ ํ ๊ณณ๋ง ๊ณ ์นฉ๋๋ค.
์๋น์ค ๊ธฐ๋ โโโถ ์ค์ ์๋ฒ โโโถ config ์ ์ฅ์
โ โ
โ โโโโถ GitHub ์์ yml ์ ์ฝ์
โ main ๋ธ๋์น
โ
โโโโถ 4๊ณ์ธต์ ์์๋๋ก ๊ฒน์ณ ํ๋๋ก ๋ง๋ค์ด ๋๋ ค์ค
์๋น์ค๋ ์๊ธฐ application.yml ์ ์ธ ์ค๋ง ๋๊ณ ๋๋จธ์ง๋ฅผ ์ฌ๊ธฐ์ ๋ฐ์
โ ์ด ์ ์ฅ์๋ ๊ณต๊ฐ์ โ ๋น๋ฐ๊ฐ์ ${ํ๊ฒฝ๋ณ์} ์๋ฆฌ๋ง ๋จ๊น
์ค์ ์ ์ ์ฅ์์ ๋๋ฉด ์ด๋ ๊ฒ ๋ฉ๋๋ค.
| ์ฌ๊ธฐ์ ๋๋ฉด | ๊ฐ ์๋น์ค์ ๋๋ฉด | |
|---|---|---|
| ๊ฐ์ ๋ฐ๊พธ๋ฉด | push ํ๋ฉด ๋ | ๋น๋ โ ์ด๋ฏธ์ง โ ๋ฐฐํฌ |
| DB ์ฃผ์๋ฅผ ์ฎ๊ธฐ๋ฉด | ํ ์ค ๊ณ ์นจ | 14๊ฐ ์๋น์ค๋ฅผ ๋ค์ ๋ฐฐํฌ |
| ํ๊ฒฝ๋ณ ์ฐจ์ด | ํ์ผ๋ก ๊ฐ๋ฆผ | ์ฝ๋์ ๋ถ๊ธฐ |
| ๊ฐ์ด ์ด๋ ์๋์ง | ์ฌ๊ธฐ ํ๋ | ์ ์ฅ์ 17๊ณณ |
์ซ์๋ก ๋ณด๋ฉด ์ด๋ ์ต๋๋ค.
| ๊ฐ | ์ด๋์ | |
|---|---|---|
| yml ํ์ผ | 23๊ฐ | 1์ฅ |
| ๊ณ์ธต | 4๊ฐ | 2์ฅ |
| ์๋น์ค ํ์ผ | 17๊ฐ | ๋๋ฉ์ธ 14 + ํ๋ซํผ 2 + ํ ํ๋ฆฟ 1 |
| ํ๊ฒฝ | 3๊ฐ | local ยท dev ยท prod |
| 4๊ณ์ธต ์ค์ฌ๋ก | 2๊ฐ | eureka-server-{local,dev}.yml |
| ์ ์ฅ์ ๊ณต๊ฐ ์ฌ๋ถ | ๊ณต๊ฐ | 4์ฅ |
์ด ์ ์ฅ์๋ง์ ํน์ง ์ ์ ๋๋ค.
1 ์ฝ๋๊ฐ ์์ yml 23๊ฐ์ README ๋ฟ
๋น๋๋ CI ๋ ์์
2 main ์ ์ง์ ์ปค๋ฐ ์ด์ยทPRยท๋ธ๋์น๋ฅผ ๋ง๋ค์ง ์์
push ํ๋ฉด ์ค์ ์๋ฒ๊ฐ ๋ฐ๋ก ์ฝ์
3 ๊ณต๊ฐ ์ ์ฅ์ โ ๋น๋ฐ๊ฐ์ ์ ๋ ์ ์ง ์์
ํ ๋ฒ ์ปค๋ฐํ๋ฉด ์ง์๋ ์ด๋ ฅ์ ๋จ์
โ ์ค์ ์ด๋ โ ์ฝ๋์์ ๋บ "๊ฐ"
์ฝ๋์ ๋ฐ์ผ๋ฉด ์ค์ ์ผ๋ก ๋นผ๋ฉด
url = "jdbc:postgresql://localhost" url = ${DB ์ฃผ์}
โ โ
โโโ DB ๋ฅผ ์ฎ๊ธฐ๋ฉด ์ฝ๋๋ฅผ ๊ณ ์น๊ณ โโโ ๊ฐ๋ง ๋ฐ๊พธ๋ฉด ๋จ
๋น๋ํ๊ณ ๋ค์ ๋ฐฐํฌ ์ฝ๋๋ ๊ทธ๋๋ก
ํฌํธ ยท DB ์ฃผ์ ยท ๋ง๋ฃ ์๊ฐ ยท ๋ผ์ฐํธ ๊ฐ์ ๊ฒ๋ค์ด ์ ๋ถ ์ค์ ์ ๋๋ค. ์ด ์ ์ฅ์๋ ๊ทธ ๊ฐ๋ค์ ๋ชจ์ ๋ ๊ณณ์ด๊ณ , ์ฝ๋๋ ํ ์ค๋ ์์ต๋๋ค.
โก ํ๋กํ์ผ์ด๋ โ "์ง๊ธ ์ด๋์ ๋๊ณ ์๋"
๊ฐ์ ์๋น์ค๋ผ๋ ์ด๋์ ๋๋๋์ ๋ฐ๋ผ ๊ฐ์ด ๋ค๋ฆ ๋๋ค. ๊ทธ๊ฒ์ ์ด๋ฆ ํ๋๋ก ๊ฐ๋ฆ ๋๋ค.
| ํ๋กํ์ผ | ์ด๋์ | DB ์ฃผ์ | Kafka ์ฃผ์ |
|---|---|---|---|
local |
IntelliJ (๋ด ์ปดํจํฐ) | localhost |
localhost:29092 |
dev |
๋ก์ปฌ ๋์ปค ์ปจํ ์ด๋ | postgres |
kafka:9092 |
prod |
AWS EC2 | (์์ง) | (์์ง) |
์๋น์ค๋ฅผ ๋์ธ ๋ ํ๋กํ์ผ์ ํ๋ ๊ณ ๋ฅด๋ฉด ๊ทธ ์ด๋ฆ์ด ๋ถ์ ํ์ผ์ด ํจ๊ป ์ ์ฉ๋ฉ๋๋ค.
โข ${...} โ ๊ฐ์ด ์๋๋ผ ์๋ฆฌ
password: ${SERVICE_DB_PASSWORD}
โฒ
โโโ "์ด ๊ฐ์ ์ฌ๊ธฐ ์ ์ ์. ํ๊ฒฝ๋ณ์ SERVICE_DB_PASSWORD ์์ ๊ฐ์ ธ์๋ผ"๋น๋ฐ๋ฒํธยทํค๋ฅผ ์ ์ฅ์์ ์ ์ง ์๊ธฐ ์ํ ์ฅ์น์
๋๋ค. ์๋น์ค๊ฐ ๋ฐ ๋ ์๊ธฐ ํ๊ฒฝ๋ณ์๋ฅผ
๋ณด๊ณ ์ฑ์๋๋ค. ํ๊ฒฝ๋ณ์๊ฐ ์์ผ๋ฉด ${SERVICE_DB_PASSWORD} ๋ผ๋ ๋ฌธ์์ด์ด ๊ทธ๋๋ก ๋ค์ด๊ฐ
์ ์์ ์คํจํฉ๋๋ค โ ๊ทธ๊ฒ์ด "๋น ๋จ๋ ธ๋ค" ๋ ์ ํธ์
๋๋ค.
โฃ YAML โ ๋ค์ฌ์ฐ๊ธฐ๊ฐ ๊ณง ๊ตฌ์กฐ
server: # server
port: 8084 # โโโ port = 8084
spring: # spring
datasource: # โโโ datasource
url: jdbc:... # โโโ url = jdbc:...๊ณต๋ฐฑ ๋ ์นธ์ด ํ ๋จ๊ณ์ ๋๋ค. ํ ์นธ์ด๋ผ๋ ์ด๊ธ๋๋ฉด ์ค๋ฅ ์์ด ๋ค๋ฅธ ์์น๋ก ์ฝํ๊ฑฐ๋ ๋ฌด์๋ฉ๋๋ค. ๊ธฐ์กด ํญ๋ชฉ์ ๋ณต์ฌํด ๊ฐ๋ง ๋ฐ๊พธ๋ ํธ์ด ์์ ํฉ๋๋ค.
| ์ง๊ธ ํ๋ ค๋ ์ผ | ๋ณผ ๊ณณ |
|---|---|
| ์ด๋ค ํ์ผ์ด ์๋์ง ๋ณด๊ณ ์ถ๋ค | 1์ฅ |
| ๊ณ์ธต์ด ๋ญ์ง ๋ชจ๋ฅด๊ฒ ๋ค | 2์ฅ |
| ์ ๊ฐ์ ๋ฃ์ด์ผ ํ๋๋ฐ ์ด๋ ๋์ง ๋ชจ๋ฅด๊ฒ ๋ค | 3์ฅ |
| ๋น๋ฐ๋ฒํธยทํค๋ฅผ ๋ฃ์ด์ผ ํ๋ค | 4์ฅ |
| ์ ์๋น์ค๋ฅผ ๋ฑ๋กํด์ผ ํ๋ค | 5์ฅ |
| ๊ณ ์ณค๋๋ฐ ๋ฐ์์ด ์ ๋๋ค | 6์ฅ |
| ๋ญ๊ฐ ์ ๋๋ค | 7์ฅ |
| "์ ์ด๋ ๊ฒ ๋ง๋ค์์ง" | 8์ฅ |
| ์์ง ์ ์ฑ์ด ๊ฒ์ด ๊ถ๊ธํ๋ค | 9์ฅ |
์๋น์ค๋ฅผ ๋ง๋๋ ์ฌ๋์ด ์ค์ ๋ก ํ๋ ์ผ์ 5์ฅ ํ๋์ ๋๋ค. ํ์ผ ํ๋๋ฅผ ๋ง๋ค๊ณ ๊ฒ์ดํธ์จ์ด ๋ผ์ฐํธ๋ฅผ ์ฌ๋ ๊ฒ์ด ์ ๋ถ์ ๋๋ค.
paw-trail/config
โ
โโโ application.yml 1๊ณ์ธต ๋ชจ๋ ์๋น์ค ยท ๋ชจ๋ ํ๊ฒฝ 197์ค
โ
โโโ application-local.yml 3๊ณ์ธต IntelliJ ๋ก ๋์ธ ๋ 75์ค
โโโ application-dev.yml 3๊ณ์ธต ๋ก์ปฌ ์ปจํ
์ด๋ 62์ค
โโโ application-prod.yml 3๊ณ์ธต AWS EC2 81์ค (๊ฑฐ์ TODO)
โ
โโโ ํ๋ซํผ (2๊ฐ)
โ โโโ gateway-server.yml 2๊ณ์ธต *๋ผ์ฐํธ 19 ยท ๊ณต๊ฐํค ยท ์ธ์ฆ์์ธ 293์ค
โ โโโ eureka-server.yml 2๊ณ์ธต 44์ค
โ โโโ eureka-server-local.yml 4๊ณ์ธต *์ค์ฌ๋ก 25์ค
โ โโโ eureka-server-dev.yml 4๊ณ์ธต *์ค์ฌ๋ก 15์ค
โ
โโโ ๋๋ฉ์ธ ์๋น์ค (14๊ฐ)
โ โโโ auth-service.yml 2๊ณ์ธต *์ ์ผ ํผ โ JWT ยท ๋ฉ์ผ ยท OAuth 238์ค
โ โโโ user-service.yml 134์ค S3 ยท ์ด๋ฏธ์ง ์ํ ยท LLM
โ โโโ pet-service.yml 52์ค S3 ยท ์ด๋ฏธ์ง ์ํ ยท outbox relay
โ โโโ place-service.yml 53์ค ์ง์ค์ฝ๋ฉ ยท outbox relay
โ โโโ policy-service.yml 23์ค
โ โโโ search-service.yml 17์ค
โ โโโ report-service.yml 23์ค
โ โโโ review-service.yml 17์ค
โ โโโ notification-service.yml 17์ค
โ โโโ verdict-service.yml 12์ค DB ์์ โ ํฌํธ๋ง
โ โโโ congestion-service.yml 12์ค DB ์์
โ โโโ route-service.yml 12์ค DB ์์
โ โโโ ingest-service.yml 227์ค *๋ฐฐ์น โ ์์ค 4์ข
ยท ํ์ฉ๋ ยท ํ๋ณธ
โ โโโ extract-service.yml 36์ค ๋ฐฐ์น โ ์์ง ํฌํธ์ auditor ๋ฟ
โ
โโโ template-service.yml 2๊ณ์ธต service-template ์ ๊ทธ๋๋ก ๋์ธ ๋
config-server.yml์ด ์์ต๋๋ค. ์ค์ ์๋ฒ๋ ์๊ธฐ ์ค์ ์ ์ด ์ ์ฅ์์์ ๋ฐ์ง ์์ต๋๋ค. ์ ์ฅ์ ์ฃผ์๋ฅผ ์์์ผ ์ ์ฅ์๋ฅผ ์ฝ์ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ ๊ฐ๋ค์config-server์ ์ฅ์ ์์ ์์ต๋๋ค.
293์ค gateway-server ๋ผ์ฐํธ 19๊ฐ ยท ๊ณต๊ฐํค PEM ยท ์ธ์ฆ ์์ธ 9์ค
238์ค auth-service JWT ยท SMTP ยท OAuth ยท ์ฟ ํค ยท permit-all 9์ค
23์ค place-service ํฌํธ ยท DB ยท outbox ์ค์์น
12์ค verdict-service ํฌํธ๋ง
๋๋ถ๋ถ์ ์๋น์ค๋ ์งง์ต๋๋ค. ๊ณตํต๊ฐ์ด 1๊ณ์ธต์, ์ฃผ์๊ฐ 3๊ณ์ธต์ ์์ด์ 2๊ณ์ธต์๋ ๊ทธ ์๋น์ค๋ง์ ๊ฒ๋ง ๋จ์ต๋๋ค.
12์ค์ง๋ฆฌ ํ์ผ์ ์ ๋ถ์ ๋๋ค.
# =============================================================================
# 2๊ณ์ธต โ verdict-service
# =============================================================================
# ํ์ ๋ด๋น์
#
# DB ๋ฅผ ์ฐ์ง ์์ผ๋ฏ๋ก datasource ๋ฅผ ๋์ง ์์
# outbox ๋ ์์ด relay ์ค์์น๋ฅผ ์ ์ง ์์
# =============================================================================
server:
port: 8086<์๋น์ค๋ช
>.yml 2๊ณ์ธต
<์๋น์ค๋ช
>-<ํ๊ฒฝ>.yml 4๊ณ์ธต
application.yml 1๊ณ์ธต
application-<ํ๊ฒฝ>.yml 3๊ณ์ธต
<์๋น์ค๋ช
> ์ ๊ทธ ์๋น์ค์ spring.application.name ๊ณผ ์ ํํ ๊ฐ์์ผ ํฉ๋๋ค.
auth-service/src/main/resources/application.yml
spring.application.name: auth-service
โ
โโโโถ config ์ ์ฅ์์ auth-service.yml ์ ์ฐพ์
๋ค๋ฅด๋ฉด ์ค๋ฅ ์์ด ๊ทธ ๊ณ์ธต๋ง ๋น ์ง ์ฑ ๋ด๋ ค๊ฐ๋๋ค. ์ฆ์์ ํฌํธ๊ฐ ์คํ๋ง ๊ธฐ๋ณธ๊ฐ 8080 ์ผ๋ก ๋จ๋ ๊ฒ์ ๋๋ค.
ํ๊ฒฝ ์ด๋ฆ์ ํ์ดํ์ ์ฐ์ง ์์ต๋๋ค.
์ค์ ์๋ฒ๋ ํ์ผ๋ช
์์ ์๋น์ค๋ช
๊ณผ ํ๊ฒฝ์ ํ์ดํ์ผ๋ก ๊ฐ๋ฆ
โ
โโโ auth-service-local.yml
โ ์ด๋๊น์ง๊ฐ ์๋น์ค๋ช
์ด๊ณ ์ด๋๋ถํฐ๊ฐ ํ๊ฒฝ์ธ๊ฐ
์ฐ๋ฆฌ ์๋น์ค๋ช
์ด ์ ๋ถ ํ์ดํ์ ํฌํจํ๋ฏ๋ก
ํ๊ฒฝ๊น์ง ํ์ดํ์ด ์์ผ๋ฉด ๊ฒฝ๊ณ๋ฅผ ๋ชป ์ฐพ์
๊ทธ๋์ local ยท dev ยท prod ์
๋๋ค. local-test ๊ฐ์ ์ด๋ฆ์ ์ ๋ฉ๋๋ค.
place-service ๊ฐ local ํ๋กํ์ผ๋ก ๋ฐ ๋
1๊ณ์ธต application.yml ๋ชจ๋ ์๋น์ค ยท ๋ชจ๋ ํ๊ฒฝ
ddl-auto: validate
flyway.locations ยท out-of-order
kafka ์ง๋ ฌํ๊ธฐ ยท observation
datasource.password: ${SERVICE_DB_PASSWORD}
auditor.system-name: SYSTEM
outbox.relay.enabled: false
โ
โผ ๊ฐ์ ํค๊ฐ ์์ผ๋ฉด ์๋๊ฐ ๋ฎ์
2๊ณ์ธต place-service.yml place ยท ๋ชจ๋ ํ๊ฒฝ
server.port: 8084
datasource.url ยท username
outbox.relay.enabled: true โ 1๊ณ์ธต์ false ๋ฅผ ๋ฎ์
โ
โผ
3๊ณ์ธต application-local.yml ๋ชจ๋ ์๋น์ค ยท local ๋ง
app.datasource.host: ${DB_HOST}
redis ยท kafka ยท eureka ยท zipkin ์ฃผ์
cookie.secure: false
โ
โผ
4๊ณ์ธต place-service-local.yml place ยท local ๋ง
(ํ์ผ ์์ โ ๊ฑด๋๋)
โ
โผ
์ต์ข
port 8084 ยท outbox true ยท host=ํ๊ฒฝ๋ณ์ ยท kafka localhost:29092 ยท ddl validate
"๊ตฌ์ฒด์ ์ธ ํ์ผ์ด ์ด๊ธด๋ค" ๊ฐ ์๋. ๊ท์น์ด ๋ ๊ฒน์
โ ํ๋กํ์ผ์ด ๋ถ์ ํ์ผ์ด ์ ๋ถ์ ํ์ผ์ ์ด๊น
application-local.yml > place-service.yml
(3๊ณ์ธต์ด 2๊ณ์ธต์ ์ด๊น)
โก ๊ฐ์ ์กฐ๊ฑด ์์์๋ ์๋น์ค๋ณ ํ์ผ์ด ๊ณตํต ํ์ผ์ ์ด๊น
place-service.yml > application.yml (2 > 1)
place-service-local.yml > application-local.yml (4 > 3)
ํ๊ฒฝ๋ณ ๊ณตํต๊ฐ์ ํน์ ์๋น์ค๋ง ๋ค๋ฅด๊ฒ ํ๋ ค๋ฉด
โ 2๊ณ์ธต์ ์ ์ผ๋ฉด 3๊ณ์ธต์ ๋ฎ์
โ
4๊ณ์ธต์ ์ ์ด์ผ ํจ
์ค์ ๋ก ๊ทธ ์๋ฆฌ๋ฅผ ์ฐ๊ณ ์๋ ๊ฒ์ด eureka-server ์
๋๋ค.
# 2๊ณ์ธต โ eureka-server.yml (ํ๊ฒฝ ๋ฌด๊ด)
eureka:
client:
register-with-eureka: false
fetch-registry: false
# 4๊ณ์ธต โ eureka-server-local.yml
eureka:
server:
my-url: http://localhost:8761/eureka/
# 4๊ณ์ธต โ eureka-server-dev.yml
eureka:
server:
my-url: http://eureka-server:8761/eureka/3๊ณ์ธต(application-local.yml)์ ๋๋ฉด ๋ชจ๋ ์๋น์ค๊ฐ ๊ทธ ๊ฐ์ ๋ฐ์ต๋๋ค.
์ ๋ ์นด ์์ ๋ง ํ์ํ ๊ฐ์ด๋ผ 4๊ณ์ธต์ด ๋ง์ต๋๋ค.
1๊ณ์ธต โ application.yml (197์ค)
| ๋ธ๋ก | ๋ฌด์ |
|---|---|
spring.datasource.password |
${SERVICE_DB_PASSWORD} โ ๊ณ์ 10๊ฐ๊ฐ ๊ณต์ |
spring.cloud.refresh |
DataSource ๋ฅผ refresh ๋์์ ๋ฃ์ โ 6์ฅ |
spring.jpa |
ddl-auto: validate ยท open-in-view: false |
spring.flyway |
locations ๋ ๊ณณ ยท out-of-order: true |
spring.kafka |
์ง๋ ฌํ๊ธฐ ยท observation-enabled ๋ |
management |
์ก์ถ์์ดํฐ ๋ ธ์ถ ยท ์ถ์ ์ํ๋ง 1.0 |
app.auditor.system-name |
SYSTEM |
app.outbox.relay.enabled |
false โ ๋ฐํํ๋ ์๋น์ค๋ง 2๊ณ์ธต์์ ์ผฌ |
app.rest-client |
connect-timeout 2s ยท read-timeout 5s โ ์๋น์ค ๊ฐ ํธ์ถ |
2๊ณ์ธต โ <์๋น์ค๋ช
>.yml
ํฌํธ ์ ๋ถ
datasource.url ยท username DB ๋ฅผ ์ฐ๋ ์๋น์ค๋ง
outbox.relay.enabled: true ์ด๋ฒคํธ๋ฅผ ๋ฐํํ๋ ์๋น์ค๋ง
auditor.system-name ๋ฐฐ์น๋ง (ingest-batch ยท extract-batch)
๊ทธ ์๋น์ค๋ง์ ๊ฐ auth ์ JWT ยท ๋ฉ์ผ ยท OAuth
gateway ์ ๋ผ์ฐํธ ยท ๊ณต๊ฐํค
3๊ณ์ธต โ application-{env}.yml
ํ๊ฒฝ๋ง๋ค ๋ฐ๋๋ ๊ฒ์ ์ฌ์ค์ "์ฃผ์" ์ ๋๋ค.
| ๊ฐ | local |
dev |
prod |
|---|---|---|---|
app.datasource.host |
${DB_HOST} |
${DB_HOST} |
TODO |
| Redis | localhost:6379 |
redis:6379 |
TODO |
| Kafka | localhost:29092 |
kafka:9092 |
TODO |
| ์ ๋ ์นด | localhost:8761 |
eureka-server:8761 |
TODO |
| Zipkin | localhost:9411 |
zipkin:9411 |
TODO |
| Loki | localhost:3100 |
loki:3100 |
TODO |
cookie.secure |
false |
false |
(์์ง) |
local๊ณผdev๊ฐ ๊ฐ๋ฆฌ๋ ์ด์ โlocal์ IntelliJ ๊ฐ ๋์ปค ๋ฐ์์ ๋์localhost๋ก ๋ถ๊ณ ,dev๋ ์ปจํ ์ด๋ ์์ด๋ผlocalhost๊ฐ ์๊ธฐ ์์ ์ด๋ผ์ ์ปจํ ์ด๋ ์ด๋ฆ์ผ๋ก ๋ถ์ต๋๋ค.
4๊ณ์ธต โ <์๋น์ค๋ช
>-{env}.yml
๋๋๋ก ๋น์ ๋ก๋๋ค. ์ง๊ธ ์ ๋ ์นด ๋๋ฟ์ ๋๋ค.
# application-local.yml
eureka:
instance:
hostname: host.docker.internal
prefer-ip-address: false
# application-dev.yml
eureka:
instance:
prefer-ip-address: truelocal IntelliJ ๊ฐ ํธ์คํธ์์ ๋
โ
โโโโถ host.docker.internal ๋ก ๋ฑ๋ก
*์ปจํ
์ด๋ ์์ ๊ฒ์ดํธ์จ์ด๊ฐ ์ด ์ด๋ฆ์ผ๋ก ํธ์คํธ๋ฅผ ์ฐพ์
ํ ์ด๋ฆ์ด ํธ์คํธยท์ปจํ
์ด๋ ์์ชฝ์์ ํตํจ
dev ์ปจํ
์ด๋ ์์์ ๋
โ
โโโโถ ๋์ปค ๋คํธ์ํฌ IP ๋ก ๋ฑ๋ก
๊ฐ์ ๋คํธ์ํฌ๋ผ IP ๋ก ๋ฐ๋ก ๋ฟ์
์ด๊ฒ ๋๋ถ์ IntelliJ ๋ก ๋์ด ์๋น์ค๋ ๊ฒ์ดํธ์จ์ด๊ฐ ์ฐพ์๋ ๋๋ค.
http://localhost:8888/{์๋น์ค๋ช
}/{ํ๊ฒฝ}
macOS
curl http://localhost:8888/place-service/localWindows (PowerShell)
curl.exe http://localhost:8888/place-service/local์๋ต์ propertySources ๋ฐฐ์ด์ด ์ด๋ ํ์ผ์์ ์จ ๊ฐ์ธ์ง๊น์ง ๋ณด์ฌ ์ฃผ๋ฉฐ,
๋ฐฐ์ด ์์ด ์ฐ์ ์์๊ฐ ๋์ ์ชฝ์
๋๋ค.
{
"name": "place-service",
"profiles": ["local"],
"propertySources": [
{ "name": "...config/application-local.yml", "source": { } },
{ "name": "...config/place-service.yml", "source": { } },
{ "name": "...config/application.yml", "source": { } }
]
}
.ymlยท.propertiesยท.json์ฃผ์๋ ์ธ ์ ์์ต๋๋ค.http://localhost:8888/place-service-local.yml โ 400์ค์ ์๋ฒ๊ฐ ๊ทธ ์ฃผ์์์ ์๋น์ค๋ช ๊ณผ ํ๊ฒฝ์ ํ์ดํ์ผ๋ก ๊ฐ๋ฅด๋๋ฐ ์ฐ๋ฆฌ ์๋น์ค๋ช ์ด ์ ๋ถ ํ์ดํ์ ํฌํจํ๊ณ ์์ต๋๋ค.
${...} ๋ ์นํ๋์ง ์์ ์ฑ๋ก ๋ด๋ ค์ต๋๋ค.
"spring.datasource.password": "${SERVICE_DB_PASSWORD}"์ค์ ์๋ฒ๋ ๋ฌธ์์ด ๊ทธ๋๋ก ๋ณด๋ด๊ณ ๊ฐ ์๋น์ค๊ฐ ์๊ธฐ ํ๊ฒฝ๋ณ์๋ก ํด์ํฉ๋๋ค. ์ด๊ฒ์ด ๊ณต๊ฐ ์ ์ฅ์๋ก ๋ ์ ์๋ ์ ์ ์ ๋๋ค.
์ ๊ฐ์ ๋ฃ์ ๋
์๋น์ค๋ง๋ค ๋ค๋ฅธ๊ฐ?
โ
โโโโโโโโโโโโโดโโโโโโโโโโโโ
์ ์๋์ค
โ โ
โผ โผ
ํ๊ฒฝ๋ง๋ค ๋ค๋ฅธ๊ฐ? ํ๊ฒฝ๋ง๋ค ๋ค๋ฅธ๊ฐ?
โ โ
โโโโโโโดโโโโโโ โโโโโโโดโโโโโโ
์ ์๋์ค ์ ์๋์ค
โ โ โ โ
โผ โผ โผ โผ
4๊ณ์ธต 2๊ณ์ธต 3๊ณ์ธต 1๊ณ์ธต
{svc}-{env} {svc} app-{env} app
์ ๋งคํ๋ฉด ๋ฒํธ๊ฐ ์์ ์ชฝ์ ๋ ๊ฒ
๋์ค์ ํฐ ๋ฒํธ์์ ๋ฎ์ด์ฐ๋ ๊ฒ์ด ๋ฐ๋๋ณด๋ค ์ฌ์
| ๊ฐ | ์๋น์ค๋ง๋ค? | ํ๊ฒฝ๋ง๋ค? | ์ด๋์ |
|---|---|---|---|
ddl-auto: validate |
์๋์ค | ์๋์ค | 1๊ณ์ธต |
server.port: 8084 |
์ | ์๋์ค | 2๊ณ์ธต |
| Redis ์ฃผ์ | ์๋์ค | ์ | 3๊ณ์ธต |
eureka.server.my-url |
์ | ์ | 4๊ณ์ธต |
app.outbox.relay.enabled ๊ฐ ์ข์ ์์
๋๋ค.
1๊ณ์ธต enabled: false ๊ธฐ๋ณธ๊ฐ โ ๋๋ถ๋ถ์ ์๋น์ค๋ ๋ฐํ์ ์ ํจ
โ
โผ
2๊ณ์ธต enabled: true ๋ฐํํ๋ ์๋น์ค๋ง ์ผฌ
auth ยท place ยท policy ยท pet ยท report
๊ธฐ๋ณธ๊ฐ์ "๊บผ์ง" ์ผ๋ก ๋ ์ด์ โ ์ผ๋ ๊ฒ์ ์์ผ๋ฉด ์ด๋ฒคํธ๊ฐ 5์ด ๋ฆ๊ฒ ๋๊ฐ ๋ฟ์ด์ง๋ง, ๋๋ ๊ฒ์ ์์ผ๋ฉด ์ฌ๋ฌ ์ธ์คํด์ค๊ฐ ๊ฐ์ ํ์ ์ง์ด ์์ ๋ณด์ฅ์ด ๊นจ์ง๋๋ค.
app.auditor.system-name ๋ ๊ฐ์ ๋ชจ์์
๋๋ค.
1๊ณ์ธต SYSTEM ์ ๋ถ
2๊ณ์ธต ingest-batch ingest ๋ง
extract-batch extract ๋ง
# โ ์ด๋ ๊ฒ ์ฐ์ง ์์ต๋๋ค
password: ${SERVICE_DB_PASSWORD:1234}
host: ${DB_HOST:localhost}ํ๊ฒฝ๋ณ์๋ฅผ ๋น ๋จ๋ ค๋ ๊ทธ๋ฅ ๋ถ์ด ๋ฒ๋ฆผ
โ
โโโ ๋๋ฝ์ด ์์ ์ ๋๋ฌ๋จ
EC2 ๋ก ์ฎ๊ธธ ๋ ํ๊ฒฝ๋ณ์๋ฅผ ์ ๋ฃ์ ์ฌ๋์ด
์กฐ์ฉํ ๋ก์ปฌ DB ์ ๋ถ๊ฒ ๋จ โ ๊ทธํธ์ด ๋ ๋์จ
ํ๊ฒฝ๋ณ์๊ฐ ์์ผ๋ฉด ๊ธฐ๋์ด ์คํจํ๋ ํธ์ด ๋ซ์ต๋๋ค.
${CONFIG_HOST:localhost}๋ง ์์ธ์ ๋๋ค. ๊ทธ๊ฑด ์ ์ฅ์๊ฐ ์๋๋ผ ์๋น์ค์application.yml์ ์๊ณ , ์ค์ ์๋ฒ ์ฃผ์๋ ๋ก์ปฌ์์ ์ธ์ ๋localhost:8888์ด๋ผ ๊ธฐ๋ณธ๊ฐ์ด ์ ๋ต์ ๋๋ค.
# 2๊ณ์ธต โ place-service.yml
spring:
datasource:
url: jdbc:postgresql://${app.datasource.host}:5432/place_db
# 3๊ณ์ธต โ application-local.yml
app:
datasource:
host: ${DB_HOST}ํฉ์น ๋ค์ ํ๋ฆผ
โ
โโโ 2๊ณ์ธต์ url ์ด 3๊ณ์ธต์ host ๋ฅผ ์ธ ์ ์์
๊ณ์ธต ์์์ ๋ฌด๊ดํ๊ฒ ์ต์ข
๊ฒฐ๊ณผ์์ ํด์๋จ
app.datasource.host ํ ์ค์ด DB ์ฃผ์์ ๋จ์ผ ์ถ์ฒ์
๋๋ค.
DB ๋ฅผ ์ฎ๊ธธ ๋ ๊ณ ์น๋ ์๋ฆฌ๊ฐ 3๊ณ์ธต์ ๊ทธ ํ ์ค๋ฟ์
๋๋ค.
โ paw-trail/config ๋ ๊ณต๊ฐ ์ ์ฅ์์
๋๋ค.
๋น๋ฐ๋ฒํธ ยท ๊ฐ์ธํค ยท API ์ํฌ๋ฆฟ
โ
โโโ ์ด๋ ๊ณ์ธต์๋ ๋ฃ์ง ์์
์๋ฆฌ๋ง ${ํ๊ฒฝ๋ณ์} ๋ก ๋จ๊น
| config ์ ์ฅ์ | ํ๊ฒฝ๋ณ์ | |
|---|---|---|
| DB ๋น๋ฐ๋ฒํธ | โ SERVICE_DB_PASSWORD |
|
| RS256 ๊ฐ์ธํค | โ AUTH_JWT_PRIVATE_KEY_B64 |
|
| RS256 ๊ณต๊ฐํค | โ PEM ์๋ณธ ๊ทธ๋๋ก | |
| Gmail ์ฑ ๋น๋ฐ๋ฒํธ | โ AUTH_MAIL_PASSWORD |
|
| ๊ตฌ๊ธ ํด๋ผ์ด์ธํธ ์ํฌ๋ฆฟ | โ AUTH_OAUTH_GOOGLE_CLIENT_SECRET |
|
| ๊ตฌ๊ธ ํด๋ผ์ด์ธํธ ID | โ ๊ฐ ๊ทธ๋๋ก | |
| DB ํธ์คํธ | โ DB_HOST (์ฌ๋๋ง๋ค ๋ค๋ฆ) |
|
| ํฌํธ ยท ๋ง๋ฃ ์๊ฐ ยท ๊ฒฝ๋ก | โ |
๊ธฐ์ค์ "์๋ฉด ๋ฌด์์ ํ ์ ์๋" ์ ๋๋ค.
๊ณต๊ฐํค ํ์ธ๋ง ๋๊ณ ๋ง๋ค ์๋ ์์ โ ๊ณต๊ฐ๋ผ๋ ๋ฌดํด
๊ฐ์ธํค ๋๊ตฌ๋ ์ ํจํ ํ ํฐ์ ๋ง๋ค ์ ์์ โ ์ ๋ ์ ๋จ
ํด๋ผ์ด์ธํธ ID authorize URL ์ ์ค๋ ค ์ฃผ์์ฐฝ์ ๋ธ
๋จ์ด ์์๋ ๋ฑ๋ก๋ redirect URI ๋ก๋ง ๋๋์๊ฐ โ ๋ฌดํด
ํด๋ผ์ด์ธํธ ์ํฌ๋ฆฟ ํ ํฐ ๊ตํ์ ์ฐ์ โ ์ ๋ ์ ๋จ
๊ณต๊ฐํค๋ ๋ธ๋ก ์ค์นผ๋ผ๋ก ๋ก๋๋ค.
# gateway-server.yml
app:
jwt:
public-key: |
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA...
-----END PUBLIC KEY-----๋ค์ฌ์ฐ๊ธฐ๊ฐ ์ผ์ ํด์ผ ํฉ๋๋ค. ์ด๊ธ๋๋ฉด ๊ฒ์ดํธ์จ์ด๊ฐ ํค ํ์ฑ์ ์คํจํ๊ณ ๊ธฐ๋์ด ๋งํ๋๋ค.
Base64 ํ ์ค๋ก ๋ฒ๊ธฐ์ง ์๋ ์ด์ โ ํค๋ยท๊ฐํ์ ์๋๋ค ํ ๊ธ์๋ง ํ๋ ค๋ "์๋ช ๊ฒ์ฆ ์คํจ" ๋ก๋ง ๋ํ๋ ์์ธ ์ถ์ ์ด ๊ณ ์ฝํฉ๋๋ค.
ํ ๋ฒ ์ปค๋ฐํ ๊ฐ์ ์ง์๋ ์ด๋ ฅ์ ๋จ์
โ
โโโ ๋๋๋ฆฌ๋ ๊ฒ์ผ๋ก ๋๋์ง ์์
๊ทธ ํค๋ฅผ ์๋ก ๋ฐ๊ธํด์ผ ํจ
| ๋ฌด์ | ์ด๋ป๊ฒ |
|---|---|
| DB ๋น๋ฐ๋ฒํธ | infra/.env ๋ฅผ ๋ฐ๊พธ๊ณ DB ๋ฅผ ๋ค์ ๋ง๋ฆ |
| RS256 ํค | ์ ์์ ๋ง๋ค๊ณ ๊ฐ์ธํคยท๊ณต๊ฐํค๋ฅผ ํจ๊ป ๊ต์ฒด โ gateway-server README 7-2 |
| Gmail ์ฑ ๋น๋ฐ๋ฒํธ | ๊ตฌ๊ธ ๊ณ์ ์์ ํ๊ธฐํ๊ณ ์ฌ๋ฐ๊ธ |
| ๊ตฌ๊ธ ์ํฌ๋ฆฟ | ํด๋ผ์ฐ๋ ์ฝ์์์ ์ฌ๋ฐ๊ธ |
์๋น์ค๋ฅผ ๋ง๋๋ ์ฌ๋์ด ์ด ์ ์ฅ์์์ ํ๋ ์ผ์ ์ด๊ฒ๋ฟ์ ๋๋ค.
โ config ์ ์ฅ์๋ฅผ clone ์ฒ์ ํ ๋ฒ
โ
โผ
โก <์๋น์ค๋ช
>.yml ์ ๋ฃจํธ์ ๋ง๋ฆ 2๊ณ์ธต
โ
โผ
โข gateway-server.yml ์ ๋ผ์ฐํธ ์ถ๊ฐ
โ
โผ
โฃ ์ธ์ฆ ์์ด ์ด ๊ฒฝ๋ก๊ฐ ์์ผ๋ฉด permit-all ์๋
โ
โผ
โค main ์ ์ปค๋ฐ ยท push ์ด์ยทPR ์์ด
โ
โผ
โฅ ํ์ธ curl :8888/<์๋น์ค๋ช
>/local
DB ๋ฅผ ์ฐ๋ ์๋น์ค
# =============================================================================
# 2๊ณ์ธต โ place-service
# =============================================================================
# ์ฅ์ ๋ด๋น์
#
# ํธ์คํธ๋ 3๊ณ์ธต์ app.datasource.host ์์ ์ค๊ณ ๋น๋ฐ๋ฒํธ๋ 1๊ณ์ธต์ ์์
# ๊ณ์ 10๊ฐ๊ฐ ๊ฐ์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ฐ๋ฏ๋ก ์ฌ๊ธฐ์๋ ๊ณ์ ๋ช
๋ง ๋
# =============================================================================
server:
port: 8084
spring:
datasource:
url: jdbc:postgresql://${app.datasource.host}:5432/place_db
username: place_svc
app:
outbox:
relay:
# place.updated ๋ฅผ ๋ฐํํจ
# ๋จ์ผ ์ธ์คํด์ค๋ผ ์ผ๋ ๊ฐ์ ํ์ ๋ ๋ฒ ์ง์ ์ผ์ด ์์
enabled: trueDB ๋ฅผ ์ ์ฐ๋ ์๋น์ค
server:
port: 8086| ๊ฐ | ๊ท์น |
|---|---|
server.port |
์๋ ๋ฐฐ์ ํ |
username |
<์๋น์ค>_svc โ _user ๊ฐ ์๋๋๋ค |
url ์ DB ์ด๋ฆ |
<์๋น์ค>_db (ingest ๋ง raw_db) |
outbox.relay.enabled |
์ด๋ฒคํธ๋ฅผ ๋ฐํํ๋ ์๋น์ค๋ง true โ auth ยท place ยท policy ยท pet ยท report |
auditor.system-name |
๋ฐฐ์น๋ง โ ingest-batch ยท extract-batch |
ํฌํธ ๋ฐฐ์ ํ์
๋๋ค. ์ด ์ ์ฅ์์ <์๋น์ค๋ช
>.yml ์ด ํฌํธ์ ๋จ์ผ ์ถ์ฒ์
๋๋ค.
ํ๋ซํผ ๋๋ฉ์ธ
8080 gateway-server 8081 auth 8088 ingest
8761 eureka-server 8082 user 8089 extract
8888 config-server 8083 pet 8090 congestion
8084 place 8091 route
8085 policy 8092 report
8086 verdict 8093 notification
8087 search 8094 review
8095 template (๊ฒ์ฆ์ฉ)
docker-compose.yml์ ํฌํธ ๋งคํ๊ณผ Prometheus ํ๊น๋ ๊ฐ์ ๋ฒํธ๋ฅผ ์๋๋ค. ์ฌ๊ธฐ์ ๋ฐ๊พธ๋ฉด ๊ทธ ๋๋ ํจ๊ป ๋ด์ผ ํฉ๋๋ค.
์ฃผ์์ ๋ค๋ ํํ๋ฅผ ์งํต๋๋ค. ํ์ผ ์ฒซ๋จธ๋ฆฌ์ ๊ณ์ธต ยท ์๋น์ค๋ช ยท ๋ด๋น ยท ๊ฐ์ ์ถ์ฒ๋ฅผ ์ ์ต๋๋ค. ๋์ค์ ๋ณด๋ ์ฌ๋์ด "์ด ๊ฐ์ด ์ด๋์ ์ค๋" ๋ฅผ ํ์ผ ์์์ ์ ์ ์์ด์ผ ํฉ๋๋ค.
spring:
cloud:
gateway:
server:
webflux:
routes:
- id: auth-service
uri: lb://auth-service
predicates:
- Path=/api/v1/auth/**
- id: place-service # โ ์ถ๊ฐ
uri: lb://place-service
predicates:
- Path=/api/v1/places/{placeId},/api/v1/places/{placeId}/documents| ํญ๋ชฉ | ๊ท์น | ์ด๊ธฐ๋ฉด |
|---|---|---|
uri |
lb:// + ๊ทธ ์๋น์ค์ spring.application.name |
503 |
predicates |
๋ณด๋ผ ๊ฒฝ๋ก | ์ ์ ์ผ๋ฉด 404 |
| ๊ด๋ฆฌ์ ๊ฒฝ๋ก | /api/v1/admin/{๋ฆฌ์์ค}/** ๋ก ๋ฐ๋ก |
โ |
/api/v1/places/์๋์๋/**๋ฅผ ์ฐ์ง ์์ต๋๋ค. ์๋น์ค 6๊ฐ๊ฐ ์์ฌ ์์ด ์ฒซ ๋ผ์ฐํธ๊ฐ ์ ๋ถ ๋จน์ต๋๋ค.gateway-serverREADME 3-2 ์ฐธ๊ณ .YAML ์ ๋ค์ฌ์ฐ๊ธฐ๊ฐ ๊ณง ๊ตฌ์กฐ์ ๋๋ค.
- id:์ ๊ณต๋ฐฑ์ด ํ ์นธ์ด๋ผ๋ ๋ค๋ฅด๋ฉด ์ค๋ฅ ์์ด ๋ฌด์๋ฉ๋๋ค. ์ ํญ๋ชฉ์ ๋ณต์ฌํด ๊ฐ๋ง ๋ฐ๊พธ๋ ํธ์ด ์์ ํฉ๋๋ค.
# gateway-server.yml
app:
gateway:
permit-all:
- /api/v1/auth/signup
# ... 9์คauth ๋ ์๊ธฐ ๋ชฉ๋ก๋ ๊ฐ๊ณ ์์ต๋๋ค.
gateway-server.yml app.gateway.permit-all ๊ฒ์ดํธ์จ์ด๊ฐ ํ ํฐ ์์ด ํต๊ณผ์ํด
auth-service.yml app.auth.permit-all auth ๋ณด์ ์ฒด์ธ์ด ์ด์ด ๋
๊ฐ์ 9์ค์ด ์์ชฝ์ ์์ด์ผ ํฉ๋๋ค. ํ์ชฝ์๋ง ๋น ์ง๋ฉด 401 ์ด ๋ฉ๋๋ค.
auth ๋ง ๊ทธ๋ ์ต๋๋ค. auth ๊ฐ ์๊ธฐ
SecurityFilterChain์ ์ ์ํด ๊ณตํต ๋ชจ๋์ ๊ท์น์ด ๋ฌผ๋ฌ๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ค๋ฅธ ์๋น์ค๋ ๊ฒ์ดํธ์จ์ด ์ชฝ๋ง ์ ์ผ๋ฉด ๋ฉ๋๋ค.
โ config ์ ์ฅ์์ push
โ
โ ์ค์ ์๋ฒ๋ ์์ฒญ์ด ์ฌ ๋๋ง๋ค GitHub ์ ์ฝ์
โ *์ฌ์์์ด ํ์ ์์
โผ
โก ์ด๋ฏธ ๋ ์๋ ์๋น์ค์ ๋ฐ์ โ ๋ ์ค ํ๋
โ
โโโโถ POST /actuator/refresh ์ฌ์์ ์์ด
โโโโถ ์๋น์ค ์ฌ๊ธฐ๋
โ
โผ
โข ํ์ธ curl :8888/<์๋น์ค๋ช
>/local
| ๋ฐ๊พผ ๊ฒ | ํ์ํ ์์ |
|---|---|
| config ์ ์ฅ์์ ๊ฐ | push ํ๋ฉด ๋. ์ค์ ์๋ฒ๋ ๊ทธ๋๋ก |
| ์ด๋ฏธ ๋ ์๋ ์๋น์ค | POST /actuator/refresh ๋๋ ์ฌ๊ธฐ๋ |
์๋น์ค ์ ์ฅ์์ application.yml |
์ฌ๋ฐฐํฌ |
| ํ๊ฒฝ๋ณ์ | ์ปจํ ์ด๋ ์ฌ์์ |
| ์ก์ถ์์ดํฐ ์๋ํฌ์ธํธ ๋ฑ๋ก | ์ฌ๊ธฐ๋ โ ๋ฑ๋ก์ ๊ธฐ๋ ์์ ์ ์ผ์ด๋จ |
curl -X POST http://localhost:8084/actuator/refresh๋ฐ๋ ํค ๋ชฉ๋ก์ด ๋ฐฐ์ด๋ก ๋์์ต๋๋ค.
["app.datasource.host", "server.port"]๋น ๋ฐฐ์ด์ด๋ฉด ์๋ฌด๊ฒ๋ ์ ๋ฐ๋ ๊ฒ์ ๋๋ค. push ๋ฅผ ์ ํ๊ฑฐ๋ ๊ฐ์ด ๊ฐ์ต๋๋ค.
# 1๊ณ์ธต โ application.yml
spring:
cloud:
refresh:
extra-refreshable: javax.sql.DataSource,com.zaxxer.hikari.HikariDataSource
never-refreshable: ""์ด ๋ ์ค์ด ์์ผ๋ฉด
โ
โโโโถ ํ๋กํผํฐ๋ง ๋ค์ ๋ฐ์ธ๋ฉ๋จ
โโโโถ โ ์ปค๋ฅ์
ํ์ ์ ์ฃผ์๋ฅผ ๊ทธ๋๋ก ๋ฌผ๊ณ ์์
refresh ์๋ต์ด ์ ์์ด๊ณ ๋ฐ๋ ํค๊ฐ ๋์๋ ๊ทธ๋ฌํจ
DB ๋ฅผ ์ฎ๊ฒผ์ ๋ ์ฃผ์๋ง ๋ฐ๊พธ๊ณ ์ฌ๋ฐฐํฌ ์์ด ์ ํํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค. ์ง์ฐ์ง ์์ต๋๋ค.
app.datasource.hostํ ์ค์ 3๊ณ์ธต์์ ๊ณ ์น๊ณ refresh ํ๋ฉด 14๊ฐ ์๋น์ค๊ฐ ์ DB ๋ฅผ ๋ด ๋๋ค.
| ์๋น์ค | ์ค์ ๋ฏธ์์ ํ๋ณ |
|---|---|
| ๋๋ฉ์ธ ์๋น์ค | ํฌํธ๊ฐ 8080 ์ผ๋ก ๋ธ (์ ์ ํฌํธ๊ฐ 8081~8095) |
| eureka-server | ํฌํธ๊ฐ 8080 ์ผ๋ก ๋ธ (์ ์ 8761) |
| gateway-server | โ ์ ์ ํฌํธ๊ฐ 8080 ์ด๋ผ ํ๋ณ ๋ถ๊ฐ |
๊ฒ์ดํธ์จ์ด๋ /actuator/gateway/routes ๊ฐ ๋น์ด ์๋ ๊ฒ์ผ๋ก ๊ฐ๋ ค๋
๋๋ค.
curl http://localhost:8080/actuator/gateway/routes| ์ฆ์ | ์์ธ |
|---|---|
| ํฌํธ๊ฐ 8080 ์ผ๋ก ๋ธ | 2๊ณ์ธต ํ์ผ์ ๋ชป ์ฐพ์. ํ์ผ๋ช
์ด spring.application.name ๊ณผ ๊ฐ์์ง |
propertySources ๊ฐ ๋น์ด ์์ |
๊ฐ์ |
${DB_HOST} ๊ฐ ๊ทธ๋๋ก ๋ค์ด๊ฐ |
ํ๊ฒฝ๋ณ์๋ฅผ ์ ๋ฃ์. UnknownHostException: ${DB_HOST} |
:8888/์๋น์ค๋ช
-local.yml ์ด 400 |
ํ์ฅ์ ์ฃผ์๋ ๋ชป ์. /์๋น์ค๋ช
/local ๋ก |
| ๊ณ ์ณค๋๋ฐ ๊ทธ๋๋ก | push ๋ฅผ ์ ํ๊ฑฐ๋ refresh ๋ฅผ ์ ํจ |
| ๊ฒ์ดํธ์จ์ด ๋ผ์ฐํธ๊ฐ 0๊ฐ | config ๋ฏธ์์ |
๋์กฐํ๋ ๊ฒ์ด ์๋ น์ ๋๋ค.
:8888/place-service/local ๋ด๊ฐ ์ด ๊ฒ
:8084/actuator/env ์๋น์ค๊ฐ ์ค์ ๋ก ๋ค๊ณ ์๋ ๊ฒ
| ํ๋ ค๋ ๊ฒ | ์ฃผ์ |
|---|---|
| ์ต์์ ํค๋ฅผ ์ถ๊ฐ | ๊ฐ์ ํค๊ฐ ๋ ๋ฒ ๋์ค๋ฉด ์์ ๋ธ๋ก์ด ํต์งธ๋ก ๋ฌด์๋จ |
| ๋ผ์ฐํธ ์ถ๊ฐ | - id: ์ ๊ณต๋ฐฑ์ด ํ ์นธ๋ง ๋ฌ๋ผ๋ ๋ฌด์๋จ |
| ๊ณต๊ฐํค ๋ถ์ฌ๋ฃ๊ธฐ | ๋ธ๋ก ์ค์นผ๋ผ ์์ ๋ค์ฌ์ฐ๊ธฐ๊ฐ ์ผ์ ํด์ผ ํจ |
prod ์ TODO ์ฃผ์ ํ๊ธฐ |
app ยท spring ๋ฑ์ด ๋ ๋ฒ ๋์ค์ง ์๊ฒ ํ๋์ ํธ๋ฆฌ๋ก |
# โ ์ด๋ ๊ฒ ๋๋ฉด ์์ app ๋ธ๋ก์ด ํต์งธ๋ก ๋ฌด์๋จ
app:
auth:
cookie:
secure: false
app: # โ ๋ ๋ฒ์งธ app
datasource:
host: 10.0.0.0๊ฒ์ฌํ๋ ๋ฒ
python3 -c "import yaml; yaml.safe_load(open('place-service.yml', encoding='utf-8')); print('OK')"์ค์ ์๋ฒ๋ก๋ ํ์ธ๋ฉ๋๋ค.
curl http://localhost:8888/place-service/local500 ์ด ๋์ค๋ฉด YAML ์ด ๊นจ์ง ๊ฒ์ ๋๋ค.
์๋น์ค์ Properties ํด๋์ค์ "๋น๋ฉด ๊ธฐ๋์ ๋ง๋" ๊ฒ์ฆ์ ์ถ๊ฐํ๋ฉด
์ธ ๊ณณ์ ํจ๊ป ๊ณ ์ณ์ผ ํฉ๋๋ค.
config/<์๋น์ค๋ช
>.yml ์ค์ ๊ฐ
<์๋น์ค>/src/test/resources/application.yml ํ
์คํธ์ฉ ์ฌ๋ณธ โ ๋์น๊ธฐ ์ฌ์
<์๋น์ค>์ Properties ํด๋์ค ๊ฒ์ฆ
ํ
์คํธ๋ spring.cloud.config.enabled: false ๋ผ
config ์ ์ฅ์ ๊ฐ์ด ํ๋๋ ์ ๋ด๋ ค์ด
โ
โโโ config ์๋ง ๋ฃ๊ณ ํ
์คํธ ๋ฆฌ์์ค๋ฅผ ์ ๊ณ ์น๋ฉด
contextLoads ๊ฐ ์คํจํด ๋น๋๊ฐ ๊นจ์ง
์ค์ ๋ก ๊ฒช์์ต๋๋ค.
app.jwt.claim.type์ ๋ฃ์ ๋ authยท๊ฒ์ดํธ์จ์ด ์์ชฝ์์ ํ ์คํธ ๋ฆฌ์์ค๋ฅผ ๋น ๋จ๋ ธ์ต๋๋ค.
์๋น์ค์ ์ ๊ฒ์ฆ์ด ๋ค์ด๊ฐ ๋๋ config ๋ฅผ ๋จผ์ ์ฌ๋ฆฝ๋๋ค.
โ config ์ ์ฅ์์ ์ ๊ฐ push
โ
โผ
โก docker compose restart config-server (์ปจํ
์ด๋๋ก ๋ ๋)
โ
โผ
โข ์๋น์ค ๋ฐฐํฌ
โ ์ ์ ํ๊ณ โข์ ํ๋ฉด ์ ๊ฒ์ฆ์ ๊ฑธ๋ ค ๊ธฐ๋์ด ๋งํ๋๋ค. ์๋ํ ๋์์ ๋๋ค.
| ๊ณ ๋ฆ | ๋ฒ๋ฆผ |
|---|---|
| config ์ ์ฅ์ + ์ค์ ์๋ฒ | ๊ฐ ์๋น์ค์ application.yml |
| ๊ฐ์ ๋ฐ๊พธ๋ฉด push ๋ก ๋ | ๋น๋ โ ์ด๋ฏธ์ง โ ๋ฐฐํฌ ํ ์ฌ์ดํด |
| ๊ฐ์ด ํ ๊ณณ์ ๋ชจ์ | ์ ์ฅ์ 17๊ณณ์ ํฉ์ด์ง |
| ํ๊ฒฝ๋ณ ์ฐจ์ด๊ฐ ํ์ผ๋ก ๊ฐ๋ฆผ | ์ฝ๋์ ๋ถ๊ธฐ |
๊ฒฐ์ ์ ์ธ ์๋ฆฌ๊ฐ ๋์ ๋๋ค.
DB ์น๊ฒฉ 3๊ณ์ธต์ app.datasource.host ํ ์ค + refresh
์ฌ๋ฐฐํฌ ์์ด 14๊ฐ ์๋น์ค๊ฐ ์ DB ๋ฅผ ๋ด
๋ผ์ฐํธ ๊ฐ๋ฐฉ ์์ผ๋ก 14๋ฒ ์ผ์ด๋จ
๊ฒ์ดํธ์จ์ด ์ฝ๋์ ์์ผ๋ฉด ๊ทธ๋๋ง๋ค blue-green ๋ฐฐํฌ
์ ์ โ ์ค์ ์๋ฒ๋ ${...} ๋ฅผ ์นํํ์ง ์๊ณ ๋ฌธ์์ด ๊ทธ๋๋ก ๋ด๋ ค๋ณด๋
โ
โโโ ๋น๋ฐ๊ฐ์ด ์ ์ด์ ์ด ์ ์ฅ์์ ์กด์ฌํ์ง ์์
๊ฐ ์๋น์ค๊ฐ ์๊ธฐ ํ๊ฒฝ๋ณ์๋ก ํด์ํจ
๊ณต๊ฐ๋ก ๋๋ฉด ์ป๋ ๊ฒ์ ๋๋ค.
| ์ค์ ์๋ฒ๊ฐ ์ธ์ฆ ์์ด ์ฝ์ | private ์ด๋ฉด ํ ํฐ์ ์ค์ ์๋ฒ์ ๋ฃ์ด์ผ ํจ |
| ํ์์ด ๋ฐ๋ก ๋ด | ๊ถํ ๊ด๋ฆฌ๊ฐ ์์ |
| ์ฌ์ฌ์์ ๊ทธ๋๋ก ๋ณด์ฌ์ค ์ ์์ |
โ ๋์ ์ค์์ ๋๊ฐ๊ฐ ํฝ๋๋ค. ํ ๋ฒ ์ปค๋ฐํ๋ฉด ์ง์๋ ์ด๋ ฅ์ ๋จ๊ณ ํค๋ฅผ ์๋ก ๋ฐ๊ธํด์ผ ํฉ๋๋ค.
๊ฒ์ดํธ์จ์ด ์ฝ๋๊ฐ ์๋๋ผ config 2๊ณ์ธต์ ์์ต๋๋ค.
๋ผ์ฐํธ ๊ฐ๋ฐฉ์ด ์์ผ๋ก 14๋ฒ ์ผ์ด๋จ
โ
โโโ ์ฝ๋์ ์์ผ๋ฉด ๋น๋ โ ์ด๋ฏธ์ง push โ blue-green ๋ฐฐํฌ
โโโ config ์ ์์ผ๋ฉด push + /actuator/refresh
| config yml | ์๋ฐ RouteLocator |
|
|---|---|---|
| ์คํ ๊ฒ์ฆ | ์์ | ์ปดํ์ผ |
| ์คํ ์ฆ์ | 404 โ ์ฒซ ํธ์ถ์์ ๋๋ฌ๋จ | โ |
| ํ๊ฒฝ๋ณ ์ฐจ์ด | 4๊ณ์ธต์ผ๋ก | ์ฝ๋ ๋ถ๊ธฐ |
๋๊ฐ๋ ์ํฅ ๋ฒ์์ ๋๋ค. ์ง๊ธ config ์คํ๋ "๊ทธ ์๋น์ค ํ๋" ๊ฐ ํฌํธ๋ฅผ ๋ชป ์ก๋ ์ ๋์ธ๋ฐ, ๋ผ์ฐํธ๊ฐ ๋ค์ด์ค๋ฉด ์คํ ํ๋๋ก ํน์ API ์ ์ฒด๊ฐ 404 ๊ฐ ๋ฉ๋๋ค.
config-server ๋ง ๋ญ-๋ฌ๊ฑ ๋ฌธ์ ๊ฐ ์์
โ
โโโ ์ ์ฅ์ ์ฃผ์๋ฅผ ์์์ผ ์ ์ฅ์๋ฅผ ์ฝ์ ์ ์์
๊ทธ ๊ฐ์ ์ ์ฅ์์์ ๋ฐ์ ์ ์์
๊ทธ๋์ ์ค์ ์๋ฒ๋ ์๊ธฐ ์ ์ฅ์ ์์ ์ค์ ์ ๋ก๋๋ค.
์์ธ๋ฅผ ๊ทธ๊ฒ ํ๋๋ก ์ค์ธ ๊ฒ์ด ์ด๋์ ๋๋ค. ๊ฒ์ดํธ์จ์ดยท์ ๋ ์นด๋ ๊ทธ ๋ฌธ์ ๊ฐ ์์ด ์ฌ๊ธฐ์ ๋ฐ์ต๋๋ค.
์ปจํ ์ด๋๋ก ๋์ธ ๋ config-server ๋ง ์ฃผ์ ํ๊ฒฝ๋ณ์๋ฅผ ์ง์ ๋ฐ์ต๋๋ค.
EUREKA_HOSTยทLOKI_HOST์ธ๋ฐ, dev ํ๋กํ์ผ์ด ์ฃผ์๋ฅผ ๋ฐ๊ฟ ์ฃผ๋ ๊ฒฝ๋ก๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.๋น ๋จ๋ฆฌ๋ฉด
localhost๋ก ๋จ๋๋ฐ ์ปจํ ์ด๋ ์์์ ๊ทธ๊ฒ์ ์๊ธฐ ์์ ์ด๋ผ ์ ๋ ์นด ๋ฑ๋ก์ด ์์ ์คํจํ๊ณ , ๋ฑ๋ก ์คํจ๊ฐ ๊ธฐ๋์ ๋ง์ง ์์ ์ ๋ ์นด ํ๋ฉด์ ์ ๋ณด์ด๋ ๊ฒ์ผ๋ก ์์์ฐจ๋ฆฌ๊ฒ ๋ฉ๋๋ค.
์ด ์ ์ฅ์์๋
์ฝ๋๊ฐ ์์ ๋น๋๋ CI ๋ ์์
๋ฆฌ๋ทฐํ ๊ฒ์ด ์์ YAML 23๊ฐ
์ค์ ์๋ฒ๊ฐ main ์ ์ฝ์
์ด์ยทPRยท๋ธ๋์น๋ฅผ ๋ง๋ค๋ฉด ์ป๋ ๊ฒ ์์ด ๋จ๊ณ๋ง ๋์ด๋ฉ๋๋ค.
๋๋ฉ์ธ ์๋น์ค๋ ๋ค๋ฆ ๋๋ค. ๊ฑฐ๊ธฐ๋ 1์ด์-1๋ธ๋์น-1PR ์ด๊ณ CodeRabbit ๋ฆฌ๋ทฐ๊ฐ ๋ถ์ต๋๋ค.
# application-prod.yml โ ์ง๊ธ ์ด์ ์๋ ๊ฒ์ ์ด๊ฒ๋ฟ
logging:
level:
com.pawtrail: INFO๋๋จธ์ง๋ ์ฃผ์ ์ฒ๋ฆฌ๋ TODO ์ ๋๋ค.
| ์ฑ์ธ ๊ฒ | ์ธ์ |
|---|---|
app.datasource.host |
AWS ๋ ธ๋ ๊ตฌ์ฑ์ด ์ ํด์ง๋ฉด โ data-primary ์ฌ์ค IP |
app.logging.loki.url |
๊ด์ธก ๋ ธ๋ ์ฌ์ค IP |
spring.data.redis.host |
Redis ๊ฐ ๋จ๋ ๋ ธ๋ |
spring.kafka.bootstrap-servers |
Kafka ๋ ธ๋ |
eureka.client.service-url |
edge ๋ ธ๋ |
management.tracing...zipkin |
๊ด์ธก ๋ ธ๋ |
app.auth.cookie.secure: true |
nginx ์ ์ธ์ฆ์๋ฅผ ๋ถ์ผ ๋ |
app.oauth.* |
๋๋ฉ์ธ์ด ์๊ธธ ๋ โ ๊ตฌ๊ธ์ IP ์ HTTP ๋ฅผ ๊ฑฐ๋ถ |
โ ์ฑ์ฐ๊ธฐ ์ ์
prodํ๋กํ์ผ๋ก ๋์ฐ์ง ์์ต๋๋ค. ๊ฐ์ด ์์ผ๋ฉด 1๊ณ์ธต ๊ฐ์ด ๊ทธ๋๋ก ๋ด๋ ค๊ฐ local ์ฃผ์๋ก ๋ถ์ผ๋ ค ์๋ํ๋ฉฐ ์ค๋ฅ ์์ด ์ด์ํ๊ฒ ๋์ํฉ๋๋ค.
์ฃผ์์ ํ ๋ ์ฃผ์ํฉ๋๋ค.
์ต์์ ํค(app ยท spring ยท eureka ยท management)๊ฐ ๋ ๋ฒ ๋์ค์ง ์๊ฒ ํ ๊ฒ
โ
โโโ YAML ์ค๋ณต ํค๊ฐ ๋๋ฉด ์์ ๋ธ๋ก์ด ํต์งธ๋ก ๋ฌด์๋จ
์ง๊ธ์ ํ๋์ ํธ๋ฆฌ๋ก ์ด์ด ๋์์ผ๋ฏ๋ก ๋ธ๋ก์งธ ์ฃผ์๋ง ํ๋ฉด ๋จ
| ์ธ์ | ๋ฌด์ |
|---|---|
| EC2 ๋ฅผ ์ธ์ธ ๋ | prod ์ฃผ์ ์ ๋ถ ยท application-dev.yml ์ DB ์ฃผ์ ์ฌ๊ฒํ |
| nginx ๋ฅผ ๋ถ์ผ ๋ | cookie.secure: true ยท OAuth ๋ฐฐํฌ ์ฃผ์ |
| AWS ๋ฐฐํฌ ๋ | RS256 ํค ํ์ด๋ฅผ ์๋ก ๋ง๋ค๊ณ gateway-server-prod.yml ์ ๊ณต๊ฐํค |
| pet ์ฐฉ์ ์ | ๊ฐ ์๋น์ค ํ์ผ์ outbox.relay.enabled ํ์ธ |
| extract ์ฐฉ์ ์ | extract-service.yml ์ด ํฌํธ์ ๊ฐ์ฌ ์ด๋ฆ๋ฟ โ LLMยท์ฒญํฌ ๊ฐ์ด ๋ค์ด๊ฐ ์๋ฆฌ |
โ ํค ํ์ด๋ฅผ ๋ฐ๊ฟ ๋ ์ง์ด ์ด๊ธ๋๋ฉด ์ ์์ฒญ์ด 401 ์ ๋๋ค. ๊ฐ์ธํค(auth ํ๊ฒฝ๋ณ์)์ ๊ณต๊ฐํค(์ฌ๊ธฐ)๋ฅผ ํจ๊ป ๋ฐ๊ฟ์ผ ํฉ๋๋ค.
| ๋ฌด์ | ์ํ |
|---|---|
| 4๊ณ์ธต์ ๋ ์ธ์ง | ์ง๊ธ ์ ๋ ์นด ๋๋ฟ. ๋๋๋ก ๋น์ ๋๋ ๊ฒ์ด ๋ฐฉ์นจ |
prod ๋ฅผ ์ด๋ป๊ฒ ๊ฒ์ฆํ ์ง |
EC2 ๊ฐ ์๊ธฐ ์ ์๋ ํ์ธํ ๋ฐฉ๋ฒ์ด ์์ |
| ์กฐ์ง ์ ์ฉ BOM | Boot ๋ฒ์ ์ด 21๊ฐ ๋ ํฌ์ ์ฌ๋ณธ์ผ๋ก ์์ |
๊ณตํต ์ฉ์ด๋ service-template README 11์ฅ์ ์์ต๋๋ค.
์ฌ๊ธฐ๋ ์ค์ ์์๋ง ์ฐ๋ ๋ง์
๋๋ค.
| ์ฉ์ด | ๋ป |
|---|---|
| ์ค์ ์๋ฒ | ์ด ์ ์ฅ์๋ฅผ ์ฝ์ด ๊ฐ ์๋น์ค์ ์ค์ ์ ๋ด๋ ค ์ฃผ๋ ์๋ฒ. config-server ์ ์ฅ์ |
| ๊ณ์ธต | ์ค์ ํ์ผ์ ์ฐ์ ์์ ๋จ๊ณ. 1~4์ด๊ณ ์ซ์๊ฐ ํฐ ์ชฝ์ด ์ด๊น |
| ํ๋กํ์ผ | ํ๊ฒฝ ์ด๋ฆ. local ยท dev ยท prod |
propertySources |
์ค์ ์๋ฒ ์๋ต์์ ์ด๋ ํ์ผ์์ ์จ ๊ฐ์ธ์ง ๋ณด์ฌ ์ฃผ๋ ๋ฐฐ์ด. ์์ด ์ฐ์ ์์๊ฐ ๋์ |
${...} |
ํ๋ ์ด์คํ๋. ์ค์ ์๋ฒ๋ ์นํํ์ง ์๊ณ ๋ฌธ์์ด ๊ทธ๋๋ก ๋ด๋ ค๋ณด๋ |
๋ธ๋ก ์ค์นผ๋ผ (|) |
์ฌ๋ฌ ์ค ๋ฌธ์์ด์ ๊ทธ๋๋ก ๋ด๋ YAML ๋ฌธ๋ฒ. ๊ณต๊ฐํค๊ฐ ์ด ํํ |
/actuator/refresh |
์๋น์ค๊ฐ ์ค์ ์ ๋ค์ ์ฝ๋ ์๋ํฌ์ธํธ. POST |
extra-refreshable |
refresh ํ ๋ ๋ค์ ๋ง๋ค ๋น์ ์ง์ . DataSource ๊ฐ ์ฌ๊ธฐ ์์ |
| ๋ญ-๋ฌ๊ฑ ๋ฌธ์ | ์ค์ ์๋ฒ๊ฐ ์๊ธฐ ์ค์ ์ ์ ์ฅ์์์ ๋ชป ๋ฐ๋ ๊ฒ. ์ ์ฅ์ ์ฃผ์๋ฅผ ์์์ผ ์ ์ฅ์๋ฅผ ์ฝ์ |
lb:// |
๊ฒ์ดํธ์จ์ด ๋ผ์ฐํธ์์ "์ ๋ ์นด์์ ์ด ์ด๋ฆ์ผ๋ก ์ฐพ์๋ผ" ๋ ํ์ |
permit-all |
์ธ์ฆ ์์ด ํต๊ณผ์ํฌ ๊ฒฝ๋ก ๋ชฉ๋ก. ๊ฒ์ดํธ์จ์ด์ auth ์์ชฝ์ ๊ฐ์ 9์ค |
out-of-order |
Flyway ๊ฐ ๋ฒํธ ์์๋ฅผ ๊ฑด๋๋ด ์คํฌ๋ฆฝํธ๋ ์คํํ๊ฒ ํ๋ ์ต์ . ๊ณตํต ๋์ญ ๋๋ฌธ์ ์ผ ๋ |