Skip to content

Latest commit

ย 

History

1,345 Commits

Folders and files

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

Repository files navigation

BURTY

๊ธˆ์œต ๋งˆ์ด๋ฐ์ดํ„ฐ์™€ ์˜คํ”ˆ๋ฑ…ํ‚น์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๊ฐœ์ธ ์ž์‚ฐ๊ด€๋ฆฌ ์„œ๋น„์Šค. ์‹œ๋‹ˆ์–ด ์‚ฌ์šฉ์ž์™€ ๋ณดํ˜ธ์ž๋ฅผ ํ•จ๊ป˜ ๊ณ ๋ คํ•œ ๊ฐ€์กฑ ๋ณดํ˜ธ ๊ธฐ๋Šฅ์ด ํ•ต์‹ฌ ์ถ•์ด๋‹ค.

์Šคํƒ Java 21 ยท Spring Boot 4 ยท MariaDB ยท Redis ยท Gradle
์•„ํ‚คํ…์ฒ˜ ํ—ฅ์‚ฌ๊ณ ๋‚  (adapter.in / application.port / application.service / domain / adapter.out)
๊ทœ๋ชจ ํ”„๋กœ๋•์…˜ ์•ฝ 640 ํŒŒ์ผ ยท ์—”๋“œํฌ์ธํŠธ 150+ ยท ์—”ํ‹ฐํ‹ฐ 50
๊ด€์ธก์„ฑ Prometheus ยท Loki ยท Grafana ยท OpenTelemetry

์ด ํ”„๋กœ์ ํŠธ์—์„œ ๋‹ค๋ฃฌ ๋ฌธ์ œ

๊ฐ€๊ณ„๋ถ€ ์•ฑ์ด ์•„๋‹ˆ๋ผ ๋ˆ์„ ์‹ค์ œ๋กœ ์›€์ง์ด๋Š” ์‹œ์Šคํ…œ์ด๋‹ค. ๊ทธ๋ž˜์„œ ๊ธฐ๋Šฅ ๋ชฉ๋ก๋ณด๋‹ค ์•„๋ž˜ ์งˆ๋ฌธ๋“ค์— ์–ด๋–ป๊ฒŒ ๋‹ตํ–ˆ๋Š”์ง€๊ฐ€ ์ค‘์š”ํ•˜๋‹ค.

์€ํ–‰์— ์ด์ฒด๋ฅผ ์š”์ฒญํ–ˆ๋Š”๋ฐ ์‘๋‹ต์ด ์˜ค์ง€ ์•Š์œผ๋ฉด, ๊ทธ ๊ฑด์€ ์„ฑ๊ณต์ธ๊ฐ€ ์‹คํŒจ์ธ๊ฐ€?

์ •๋‹ต์€ "๋‘˜ ๋‹ค ์•„๋‹ˆ๋‹ค"์ด๋‹ค. ์ด ๊ตฌ๋ถ„์„ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ด ํ”„๋กœ์ ํŠธ์˜ ์ค‘์‹ฌ ์ฃผ์ œ๋‹ค.

1. ์ด์ฒด ๊ฒฐ๊ณผ๊ฐ€ ๋ถˆํ™•์‹คํ•  ๋•Œ

ํƒ€์ž„์•„์›ƒ์ด๋‚˜ 5xx๋Š” ์š”์ฒญ์ด ์€ํ–‰์— ๋„๋‹ฌํ–ˆ๋Š”์ง€์กฐ์ฐจ ์•Œ ์ˆ˜ ์—†๋Š” ์ƒํƒœ๋‹ค. ์ด๊ฑธ ์‹คํŒจ๋กœ ํ™•์ •ํ•˜๋ฉด, ์‹ค์ œ๋กœ๋Š” ์ถœ๊ธˆ๋œ ๊ฑด์„ ์‚ฌ์šฉ์ž๊ฐ€ ์žฌ์‹œ๋„ํ•ด ์ด์ค‘ ์ถœ๊ธˆ์ด ๋ฐœ์ƒํ•œ๋‹ค.

์„ฑ๊ณต          โ†’ EXECUTED
๋ช…ํ™•ํ•œ ๊ฑฐ์ ˆ    โ†’ FAILED   + ํ•œ๋„ ๋ณต๊ตฌ
์‘๋‹ต ํ™•์ธ ๋ถˆ๊ฐ€ โ†’ UNKNOWN  + ํ•œ๋„ ์œ ์ง€ + ์ •์‚ฐ ๋Œ€์ƒ ๋“ฑ๋ก

UNKNOWN ๊ฑด์€ TransferReconciliationBatch๊ฐ€ ์€ํ–‰์— ์žฌ์กฐํšŒํ•ด ํ™•์ •ํ•œ๋‹ค. ๋ฏธ์ถœ๊ธˆ์ด ํ™•์ธ๋์„ ๋•Œ๋งŒ ํ•œ๋„๋ฅผ ๋˜๋Œ๋ฆฐ๋‹ค. ์ž๋™์œผ๋กœ ํ’€๋ฆฌ์ง€ ์•Š๋Š” ๊ฑด์€ ์šด์˜ API๋กœ ๋‹ด๋‹น์ž๊ฐ€ ์€ํ–‰ ์›์žฅ๊ณผ ๋Œ€์กฐํ•ด ํ™•์ •ํ•˜๋ฉฐ, ๊ทธ ํ–‰์œ„ ์ž์ฒด๊ฐ€ ๊ฐ์‚ฌ ๋กœ๊ทธ์— ๋‚จ๋Š”๋‹ค.

2. ์™ธ๋ถ€ ํ˜ธ์ถœ์„ ํŠธ๋žœ์žญ์…˜์— ๋„ฃ์ง€ ์•Š๊ธฐ

TransferService์—๋Š” @Transactional์ด ์—†๋‹ค. ์˜๋„์ ์ด๋‹ค. ์€ํ–‰ ํ˜ธ์ถœ์„ DB ํŠธ๋žœ์žญ์…˜ ์•ˆ์— ๋„ฃ์œผ๋ฉด

  • ๋„คํŠธ์›Œํฌ ์™•๋ณต ๋‚ด๋‚ด ์ปค๋„ฅ์…˜์„ ์ ์œ ํ•˜๊ณ ,
  • ์‹คํŒจ ์‹œ ๋กค๋ฐฑ๋˜์–ด ์‹คํŒจ ๊ธฐ๋ก์กฐ์ฐจ ๋‚จ์ง€ ์•Š์œผ๋ฉฐ,
  • ์€ํ–‰ ํ˜ธ์ถœ ์„ฑ๊ณต ํ›„ ์ปค๋ฐ‹์ด ์‹คํŒจํ•˜๋ฉด ๋ˆ์€ ๋‚˜๊ฐ”๋Š”๋ฐ ๊ธฐ๋ก์ด ์—†๋‹ค.

์ƒํƒœ ์ „์ด๋Š” TransferOrderWriter๊ฐ€ REQUIRES_NEW๋กœ ๋…๋ฆฝ ์ปค๋ฐ‹ํ•˜๊ณ , ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ดํ„ฐ๋Š” ์ˆœ์„œ๋งŒ ์กฐ์œจํ•œ๋‹ค.

3. ๋ฉฑ๋“ฑ์„ฑ์€ DB๊ฐ€ ํŒ์ •ํ•œ๋‹ค

"์กฐํšŒํ•ด์„œ ์—†์œผ๋ฉด ์‹คํ–‰"์€ ๋ฉฑ๋“ฑ์ด ์•„๋‹ˆ๋‹ค. ๋™์‹œ ์š”์ฒญ ๋‘˜์ด ๋ชจ๋‘ ์กฐํšŒ์—์„œ empty๋ฅผ ๋ฐ›์œผ๋ฉด ๋‘˜ ๋‹ค ์‹คํ–‰๋œ๋‹ค. ๋Œ€์‹  (user_id, idempotency_key) ์œ ๋‹ˆํฌ ์ œ์•ฝ ์œ„๋ฐ˜์„ ์‹ ํ˜ธ๋กœ ์‚ผ์•„ INSERT๋กœ ์„ ์ ํ•œ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ ˆ๋ฒจ ๊ฒฝ์Ÿ ๊ตฌ๊ฐ„์ด ์—†๋‹ค.

์€ํ–‰์— ๋ณด๋‚ด๋Š” ๊ฑฐ๋ž˜๊ณ ์œ ๋ฒˆํ˜ธ๋„ ๋ฉฑ๋“ฑํ‚ค์—์„œ ๊ฒฐ์ •๋ก ์ ์œผ๋กœ ๋„์ถœํ•œ๋‹ค. ์žฌ์‹œ๋„๋งˆ๋‹ค ๋‚œ์ˆ˜๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค๋ฉด ์€ํ–‰ ์ชฝ ์ค‘๋ณต ๋ฐฉ์ง€๊ฐ€ ๋ฌด๋ ฅํ•ด์ง„๋‹ค.

4. ํ•œ๋„ ๊ฒ€์‚ฌ์—์„œ ๋ฐฐ์šด ๊ฒƒ

์ผ์ผ ์ด์ฒด ํ•œ๋„๋Š” ์„ธ ๋ฒˆ ๊ฐˆ์•„์—Ž์—ˆ๋‹ค.

์‹œ๋„ ๊ฒฐ๊ณผ
์กฐ๊ฑด๋ถ€ UPDATE ... WHERE total + ? <= limit ๋™์‹œ์„ฑ ํ…Œ์ŠคํŠธ์—์„œ ํ•œ๋„ 10๊ฑด์— 14๊ฑด ํ†ต๊ณผ
SELECT ... FOR UPDATE ์—ฌ์ „ํžˆ 12๊ฑด ํ†ต๊ณผ (์—”์ง„ MVCC ๊ตฌํ˜„ ์˜์กด)
@Version ๋‚™๊ด€์  ์ž ๊ธˆ + ํŠธ๋žœ์žญ์…˜ ๋ฐ– ์žฌ์‹œ๋„ ํ†ต๊ณผ

JPA์˜ @Version์€ UPDATE์˜ WHERE์— ๋ฒ„์ „์„ ๋„ฃ๊ณ  ์˜ํ–ฅ ํ–‰ ์ˆ˜๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ, DB ์—”์ง„์˜ ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ ๊ตฌํ˜„๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ lost update๋ฅผ ์žก์•„๋‚ธ๋‹ค. ๋ˆ์ด ๊ฑธ๋ฆฐ ๊ฒ€์‚ฌ๋ฅผ ์—”์ง„ ๋™์ž‘ ์ฐจ์ด์— ๋งก๊ธธ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด ์ด ๊ณผ์ •์—์„œ ์–ป์€ ๊ฒฐ๋ก ์ด๋‹ค.

5. ๋ถ€์ˆ˜ํšจ๊ณผ๋Š” ์•„์›ƒ๋ฐ•์Šค๋กœ

์ด์ฒด ์™„๋ฃŒ ์•Œ๋ฆผ์„ ์ปค๋ฐ‹ ์‹œ์ ์— ์ง์ ‘ ๋ณด๋‚ด๋ฉด, ์ปค๋ฐ‹์€ ๋๋Š”๋ฐ ๋ฐœ์†ก์ด ์‹คํŒจํ•˜๊ฑฐ๋‚˜(์œ ์‹ค) ๋ฐœ์†ก์€ ๋๋Š”๋ฐ ๋กค๋ฐฑ๋˜๋Š”(์œ ๋ น ์•Œ๋ฆผ) dual-write ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค.

OutboxPublisher๋Š” MANDATORY ์ „ํŒŒ๋กœ ์„ ์–ธ๋˜์–ด ํŠธ๋žœ์žญ์…˜ ์—†์ด ํ˜ธ์ถœํ•˜๋ฉด ์˜ˆ์™ธ๊ฐ€ ๋‚œ๋‹ค. ์›์ž์„ฑ ๋ณด์žฅ์ด ์กฐ์šฉํžˆ ๊นจ์ง€๋Š” ์ผ์ด ์—†๋‹ค. OutboxRelay๊ฐ€ ์ปค๋ฐ‹ ์ดํ›„ ๊บผ๋‚ด ๋ฐœ์†กํ•˜๊ณ , ์‹คํŒจ๋Š” ์ง€์ˆ˜ ๋ฐฑ์˜คํ”„๋กœ ์žฌ์‹œ๋„ํ•˜๋‹ค๊ฐ€ ์†Œ์ง„๋˜๋ฉด DEAD๋กœ ๊ฒฉ๋ฆฌํ•œ๋‹ค. ์กฐ์šฉํžˆ ACKํ•˜๊ณ  ๋ฒ„๋ฆฌ์ง€ ์•Š๋Š”๋‹ค.

6. ์‚ฌํ›„ ํ†ต์ง€๊ฐ€ ์•„๋‹ˆ๋ผ ์ฐจ๋‹จ

๊ฐ€์กฑ ๋ณดํ˜ธ ๊ธฐ๋Šฅ์—์„œ "์ด์ƒ ์ด์ฒด๋ฅผ ์•Œ๋ฆฐ๋‹ค"๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ํ”ผํ•ด๋ฅผ ๋ง‰์ง€ ๋ชปํ•œ๋‹ค. ์•Œ๋ฆผ์ด ๊ฐ”์„ ๋•Œ๋Š” ์ด๋ฏธ ์ถœ๊ธˆ์ด ๋๋‚œ ๋’ค๋‹ค.

VIEW_ALERT_AND_APPROVE ๊ถŒํ•œ์„ ๊ฐ€์ง„ ๋ณดํ˜ธ์ž๊ฐ€ ์žˆ์œผ๋ฉด, ์ž„๊ณ„ ๊ธˆ์•ก ์ด์ƒ์˜ ์ด์ฒด๋Š” ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ๋ณด๋ฅ˜๋œ๋‹ค. ๋ณดํ˜ธ์ž๊ฐ€ ์Šน์ธํ•ด์•ผ ์‹คํ–‰๋˜๊ณ , ๊ฑฐ์ ˆํ•˜๊ฑฐ๋‚˜ ๊ธฐํ•œ์ด ์ง€๋‚˜๋ฉด ์ทจ์†Œ๋œ๋‹ค. ์Šน์ธ์€ "์‹คํ–‰ํ•ด๋„ ์ข‹๋‹ค"๋Š” ํ—ˆ๊ฐ€์ผ ๋ฟ ํ”ผ๋ณดํ˜ธ์ž์˜ ์ƒ์ฒด์ธ์ฆ์„ ๋Œ€์ฒดํ•˜์ง€ ์•Š๋Š”๋‹ค.

7. ๊ฐœ์ธ์ •๋ณด๋Š” ์ฆ‰์‹œ ํŒŒ๊ธฐ์™€ ๋ฒ•์ • ๋ณด์กด์œผ๋กœ ๋‚˜๋‰œ๋‹ค

ํƒˆํ‡ด ์‹œ "์ „๋ถ€ ์ฆ‰์‹œ ์‚ญ์ œ"๋Š” ์ „์ž๊ธˆ์œต๊ฑฐ๋ž˜๋ฒ• ์œ„๋ฐ˜์ด๊ณ , "์•„๋ฌด๊ฒƒ๋„ ์•ˆ ์ง€์›€"์€ ๊ฐœ์ธ์ •๋ณด๋ณดํ˜ธ๋ฒ• ์œ„๋ฐ˜์ด๋‹ค. ์–ด๋А ์ชฝ์ธ์ง€ ์ฝ”๋“œ๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ๋งํ•ด์•ผ ํ•œ๋‹ค.

์ฆ‰์‹œ ๋ณด์กด ํ›„ ํŒŒ๊ธฐ
CIยท์ „ํ™”๋ฒˆํ˜ธยท์ด๋ฆ„ยท์ƒ๋…„์›”์ผ ์ต๋ช…ํ™” ์ „์ž๊ธˆ์œต๊ฑฐ๋ž˜ ๊ธฐ๋ก (๊ธฐ๋ณธ 5๋…„)
์„ธ์…˜ยท๊ธฐ๊ธฐยท์ƒ์ฒด์ธ์ฆยท์†Œ์…œ ์—ฐ๋™ ํ๊ธฐ ๊ฐ์‚ฌ ๋กœ๊ทธ (ํ•ด์‹œ ์ฒด์ธ ๋ฌด๊ฒฐ์„ฑ ์œ ์ง€)
๋งˆ์ด๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ ๊ณ„์ขŒ ๋ฐ์ดํ„ฐ ํŒŒ๊ธฐ

tbl_data_erasure_request๊ฐ€ "์–ธ์ œ ๋ฌด์—‡์„ ์ง€์› ๊ณ  ๋ฌด์—‡์ด ์–ธ์ œ๊นŒ์ง€ ๋‚จ๋Š”์ง€"๋ฅผ ๊ธฐ๋กํ•˜๋ฉฐ, ์ด ๊ธฐ๋ก ์ž์ฒด๊ฐ€ ์ฒ˜๋ฆฌ ์ฆ๋น™์ด ๋œ๋‹ค.

8. ๊ฐ์‚ฌ ๋กœ๊ทธ๋Š” ์ง€์šธ ์ˆ˜ ์žˆ์œผ๋ฉด ๊ฐ์‚ฌ ๋กœ๊ทธ๊ฐ€ ์•„๋‹ˆ๋‹ค

๊ฐ ํ–‰์ด ์ง์ „ ํ–‰์˜ SHA-256 ํ•ด์‹œ๋ฅผ ํ’ˆ๋Š”๋‹ค. ์ค‘๊ฐ„ ํ–‰์„ ๊ณ ์น˜๊ฑฐ๋‚˜ ์ง€์šฐ๋ฉด ์ดํ›„ ์ฒด์ธ์ด ์ „๋ถ€ ์–ด๊ธ‹๋‚˜ ์ผ์ผ ๊ฒ€์ฆ์—์„œ ๋“œ๋Ÿฌ๋‚œ๋‹ค.


์‹คํ–‰

# ๋กœ์ปฌ ์ „์ฒด ์Šคํƒ (์•ฑ + MariaDB + Redis + ๊ด€์ธก์„ฑ)
docker network create global-nginx 2>/dev/null || true
cp .env.example .env      # ๊ฐ’ ์ฑ„์šฐ๊ธฐ
docker compose -f docker-compose.yml -f docker-compose.local.yml up -d --build
API http://localhost:8080/health
Swagger http://localhost:8080/api/v1/swagger-ui.html (dev๋งŒ)
Grafana http://localhost:3001
Prometheus http://localhost:9090
./gradlew check     # Spotless + ํ…Œ์ŠคํŠธ + ์ปค๋ฒ„๋ฆฌ์ง€ ๊ฒŒ์ดํŠธ
./gradlew test      # ํ…Œ์ŠคํŠธ๋งŒ

์Šคํ‚ค๋งˆ

Flyway๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. V3__fresh_install_baseline.sql์ด ์ „์ฒด ์Šคํ‚ค๋งˆ๋ฅผ ๋งŒ๋“ค๊ณ  ์ดํ›„ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ๋ณ€๊ฒฝ์„ ์Œ“๋Š”๋‹ค. ๋ชจ๋“  ๋ฌธ์žฅ์ด IF NOT EXISTS์ด๊ณ  ์ œ์•ฝ์ด CREATE TABLE ์•ˆ์— ์ธ๋ผ์ธ๋˜์–ด ์žˆ์–ด, ํ…Œ์ด๋ธ”์ด ์ด๋ฏธ ์žˆ๋Š” ๊ธฐ์กด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ๋Š” ๋ฒ ์ด์Šค๋ผ์ธ ์ „์ฒด๊ฐ€ no-op์ด๋‹ค.

๋ฒ ์ด์Šค๋ผ์ธ์€ ์†์œผ๋กœ ๊ณ ์น˜์ง€ ์•Š๋Š”๋‹ค. ์—”ํ‹ฐํ‹ฐ์—์„œ ์žฌ์ƒ์„ฑํ•œ๋‹ค.

./gradlew schemaDump && python3 tools/generate_baseline.py

ํ…Œ์ŠคํŠธ ์ „๋žต

์šด์˜๊ณผ ๊ฐ™์€ DB ์—”์ง„ ์œ„์—์„œ Flyway ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ ์šฉํ•œ ๋’ค ddl-auto=validate๋กœ ๊ฒ€์ฆํ•œ๋‹ค. ์—”ํ‹ฐํ‹ฐ์™€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด ์–ด๊ธ‹๋‚˜๋ฉด ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•œ๋‹ค.

Docker ์žˆ์Œ โ†’ MariaDB ์ปจํ…Œ์ด๋„ˆ + Flyway + validate   (CI)
Docker ์—†์Œ โ†’ H2(MariaDB ๋ชจ๋“œ) + create-drop ์œผ๋กœ ๊ฐ•๋“ฑ (๋กœ์ปฌ ํŽธ์˜)

ํ…Œ์ŠคํŠธ๊ฐ€ ์ •์ƒ ๊ฒฝ๋กœ๋ณด๋‹ค ์‹คํŒจ ๊ฒฝ๋กœ์— ์ง‘์ค‘๋˜์–ด ์žˆ๋‹ค. ์ •์ƒ ๊ฒฝ๋กœ๋Š” ์›๋ž˜๋„ ๋™์ž‘ํ–ˆ๊ณ , ๋ˆ์ด ์ƒˆ๋Š” ๊ณณ์€ ์‹คํŒจ ๊ฒฝ๋กœ์˜€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋Œ€์ƒ ๊ฒ€์ฆ ๋‚ด์šฉ
TransferServiceIdempotencyTests ์žฌ์š”์ฒญยท์ƒ์ฒด์ธ์ฆ ์‹คํŒจยทํ•œ๋„ ์ดˆ๊ณผยท์‘๋‹ต ๋ถˆ๋ช… ์‹œ ์ƒํƒœ์™€ ํ•œ๋„
TransferLimitGuardConcurrencyTests 40์Šค๋ ˆ๋“œ ๋™์‹œ ์š”์ฒญ์—์„œ ํ•œ๋„ ์ดˆ๊ณผ ๋ถˆ๊ฐ€
TransferReconciliationTests ์ •์‚ฐ ํ™•์ •ยท๋ฏธ์ถœ๊ธˆ ์‹œ์—๋งŒ ํ•œ๋„ ๋ณต๊ตฌ
OutboxRelayTests ์žฌ์‹œ๋„ยทDEAD ๊ฒฉ๋ฆฌยท๊ฒฉ๋ฆฌ ํ›„ ๋ฆด๋ ˆ์ด ์ฐจ๋‹จ ์—†์Œ
UserWithdrawalTests ๋ฌด์—‡์ด ์ง€์›Œ์ง€๊ณ  ๋ฌด์—‡์ด ๋‚จ๋Š”์ง€
FieldEncryptorTests ํ‚ค ๋ถˆ์ผ์น˜ยท๋ณ€์กฐ ์‹œ ์˜ˆ์™ธ, ๋ ˆ๊ฑฐ์‹œ ํฌ๋งท ํ˜ธํ™˜
EnumColumnWidthTests enum ์ƒ์ˆ˜๊ฐ€ ์ปฌ๋Ÿผ ๊ธธ์ด๋ฅผ ๋„˜์ง€ ์•Š๋Š”์ง€ (DB ์—†์ด)
SchemaMigrationDriftTests ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ ์šฉ ์—ฌ๋ถ€ยท์ œ์•ฝ ์กด์žฌ (MariaDB ์ „์šฉ)

์ปค๋ฒ„๋ฆฌ์ง€ ๊ฒŒ์ดํŠธ๋Š” ์ „์ฒด 33%, ๋ˆ ๊ด€๋ จ ํด๋ž˜์Šค(TransferService, TransferLimitGuard, FieldEncryptor)๋Š” 70%๋กœ CI์—์„œ ๊ฐ•์ œํ•œ๋‹ค.


์šด์˜

๋ฐฐ์น˜๋Š” ์ „๋ถ€ ShedLock์œผ๋กœ ๋ณดํ˜ธ๋˜์–ด ์ธ์Šคํ„ด์Šค๊ฐ€ ์—ฌ๋Ÿฌ ๋Œ€์—ฌ๋„ ํ•œ ๋ฒˆ๋งŒ ๋ˆ๋‹ค. ์Šค์ผ€์ค„ ์ง„์ž…์ ๊ณผ ์‹ค์ œ ๋กœ์ง์„ ๋ถ„๋ฆฌํ•ด ๋‘์–ด(relay() / relayOnce()) ํ…Œ์ŠคํŠธ์—์„œ ๋ฝ ์ธํ”„๋ผ ์—†์ด ๋กœ์ง์„ ์ง์ ‘ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฐฐ์น˜ ์ฃผ๊ธฐ ์—ญํ• 
์•„์›ƒ๋ฐ•์Šค ๋ฆด๋ ˆ์ด 1์ดˆ ์ด๋ฒคํŠธ ๋ฐœํ–‰ยท์žฌ์‹œ๋„ยทDEAD ๊ฒฉ๋ฆฌ
์ด์ฒด ์ •์‚ฐ 30์ดˆ ๋ฏธ๊ฒฐ ์ด์ฒด๋ฅผ ์€ํ–‰์— ์žฌ์กฐํšŒํ•ด ํ™•์ •
๋ณดํ˜ธ์ž ์Šน์ธ ๋งŒ๋ฃŒ 1๋ถ„ ๊ธฐํ•œ ์ง€๋‚œ ์Šน์ธ ์š”์ฒญยท์ฃผ๋ฌธ ์ทจ์†Œ
๋งˆ์ด๋ฐ์ดํ„ฐ ํ† ํฐ ๊ฐฑ์‹  15๋ถ„ ๋งŒ๋ฃŒ ์ž„๋ฐ• ํ† ํฐ ๊ฐฑ์‹ 
๋™์˜ ๋งŒ๋ฃŒ ์ฒ˜๋ฆฌ 1์‹œ๊ฐ„ ์ˆ˜์ง‘ ์ค‘๋‹จ + ๋ฐ์ดํ„ฐ ํŒŒ๊ธฐ, 7์ผ ์ „ ์˜ˆ๊ณ 
๊ฑฐ๋ž˜ ๋™๊ธฐํ™” ๋งค์ผ 04์‹œ ์˜คํ”ˆ๋ฑ…ํ‚น ๊ฑฐ๋ž˜๋‚ด์—ญ ์ ์žฌ
๊ฐ์‚ฌ ์ฒด์ธ ๊ฒ€์ฆ ๋งค์ผ 04:30 ํ•ด์‹œ ์ฒด์ธ ๋ฌด๊ฒฐ์„ฑ
๋ณด์กด๊ธฐ๊ฐ„ ๋งŒ๋ฃŒ ํŒŒ๊ธฐ ๋งค์ผ 03์‹œ ๋ฒ•์ • ๋ณด์กด๊ธฐ๊ฐ„ ๊ฒฝ๊ณผ๋ถ„ ํŒŒ๊ธฐ

์•Œ๋žŒ์€ infra/observability/alert-rules.yml์— ์ •์˜๋˜์–ด ์žˆ๊ณ , ๊ฐ ์•Œ๋žŒ์— ๋Œ€์‘ํ•˜๋Š” ์กฐ์น˜ API๊ฐ€ ์žˆ๋‹ค. ์ƒ์„ธ๋Š” ์šด์˜ ๋Ÿฐ๋ถ.


๋ฌธ์„œ


์•Œ๋ ค์ง„ ์ œ์•ฝ

์†”์งํ•˜๊ฒŒ ๋‚จ๊ธด๋‹ค.

  • ๋ถ€ํ•˜ ๊ฒ€์ฆ์„ ํ•˜์ง€ ์•Š์•˜๋‹ค. ์ปค๋„ฅ์…˜ ํ’€ ํฌ๊ธฐ(20)์™€ HTTP ํด๋ผ์ด์–ธํŠธ ์„ค์ •์€ ํ•ฉ๋ฆฌ์  ๊ธฐ๋ณธ๊ฐ’์ด์ง€ ์‹ค์ธก ๊ฒฐ๊ณผ๊ฐ€ ์•„๋‹ˆ๋‹ค.
  • ํ‚ค ๋กœํ…Œ์ด์…˜ ๋ฐฐ์น˜๊ฐ€ ์—†๋‹ค. FieldEncryptor๊ฐ€ ๋ฒ„์ „๋ณ„ ๋ณตํ˜ธํ™”์™€ needsReEncryption()์„ ์ง€์›ํ•˜์ง€๋งŒ, ์‹ค์ œ ์žฌ์•”ํ˜ธํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฐ์น˜๋Š” ์•„์ง ์—†๋‹ค. ํ˜„์žฌ๋Š” ๋กœํ…Œ์ด์…˜ํ•  ํ‚ค๊ฐ€ ์—†์–ด ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋‚ฎ์ท„๋‹ค.
  • ๋กœ๊ทธ์˜ PII ๋…ธ์ถœ์„ ๊ฐ์‚ฌํ•˜์ง€ ์•Š์•˜๋‹ค. ๊ณ„์ขŒ๋ฒˆํ˜ธยท์ „ํ™”๋ฒˆํ˜ธ๊ฐ€ ๋กœ๊ทธ์— ๋‚จ๋Š”์ง€ ์ „์ˆ˜ ํ™•์ธ์ด ํ•„์š”ํ•˜๋‹ค.
  • ๋ฐฑ์—… ๋ณต๊ตฌ๋ฅผ ๋ฆฌํ—ˆ์„คํ•˜์ง€ ์•Š์•˜๋‹ค. infra/scripts/backup-mariadb.sh๋Š” ์žˆ์œผ๋‚˜ ๋ณต๊ตฌ ์ ˆ์ฐจ๋ฅผ ์‹คํ–‰ํ•ด๋ณธ ์ ์ด ์—†๋‹ค.

About

๐Ÿฆ BURTY ์„œ๋ฒ„ ์ธํ„ฐํŽ˜์ด์Šค 2.0

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages