Skip to content

IMWoo94/ai-repo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

169 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

ai-repo

Java 25์™€ Spring Boot ๊ธฐ๋ฐ˜์œผ๋กœ ํ•€ํ…Œํฌ ์„œ๋น„์Šค๋ฅผ ํ•™์Šตํ•˜๊ณ  ๊ฒ€์ฆํ•˜๋Š” ์—”์ง€๋‹ˆ์–ด๋ง ๋žฉ์ž…๋‹ˆ๋‹ค. ๋ชฉํ‘œ๋Š” ๋‹จ์ˆœํ•œ ์˜ˆ์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์•„๋‹ˆ๋ผ, ๊ธˆ์œต๊ถŒ ์ˆ˜์ค€์˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ž‘์€ ๋ฒ”์œ„๋กœ ์ชผ๊ฐœ์–ด ์„ค๊ณ„ ๊ทผ๊ฑฐ, ํŠธ๋ ˆ์ด๋“œ์˜คํ”„, ์ฝ”๋“œ, ํ…Œ์ŠคํŠธ, ๋ฆฌ๋ทฐ, ๋ฆด๋ฆฌ์Šค๋ฅผ ํ•จ๊ป˜ ๋‚จ๊ธฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์ €์žฅ์†Œ๋Š” ํ•™์Šต์šฉ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ ๊ธˆ์œต ๊ฑฐ๋ž˜, ์‹ค๋ช… ์ธ์ฆ, ์™ธ๋ถ€ ๊ฒฐ์ œ๋ง ์—ฐ๋™, ๊ณ ๊ฐ ๊ฐœ์ธ์ •๋ณด ์ฒ˜๋ฆฌ๋Š” ๋ฒ”์œ„์— ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ง„ํ–‰ ๋ฐฐ๊ฒฝ

ํ•€ํ…Œํฌ ์„œ๋น„์Šค๋Š” ๊ธฐ๋Šฅ ๊ตฌํ˜„๋ณด๋‹ค ์ •ํ•ฉ์„ฑ, ๊ฐ์‚ฌ ๊ฐ€๋Šฅ์„ฑ, ์žฅ์•  ๋ณต๊ตฌ, ๋ณด์•ˆ, ์šด์˜ ์ ˆ์ฐจ๊ฐ€ ๋” ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ณ„์ขŒ ์ด์ฒด, ๊ฐ„ํŽธ๊ฒฐ์ œ, ํฌ์ธํŠธ ์ถฉ์ „, ์ •์‚ฐ ๊ฐ™์€ ๊ธฐ๋Šฅ์€ ํ™”๋ฉด์ƒ์œผ๋กœ๋Š” ๋‹จ์ˆœํ•˜์ง€๋งŒ ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ๋ฉฑ๋“ฑ์„ฑ, ์›์žฅ ๋ถˆ๋ณ€์„ฑ, ๋™์‹œ์„ฑ ์ œ์–ด, ํ•œ๋„, ์ด์ƒ๊ฑฐ๋ž˜ ํƒ์ง€, ์žฅ์•  ์‹œ ๋ณด์ƒ ์ฒ˜๋ฆฌ๊นŒ์ง€ ๊ณ ๋ คํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ ˆํฌ๋Š” ๋‹ค์Œ ์ „์ œ๋ฅผ ๋‘ก๋‹ˆ๋‹ค.

  • ๊ธˆ์œต ๋„๋ฉ”์ธ์€ ์ฝ”๋“œ๋ณด๋‹ค ๋จผ์ € ์ •์ฑ…๊ณผ ๋ถˆ๋ณ€์‹์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ๊ธฐ๋Šฅ์€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ์„ค๊ณ„ ์„ ํƒ์€ ADR ๋˜๋Š” Wiki ๋ฌธ์„œ๋กœ ๊ทผ๊ฑฐ๋ฅผ ๋‚จ๊น๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋Š” ๊ตฌํ˜„ ํ’ˆ์งˆ๋ฟ ์•„๋‹ˆ๋ผ ๋„๋ฉ”์ธ ๊ทœ์น™ ์œ„๋ฐ˜ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฆด๋ฆฌ์Šค๋Š” ์ž‘์€ ๋‹จ์œ„๋กœ ๋ฐ˜๋ณตํ•˜๋ฉฐ ๋ณ€๊ฒฝ ์ด๋ ฅ์„ ์ถ”์ ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์ˆ  ๊ธฐ์ค€๊ณผ ๊ทผ๊ฑฐ

ํ•ญ๋ชฉ ๊ธฐ๋ณธ ์„ ํƒ ๊ทผ๊ฑฐ ์ฃผ์š” ํŠธ๋ ˆ์ด๋“œ์˜คํ”„
Java Java 25 LTS Oracle์€ Java 25๋ฅผ 2025-09-16์— ๊ณต๊ฐœํ–ˆ๊ณ , Java ๋ฆด๋ฆฌ์Šค ํ‘œ์—์„œ Java 25 LTS์˜ ์ง€์› ์ข…๋ฃŒ๋ฅผ 2033-09๋กœ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค. ์ตœ์‹  LTS๋ฅผ ํ†ตํ•ด ์žฅ๊ธฐ ํ•™์Šต ๊ธฐ์ค€์„ ์žก์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ผ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜ธํ™˜์„ฑ์€ Java 21๋ณด๋‹ค ๋Šฆ๊ฒŒ ์•ˆ์ •ํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Spring Boot Spring Boot 4.x ์šฐ์„  ๊ฒ€ํ†  Spring Boot 4.0.5 ๋ฌธ์„œ๋Š” Java 17 ์ด์ƒ์„ ์š”๊ตฌํ•˜๊ณ  Java 26๊นŒ์ง€ ํ˜ธํ™˜๋œ๋‹ค๊ณ  ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค. Spring Framework 7, Jakarta EE ์ตœ์‹  ์ถ•์„ ํ•™์Šตํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ƒํƒœ๊ณ„ ์•ˆ์ •์„ฑ์ด ๋” ์ค‘์š”ํ•˜๋ฉด Spring Boot 3.5.x๋กœ ๋‚ฎ์ถ”๋Š” ์„ ํƒ์ง€๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
Build Gradle 9.x ๋˜๋Š” 8.14+ Spring Boot 4.0.5 ๋ฌธ์„œ๋Š” Gradle 8.14+ ๋ฐ 9.x ์ง€์›์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค. Gradle 9.x๋Š” ์ตœ์‹ ์„ฑ์ด ์ข‹๊ณ , Gradle 8.14+๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ ํ˜ธํ™˜์„ฑ์ด ๋” ์•ˆ์ •์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
Test JUnit 5, Spring Boot Test, Testcontainers ๊ธˆ์œต ๋„๋ฉ”์ธ์€ DB ํŠธ๋žœ์žญ์…˜๊ณผ ๋™์‹œ์„ฑ ๊ฒ€์ฆ์ด ์ค‘์š”ํ•˜๋ฏ€๋กœ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ์™€ ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ๋ฅผ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•˜์ง€๋งŒ ํšŒ๊ท€์™€ ์„ค๊ณ„ ์˜ค๋ฅ˜๋ฅผ ์กฐ๊ธฐ์— ๋ฐœ๊ฒฌํ•ฉ๋‹ˆ๋‹ค.
Persistence PostgreSQL ์šฐ์„  ์›์žฅ, ๊ฑฐ๋ž˜, ๊ฐ์‚ฌ ๋กœ๊ทธ์ฒ˜๋Ÿผ ์ •ํ•ฉ์„ฑ์ด ์ค‘์š”ํ•œ ๋ฐ์ดํ„ฐ์— ๊ด€๊ณ„ํ˜• ๋ชจ๋ธ์ด ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๋น ๋ฅธ ํ”„๋กœํ† ํƒ€์ดํ•‘์€ H2๊ฐ€ ์‰ฝ์ง€๋งŒ, ์šด์˜ ์œ ์‚ฌ์„ฑ์€ PostgreSQL์ด ๋†’์Šต๋‹ˆ๋‹ค.
API REST ์šฐ์„ , ์ด๋ฒคํŠธ๋Š” ํ›„์† ๋„์ž… ์ดˆ๊ธฐ ํ•™์Šต ๋‹จ๊ณ„์—์„œ๋Š” ์š”์ฒญ-์‘๋‹ต ๊ณ„์•ฝ๊ณผ ํŠธ๋žœ์žญ์…˜ ๊ฒฝ๊ณ„๋ฅผ ๋ช…ํ™•ํžˆ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜์€ ํ™•์žฅ์„ฑ์— ์œ ๋ฆฌํ•˜์ง€๋งŒ, ์ดˆ๊ธฐ์—๋Š” ๋ณต์žก๋„์™€ ๊ด€์ธก ๋น„์šฉ์ด ํฝ๋‹ˆ๋‹ค.

์ฐธ๊ณ  ์ž๋ฃŒ:

๋ชฉํ‘œ

  1. ๊ธˆ์œต ์„œ๋น„์Šค ํ•ต์‹ฌ ๋„๋ฉ”์ธ์„ ์ž‘์€ ๊ธฐ๋Šฅ ๋‹จ์œ„๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ธฐ๋Šฅ๋งˆ๋‹ค ๋„๋ฉ”์ธ ๊ทœ์น™, ์„ค๊ณ„ ๋Œ€์•ˆ, ํŠธ๋ ˆ์ด๋“œ์˜คํ”„, ํ…Œ์ŠคํŠธ ์ „๋žต์„ ๋ฌธ์„œํ™”ํ•ฉ๋‹ˆ๋‹ค.
  3. ์ฝ”๋“œ ๊ฐœ๋ฐœ์ž 2๋ช…, ์‚ฌ์šฉ์ž ๊ฐœ๋ฐœ์ž, ๋„๋ฉ”์ธ ์ „๋ฌธ๊ฐ€, ๊ธฐํš์ž, QA ์—ญํ• ์ด ๋…๋ฆฝ์ ์œผ๋กœ ๊ฒ€ํ† ํ•˜๋Š” ํ•˜๋„ค์Šค๋ฅผ ์šด์˜ํ•ฉ๋‹ˆ๋‹ค.
  4. GitHub Issues, Pull Requests, Wiki, Releases๋ฅผ ์‚ฌ์šฉํ•ด ์‹ค์ œ ํŒ€ ๊ฐœ๋ฐœ ์ ˆ์ฐจ๋ฅผ ํ‰๋‚ด ๋ƒ…๋‹ˆ๋‹ค.
  5. ๊ฐ ๋ฆด๋ฆฌ์Šค๋งˆ๋‹ค ๊ธฐ๋Šฅ, ์ œ์•ฝ, ์•Œ๋ ค์ง„ ๋ฆฌ์Šคํฌ, ๋‹ค์Œ ์‹คํ—˜ ๋Œ€์ƒ์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

์ดˆ๊ธฐ ๋„๋ฉ”์ธ ๋ฒ”์œ„

ํ•™์Šต ์ˆœ์„œ๋Š” ์ •ํ•ฉ์„ฑ ๋‚œ๋„๊ฐ€ ๋‚ฎ์€ ๊ธฐ๋Šฅ์—์„œ ๋†’์€ ๊ธฐ๋Šฅ์œผ๋กœ ํ™•์žฅํ•ฉ๋‹ˆ๋‹ค.

  1. ํšŒ์›๊ณผ ์ง€๊ฐ‘ ๊ณ„์ •
  2. ์ž”์•ก ์กฐํšŒ์™€ ๊ฑฐ๋ž˜ ๋‚ด์—ญ
  3. ์ถฉ์ „, ์ถœ๊ธˆ, ์†ก๊ธˆ
  4. ๋ฉฑ๋“ฑ ์š”์ฒญ ํ‚ค์™€ ์ค‘๋ณต ๊ฑฐ๋ž˜ ๋ฐฉ์ง€
  5. ๊ฑฐ๋ž˜ ํ•œ๋„์™€ ์ƒํƒœ ์ „์ด
  6. ์›์žฅ ๋ชจ๋ธ๊ณผ ๊ฐ์‚ฌ ๋กœ๊ทธ
  7. ์žฅ์•  ๋ณด์ƒ, ์žฌ์ฒ˜๋ฆฌ, ์ •์‚ฐ ๋ฐฐ์น˜
  8. ์ด์ƒ๊ฑฐ๋ž˜ ํƒ์ง€ ๊ทœ์น™์˜ ๊ธฐ์ดˆ

ํ•˜๋„ค์Šค ์—”์ง€๋‹ˆ์–ด๋ง ์šด์˜ ๋ชจ๋ธ

ํ•˜๋„ค์Šค๋Š” ์—ญํ• ๋ณ„ ๊ด€์ ์„ ๋ถ„๋ฆฌํ•ด ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ๋ฐ˜๋ณต ๊ฒ€์ฆํ•˜๋Š” ์ž‘์—… ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

์—ญํ•  ์ฑ…์ž„ ์‚ฐ์ถœ๋ฌผ
๊ธฐํš์ž ๋ฌธ์ œ ์ •์˜, ์‚ฌ์šฉ์ž ์‹œ๋‚˜๋ฆฌ์˜ค, ์ˆ˜์šฉ ๊ธฐ์ค€ ์ž‘์„ฑ Issue, ์‚ฌ์šฉ์ž ์Šคํ† ๋ฆฌ, acceptance criteria
๋„๋ฉ”์ธ ์ „๋ฌธ๊ฐ€ ๊ธˆ์œต ๊ทœ์น™, ๋ถˆ๋ณ€์‹, ์˜ˆ์™ธ ์ •์ฑ… ๊ฒ€ํ†  ๋„๋ฉ”์ธ ๊ทœ์น™ ๋ฌธ์„œ, ์šฉ์–ด์ง‘, ์ •์ฑ… ๊ฒฐ์ •
์‚ฌ์šฉ์ž ๊ฐœ๋ฐœ์ž ์‹ค์ œ ๊ตฌํ˜„ ์ฐธ์—ฌ, ์ตœ์ข… ์˜์‚ฌ๊ฒฐ์ • ์ฝ”๋“œ, ๋ฆฌ๋ทฐ ์˜๊ฒฌ, ์„ค๊ณ„ ์Šน์ธ
์ฝ”๋“œ ๊ฐœ๋ฐœ์ž A ๊ตฌํ˜„ ๋˜๋Š” ๋ฆฌํŒฉํ„ฐ๋ง ๋‹ด๋‹น ์ฝ”๋“œ, ๋‹จ์œ„ ํ…Œ์ŠคํŠธ, PR ์„ค๋ช…
์ฝ”๋“œ ๊ฐœ๋ฐœ์ž B ๋Œ€์•ˆ ๊ตฌํ˜„ ๊ฒ€ํ† , ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋‹ด๋‹น ๋ฆฌ๋ทฐ ์ฝ”๋ฉ˜ํŠธ, ๊ฒฐํ•จ ์ง€์ , ๊ฐœ์„ ์•ˆ
QA ํ…Œ์ŠคํŠธ ์‹œ๋‚˜๋ฆฌ์˜ค, ๊ฒฝ๊ณ„๊ฐ’, ํšŒ๊ท€ ๊ฒ€์ฆ QA ์ฒดํฌ๋ฆฌ์ŠคํŠธ, ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค, ๋ฒ„๊ทธ ์ด์Šˆ
๋ฆด๋ฆฌ์Šค ๊ด€๋ฆฌ์ž ๋ฒ„์ „, ๋ณ€๊ฒฝ ์ด๋ ฅ, ๋ฐฐํฌ ๊ฐ€๋Šฅ ์ƒํƒœ ๊ด€๋ฆฌ ํƒœ๊ทธ, GitHub Release, ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ

์ž‘์—… ์ˆœ์„œ

  1. ๊ธฐํš์ž๊ฐ€ Issue์— ๋ฌธ์ œ, ๋ฒ”์œ„, ์ˆ˜์šฉ ๊ธฐ์ค€์„ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
  2. ๋„๋ฉ”์ธ ์ „๋ฌธ๊ฐ€๊ฐ€ ์ •์ฑ…, ๋ถˆ๋ณ€์‹, ์˜ˆ์™ธ ์ผ€์ด์Šค๋ฅผ ๋ณด๊ฐ•ํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ฐœ๋ฐœ์ž๋Š” ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ฝ”๋“œ์™€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•จ๊ป˜ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
  4. ์ฝ”๋“œ ๊ฐœ๋ฐœ์ž 2๋ช…์ด ์ƒํ˜ธ ๋ฆฌ๋ทฐ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  5. QA๊ฐ€ ์ˆ˜์šฉ ๊ธฐ์ค€๊ณผ ํšŒ๊ท€ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.
  6. ์Šน์ธ๋œ ๋ณ€๊ฒฝ๋งŒ main์— ๋ณ‘ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  7. ๋ฆด๋ฆฌ์Šค ๋Œ€์ƒ ๋ณ€๊ฒฝ์€ ํƒœ๊ทธ์™€ GitHub Release๋กœ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

๋ธŒ๋žœ์น˜์™€ PR ๊ทœ์น™

  • ๊ธฐ๋ณธ ๋ธŒ๋žœ์น˜: main
  • ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜: feature/<issue-number>-<short-name>
  • ๋ฒ„๊ทธ ์ˆ˜์ • ๋ธŒ๋žœ์น˜: fix/<issue-number>-<short-name>
  • ๋ฌธ์„œ ๋ธŒ๋žœ์น˜: docs/<issue-number>-<short-name>
  • ๋ฆด๋ฆฌ์Šค ๋ธŒ๋žœ์น˜: release/v<major>.<minor>
  • ๊ธด๊ธ‰ ์ˆ˜์ • ๋ธŒ๋žœ์น˜: hotfix/v<major>.<minor>.<patch>

PR์€ ๋‹ค์Œ ์กฐ๊ฑด์„ ๋งŒ์กฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๊ด€๋ จ Issue๋ฅผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  • ๋„๋ฉ”์ธ ๊ทœ์น™ ๋ณ€๊ฒฝ ์—ฌ๋ถ€๋ฅผ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.
  • ์ฝ”๋“œ์™€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ํ•จ๊ป˜ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  • ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ ๋˜๋Š” ๋Œ€์•ˆ์ด ์žˆ์œผ๋ฉด PR ๋ณธ๋ฌธ์ด๋‚˜ ADR์— ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.
  • ์ตœ์†Œ 2๊ฐœ ๊ฐœ๋ฐœ์ž ๊ด€์ ์˜ ๋ฆฌ๋ทฐ์™€ QA ์ฒดํฌ๋ฅผ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค.

GitHub ์ž‘์—… ํ…œํ”Œ๋ฆฟ:

ํ…Œ์ŠคํŠธ ์›์น™

ํ…Œ์ŠคํŠธ๋Š” ์„ ํƒ์ด ์•„๋‹ˆ๋ผ ๊ธฐ๋Šฅ ์™„๋ฃŒ ์กฐ๊ฑด์ž…๋‹ˆ๋‹ค.

  • ๋‹จ์œ„ ํ…Œ์ŠคํŠธ: ๋„๋ฉ”์ธ ๊ฐ์ฒด, ์ •์ฑ…, ์ƒํƒœ ์ „์ด๋ฅผ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.
  • ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ: DB ํŠธ๋žœ์žญ์…˜, Repository, API ๊ฒฝ๊ณ„๋ฅผ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.
  • ๋™์‹œ์„ฑ ํ…Œ์ŠคํŠธ: ์ž”์•ก ๋ณ€๊ฒฝ, ์ค‘๋ณต ์š”์ฒญ, ๋‚™๊ด€์ /๋น„๊ด€์  ๋ฝ ์ „๋žต์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.
  • ๊ณ„์•ฝ ํ…Œ์ŠคํŠธ: ์™ธ๋ถ€ ์‹œ์Šคํ…œ์„ ๋ถ™์ผ ๊ฒฝ์šฐ ์š”์ฒญ/์‘๋‹ต ๊ณ„์•ฝ์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.
  • ํšŒ๊ท€ ํ…Œ์ŠคํŠธ: ๋ฒ„๊ทธ ์ˆ˜์ • ์‹œ ์‹คํŒจ ์žฌํ˜„ ํ…Œ์ŠคํŠธ๋ฅผ ๋จผ์ € ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

์ดˆ๊ธฐ ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ๋Š” ๋‹ค์Œ ๋ช…๋ น์„ ๊ธฐ์ค€์œผ๋กœ ์žก์Šต๋‹ˆ๋‹ค.

./gradlew test
./gradlew scenarioTest
./gradlew postgresScenarioTest
./gradlew check
cd frontend && npm run test
cd frontend && npm run build
cd frontend && npm run e2e

ํ˜„์žฌ ๋ธŒ๋žœ์น˜์—๋Š” Gradle Wrapper์™€ React/Vite ํ”„๋ก ํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ ์œ„ ๋ช…๋ น์„ ํ‘œ์ค€ ํ’ˆ์งˆ ๊ฒŒ์ดํŠธ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. test๋Š” ๋‹จ์œ„/API/์ €์žฅ์†Œ ์ค‘์‹ฌ์˜ ๋น ๋ฅธ ํšŒ๊ท€ ๊ฒŒ์ดํŠธ์ด๊ณ , scenarioTest๋Š” ๋Œ€ํ‘œ ์‚ฌ์šฉ์ž/์šด์˜ ํ๋ฆ„์„ ๊ฒ€์ฆํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค ๊ฒŒ์ดํŠธ์ž…๋‹ˆ๋‹ค. postgresScenarioTest๋Š” Docker/Testcontainers ๊ธฐ๋ฐ˜ ์‹ค์ œ PostgreSQL profile ๋Œ€ํ‘œ ํ๋ฆ„์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค. frontend unit test๋Š” React ์ƒํƒœ์™€ API payload ํšŒ๊ท€๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ฆํ•˜๊ณ , frontend build๋Š” TypeScript/Vite smoke gate์ด๋ฉฐ, frontend E2E๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ Vite proxy์™€ Spring Boot API ์—ฐ๊ฒฐ์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

๋กœ์ปฌ ํ…Œ์ŠคํŠธ ์‹คํ–‰ ์ˆœ์„œ์™€ ์‹คํŒจ ๋Œ€์‘์€ Local Test Guide๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์‹œ๋‚˜๋ฆฌ์˜ค ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ ๊ธฐ์ค€์€ Scenario Test Strategy๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. Outbox relay๋Š” publisher port ๋’ค์— ๊ธฐ๋ณธ in-memory adapter์™€ ์„ ํƒํ˜• HTTP broker adapter๋ฅผ ๋‘ก๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋กœ์ปฌ ์‹คํ–‰์€ memory์ด๋ฉฐ, http type์—์„œ๋Š” ์‹ค์ œ HTTP endpoint๋กœ event envelope๋ฅผ ๋ฐœํ–‰ํ•˜๊ณ  contract test๋กœ method/header/body๋ฅผ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

๋กœ์ปฌ ์‹คํ–‰

IntelliJ IDEA ๊ธฐ์ค€ ์„ค์ •์€ Local Setup์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

k8s ๋ฐฐํฌ์™€ ๊ด€์ธก ์Šคํƒ

๋กœ์ปฌ Docker Desktop k8s์— ์ „์ฒด ์Šคํƒ(์•ฑ + Postgres + Prometheus + Grafana + Loki)์„ ๋„์šฐ๋Š” ๊ตฌ๋™ ๋ฐฉ๋ฒ•๊ณผ ์„œ๋น„์Šค๋ณ„ ์ ‘์† URLยท๊ณ„์ • ์ •๋ณด, ๋Œ€์‹œ๋ณด๋“œ/LogQL ๋กœ๊ทธ ๊ฒ€์ƒ‰์€ k8s ๋กœ์ปฌ ๋ฐฐํฌ + ๋ชจ๋‹ˆํ„ฐ๋ง + ๋กœ๊ทธ ๊ฒ€์ƒ‰์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. main ๋จธ์ง€ ์‹œ ์ž๋™ ๋ฐฐํฌ๋˜๋Š” GitHub Actions โ†’ GHCR โ†’ ArgoCD ํŒŒ์ดํ”„๋ผ์ธ์€ CI/CD GitOps๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

./scripts/k8s-local-up.sh     # ์ „์ฒด ์Šคํƒ ๊ธฐ๋™
./scripts/k8s-local-down.sh   # ์ „์ฒด ์ œ๊ฑฐ
./scripts/argocd-install.sh   # (์„ ํƒ) ArgoCD ์„ค์น˜ + GitOps ๋ชจ๋“œ
์„œ๋น„์Šค URL ๊ณ„์ •
์•ฑ API http://localhost:30080 ์šด์˜ API ํ—ค๋”: X-Operator-Token: local-k8s-ops-operator-token / X-Admin-Token: local-k8s-ops-admin-token (deploy/k8s/secrets.yaml, ADR-0062 fail-fast๋กœ ๋น„-๊ธฐ๋ณธ ๊ฐ’)
Grafana ๋Œ€์‹œ๋ณด๋“œ http://localhost:30300/d/ai-repo-overview ์ต๋ช… Admin (๋กœ๊ทธ์ธ ๋ถˆํ•„์š”)
Grafana ๋กœ๊ทธ ๊ฒ€์ƒ‰ http://localhost:30300/explore ์ต๋ช… Admin (๋กœ๊ทธ์ธ ๋ถˆํ•„์š”)
Prometheus http://localhost:30990 ์—†์Œ
ArgoCD https://localhost:8443 (port-forward ํ›„) admin / ์ดˆ๊ธฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ์กฐํšŒ ๋ช…๋ น์€ ๊ฐ€์ด๋“œ ์ฐธ๊ณ 

์„œ๋น„์Šค๋ณ„ ์ „์ฒด ์ ‘์† ์ •๋ณด(PostgresยทLoki ํฌํ•จ)์™€ ๋ณต์‚ฌ-์‹คํ–‰ ๋ช…๋ น์–ด ๋ชจ์Œ์€ k8s ๋กœ์ปฌ ๋ฐฐํฌ + ๋ชจ๋‹ˆํ„ฐ๋ง + ๋กœ๊ทธ ๊ฒ€์ƒ‰์˜ "์ ‘์† ์ •๋ณด"ยท"์ „์ฒด ๋ช…๋ น์–ด ๋ชจ์Œ" ์„น์…˜์— ์žˆ์Šต๋‹ˆ๋‹ค. ์ธํ”„๋ผยท์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์กฐ๋Š” ์•„ํ‚คํ…์ฒ˜ ๋‹ค์ด์–ด๊ทธ๋žจ(mermaid)์„ ์ฐธ๊ณ ํ•ฉ๋‹ˆ๋‹ค.

(์„ ํƒ) ELK ๋กœ๊ทธ ์Šคํƒ โ€” opt-in ํ•™์Šต์šฉ

๊ธฐ๋ณธ ๋กœ๊ทธ ์Šคํƒ์€ ์œ„ PLG(Loki)์ž…๋‹ˆ๋‹ค. ๋กœ๊ทธ ํŒŒ์‹ฑยท๊ฒ€์ƒ‰์„ ํ•™์Šตํ•˜๋ ค๋ฉด opt-in ELK ์Šคํƒ(Filebeatโ†’Logstashโ†’Elasticsearchโ†’Kibana)์„ logging ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋ณ„๋„๋กœ ๋„์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. PLG๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š๊ณ  ๋ณ‘์กดํ•˜๋ฉฐ, ๋ฆฌ์†Œ์Šค ๋ถ€๋‹ด์ด ์ปค ๊ธฐ๋ณธ off์ž…๋‹ˆ๋‹ค(ADR-0066). ๊ตฌ๋™ยทKQL ๊ฒ€์ƒ‰ยทํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…์€ ELK ๋กœ์ปฌ ๋กœ๊น… ๊ฐ€์ด๋“œ, ๊ฐœ๋… ํ•™์Šต์€ ELK ํ•™์Šต ๋ฌธ์„œ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

on/off๋Š” ์„ธ ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜๋กœ ํ•˜๋ฉฐ(์„ž์ง€ ์•Š์Œ): โ‘  ๋…๋ฆฝ ์Šคํฌ๋ฆฝํŠธ, โ‘ก ๋ฉ”์ธ ์Šคํƒ env ํ”Œ๋ž˜๊ทธ AI_REPO_ELK_ENABLED=true, โ‘ข ArgoCD ์ˆ˜๋™ sync App(deploy/argocd/logging-application.yaml, automated ์—†์Œ โ€” ๊ธฐ์กด ai-repo App์€ ํ•ญ์ƒ ์ผœ์ง€๋ฏ€๋กœ ๋ถ„๋ฆฌ).

./scripts/elk-local-up.sh                              # โ‘  ELK๋งŒ ๊ธฐ๋™ (logging ๋„ค์ž„์ŠคํŽ˜์ด์Šค)
./scripts/elk-local-down.sh                            # โ‘  ELK๋งŒ ์ œ๊ฑฐ
AI_REPO_ELK_ENABLED=true ./scripts/k8s-local-up.sh     # โ‘ก PLG + ELK ํ•จ๊ป˜
# โ‘ข ArgoCD(GitOps): App ๋“ฑ๋ก ํ›„ UI/CLI์—์„œ Sync(์ผœ๊ธฐ)/Delete(๋„๊ธฐ)
kubectl apply -f deploy/argocd/logging-application.yaml && argocd app sync ai-repo-logging
์„œ๋น„์Šค URL ๊ณ„์ •
Kibana (Discover/KQL) http://localhost:30561 ์—†์Œ (๋กœ์ปฌ ํ•™์Šต์šฉ xpack.security.enabled=false)
Elasticsearch API http://localhost:30920 ์—†์Œ (์ธ๋ฑ์Šค ํŒจํ„ด spring-logs-*)

ํ˜„์žฌ ๊ธฐ๋Šฅ ํ๋ฆ„์€ ์ž”์•ก/๊ฑฐ๋ž˜๋‚ด์—ญ ์กฐํšŒ, ํšŒ์›/์ง€๊ฐ‘ ๊ณ„์ •, ์ถฉ์ „/์†ก๊ธˆ, ์›์žฅ/๊ฐ์‚ฌ ๋กœ๊ทธ 1์ฐจ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

  • GET /api/v1/wallets/wallet-001/balance
  • GET /api/v1/wallets/wallet-001/transactions
  • POST /api/v1/wallets/wallet-001/charges
  • POST /api/v1/wallets/wallet-001/transfers
  • GET /api/v1/wallets/wallet-001/ledger-entries
  • GET /api/v1/audit-events
  • GET /api/v1/operations/op-001/step-logs
  • GET /api/v1/operations/op-001/outbox-events
  • GET /api/v1/outbox-events/manual-review
  • POST /api/v1/outbox-events/outbox-001/requeue-requests
  • GET /api/v1/outbox-events/outbox-001/requeue-requests
  • POST /api/v1/outbox-events/requeue-requests/outbox-requeue-request-001/approve
  • POST /api/v1/outbox-events/requeue-requests/outbox-requeue-request-001/execute
  • POST /api/v1/outbox-events/requeue-requests/outbox-requeue-request-001/reject
  • GET /api/v1/outbox-events/outbox-001/requeue-audits
  • GET /api/v1/outbox-consumer/metrics
  • GET /api/v1/outbox-consumer/window-metrics
  • GET /api/v1/outbox-consumer/health
  • GET /api/v1/outbox-consumer/receipts
  • POST /api/v1/outbox-consumer/pruning-runs
  • GET /api/v1/outbox-relay-runs
  • GET /api/v1/outbox-relay-runs/health
  • GET /api/v1/operational-alerts
  • GET /api/v1/admin-api-access-audits
  • POST /api/v1/operational-log-pruning-runs

์—”๋“œ์œ ์ € ์ธ์ฆ(ADR-0056/0057): ํšŒ์›์€ POST /api/v1/auth/tokens๋กœ ๋กœ๊ทธ์ธํ•ด HS256 JWT(subject=memberId)๋ฅผ ๋ฐœ๊ธ‰๋ฐ›๊ณ , Bearer ํ† ํฐ์œผ๋กœ ์ง€๊ฐ‘ API๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ฐ‘ ์กฐํšŒ/๋ช…๋ น์€ ์„œ๋น„์Šค ๊ณ„์ธต์—์„œ ํ† ํฐ ์†Œ์œ ์ž์™€ ์ง€๊ฐ‘ ์†Œ์œ ์ž๋ฅผ ๋Œ€์กฐํ•˜๋Š” per-user ownership ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ JWT secret ์‚ฌ์šฉ์€ JwtSecretGuard๊ฐ€ ๊ธฐ๋™ ์‹œ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ํ”ฝ์Šค์ฒ˜๋Š” POST /api/v1/test-fixtures(property๋กœ ๊ฒŒ์ดํŠธ)๋กœ ์ค€๋น„ํ•˜๊ณ , HTTP broker ์†Œ๋น„ ๋ฃจํ”„๋Š” POST /internal/broker/outbox-events๋กœ ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค. ์ด broker ์—”๋“œํฌ์ธํŠธ๋Š” brokerโ†’consumer shared secret ํ—ค๋” X-Broker-Token์„ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค(ADR-0065): ์ „์šฉ SecurityFilterChain(Order 3)์ด MessageDigest.isEqual ์ƒ์ˆ˜์‹œ๊ฐ„ ๋น„๊ต๋กœ ๊ฒ€์ฆํ•˜๊ณ  ๋ถˆ์ผ์น˜/๋ˆ„๋ฝ ์‹œ 401์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ, publisher(HttpOperationOutboxPublisher)๋Š” ๊ฐ™์€ secret์„ ๋ถ€์ฐฉํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ broker token ์‚ฌ์šฉ์€ BrokerTokenGuard๊ฐ€ ๋ฐฐํฌ ํ”„๋กœํŒŒ์ผ(postgres/prod)์—์„œ ๊ธฐ๋™ ์‹œ ์ฐจ๋‹จํ•ฉ๋‹ˆ๋‹ค.

Outbox ์šด์˜ API๋Š” X-Operator-Token, X-Admin-Token, X-Operator-Id header๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์กฐํšŒ์„ฑ ์šด์˜ API๋Š” operator token ๋˜๋Š” admin token์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ณ , requeue ์Šน์ธ/์‹คํ–‰/๋ฐ˜๋ ค์™€ operational log pruning, consumer pruning ๊ฐ™์€ ๋ณ€๊ฒฝ์„ฑ ์šด์˜ ์กฐ์น˜๋Š” admin token์„ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ์šด์˜ API ์ธ์ฆ ํ•„ํ„ฐ์™€ ์ ‘๊ทผ ๊ฐ์‚ฌ ํ•„ํ„ฐ๋Š” root ๋˜๋Š” ํ•˜์œ„ path segment๋งŒ ๋งค์นญํ•˜๋Š” ๊ณตํ†ต path matcher๋ฅผ ์‚ฌ์šฉํ•ด /api/v1/outbox-events-v2 ๊ฐ™์€ lookalike prefix๋ฅผ ์šด์˜ API๋กœ ์˜คํƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋กœ์ปฌ ๊ธฐ๋ณธ token์€ local-operator-token, local-ops-token์ด๋ฉฐ, ์‹ค์ œ ์‹คํ–‰์—์„œ๋Š” AI_REPO_OPS_OPERATOR_TOKEN, AI_REPO_OPS_ADMIN_TOKEN ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ overrideํ•ฉ๋‹ˆ๋‹ค. Broker ์ธ์ฆ token์€ consumer AI_REPO_OUTBOX_CONSUMER_BROKER_TOKEN๊ณผ publisher AI_REPO_OUTBOX_PUBLISHER_HTTP_BROKER_TOKEN์œผ๋กœ ์ฃผ์ž…ํ•˜๋ฉฐ(๋กœ์ปฌ ๊ธฐ๋ณธ local-broker-token, ๋‘ ๊ฐ’์€ ์ผ์น˜ํ•ด์•ผ ํ•จ), ๋ฐฐํฌ ํ”„๋กœํŒŒ์ผ์—์„œ๋Š” ์ฃผ์ž…์ด ๊ฐ•์ œ๋ฉ๋‹ˆ๋‹ค. Manual review requeue๋Š” REQUESTED -> APPROVED -> EXECUTED์™€ REQUESTED -> REJECTED ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์Šน์ธ์ž/๋ฐ˜๋ ค์ž๋Š” ์š”์ฒญ์ž์™€ ๋‹ฌ๋ผ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ์ง์ ‘ requeue API๋Š” workflow ์šฐํšŒ๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด 410 Gone๊ณผ DIRECT_REQUEUE_API_DEPRECATED๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. Requeue audit์˜ operator๋Š” request body๊ฐ€ ์•„๋‹ˆ๋ผ ์‹คํ–‰ ๋‹จ๊ณ„์˜ X-Operator-Id์—์„œ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ ค ์‹œ outbox event๋Š” MANUAL_REVIEW ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•˜๊ณ  requeue audit์€ ๋‚จ๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Consumer ์ฒ˜๋ฆฌ ์ง€ํ‘œ์™€ duplicate health๋Š” /api/v1/outbox-consumer/metrics, /api/v1/outbox-consumer/window-metrics, /api/v1/outbox-consumer/health์—์„œ ์กฐํšŒํ•˜๊ณ , ์ตœ๊ทผ receipt๋Š” /api/v1/outbox-consumer/receipts์—์„œ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ž˜๋œ consumer dedupe/receipt ๊ธฐ๋ก์€ /api/v1/outbox-consumer/pruning-runs์—์„œ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. Relay scheduler ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” /api/v1/outbox-relay-runs์—์„œ ์ตœ๊ทผ ์ด๋ ฅ์œผ๋กœ ์กฐํšŒํ•˜๊ณ , /api/v1/outbox-relay-runs/health์—์„œ health summary์™€ alert ํŒ์ •์„ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. Warning/Critical health ํŒ์ •์€ ์šด์˜ alert record๋กœ ์ €์žฅ๋˜๊ณ  /api/v1/operational-alerts์—์„œ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. ์šด์˜ API ์ ‘๊ทผ ์„ฑ๊ณต/์‹คํŒจ ์ด๋ ฅ์€ /api/v1/admin-api-access-audits์—์„œ ์กฐํšŒํ•ฉ๋‹ˆ๋‹ค. ์šด์˜ ๊ด€์ธก ๋กœ๊ทธ pruning์€ /api/v1/operational-log-pruning-runs์—์„œ ์ˆ˜๋™ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ ๋ˆ„๋ฝ ๊ฒ€์‚ฌ๋Š” .dev/rules์™€ scripts/check-dev-rules.sh๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. CI์˜ Dev Rules Check job์€ ์ฝ”๋“œ, DB, ํ”„๋ก ํŠธ, ์šด์˜ ์Šคํฌ๋ฆฝํŠธ ๋ณ€๊ฒฝ ์‹œ ADR/progress/Wiki/test/release ๋ฌธ์„œ ๋™๊ธฐํ™” ๋ˆ„๋ฝ์„ ํŒŒ์ผ ๋ณ€๊ฒฝ ๊ธฐ์ค€์œผ๋กœ ํƒ์ง€ํ•ฉ๋‹ˆ๋‹ค.

Outbox relay scheduler๋Š” ๊ธฐ๋ณธ ๋น„ํ™œ์„ฑํ™”์ž…๋‹ˆ๋‹ค. ์ž๋™ ๋ฐœํ–‰์„ ๋กœ์ปฌ์—์„œ ํ™•์ธํ•˜๋ ค๋ฉด AI_REPO_OUTBOX_RELAY_SCHEDULER_ENABLED=true๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. Batch size์™€ ์‹คํ–‰ ์ฃผ๊ธฐ๋Š” AI_REPO_OUTBOX_RELAY_BATCH_SIZE, AI_REPO_OUTBOX_RELAY_INITIAL_DELAY_MS, AI_REPO_OUTBOX_RELAY_FIXED_DELAY_MS๋กœ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค.

Operational log pruning scheduler๋„ ๊ธฐ๋ณธ ๋น„ํ™œ์„ฑํ™”์ž…๋‹ˆ๋‹ค. ์ž๋™ pruning์„ ๋กœ์ปฌ์—์„œ ํ™•์ธํ•˜๋ ค๋ฉด AI_REPO_OPERATIONAL_LOG_PRUNING_SCHEDULER_ENABLED=true๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. Relay run ๊ธฐ๋ณธ ๋ณด์กด ๊ธฐ๊ฐ„์€ 30์ผ, admin access audit ๊ธฐ๋ณธ ๋ณด์กด ๊ธฐ๊ฐ„์€ 180์ผ์ž…๋‹ˆ๋‹ค.

Operational alert๋Š” ๊ฐ™์€ source/severity/reasons ์กฐํ•ฉ์„ ๊ธฐ๋ณธ 15๋ถ„ ๋™์•ˆ ์ค‘๋ณต ์ €์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. suppression window์™€ ๋ณด์กด ๊ธฐ๊ฐ„์€ AI_REPO_OPERATIONAL_ALERT_SUPPRESSION_WINDOW_MINUTES, AI_REPO_OPERATIONAL_ALERT_RETENTION_DAYS๋กœ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ž˜๋œ alert record๋Š” operational log pruning ์‹คํ–‰ ์‹œ ํ•จ๊ป˜ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.

Slack Incoming Webhook ํ˜ธํ™˜ alert push๋Š” ๊ธฐ๋ณธ ๋น„ํ™œ์„ฑํ™”์ž…๋‹ˆ๋‹ค. ๋กœ์ปฌ์—์„œ ํ™•์ธํ•˜๋ ค๋ฉด AI_REPO_OPERATIONAL_ALERT_PUBLISHER_TYPE=slack-webhook, AI_REPO_OPERATIONAL_ALERT_SLACK_WEBHOOK_URL=<webhook-url>์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. Slack ๋ฐœํ–‰ ์‹คํŒจ๋Š” health API์™€ alert record ์ €์žฅ์„ ์‹คํŒจ์‹œํ‚ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Consumer pruning scheduler๋„ ๊ธฐ๋ณธ ๋น„ํ™œ์„ฑํ™”์ž…๋‹ˆ๋‹ค. ์ž๋™ pruning์„ ๋กœ์ปฌ์—์„œ ํ™•์ธํ•˜๋ ค๋ฉด AI_REPO_OUTBOX_CONSUMER_PRUNING_SCHEDULER_ENABLED=true๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. Processed-event, receipt, delivery metric bucket ๊ธฐ๋ณธ ๋ณด์กด ๊ธฐ๊ฐ„์€ ๊ฐ๊ฐ 30์ผ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ broker๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ๋Š” dedupe ๋ณด์กด ๊ธฐ๊ฐ„์„ broker replay ๊ฐ€๋Šฅ ๊ธฐ๊ฐ„๋ณด๋‹ค ๊ธธ๊ฒŒ ์žก์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ถฉ์ „/์†ก๊ธˆ์€ KRW ๋‹จ์ผ ํ†ตํ™”์™€ ๋ฉฑ๋“ฑํ‚ค๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์›์žฅ/๊ฐ์‚ฌ ๋กœ๊ทธ๋Š” Issue #7 ๊ธฐ์ค€์œผ๋กœ ํ™•์žฅ ์ค‘์ด๋ฉฐ, 1์ฐจ ๋ฒ”์œ„์—์„œ๋Š” ์ธ๋ฉ”๋ชจ๋ฆฌ ์กฐํšŒ API๋กœ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์‹คํ–‰์€ ์ธ๋ฉ”๋ชจ๋ฆฌ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. PostgreSQL ์ €์žฅ์†Œ๋Š” postgres ํ”„๋กœํ•„์—์„œ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค.

๋กœ์ปฌ PostgreSQL์€ compose.yml์˜ postgres ์„œ๋น„์Šค๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

postgres ํ”„๋กœํ•„์˜ ์Šคํ‚ค๋งˆ ๊ธฐ์ค€์€ Flyway migration์ž…๋‹ˆ๋‹ค. ์ดˆ๊ธฐ migration์€ src/main/resources/db/migration์— ๋‘๋ฉฐ, ๊ธฐ์กด src/main/resources/db/postgresql SQL ํŒŒ์ผ์€ H2 ํ…Œ์ŠคํŠธ์™€ ์ˆ˜๋™ ๋น„๊ต๋ฅผ ์œ„ํ•ด ์ผ์‹œ์ ์œผ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

React ์‚ฌ์šฉ์ž ํ™”๋ฉด๊ณผ ์šด์˜์ž manual review ์ฝ˜์†”์€ React User Frontend๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๋ฐฑ์—”๋“œ๋Š” ./gradlew bootRun์œผ๋กœ ์‹คํ–‰ํ•˜๊ณ , ํ”„๋ก ํŠธ๋Š” frontend์—์„œ npm install, npm run dev๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋กœ์ปฌ ๊ฒ€์ฆ์€ Local Test Guide๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์„œํ™” ์ „๋žต

README๋Š” ์ €์žฅ์†Œ์˜ ๊ณ„์•ฝ๊ณผ ๋ฐฉํ–ฅ์„ ๋‹ด๊ณ , ์ƒ์„ธ ๋ฌธ์„œ๋Š” GitHub Wiki๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ค‘์š”ํ•œ ๊ฒฐ์ •์˜ source of truth๋Š” ADR์ž…๋‹ˆ๋‹ค. README์™€ Wiki๋Š” ADR์„ ์š”์•ฝํ•˜๊ฑฐ๋‚˜ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ฒฐ์ • ์ž์ฒด๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‹จ๊ณ„๋ณ„ ์ž‘์—… ์™„๋ฃŒ ํ”์ ์€ Progress Reports์— ๋‚จ๊น๋‹ˆ๋‹ค. ADR์ด ์˜์‚ฌ๊ฒฐ์ • ๊ธฐ๋ก์ด๋ผ๋ฉด, Progress Reports๋Š” ๊ฐ ์ž‘์—…์—์„œ ์™„๋ฃŒ๋œ ๊ฒฐ๊ณผ, ๊ฒ€์ฆ, ๋‚จ์€ ์ผ์„ ์งง๊ฒŒ ์ถ”์ ํ•˜๋Š” ๋ฌธ์„œ์ž…๋‹ˆ๋‹ค.

ADR ์ „์ฒด ๋ชฉ๋ก๊ณผ ์ƒํƒœ๋Š” ๋‹จ์ผ ์ธ๋ฑ์Šค์—์„œ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค (ํ˜„์žฌ ์ตœ์‹  ADR-0057): ADR Index. READMEยทWiki๋Š” ์ด ์ธ๋ฑ์Šค๋ฅผ ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ณ  ๋งํฌ๋งŒ ์œ ์ง€ํ•ด ์ค‘๋ณต ๊ฐฑ์‹ ์„ ์—†์•ฑ๋‹ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ์ „์ฒด ๊ตฌ์กฐยท๋ฐ์ดํ„ฐ ํ๋ฆ„์€ Architecture Overview, ๋„๋ฉ”์ธ ์šฉ์–ด๋Š” Glossary, ์ฒ˜์Œ ์‹คํ–‰์€ **Getting Started**๋ฅผ ์ฐธ๊ณ ํ•ฉ๋‹ˆ๋‹ค.

๊ถŒ์žฅ Wiki ๊ตฌ์กฐ:

  • Home: ์ „์ฒด ์ง€๋„์™€ ํ˜„์žฌ ๋ฆด๋ฆฌ์Šค ์ƒํƒœ
  • Glossary: ๊ณ„์ •, ์ง€๊ฐ‘, ์›์žฅ, ๊ฑฐ๋ž˜, ์ •์‚ฐ ๋“ฑ ์šฉ์–ด์ง‘
  • Domain-Rules: ๋„๋ฉ”์ธ ๋ถˆ๋ณ€์‹๊ณผ ์ •์ฑ…
  • Architecture-Decisions: ADR ๋ชฉ๋ก๊ณผ ๊ฒฐ์ • ๋ฐฐ๊ฒฝ
  • Development-Workflow: ๋ธŒ๋žœ์น˜, PR, ๋ฆฌ๋ทฐ, ํ…Œ์ŠคํŠธ ๊ทœ์น™
  • Harness-Roles: ํ•˜๋„ค์Šค ์—ญํ• ๋ณ„ ์ฑ…์ž„๊ณผ ์ฒดํฌ ๊ธฐ์ค€
  • QA-Scenarios: QA ๊ด€์ ์˜ ์‹œ๋‚˜๋ฆฌ์˜ค์™€ ๊ฒฝ๊ณ„๊ฐ’
  • Release-Notes: ๋ฆด๋ฆฌ์Šค๋ณ„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊ณผ ์•Œ๋ ค์ง„ ๋ฆฌ์Šคํฌ
  • MCP-and-Skills: ์‚ฌ์šฉํ•  MCP ์„œ๋ฒ„์™€ ์ปค์Šคํ…€ ์Šคํ‚ฌ ๋ชฉ๋ก

ADR์€ ๋‹ค์Œ ํ˜•์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

# ADR-0001: ๊ฒฐ์ • ์ œ๋ชฉ

## ์ƒํƒœ
Proposed | Accepted | Deprecated | Superseded

## ๋งฅ๋ฝ
๋ฌธ์ œ์™€ ์ œ์•ฝ ์กฐ๊ฑด

## ์„ ํƒ์ง€
๋Œ€์•ˆ A / B / C

## ๊ฒฐ์ •
์„ ํƒํ•œ ๋ฐฉ์‹

## ๊ฒฐ๊ณผ
์žฅ์ , ๋‹จ์ , ํ›„์† ์ž‘์—…

๋ฆด๋ฆฌ์Šค ๊ด€๋ฆฌ

์ดˆ๊ธฐ ๋ฒ„์ „์€ 0.x๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

  • v0.1.0: ํ”„๋กœ์ ํŠธ ์Šค์บํด๋”ฉ, ๊ธฐ๋ณธ CI, ํšŒ์›/์ง€๊ฐ‘ ๊ณ„์ • ๋ผˆ๋Œ€
  • v0.2.0: ์ž”์•ก ์กฐํšŒ, ๊ฑฐ๋ž˜ ๋‚ด์—ญ, ํšŒ์›/์ง€๊ฐ‘ ๊ณ„์ •, ์ถฉ์ „/์†ก๊ธˆ 1์ฐจ
  • v0.3.0: ์›์žฅ ๋ชจ๋ธ, ๊ฐ์‚ฌ ๋กœ๊ทธ, PostgreSQL ์ €์žฅ์†Œ ํ›„๋ณด
  • v0.4.0: ์›์žฅ ๋ชจ๋ธ, ๊ฐ์‚ฌ ๋กœ๊ทธ
  • v0.5.0: PostgreSQL ์Šคํ‚ค๋งˆ migration, ์ •์‚ฐ ๋ฐฐ์น˜ ํ›„๋ณด
  • v0.6.0: outbox ์žฌ์ฒ˜๋ฆฌ, manual review, requeue ๊ฐ์‚ฌ ์ด๋ ฅ, ์ฒซ GitHub Release ๊ธฐ์ค€์„ 
  • v0.7.0: 1์ฐจ MVP ์‹œ์—ฐ ๊ธฐ์ค€์„ 
  • unreleased: v0.7.0 ์ดํ›„ ๋ณ€๊ฒฝ ํ›„๋ณด

ํ˜„์žฌ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ:

๋ฆด๋ฆฌ์Šค ๋…ธํŠธ์—๋Š” ๋ฐ˜๋“œ์‹œ ๋‹ค์Œ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.

  • ํฌํ•จ๋œ ๊ธฐ๋Šฅ
  • ๋ณ€๊ฒฝ๋œ ๋„๋ฉ”์ธ ๊ทœ์น™
  • ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ํ•„์š” ์—ฌ๋ถ€
  • ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ
  • ์•Œ๋ ค์ง„ ๋ฆฌ์Šคํฌ
  • ๋‹ค์Œ ๋ฆด๋ฆฌ์Šค ํ›„๋ณด

MCP์™€ ์Šคํ‚ฌ ๊ณ„ํš

ํ•„์š”ํ•  ๋•Œ๋งŒ ์—ฐ๊ฒฐํ•˜๊ณ , ์—ฐ๊ฒฐ ๋ชฉ์ ๊ณผ ๊ถŒํ•œ ๋ฒ”์œ„๋ฅผ ๋ฌธ์„œํ™”ํ•ฉ๋‹ˆ๋‹ค.

ํ›„๋ณด ๋ชฉ์  ๋„์ž… ์‹œ์ 
GitHub MCP Issue, PR, Wiki, Release ์ž‘์—… ์ž๋™ํ™” GitHub ์ž‘์—…๋Ÿ‰์ด ๋Š˜์–ด๋‚  ๋•Œ
PostgreSQL MCP ์Šคํ‚ค๋งˆ ํƒ์ƒ‰, ์ฟผ๋ฆฌ ์ ๊ฒ€, ํ…Œ์ŠคํŠธ ๋ฐ์ดํ„ฐ ํ™•์ธ DB ๋ชจ๋ธ์ด ์ƒ๊ธด ๋’ค
๊ณต์‹ ๋ฌธ์„œ ๊ฒ€์ƒ‰ ์Šคํ‚ฌ Java, Spring, Gradle ๋ณ€๊ฒฝ์‚ฌํ•ญ ํ™•์ธ ๋ฒ„์ „ ์„ ํƒ ๋˜๋Š” ์—…๊ทธ๋ ˆ์ด๋“œ ํŒ๋‹จ ์‹œ
ํ•€ํ…Œํฌ ๋„๋ฉ”์ธ ์Šคํ‚ฌ ์›์žฅ, ๋ฉฑ๋“ฑ์„ฑ, ์ •์‚ฐ, ํ•œ๋„ ์ •์ฑ… ์ฒดํฌ๋ฆฌ์ŠคํŠธํ™” ๋„๋ฉ”์ธ ๊ทœ์น™์ด ๋ฐ˜๋ณต๋  ๋•Œ
QA ์‹œ๋‚˜๋ฆฌ์˜ค ์Šคํ‚ฌ ๊ฒฝ๊ณ„๊ฐ’, ์‹คํŒจ ์ฃผ์ž…, ํšŒ๊ท€ ์ผ€์ด์Šค ์ƒ์„ฑ ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ˆ„์ ๋  ๋•Œ

MCP ๋˜๋Š” ์Šคํ‚ฌ์€ ํŽธ์˜๋ฅผ ์œ„ํ•œ ๋„๊ตฌ์ด๋ฉฐ, ์ €์žฅ์†Œ์˜ ๊ฒฐ์ • ๊ทผ๊ฑฐ๋ฅผ ๋Œ€์ฒดํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ํŒ๋‹จ์€ Issue, PR, ADR, Wiki์— ๋‚จ๊น๋‹ˆ๋‹ค.

Codex ์Šคํ‚ฌ ์Šค๋ƒ…์ƒท

ํ”„๋กœ์ ํŠธ์—์„œ ์‹ค์ œ ์‚ฌ์šฉํ•œ ์Šคํ‚ฌ์€ project-skills/์— ์Šค๋ƒ…์ƒท์œผ๋กœ ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค. Codex ์ž๋™ ๋ฐœ๊ฒฌ์ด ํ•„์š”ํ•˜๋ฉด ํ•„์š”ํ•œ ์Šคํ‚ฌ ํด๋”๋งŒ $CODEX_HOME/skills ๋˜๋Š” ~/.codex/skills๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰์‹œ ์ง„ํ–‰ํ•  ์ฒซ ์ž‘์—…

  1. ์ž”์•ก/๊ฑฐ๋ž˜๋‚ด์—ญ ์ฒซ Issue ์ดˆ์•ˆ์„ GitHub Issue๋กœ ์˜ฎ๊น๋‹ˆ๋‹ค.
  2. Java 25, Spring Boot, Gradle ๊ธฐ์ค€์˜ ํ”„๋กœ์ ํŠธ ์Šค์บํด๋”ฉ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ธฐ๋ณธ CI์—์„œ test์™€ check๋ฅผ ์‹คํ–‰ํ•˜๋„๋ก ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  4. ์ž”์•ก/๊ฑฐ๋ž˜๋‚ด์—ญ ์กฐํšŒ API์˜ ์ฝ”๋“œ์™€ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
  5. ์ฒซ ADR๋กœ Spring Boot 4.x vs 3.5.x์™€ Gradle 9.x vs 8.14+ ์„ ํƒ์„ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค.

์™„๋ฃŒ ์ •์˜

๊ฐ ์ž‘์—…์€ ๋‹ค์Œ์„ ๋ชจ๋‘ ๋งŒ์กฑํ•ด์•ผ ์™„๋ฃŒ์ž…๋‹ˆ๋‹ค.

  • Issue์— ์ˆ˜์šฉ ๊ธฐ์ค€์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ตฌํ˜„ ์ฝ”๋“œ์™€ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๊ฐ€ ํ•จ๊ป˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋„๋ฉ”์ธ ๊ทœ์น™์ด ์ฝ”๋“œ ๋˜๋Š” ๋ฌธ์„œ์— ๋ฐ˜์˜๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๊ฐ€ ํ•„์š”ํ•œ ๊ฒฐ์ •์€ ADR ๋˜๋Š” PR์— ๊ธฐ๋ก๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฆฌ๋ทฐ์™€ QA ์ฒดํฌ๊ฐ€ ์™„๋ฃŒ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ฆด๋ฆฌ์Šค ๋Œ€์ƒ์ด๋ฉด ๋ฒ„์ „๊ณผ ๋ฆด๋ฆฌ์Šค ๋…ธํŠธ๊ฐ€ ๊ฐฑ์‹ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

About

ai skills or agents feat. claude

Resources

Stars

0 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors