Skip to content

Latest commit

ย 

History

54 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

config

ํ•จ๊ป˜ํ•˜๊ฐœ์˜ ์„ค์ • ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค. ์„œ๋น„์Šค 17๊ฐœ์˜ ์„ค์ •๊ฐ’์ด ์ „๋ถ€ ์—ฌ๊ธฐ ์žˆ์Šต๋‹ˆ๋‹ค.


๋จผ์ € ์ „์ฒด ๊ทธ๋ฆผ์„ ๋ณด๊ณ , ์ด ๋ ˆํฌ๊ฐ€ ๊ทธ ์•ˆ ์–ด๋””์— ์žˆ๋Š”์ง€ ๋ณธ ๋’ค ์ฝ์Šต๋‹ˆ๋‹ค.

โ‘  ์ „์ฒด ๊ตฌ์กฐ โ€” ์ธต์œผ๋กœ ๋ณธ ๊ฒƒ. ์œ„์—์„œ ์•„๋ž˜๋กœ ์š”์ฒญ์ด ๋‚ด๋ ค๊ฐ€๊ณ , ์–ด๋А ์ธต์— ๋ฌด์—‡์ด ์žˆ๋Š”์ง€.

์ „์ฒด ๊ตฌ์กฐ (์ธต)

โ‘ก ์ „์ฒด ๊ตฌ์กฐ โ€” ์„œ๋น„์Šค๋ผ๋ฆฌ ๋ฌด์—‡์„ ์ฃผ๊ณ ๋ฐ›๋Š”์ง€. ์ดˆ๋ก ์‹ค์„ ์ด /internal ํ˜ธ์ถœ, Kafka ํ‘œ๊ฐ€ ์ด๋ฒคํŠธ, ํ•˜๋Š˜์ƒ‰ ์ ์„ ์ด VPC ๊ฒฝ๊ณ„.

์ „์ฒด ๊ตฌ์กฐ (ํ˜ธ์ถœ ๊ด€๊ณ„)

โ‘ข ์ด ๋ ˆํฌ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ. ์ง์ ‘ ์—ฐ๊ฒฐ๋œ ๊ฒƒ๋งŒ ๋‚จ๊ธด ๊ทธ๋ฆผ.

config ์ €์žฅ์†Œ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ

โ‘ โ‘ก ๋Š” service-template/docs ์— ์žˆ๋Š” ๊ฒƒ์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. ์„œ๋น„์Šค๊ฐ€ ๋Š˜์–ด๋„ ๊ทธ์ชฝ ํ•œ ๊ณณ๋งŒ ๊ณ ์นฉ๋‹ˆ๋‹ค.




๋ณธ๋ฌธ ์‹œ์ž‘

์„œ๋น„์Šค ๊ธฐ๋™  โ”€โ”€โ–ถ  ์„ค์ • ์„œ๋ฒ„  โ”€โ”€โ–ถ  config ์ €์žฅ์†Œ
                      โ”‚                 โ”‚
                      โ”‚                 โ””โ”€โ”€โ–ถ  GitHub ์—์„œ yml ์„ ์ฝ์Œ
                      โ”‚                       main ๋ธŒ๋žœ์น˜
                      โ”‚
                      โ””โ”€โ”€โ–ถ  4๊ณ„์ธต์„ ์ˆœ์„œ๋Œ€๋กœ ๊ฒน์ณ ํ•˜๋‚˜๋กœ ๋งŒ๋“ค์–ด ๋Œ๋ ค์คŒ

        ์„œ๋น„์Šค๋Š” ์ž๊ธฐ application.yml ์— ์„ธ ์ค„๋งŒ ๋‘๊ณ  ๋‚˜๋จธ์ง€๋ฅผ ์—ฌ๊ธฐ์„œ ๋ฐ›์Œ

        โš  ์ด ์ €์žฅ์†Œ๋Š” ๊ณต๊ฐœ์ž„ โ€” ๋น„๋ฐ€๊ฐ’์€ ${ํ™˜๊ฒฝ๋ณ€์ˆ˜} ์ž๋ฆฌ๋งŒ ๋‚จ๊น€




0. ์ด ์ €์žฅ์†Œ๊ฐ€ ํ•˜๋Š” ์ผ

์„ค์ •์„ ์ €์žฅ์†Œ์— ๋‘๋ฉด ์ด๋ ‡๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๋‘๋ฉด ๊ฐ ์„œ๋น„์Šค์— ๋‘๋ฉด
๊ฐ’์„ ๋ฐ”๊พธ๋ฉด 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  ๊ณต๊ฐœ ์ €์žฅ์†Œ                  โš  ๋น„๋ฐ€๊ฐ’์„ ์ ˆ๋Œ€ ์ ์ง€ ์•Š์Œ
                              ํ•œ ๋ฒˆ ์ปค๋ฐ‹ํ•˜๋ฉด ์ง€์›Œ๋„ ์ด๋ ฅ์— ๋‚จ์Œ




๋จผ์ € ์•Œ์•„ ๋‘๋ฉด ์ข‹์€ ๊ฒƒ 4๊ฐ€์ง€


โ‘  ์„ค์ •์ด๋ž€ โ€” ์ฝ”๋“œ์—์„œ ๋บ€ "๊ฐ’"

์ฝ”๋“œ์— ๋ฐ•์œผ๋ฉด                            ์„ค์ •์œผ๋กœ ๋นผ๋ฉด

  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์žฅ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ํŒŒ์ผ ํ•˜๋‚˜๋ฅผ ๋งŒ๋“ค๊ณ  ๊ฒŒ์ดํŠธ์›จ์ด ๋ผ์šฐํŠธ๋ฅผ ์—ฌ๋Š” ๊ฒƒ์ด ์ „๋ถ€์ž…๋‹ˆ๋‹ค.




1. ํŒŒ์ผ ์ง€๋„

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 ์ €์žฅ์†Œ ์•ˆ์— ์žˆ์Šต๋‹ˆ๋‹ค.




1-1. ํŒŒ์ผ ํฌ๊ธฐ๊ฐ€ ๊ฐˆ๋ฆฌ๋Š” ์ด์œ 

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




1-2. ์ด๋ฆ„ ๊ทœ์น™

<์„œ๋น„์Šค๋ช…>.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 ๊ฐ™์€ ์ด๋ฆ„์€ ์•ˆ ๋ฉ๋‹ˆ๋‹ค.




2. 4๊ณ„์ธต โ€” ์ˆซ์ž๊ฐ€ ํฐ ์ชฝ์ด ์ด๊น€

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




2-1. ์„ธ๊ธฐ ๊ทœ์น™์€ ๋‘ ๊ฒน์ž…๋‹ˆ๋‹ค

"๊ตฌ์ฒด์ ์ธ ํŒŒ์ผ์ด ์ด๊ธด๋‹ค" ๊ฐ€ ์•„๋‹˜. ๊ทœ์น™์ด ๋‘ ๊ฒน์ž„

  โ‘  ํ”„๋กœํŒŒ์ผ์ด ๋ถ™์€ ํŒŒ์ผ์ด ์•ˆ ๋ถ™์€ ํŒŒ์ผ์„ ์ด๊น€
        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๊ณ„์ธต์ด ๋งž์Šต๋‹ˆ๋‹ค.




2-2. ๊ฐ ๊ณ„์ธต์— ๋ฌด์—‡์ด ์žˆ๋‚˜

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

๋˜๋„๋ก ๋น„์›Œ ๋‘ก๋‹ˆ๋‹ค. ์ง€๊ธˆ ์œ ๋ ˆ์นด ๋‘˜๋ฟ์ž…๋‹ˆ๋‹ค.




2-3. ์œ ๋ ˆ์นด ๋“ฑ๋ก ๋ฐฉ์‹์ด ํ™˜๊ฒฝ๋งˆ๋‹ค ๋‹ค๋ฆ…๋‹ˆ๋‹ค

# application-local.yml
eureka:
  instance:
    hostname: host.docker.internal
    prefer-ip-address: false

# application-dev.yml
eureka:
  instance:
    prefer-ip-address: true
local   IntelliJ ๊ฐ€ ํ˜ธ์ŠคํŠธ์—์„œ ๋Ž
          โ”‚
          โ””โ”€โ”€โ–ถ  host.docker.internal ๋กœ ๋“ฑ๋ก
                  *์ปจํ…Œ์ด๋„ˆ ์•ˆ์˜ ๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ ์ด ์ด๋ฆ„์œผ๋กœ ํ˜ธ์ŠคํŠธ๋ฅผ ์ฐพ์Œ
                    ํ•œ ์ด๋ฆ„์ด ํ˜ธ์ŠคํŠธยท์ปจํ…Œ์ด๋„ˆ ์–‘์ชฝ์—์„œ ํ†ตํ•จ

dev     ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ๋Ž
          โ”‚
          โ””โ”€โ”€โ–ถ  ๋„์ปค ๋„คํŠธ์›Œํฌ IP ๋กœ ๋“ฑ๋ก
                  ๊ฐ™์€ ๋„คํŠธ์›Œํฌ๋ผ IP ๋กœ ๋ฐ”๋กœ ๋‹ฟ์Œ

์ด๊ฒƒ ๋•๋ถ„์— IntelliJ ๋กœ ๋„์šด ์„œ๋น„์Šค๋„ ๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ ์ฐพ์•„๋ƒ…๋‹ˆ๋‹ค.




2-4. ์‹ค์ œ๋กœ ๋ฐ›์€ ๊ฐ’ ํ™•์ธํ•˜๊ธฐ

http://localhost:8888/{์„œ๋น„์Šค๋ช…}/{ํ™˜๊ฒฝ}

macOS

curl http://localhost:8888/place-service/local

Windows (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}"

์„ค์ • ์„œ๋ฒ„๋Š” ๋ฌธ์ž์—ด ๊ทธ๋Œ€๋กœ ๋ณด๋‚ด๊ณ  ๊ฐ ์„œ๋น„์Šค๊ฐ€ ์ž๊ธฐ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ํ•ด์„ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๊ณต๊ฐœ ์ €์žฅ์†Œ๋กœ ๋‘˜ ์ˆ˜ ์žˆ๋Š” ์ „์ œ์ž…๋‹ˆ๋‹ค.




3. ๊ฐ’์„ ์–ด๋””์— ๋‘˜์ง€ ์ •ํ•˜๊ธฐ

์ƒˆ ๊ฐ’์„ ๋„ฃ์„ ๋•Œ

              ์„œ๋น„์Šค๋งˆ๋‹ค ๋‹ค๋ฅธ๊ฐ€?
                      โ”‚
          โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
         ์˜ˆ                    ์•„๋‹ˆ์˜ค
          โ”‚                       โ”‚
          โ–ผ                       โ–ผ
  ํ™˜๊ฒฝ๋งˆ๋‹ค ๋‹ค๋ฅธ๊ฐ€?        ํ™˜๊ฒฝ๋งˆ๋‹ค ๋‹ค๋ฅธ๊ฐ€?
          โ”‚                       โ”‚
    โ”Œโ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”           โ”Œโ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”
   ์˜ˆ        ์•„๋‹ˆ์˜ค        ์˜ˆ        ์•„๋‹ˆ์˜ค
    โ”‚           โ”‚           โ”‚           โ”‚
    โ–ผ           โ–ผ           โ–ผ           โ–ผ
  4๊ณ„์ธต       2๊ณ„์ธต       3๊ณ„์ธต       1๊ณ„์ธต
{svc}-{env}   {svc}     app-{env}      app


  ์• ๋งคํ•˜๋ฉด ๋ฒˆํ˜ธ๊ฐ€ ์ž‘์€ ์ชฝ์— ๋‘˜ ๊ฒƒ
  ๋‚˜์ค‘์— ํฐ ๋ฒˆํ˜ธ์—์„œ ๋ฎ์–ด์“ฐ๋Š” ๊ฒƒ์ด ๋ฐ˜๋Œ€๋ณด๋‹ค ์‰ฌ์›€




3-1. ์‹ค์ œ ์‚ฌ๋ก€๋กœ ๋ณด๊ธฐ

๊ฐ’ ์„œ๋น„์Šค๋งˆ๋‹ค? ํ™˜๊ฒฝ๋งˆ๋‹ค? ์–ด๋””์—
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 ๋งŒ




3-2. ๊ธฐ๋ณธ๊ฐ’์„ ๋ฐ•์ง€ ์•Š์Šต๋‹ˆ๋‹ค

# โ›” ์ด๋ ‡๊ฒŒ ์“ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค
password: ${SERVICE_DB_PASSWORD:1234}
host: ${DB_HOST:localhost}
ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ๋น ๋œจ๋ ค๋„ ๊ทธ๋ƒฅ ๋ถ™์–ด ๋ฒ„๋ฆผ
        โ”‚
        โ””โ”€โ”€ ๋ˆ„๋ฝ์ด ์˜์˜ ์•ˆ ๋“œ๋Ÿฌ๋‚จ
              EC2 ๋กœ ์˜ฎ๊ธธ ๋•Œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์•ˆ ๋„ฃ์€ ์‚ฌ๋žŒ์ด
              ์กฐ์šฉํžˆ ๋กœ์ปฌ DB ์— ๋ถ™๊ฒŒ ๋จ โ€” ๊ทธํŽธ์ด ๋” ๋‚˜์จ

ํ™˜๊ฒฝ๋ณ€์ˆ˜๊ฐ€ ์—†์œผ๋ฉด ๊ธฐ๋™์ด ์‹คํŒจํ•˜๋Š” ํŽธ์ด ๋‚ซ์Šต๋‹ˆ๋‹ค.

${CONFIG_HOST:localhost} ๋งŒ ์˜ˆ์™ธ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฑด ์ €์žฅ์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ ์„œ๋น„์Šค์˜ application.yml ์— ์žˆ๊ณ , ์„ค์ • ์„œ๋ฒ„ ์ฃผ์†Œ๋Š” ๋กœ์ปฌ์—์„œ ์–ธ์ œ๋‚˜ localhost:8888 ์ด๋ผ ๊ธฐ๋ณธ๊ฐ’์ด ์ •๋‹ต์ž…๋‹ˆ๋‹ค.




3-3. ๊ฐ’์ด ๋‹ค๋ฅธ ํ‚ค๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

# 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๊ณ„์ธต์˜ ๊ทธ ํ•œ ์ค„๋ฟ์ž…๋‹ˆ๋‹ค.




4. ๋น„๋ฐ€๊ฐ’์€ ์—ฌ๊ธฐ ๋‘์ง€ ์•Š์Šต๋‹ˆ๋‹ค

โš  paw-trail/config ๋Š” ๊ณต๊ฐœ ์ €์žฅ์†Œ์ž…๋‹ˆ๋‹ค.

๋น„๋ฐ€๋ฒˆํ˜ธ ยท ๊ฐœ์ธํ‚ค ยท API ์‹œํฌ๋ฆฟ
        โ”‚
        โ””โ”€โ”€ ์–ด๋А ๊ณ„์ธต์—๋„ ๋„ฃ์ง€ ์•Š์Œ
              ์ž๋ฆฌ๋งŒ ${ํ™˜๊ฒฝ๋ณ€์ˆ˜} ๋กœ ๋‚จ๊น€




4-1. ๋ฌด์—‡์ด ๊ฐˆ๋ฆฌ๋‚˜

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 ํ•œ ์ค„๋กœ ๋ฒ—๊ธฐ์ง€ ์•Š๋Š” ์ด์œ  โ€” ํ—ค๋”ยท๊ฐœํ–‰์„ ์†๋Œ€๋‹ค ํ•œ ๊ธ€์ž๋งŒ ํ‹€๋ ค๋„ "์„œ๋ช… ๊ฒ€์ฆ ์‹คํŒจ" ๋กœ๋งŒ ๋‚˜ํƒ€๋‚˜ ์›์ธ ์ถ”์ ์ด ๊ณ ์•ฝํ•ฉ๋‹ˆ๋‹ค.




4-2. ์‹ค์ˆ˜๋กœ ๋„ฃ์—ˆ๋‹ค๋ฉด

ํ•œ ๋ฒˆ ์ปค๋ฐ‹ํ•œ ๊ฐ’์€ ์ง€์›Œ๋„ ์ด๋ ฅ์— ๋‚จ์Œ
        โ”‚
        โ””โ”€โ”€ ๋˜๋Œ๋ฆฌ๋Š” ๊ฒƒ์œผ๋กœ ๋๋‚˜์ง€ ์•Š์Œ
              ๊ทธ ํ‚ค๋ฅผ ์ƒˆ๋กœ ๋ฐœ๊ธ‰ํ•ด์•ผ ํ•จ
๋ฌด์—‡ ์–ด๋–ป๊ฒŒ
DB ๋น„๋ฐ€๋ฒˆํ˜ธ infra/.env ๋ฅผ ๋ฐ”๊พธ๊ณ  DB ๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ฆ
RS256 ํ‚ค ์ƒˆ ์Œ์„ ๋งŒ๋“ค๊ณ  ๊ฐœ์ธํ‚คยท๊ณต๊ฐœํ‚ค๋ฅผ ํ•จ๊ป˜ ๊ต์ฒด โ€” gateway-server README 7-2
Gmail ์•ฑ ๋น„๋ฐ€๋ฒˆํ˜ธ ๊ตฌ๊ธ€ ๊ณ„์ •์—์„œ ํ๊ธฐํ•˜๊ณ  ์žฌ๋ฐœ๊ธ‰
๊ตฌ๊ธ€ ์‹œํฌ๋ฆฟ ํด๋ผ์šฐ๋“œ ์ฝ˜์†”์—์„œ ์žฌ๋ฐœ๊ธ‰




5. ์ƒˆ ์„œ๋น„์Šค ๋“ฑ๋กํ•˜๊ธฐ

์„œ๋น„์Šค๋ฅผ ๋งŒ๋“œ๋Š” ์‚ฌ๋žŒ์ด ์ด ์ €์žฅ์†Œ์—์„œ ํ•˜๋Š” ์ผ์€ ์ด๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค.

โ‘  config ์ €์žฅ์†Œ๋ฅผ clone            ์ฒ˜์Œ ํ•œ ๋ฒˆ
        โ”‚
        โ–ผ
โ‘ก <์„œ๋น„์Šค๋ช…>.yml ์„ ๋ฃจํŠธ์— ๋งŒ๋“ฆ      2๊ณ„์ธต
        โ”‚
        โ–ผ
โ‘ข gateway-server.yml ์— ๋ผ์šฐํŠธ ์ถ”๊ฐ€
        โ”‚
        โ–ผ
โ‘ฃ ์ธ์ฆ ์—†์ด ์—ด ๊ฒฝ๋กœ๊ฐ€ ์žˆ์œผ๋ฉด permit-all ์—๋„
        โ”‚
        โ–ผ
โ‘ค main ์— ์ปค๋ฐ‹ ยท push              ์ด์ŠˆยทPR ์—†์ด
        โ”‚
        โ–ผ
โ‘ฅ ํ™•์ธ   curl :8888/<์„œ๋น„์Šค๋ช…>/local




5-1. โ‘ก ์„œ๋น„์Šค ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

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: true

DB ๋ฅผ ์•ˆ ์“ฐ๋Š” ์„œ๋น„์Šค

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 ํƒ€๊นƒ๋„ ๊ฐ™์€ ๋ฒˆํ˜ธ๋ฅผ ์”๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋ฐ”๊พธ๋ฉด ๊ทธ ๋‘˜๋„ ํ•จ๊ป˜ ๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ฃผ์„์„ ๋‹ค๋Š” ํ˜•ํƒœ๋ฅผ ์ง€ํ‚ต๋‹ˆ๋‹ค. ํŒŒ์ผ ์ฒซ๋จธ๋ฆฌ์— ๊ณ„์ธต ยท ์„œ๋น„์Šค๋ช… ยท ๋‹ด๋‹น ยท ๊ฐ’์˜ ์ถœ์ฒ˜๋ฅผ ์ ์Šต๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ๋ณด๋Š” ์‚ฌ๋žŒ์ด "์ด ๊ฐ’์ด ์–ด๋””์„œ ์˜ค๋‚˜" ๋ฅผ ํŒŒ์ผ ์•ˆ์—์„œ ์•Œ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.




5-2. โ‘ข ๊ฒŒ์ดํŠธ์›จ์ด ๋ผ์šฐํŠธ

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-server README 3-2 ์ฐธ๊ณ .

YAML ์€ ๋“ค์—ฌ์“ฐ๊ธฐ๊ฐ€ ๊ณง ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. - id: ์•ž ๊ณต๋ฐฑ์ด ํ•œ ์นธ์ด๋ผ๋„ ๋‹ค๋ฅด๋ฉด ์˜ค๋ฅ˜ ์—†์ด ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค. ์œ„ ํ•ญ๋ชฉ์„ ๋ณต์‚ฌํ•ด ๊ฐ’๋งŒ ๋ฐ”๊พธ๋Š” ํŽธ์ด ์•ˆ์ „ํ•ฉ๋‹ˆ๋‹ค.




5-3. โ‘ฃ ์ธ์ฆ ์˜ˆ์™ธ

# 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 ์„ ์ •์˜ํ•ด ๊ณตํ†ต ๋ชจ๋“ˆ์˜ ๊ทœ์น™์ด ๋ฌผ๋Ÿฌ๋‚˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์„œ๋น„์Šค๋Š” ๊ฒŒ์ดํŠธ์›จ์ด ์ชฝ๋งŒ ์ ์œผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.




6. ๊ฐ’์ด ์–ธ์ œ ๋ฐ˜์˜๋˜๋‚˜

โ‘  config ์ €์žฅ์†Œ์— push
        โ”‚
        โ”‚  ์„ค์ • ์„œ๋ฒ„๋Š” ์š”์ฒญ์ด ์˜ฌ ๋•Œ๋งˆ๋‹ค GitHub ์„ ์ฝ์Œ
        โ”‚  *์žฌ์‹œ์ž‘์ด ํ•„์š” ์—†์Œ
        โ–ผ
โ‘ก ์ด๋ฏธ ๋–  ์žˆ๋Š” ์„œ๋น„์Šค์— ๋ฐ˜์˜ โ€” ๋‘˜ ์ค‘ ํ•˜๋‚˜
        โ”‚
        โ”œโ”€โ”€โ–ถ  POST /actuator/refresh        ์žฌ์‹œ์ž‘ ์—†์ด
        โ””โ”€โ”€โ–ถ  ์„œ๋น„์Šค ์žฌ๊ธฐ๋™
        โ”‚
        โ–ผ
โ‘ข ํ™•์ธ   curl :8888/<์„œ๋น„์Šค๋ช…>/local




6-1. ๋ฌด์—‡์ด refresh ๋กœ ๋˜๊ณ  ๋ฌด์—‡์ด ์•ˆ ๋˜๋‚˜

๋ฐ”๊พผ ๊ฒƒ ํ•„์š”ํ•œ ์ž‘์—…
config ์ €์žฅ์†Œ์˜ ๊ฐ’ push ํ•˜๋ฉด ๋. ์„ค์ • ์„œ๋ฒ„๋Š” ๊ทธ๋Œ€๋กœ
์ด๋ฏธ ๋–  ์žˆ๋Š” ์„œ๋น„์Šค POST /actuator/refresh ๋˜๋Š” ์žฌ๊ธฐ๋™
์„œ๋น„์Šค ์ €์žฅ์†Œ์˜ application.yml ์žฌ๋ฐฐํฌ
ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ปจํ…Œ์ด๋„ˆ ์žฌ์‹œ์ž‘
์•ก์ถ”์—์ดํ„ฐ ์—”๋“œํฌ์ธํŠธ ๋“ฑ๋ก ์žฌ๊ธฐ๋™ โ€” ๋“ฑ๋ก์€ ๊ธฐ๋™ ์‹œ์ ์— ์ผ์–ด๋‚จ
curl -X POST http://localhost:8084/actuator/refresh

๋ฐ”๋€ ํ‚ค ๋ชฉ๋ก์ด ๋ฐฐ์—ด๋กœ ๋Œ์•„์˜ต๋‹ˆ๋‹ค.

["app.datasource.host", "server.port"]

๋นˆ ๋ฐฐ์—ด์ด๋ฉด ์•„๋ฌด๊ฒƒ๋„ ์•ˆ ๋ฐ”๋€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. push ๋ฅผ ์•ˆ ํ–ˆ๊ฑฐ๋‚˜ ๊ฐ’์ด ๊ฐ™์Šต๋‹ˆ๋‹ค.




6-2. refresh ๊ฐ€ DataSource ๊นŒ์ง€ ๋‹ค์‹œ ๋งŒ๋“ญ๋‹ˆ๋‹ค

# 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 ๋ฅผ ๋ด…๋‹ˆ๋‹ค.




6-3. ํฌํŠธ๋กœ๋Š” ํŒ๋ณ„์ด ์•ˆ ๋˜๋Š” ์„œ๋น„์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค

์„œ๋น„์Šค ์„ค์ • ๋ฏธ์ˆ˜์‹  ํŒ๋ณ„
๋„๋ฉ”์ธ ์„œ๋น„์Šค ํฌํŠธ๊ฐ€ 8080 ์œผ๋กœ ๋œธ (์ •์ƒ ํฌํŠธ๊ฐ€ 8081~8095)
eureka-server ํฌํŠธ๊ฐ€ 8080 ์œผ๋กœ ๋œธ (์ •์ƒ 8761)
gateway-server โ›” ์ •์ƒ ํฌํŠธ๊ฐ€ 8080 ์ด๋ผ ํŒ๋ณ„ ๋ถˆ๊ฐ€

๊ฒŒ์ดํŠธ์›จ์ด๋Š” /actuator/gateway/routes ๊ฐ€ ๋น„์–ด ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€๋ ค๋ƒ…๋‹ˆ๋‹ค.

curl http://localhost:8080/actuator/gateway/routes




7. ๋ง‰ํžˆ๊ธฐ ์‰ฌ์šด ์ž๋ฆฌ




7-1. ๊ฐ’์ด ์•ˆ ๋‚ด๋ ค์˜ฌ ๋•Œ

์ฆ์ƒ ์›์ธ
ํฌํŠธ๊ฐ€ 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                     ์„œ๋น„์Šค๊ฐ€ ์‹ค์ œ๋กœ ๋“ค๊ณ  ์žˆ๋Š” ๊ฒƒ




7-2. YAML ์„ ๊ณ ์น  ๋•Œ

ํ•˜๋ ค๋Š” ๊ฒƒ ์ฃผ์˜
์ตœ์ƒ์œ„ ํ‚ค๋ฅผ ์ถ”๊ฐ€ ๊ฐ™์€ ํ‚ค๊ฐ€ ๋‘ ๋ฒˆ ๋‚˜์˜ค๋ฉด ์•ž์˜ ๋ธ”๋ก์ด ํ†ต์งธ๋กœ ๋ฌด์‹œ๋จ
๋ผ์šฐํŠธ ์ถ”๊ฐ€ - 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/local

500 ์ด ๋‚˜์˜ค๋ฉด YAML ์ด ๊นจ์ง„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.




7-3. ์ƒˆ ๊ฐ’์— ๊ฒ€์ฆ์„ ๋ถ™์ผ ๋•Œ

์„œ๋น„์Šค์˜ Properties ํด๋ž˜์Šค์— "๋น„๋ฉด ๊ธฐ๋™์„ ๋ง‰๋Š”" ๊ฒ€์ฆ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์„ธ ๊ณณ์„ ํ•จ๊ป˜ ๊ณ ์ณ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

config/<์„œ๋น„์Šค๋ช…>.yml                              ์‹ค์ œ ๊ฐ’
<์„œ๋น„์Šค>/src/test/resources/application.yml        ํ…Œ์ŠคํŠธ์šฉ ์‚ฌ๋ณธ   โ† ๋†“์น˜๊ธฐ ์‰ฌ์›€
<์„œ๋น„์Šค>์˜ Properties ํด๋ž˜์Šค                        ๊ฒ€์ฆ
ํ…Œ์ŠคํŠธ๋Š” spring.cloud.config.enabled: false ๋ผ
config ์ €์žฅ์†Œ ๊ฐ’์ด ํ•˜๋‚˜๋„ ์•ˆ ๋‚ด๋ ค์˜ด
        โ”‚
        โ””โ”€โ”€ config ์—๋งŒ ๋„ฃ๊ณ  ํ…Œ์ŠคํŠธ ๋ฆฌ์†Œ์Šค๋ฅผ ์•ˆ ๊ณ ์น˜๋ฉด
              contextLoads ๊ฐ€ ์‹คํŒจํ•ด ๋นŒ๋“œ๊ฐ€ ๊นจ์ง

์‹ค์ œ๋กœ ๊ฒช์—ˆ์Šต๋‹ˆ๋‹ค. app.jwt.claim.type ์„ ๋„ฃ์„ ๋•Œ authยท๊ฒŒ์ดํŠธ์›จ์ด ์–‘์ชฝ์—์„œ ํ…Œ์ŠคํŠธ ๋ฆฌ์†Œ์Šค๋ฅผ ๋น ๋œจ๋ ธ์Šต๋‹ˆ๋‹ค.




7-4. ์ˆœ์„œ๊ฐ€ ์ค‘์š”ํ•œ ๊ฒฝ์šฐ

์„œ๋น„์Šค์— ์ƒˆ ๊ฒ€์ฆ์ด ๋“ค์–ด๊ฐˆ ๋•Œ๋Š” config ๋ฅผ ๋จผ์ € ์˜ฌ๋ฆฝ๋‹ˆ๋‹ค.

โ‘  config ์ €์žฅ์†Œ์— ์ƒˆ ๊ฐ’ push
        โ”‚
        โ–ผ
โ‘ก docker compose restart config-server      (์ปจํ…Œ์ด๋„ˆ๋กœ ๋Œ ๋•Œ)
        โ”‚
        โ–ผ
โ‘ข ์„œ๋น„์Šค ๋ฐฐํฌ

โ‘ ์„ ์•ˆ ํ•˜๊ณ  โ‘ข์„ ํ•˜๋ฉด ์ƒˆ ๊ฒ€์ฆ์— ๊ฑธ๋ ค ๊ธฐ๋™์ด ๋ง‰ํž™๋‹ˆ๋‹ค. ์˜๋„ํ•œ ๋™์ž‘์ž…๋‹ˆ๋‹ค.




8. ์™œ ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์—ˆ๋‚˜




8-1. ์™œ ์ €์žฅ์†Œ๋ฅผ ๋”ฐ๋กœ ๋‘๋‚˜

๊ณ ๋ฆ„ ๋ฒ„๋ฆผ
config ์ €์žฅ์†Œ + ์„ค์ • ์„œ๋ฒ„ ๊ฐ ์„œ๋น„์Šค์˜ application.yml
๊ฐ’์„ ๋ฐ”๊พธ๋ฉด push ๋กœ ๋ ๋นŒ๋“œ โ†’ ์ด๋ฏธ์ง€ โ†’ ๋ฐฐํฌ ํ•œ ์‚ฌ์ดํด
๊ฐ’์ด ํ•œ ๊ณณ์— ๋ชจ์ž„ ์ €์žฅ์†Œ 17๊ณณ์— ํฉ์–ด์ง
ํ™˜๊ฒฝ๋ณ„ ์ฐจ์ด๊ฐ€ ํŒŒ์ผ๋กœ ๊ฐˆ๋ฆผ ์ฝ”๋“œ์— ๋ถ„๊ธฐ

๊ฒฐ์ •์ ์ธ ์ž๋ฆฌ๊ฐ€ ๋‘˜์ž…๋‹ˆ๋‹ค.

DB ์Šน๊ฒฉ        3๊ณ„์ธต์˜ app.datasource.host ํ•œ ์ค„ + refresh
                ์žฌ๋ฐฐํฌ ์—†์ด 14๊ฐœ ์„œ๋น„์Šค๊ฐ€ ์ƒˆ DB ๋ฅผ ๋ด„

๋ผ์šฐํŠธ ๊ฐœ๋ฐฉ     ์•ž์œผ๋กœ 14๋ฒˆ ์ผ์–ด๋‚จ
                ๊ฒŒ์ดํŠธ์›จ์ด ์ฝ”๋“œ์— ์žˆ์œผ๋ฉด ๊ทธ๋•Œ๋งˆ๋‹ค blue-green ๋ฐฐํฌ




8-2. ์™œ ๊ณต๊ฐœ ์ €์žฅ์†Œ์ธ๊ฐ€

์ „์ œ โ€” ์„ค์ • ์„œ๋ฒ„๋Š” ${...} ๋ฅผ ์น˜ํ™˜ํ•˜์ง€ ์•Š๊ณ  ๋ฌธ์ž์—ด ๊ทธ๋Œ€๋กœ ๋‚ด๋ ค๋ณด๋ƒ„
        โ”‚
        โ””โ”€โ”€ ๋น„๋ฐ€๊ฐ’์ด ์• ์ดˆ์— ์ด ์ €์žฅ์†Œ์— ์กด์žฌํ•˜์ง€ ์•Š์Œ
              ๊ฐ ์„œ๋น„์Šค๊ฐ€ ์ž๊ธฐ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ํ•ด์„ํ•จ

๊ณต๊ฐœ๋กœ ๋‘๋ฉด ์–ป๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์„ค์ • ์„œ๋ฒ„๊ฐ€ ์ธ์ฆ ์—†์ด ์ฝ์Œ private ์ด๋ฉด ํ† ํฐ์„ ์„ค์ • ์„œ๋ฒ„์— ๋„ฃ์–ด์•ผ ํ•จ
ํŒ€์›์ด ๋ฐ”๋กœ ๋ด„ ๊ถŒํ•œ ๊ด€๋ฆฌ๊ฐ€ ์—†์Œ
์‹ฌ์‚ฌ์—์„œ ๊ทธ๋Œ€๋กœ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ์Œ

โš  ๋Œ€์‹  ์‹ค์ˆ˜์˜ ๋Œ€๊ฐ€๊ฐ€ ํฝ๋‹ˆ๋‹ค. ํ•œ ๋ฒˆ ์ปค๋ฐ‹ํ•˜๋ฉด ์ง€์›Œ๋„ ์ด๋ ฅ์— ๋‚จ๊ณ  ํ‚ค๋ฅผ ์ƒˆ๋กœ ๋ฐœ๊ธ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.




8-3. ์™œ ๋ผ์šฐํŒ…์„ ์—ฌ๊ธฐ ๋‘๋‚˜

๊ฒŒ์ดํŠธ์›จ์ด ์ฝ”๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ config 2๊ณ„์ธต์— ์žˆ์Šต๋‹ˆ๋‹ค.

๋ผ์šฐํŠธ ๊ฐœ๋ฐฉ์ด ์•ž์œผ๋กœ 14๋ฒˆ ์ผ์–ด๋‚จ
        โ”‚
        โ”œโ”€โ”€ ์ฝ”๋“œ์— ์žˆ์œผ๋ฉด   ๋นŒ๋“œ โ†’ ์ด๋ฏธ์ง€ push โ†’ blue-green ๋ฐฐํฌ
        โ””โ”€โ”€ config ์— ์žˆ์œผ๋ฉด  push + /actuator/refresh
config yml ์ž๋ฐ” RouteLocator
์˜คํƒ€ ๊ฒ€์ฆ ์—†์Œ ์ปดํŒŒ์ผ
์˜คํƒ€ ์ฆ์ƒ 404 โ€” ์ฒซ ํ˜ธ์ถœ์—์„œ ๋“œ๋Ÿฌ๋‚จ โ€”
ํ™˜๊ฒฝ๋ณ„ ์ฐจ์ด 4๊ณ„์ธต์œผ๋กœ ์ฝ”๋“œ ๋ถ„๊ธฐ

๋Œ€๊ฐ€๋Š” ์˜ํ–ฅ ๋ฒ”์œ„์ž…๋‹ˆ๋‹ค. ์ง€๊ธˆ config ์˜คํƒ€๋Š” "๊ทธ ์„œ๋น„์Šค ํ•˜๋‚˜" ๊ฐ€ ํฌํŠธ๋ฅผ ๋ชป ์žก๋Š” ์ •๋„์ธ๋ฐ, ๋ผ์šฐํŠธ๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ์˜คํƒ€ ํ•˜๋‚˜๋กœ ํŠน์ • API ์ „์ฒด๊ฐ€ 404 ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.




8-4. ์™œ config-server.yml ์ด ์—†๋‚˜

config-server ๋งŒ ๋‹ญ-๋‹ฌ๊ฑ€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Œ
        โ”‚
        โ””โ”€โ”€ ์ €์žฅ์†Œ ์ฃผ์†Œ๋ฅผ ์•Œ์•„์•ผ ์ €์žฅ์†Œ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Œ
              ๊ทธ ๊ฐ’์„ ์ €์žฅ์†Œ์—์„œ ๋ฐ›์„ ์ˆ˜ ์—†์Œ

๊ทธ๋ž˜์„œ ์„ค์ • ์„œ๋ฒ„๋Š” ์ž๊ธฐ ์ €์žฅ์†Œ ์•ˆ์— ์„ค์ •์„ ๋‘ก๋‹ˆ๋‹ค.

์˜ˆ์™ธ๋ฅผ ๊ทธ๊ฒƒ ํ•˜๋‚˜๋กœ ์ค„์ธ ๊ฒƒ์ด ์ด๋“์ž…๋‹ˆ๋‹ค. ๊ฒŒ์ดํŠธ์›จ์ดยท์œ ๋ ˆ์นด๋Š” ๊ทธ ๋ฌธ์ œ๊ฐ€ ์—†์–ด ์—ฌ๊ธฐ์„œ ๋ฐ›์Šต๋‹ˆ๋‹ค.

์ปจํ…Œ์ด๋„ˆ๋กœ ๋„์šธ ๋•Œ config-server ๋งŒ ์ฃผ์†Œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ง์ ‘ ๋ฐ›์Šต๋‹ˆ๋‹ค. EUREKA_HOST ยท LOKI_HOST ์ธ๋ฐ, dev ํ”„๋กœํŒŒ์ผ์ด ์ฃผ์†Œ๋ฅผ ๋ฐ”๊ฟ” ์ฃผ๋Š” ๊ฒฝ๋กœ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋น ๋œจ๋ฆฌ๋ฉด localhost ๋กœ ๋‚จ๋Š”๋ฐ ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ๊ทธ๊ฒƒ์€ ์ž๊ธฐ ์ž์‹ ์ด๋ผ ์œ ๋ ˆ์นด ๋“ฑ๋ก์ด ์˜์˜ ์‹คํŒจํ•˜๊ณ , ๋“ฑ๋ก ์‹คํŒจ๊ฐ€ ๊ธฐ๋™์„ ๋ง‰์ง€ ์•Š์•„ ์œ ๋ ˆ์นด ํ™”๋ฉด์— ์•ˆ ๋ณด์ด๋Š” ๊ฒƒ์œผ๋กœ ์•Œ์•„์ฐจ๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.




8-5. ์™œ main ์— ์ง์ ‘ ์ปค๋ฐ‹ํ•˜๋‚˜

์ด ์ €์žฅ์†Œ์—๋Š”
        ์ฝ”๋“œ๊ฐ€ ์—†์Œ         ๋นŒ๋“œ๋„ CI ๋„ ์—†์Œ
        ๋ฆฌ๋ทฐํ•  ๊ฒƒ์ด ์—†์Œ     YAML 23๊ฐœ
        ์„ค์ • ์„œ๋ฒ„๊ฐ€ main ์„ ์ฝ์Œ

์ด์ŠˆยทPRยท๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค๋ฉด ์–ป๋Š” ๊ฒƒ ์—†์ด ๋‹จ๊ณ„๋งŒ ๋Š˜์–ด๋‚ฉ๋‹ˆ๋‹ค.

๋„๋ฉ”์ธ ์„œ๋น„์Šค๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊ฑฐ๊ธฐ๋Š” 1์ด์Šˆ-1๋ธŒ๋žœ์น˜-1PR ์ด๊ณ  CodeRabbit ๋ฆฌ๋ทฐ๊ฐ€ ๋ถ™์Šต๋‹ˆ๋‹ค.




9. ์•„์ง ์•ˆ ํ•œ ๊ฒƒ




9-1. prod ๊ฐ€ ๊ฑฐ์˜ ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค

# 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 ์ค‘๋ณต ํ‚ค๊ฐ€ ๋˜๋ฉด ์•ž์˜ ๋ธ”๋ก์ด ํ†ต์งธ๋กœ ๋ฌด์‹œ๋จ
              ์ง€๊ธˆ์€ ํ•˜๋‚˜์˜ ํŠธ๋ฆฌ๋กœ ์ด์–ด ๋‘์—ˆ์œผ๋ฏ€๋กœ ๋ธ”๋ก์งธ ์ฃผ์„๋งŒ ํ’€๋ฉด ๋จ




9-2. ์‹œ์ ์ด ์ •ํ•ด์ง„ ๊ฒƒ

์–ธ์ œ ๋ฌด์—‡
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 ํ™˜๊ฒฝ๋ณ€์ˆ˜)์™€ ๊ณต๊ฐœํ‚ค(์—ฌ๊ธฐ)๋ฅผ ํ•จ๊ป˜ ๋ฐ”๊ฟ”์•ผ ํ•ฉ๋‹ˆ๋‹ค.




9-3. ํŒ๋‹จ๋งŒ ๋‚จ์€ ๊ฒƒ

๋ฌด์—‡ ์ƒํƒœ
4๊ณ„์ธต์„ ๋” ์“ธ์ง€ ์ง€๊ธˆ ์œ ๋ ˆ์นด ๋‘˜๋ฟ. ๋˜๋„๋ก ๋น„์›Œ ๋‘๋Š” ๊ฒƒ์ด ๋ฐฉ์นจ
prod ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฒ€์ฆํ• ์ง€ EC2 ๊ฐ€ ์„œ๊ธฐ ์ „์—๋Š” ํ™•์ธํ•  ๋ฐฉ๋ฒ•์ด ์—†์Œ
์กฐ์ง ์ „์šฉ BOM Boot ๋ฒ„์ „์ด 21๊ฐœ ๋ ˆํฌ์— ์‚ฌ๋ณธ์œผ๋กœ ์žˆ์Œ




10. ์šฉ์–ด

๊ณตํ†ต ์šฉ์–ด๋Š” 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 ๊ฐ€ ๋ฒˆํ˜ธ ์ˆœ์„œ๋ฅผ ๊ฑด๋„ˆ๋›ด ์Šคํฌ๋ฆฝํŠธ๋„ ์‹คํ–‰ํ•˜๊ฒŒ ํ•˜๋Š” ์˜ต์…˜. ๊ณตํ†ต ๋Œ€์—ญ ๋•Œ๋ฌธ์— ์ผœ ๋‘ 

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors