Skip to content

42-195KM/backend

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 

History

398 Commits
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿ’ก์„œ๋น„์Šค/ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

ํ”„๋กœ์ ํŠธ ์ด๋ฏธ์ง€

All in One ํ†ตํ•ฉ ๋Ÿฌ๋‹ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. ๋Ÿฌ๋‹ ๊ธฐ๋ก ๊ด€๋ฆฌ, ํฌ๋ฃจ ํ™œ๋™, ๋Œ€ํšŒ ์‹ ์ฒญ ๋“ฑ ๋Ÿฌ๋‹๊ณผ ๊ด€๋ จ๋œ ์„œ๋น„์Šค๋“ค์„ ์•ˆ์ •์ ์œผ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๐ŸŽฏ์„œ๋น„์Šค/ํ”„๋กœ์ ํŠธ ๋ชฉํ‘œ

๋Œ€๊ทœ๋ชจ ํŠธ๋ ˆํ”ฝ ๋Œ€์‘

  • MSA ๊ตฌ์กฐ๋กœ ์žฅ์•  ๋Œ€์‘ ๋ฐ ํ™•์žฅ์„ฑ ํ™•๋ณด
  • Kafka๋ฅผ ์ด์šฉํ•ด ๊ณ ์„ฑ๋Šฅ๊ณผ ๊ณ ๊ฐ€์šฉ์„ฑ ๊ตฌํ˜„
  • Redis๋กœ ์ฒ˜๋ฆฌ ์†๋„ ํ–ฅ์ƒ

์•ˆ์ •์ ์ธ ๋ชจ๋‹ˆํ„ฐ๋ง

  • Prometheus, Grafna ์ด์šฉ
  • ์‹œ์Šคํ…œ, ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ง€ํ‘œ ๊ด€๋ฆฌ

๋ฐฐํฌ

  • Docker๋ฅผ ์ด์šฉํ•ด ์‹คํ–‰ ํ™˜๊ฒฝ ํ†ต์ผ, ๋ฐฐํฌ ๋‹จ์ˆœํ™”

๐Ÿ›  ์„ค๊ณ„๋„

  • DDD ์„ค๊ณ„ DDD๊ตฌ์กฐ

  • ํ”„๋กœ์ ํŠธ ์ธํ”„๋ผ ๊ตฌ์กฐ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ณ

๐Ÿ” ์ฃผ์š” ๊ธฐ๋Šฅ

  • ๋Ÿฌ๋‹ ๊ธฐ๋ก
    • ์‚ฌ์šฉ์ž ID, ๋‹ฌ๋ฆฐ ๊ฑฐ๋ฆฌ, ๋‹ฌ๋ฆฐ ์‹œ๊ฐ„, ํ‰๊ท  ํŽ˜์ด์Šค๋ฅผ ์ž…๋ ฅ ๋ฐ›์•„ ๊ด€๋ฆฌํ•˜๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.
    • ๋Ÿฌ๋‹ ๊ธฐ๋ก ๋“ฑ๋ก ๋ฐ ์ €์žฅ์„ ํ•ฉ๋‹ˆ๋‹ค.
    • ๋Ÿฌ๋‹ ๊ธฐ๋ก ๋“ฑ๋ก ์‹œ Kafka๋ฅผ ์ด์šฉํ•˜์—ฌ ์—…์  ์„œ๋น„์Šค๋กœ ๋Ÿฌ๋‹ ๊ธฐ๋ก ์ƒ์„ฑ ์ด๋ฒคํŠธ๋ฅผ ๋‚ ๋ฆฝ๋‹ˆ๋‹ค.
  • ๋žญํ‚น
    • ๋Ÿฌ๋‹ ๊ธฐ๋ก ๊ธฐ๋ฐ˜ ๋žญํ‚น ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.
    • ์‚ฌ์šฉ์ž๋“ค๊ฐ„ ํ˜น์€ ํฌ๋ฃจ๊ฐ„ ๊ธฐ๋ก์„ ํ™•์ธํ•˜์—ฌ, ๊ฒฝ์Ÿ์„ ๋ถ€์ถ”๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๊ฐœ์ธ ๋žญํ‚น ์‚ฐ์ •์€ ์ผ์ • ๊ธฐ๊ฐ„๋งˆ๋‹ค ๋ˆ„์  ๋‹ฌ๋ฆฐ ๊ฑฐ๋ฆฌ(Km) , ๋ˆ„์  ๋‹ฌ๋ฆฐ ์‹œ๊ฐ„ , ํ‰๊ท  ํŽ˜์ด์Šค๋กœ ๊ฐ ๋žญํ‚น์ด ์‚ฐ์ •๋ฉ๋‹ˆ๋‹ค.
    • ํฌ๋ฃจ ๋žญํ‚น ์‚ฐ์ •์€ ํฌ๋ฃจ์˜ ํ˜„์žฌ ๊ฐ€์ž…๋œ ํฌ๋ฃจ์› ์ˆ˜ , ๋ชจ์ž„์˜ ์ฐธ์—ฌ์œจ ๋“ฑ์œผ๋กœ ๋žญํ‚น์ด ์‚ฐ์ •๋ฉ๋‹ˆ๋‹ค.
    • ๋žญํ‚น์€ ์ผ์ • ๊ธฐ๊ฐ„๋งˆ๋‹ค ์Šค์ผ€์ฅด๋ง์œผ๋กœ ์Šค๋ƒ…์ƒท ํ˜•ํƒœ๋กœ ๊ธฐ๋ก๋ฉ๋‹ˆ๋‹ค.
  • ์—…์ 
    • ๋Ÿฌ๋‹ ๊ธฐ๋ก ๊ธฐ๋ฐ˜์œผ๋กœ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์—…์ ์„ ๋‹ฌ์„ฑํ–ˆ๋Š”์ง€ ํ™•์ธํ•ด์ฃผ๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.
    • ์—…์  ์„œ๋น„์Šค๋ฅผ ํ†ตํ•ด ๋Ÿฌ๋‹ ๋ชฉํ‘œ ๋‹ฌ์„ฑ์„ ์œ ๋„ํ•ด์ค๋‹ˆ๋‹ค.
    • Kafka๋ฅผ ํ†ตํ•ด ๋Ÿฌ๋‹ ๊ธฐ๋ก ์ƒ์„ฑ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์•„ ์—…์  ๋‹ฌ์„ฑ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•œ ๋’ค, ๋‹ฌ์„ฑ ์‹œ ์•Œ๋ฆผ ์„œ๋น„์Šค๋กœ ์‚ฌ์šฉ์ž๋“ค์—๊ฒŒ ์—…์  ๋‹ฌ์„ฑ ์•Œ๋ฆผ์„ ๋‚จ๊น๋‹ˆ๋‹ค.
  • ์ด์šฉ์ž ๋ณด๊ณ ์„œ (ReCap)
    • ์‚ฌ์šฉ์ž ๋Ÿฌ๋‹ ๊ธฐ๋ก ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์š”์•ฝ ๋ณด๊ณ ์„œ๋ฅผ ์ƒ์„ฑํ•ด์ฃผ๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.
    • ์‚ฌ์šฉ์ž ๋Ÿฌ๋‹ ๊ธฐ๋ก ๋ฐ์ดํ„ฐ์— ์žˆ๋Š” ์ˆ˜์น˜๋ฅผ ์ด์šฉํ•˜์—ฌ ์ด์šฉ์ž์—๊ฒŒ ์˜๋ฏธ ์žˆ๋Š” ํ†ต๊ณ„๋Ÿ‰์„ ๊ณ„์‚ฐํ•˜์—ฌ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ๋Ÿฌ๋‹ ํฌ๋ฃจ
    • ํฌ๋ฃจ ๊ธฐ๋Šฅ
      • ์ด์šฉ์ž๋“ค์ด ๋งˆ์Œ ๋งž๋Š” ์‚ฌ๋žŒ๋“ค๊ณผ ํ•จ๊ป˜ ๋Ÿฌ๋‹ ๊ฒฝํ—˜์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํฌ๋ฃจ๋ฅผ ๋ชจ์ง‘ํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ํฌ๋ฃจ์— ์ฐธ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      • ํฌ๋ฃจ ์žฅ์ด ํฌ๋ฃจ ํšŒ์›์„ ๊ด€๋ฆฌํ•˜์—ฌ ๊ฐ€์ž… ์‹ ์ฒญ์„ ๊ด€๋ฆฌํ•˜๊ณ , ์ด๋ฏธ ๊ฐ€์ž… ์ค‘์ธ ๋ฉค๋ฒ„๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
      • ํ™œ๋ฐœํ•œ ํฌ๋ฃจ ํ™œ๋™์„ ์œ„ํ•ด ํฌ๋ฃจ ๋‚ด ๋ชจ์ž„์„ ๋ชจ์ง‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ๊ณผ, ํฌ๋ฃจ์›๋“ค์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒŒ์‹œํŒ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
    • ํฌ๋ฃจ ๋‚ด ๋ชจ์ž„ ๊ธฐ๋Šฅ
      • ํฌ๋ฃจ ์ •๊ธฐ ๋ชจ์ž„์ด๋‚˜ , ํฌ๋ฃจ์›์ด ์ž์œ ๋กญ๊ฒŒ ํฌ๋ฃจ ์•ˆ์—์„œ ๋ชจ์ž„์„ ๋ชจ์ง‘ํ•˜์—ฌ ๊ฐ™์ด ๋Ÿฌ๋‹ ํ™œ๋™์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ๊ฒŒ์‹œํŒ ๊ธฐ๋Šฅ
      • ํฌ๋ฃจ ๋‚ด ์ •๋ณด ๊ฒŒ์‹œ๋ฅผ ๋‹ด๋‹นํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
      • ๊ฒŒ์‹œ๊ธ€ ์ƒ์„ฑ, ์กฐํšŒ, ๊ฒ€์ƒ‰, ์ˆ˜์ •, ์‚ญ์ œ ๊ธฐ๋Šฅ์ด ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋Œ€ํšŒ
    • ๋Œ€ํšŒ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ
      • ๊ณต์‹ ๋Œ€ํšŒ๋ฅผ ๋“ฑ๋กํ•˜์—ฌ ๋Ÿฌ๋„ˆ๋“ค์—๊ฒŒ ๋Œ€ํšŒ ์ฐธ๊ฐ€๋ฅผ ์œ ๋„ํ•ด์ฃผ๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.
      • ๋Œ€ํšŒ ์ƒ์„ฑ, ์กฐํšŒ, ๊ฒ€์ƒ‰, ์ˆ˜์ •, ์‚ญ์ œ ๊ธฐ๋Šฅ์ด ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
      • ์ฃผ์ตœ์ž๋ณ„ ๋Œ€ํšŒ ๊ด€๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
      • ์„ ์ฐฉ์ˆœ/์ถ”์ฒจ ๋ฐฉ์‹์˜ ๋‹ค์–‘ํ•œ ์ ‘์ˆ˜ ์œ ํ˜• ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
    • ์ฐธ๊ฐ€ ์‹ ์ฒญ ํ”„๋กœ์„ธ์Šค
      • Saga Pattern์„ ํ™œ์šฉํ•˜์—ฌ ๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜์„ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
      • ์•ฝ๊ด€ ๋™์˜ โ†’ ๊ธฐ๋…ํ’ˆ ์„ ํƒ โ†’ ๋ฐฐ์†ก์ง€ ์ž…๋ ฅ โ†’ ๊ฒฐ์ œ โ†’ ์ฐธ๊ฐ€ ํ™•์ •์˜ ๋‹จ๊ณ„์  ํ”„๋กœ์„ธ์Šค๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
      • Redis๋ฅผ ํ™œ์šฉํ•œ Saga ์ƒํƒœ ๊ด€๋ฆฌ๋กœ ํŠธ๋žœ์žญ์…˜ ์ผ๊ด€์„ฑ ์œ ์ง€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    • ์•Œ๋ฆผ ์„œ๋น„์Šค
      • Kafka๋ฅผ ํ™œ์šฉํ•œ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ์ฑ—๋ด‡
    • ์‚ฌ์šฉ์ž์˜ ๋Ÿฐ๋‹์— ๊ด€ํ•œ ์งˆ๋ฌธ์—๋Œ€ํ•ด AI์ฑ—๋ด‡์ด ๋ฏธ๋ฆฌ ์ €์žฅ๋œ ๋Ÿฐ๋‹์ •๋ณด๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
      • ๊ด€๋ฆฌ์ž๊ฐ€ vector storeํ…Œ์ด๋ธ” ์ €์žฅ API๋ฅผ ์ด์šฉํ•ด์„œ ๋Ÿฐ๋‹๊ด€๋ จ ์ •๋ณด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
      • ์‚ฌ์šฉ์ž๊ฐ€ ์งˆ๋ฌธ์„ ์š”์ฒญํ•˜๋ฉด ์‚ฌ์šฉ์ž์˜ ์งˆ๋ฌธ๊ณผ ์œ ์‚ฌ๋„๊ฐ€ ๋น„์Šทํ•œ ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
      • ํ”„๋กฌํ”„ํŠธ ์—”์ง€๋‹ˆ๋ง์˜ ํŽ˜๋ฅด์†Œ๋‚˜ ํŒจํ„ด์„ ์ ์šฉํ•ด AI์— ๋Ÿฐ๋‹ ์„ ์ˆ˜ ์ถœ์‹  ์ฝ”์น˜๋ผ๋Š” ์—ญํ• ์„ ๋ถ€์—ฌํ•˜์—ฌ ๋‹ต๋ณ€์˜ ์ •ํ™•๋„๋ฅผ ๋†’์ž…๋‹ˆ๋‹ค.
      • ์ƒ์„ฑ๋œ ๋‹ต๋ณ€์„ SSE๋กœ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.
  • ์•Œ๋ฆผ
    • ์—…์  ๋‹ฌ์„ฑ, ๋Œ€ํšŒ ์‹ ์ฒญ ์™„๋ฃŒ ๋“ฑ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ์‹œ Slack์œผ๋กœ ์•Œ๋ฆผ ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
      • ์•Œ๋ฆผ ์„œ๋น„์Šค์—์„œ Kafka ์ปจ์Šˆ๋จธ๋ฅผ ํ†ตํ•ด ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›๊ณ  Slack API๋ฅผ ํ˜ธ์ถœํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.
      • Kafka์ปจ์Šˆ๋จธ Lag, ๋ฉ”์‹œ์ง€ ์ „์†ก ์„ฑ๊ณต/์‹คํŒจ ๋“ฑ์„ Grafana๋Œ€์‹œ๋ณด๋“œ๋ฅผ ํ†ตํ•ด ๋ชจ๋‹ˆํ„ฐ๋ง์„ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿช„ ์ ์šฉ ๊ธฐ์ˆ 

์นดํ…Œ๊ณ ๋ฆฌ ๊ธฐ์ˆ  ๋ฒ„์ „ ๊ทผ๊ฑฐ/ ๋ชฉ์ 
์–ธ์–ด Java 17 LTS ์ง€์› ์ตœ์‹  ์–ธ์–ด
๋นŒ๋“œ Gradle 1.1.7 ๋นŒ๋“œ ๊ด€๋ฆฌ ์ž๋™ํ™”
ํ”„๋ ˆ์ž„์›Œํฌ Spring Boot 3.4.4 ์„ค์ • ๊ฐ„์†Œํ™”
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ Netflix Eureka Spring Cloud 2024.0.1 MSA ํ™˜๊ฒฝ์—์„œ ์„œ๋น„์Šค ์ธ์Šคํ„ด์Šค ์ž๋™ ๋“ฑ๋กยท๊ฒ€์ƒ‰
Spring Boot JPA SQL ์—†์ด๋„ ๊ฐ„๋‹จํžˆ ๊ตฌํ˜„
Spring Boot Kafka ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌํ•˜์—ฌ ์„œ๋น„์Šค ๊ฐ„ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ํ™•์žฅ์„ฑ ํ™•๋ณด
Jackson2JsonRedisSerializer JSON ํ˜•ํƒœ๋กœ ์ €์žฅยท์กฐํšŒ
Swagger(springdoc-openapi) 2.8.5 API ๋ช…์„ธ ์ž๋™ ์ƒ์„ฑ, ํ…Œ์ŠคํŠธ ํŽธ์˜์„ฑ
Infra Docker ๊ฐœ๋ฐœยทํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ์ผ์น˜
PostgreSQL ankane/pgvector:latest ๋ฒกํ„ฐ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ํฌํ•จ
Redis redis/redis-stack
Zookeeper wurstmeister/zookeeper ์˜คํ”„์…‹ ๊ด€๋ฆฌยทํŒŒํ‹ฐ์…˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์กฐ์œจ
Apache Kafka wurstmeister/kafka ๋ฉฑ๋“ฑยท์žฌ์‹œ๋„ ์„ค์ •
UI kafka-ui provectuslabs/kafka-ui
๋ชจ๋‹ˆํ„ฐ๋ง Prometheus prom/prometheus ๋ฉ”ํŠธ๋ฆญ์„ ์Šคํฌ๋ž˜ํ•‘ํ•ด ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘
Grafana grafana/grafana ๋ฉ”ํŠธ๋ฆญ์„ ๋Œ€์‹œ๋ณด๋“œํ™”
Loki grafana/loki ๋กœ๊ทธ๋ฅผ ๋ผ๋ฒจ๋งํ•ด ์ค‘์•™์ง‘์ค‘์‹ ์ €์žฅ
Micrometer Registry Prometheus ๋ชจ๋‹ˆํ„ฐ๋ง ํŒŒ์ดํ”„๋ผ์ธ์— ์—ฐ๊ฒฐ
Test Spring Boot Starter Test JUnit Platform Launcher ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ์™€ ์—ฐ๋™ ํ…Œ์ŠคํŠธ ์ง€์›

๐Ÿ‘ฅ ๊ธฐ์ˆ ์  ์˜์‚ฌ๊ฒฐ์ •

๐Ÿ‘ฅ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์ฒ˜๋ฆฌ ์ ์šฉ
Kafka๋ฅผ ์„ ํƒํ•œ ์ด์œ 

๐Ÿ‘ฅ ์ค‘๊ฐ„ ์ƒํƒœ ์ €์žฅ
Redis ๋ฅผ ์„ ํƒํ•œ ์ด์œ 

๐Ÿ”ฌ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…

๐Ÿ”ฌ Running-Record ์ƒ์„ฑ API ์ฒ˜๋ฆฌ๋Ÿ‰ ๊ฐœ์„ 
RunningRecord ์ƒ์„ฑ API์˜ ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ์›์ธ ๋ถ„์„ ๋ฐ ์ฒ˜๋ฆฌ๋Ÿ‰ ๊ฐœ์„  ๊ณผ์ •

๐Ÿ”ฌ AWS ํ™˜๊ฒฝ์— ๋ฐฐํฌ ํ›„ Spring Cloud Gateway ๊ฐ€ Eureka Client ๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ
ECS์—์„œ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ž˜๋ชป๋œ IP๋กœ Eureka์— ๋“ฑ๋ก๋˜๋Š” ๋ฌธ์ œ ๋ถ„์„ ๋ฐ ํ•ด๊ฒฐ

๐Ÿ”ฌ ์‚ฌ์šฉ์ž ์ธ์ฆ์ธ๊ฐ€ ์„œ๋ฒ„๋ถ„๋ฆฌ์™€ ๊ฒŒ์ดํŠธ์›จ์ด ์ˆœํ™˜์ฐธ์กฐ ์˜ค๋ฅ˜ FeignClient ๋นˆ ์ƒ์„ฑ ์ „์— GatewayFilter๊ฐ€ ๋จผ์ € ์ฃผ์ž…์„ ์š”๊ตฌํ•˜๋ฉด์„œ ์„œ๋กœ ์ฐธ์กฐํ•˜๋Š” ๊ตฌ์กฐ ๊ฐœ์„ 

โ™ป๏ธ CONTRIBUTORS

ํŒ€์›๋ช… ํฌ์ง€์…˜ ๋‹ด๋‹น ๊นƒํ—ˆ๋ธŒ ๋งํฌ
๊ฐ•๋ฏผ ํŒ€์› โ–ถ ๋Ÿฌ๋‹๊ธฐ๋ก
- ๋Ÿฌ๋‹๊ธฐ๋ก ์„œ๋น„์Šค๋Š” ์œ ์ € ID, ๋‹ฌ๋ฆฐ ๊ฑฐ๋ฆฌ, ๋‹ฌ๋ฆฐ ์‹œ๊ฐ„, ํ‰๊ท  ํŽ˜์ด์Šค๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ๋Ÿฌ๋‹ ๊ธฐ๋ก์œผ๋กœ ์ €์žฅํ•˜๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.
- ์›จ์–ด๋Ÿฌ๋ธ” ๋””๋ฐ”์ด์Šค์— ๋”ฐ๋ผ ๋Ÿฌ๋‹ ๊ธฐ๋ก์˜ ํ˜•์‹์ด ์•ฝ๊ฐ„์”ฉ ์ฐจ์ด๊ฐ€ ์žˆ์„ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, ์šฐ์„  ๊ณตํ†ต์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๊ธฐ๋ก์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋Ÿฌ๋‹ ๊ธฐ๋ก ํ˜•์‹์„ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
- ๋Ÿฌ๋‹ ๊ธฐ๋ก ์ƒ์„ฑ, ๋‹จ๊ฑด ์กฐํšŒ, ์ „์ฒด ๋ชฉ๋ก ์กฐํšŒ, ๊ฒ€์ƒ‰, ์‚ญ์ œ๋ฅผ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
- ๋Ÿฌ๋‹ ๊ธฐ๋ก ์ƒ์„ฑ์‹œ, ์—…์  ํ™•์ธ์„ ์œ„ํ•ด ์—…์  ์„œ๋น„์Šค์— Kafka๋ฅผ ์ด์šฉํ•˜์—ฌ ๋Ÿฌ๋‹ ๊ธฐ๋ก ์ƒ์„ฑ ์ด๋ฒคํŠธ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.
โ–ถ ์—…์ 
- ์—…์  ์„œ๋น„์Šค๋Š” ๋Ÿฌ๋‹ ๊ธฐ๋ก ๊ธฐ๋ฐ˜์œผ๋กœ ์—…์ ์„ ํ™•์ธํ•ด์ฃผ๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.
- Kafka๋ฅผ ์ด์šฉํ•˜์—ฌ ๋Ÿฌ๋‹ ๊ธฐ๋ก ์ƒ์„ฑ ์ด๋ฒคํŠธ๋ฅผ ๋ฐ›์•„ ์ด๋ฒคํŠธ ๋‚ด์šฉ์ธ ๋Ÿฌ๋‹ ๊ธฐ๋ก ์ˆ˜์น˜์™€ ์—…์  ๊ธฐ์ค€ ๋ฐ ์ˆ˜์น˜๋ฅผ ๋น„๊ตํ•˜์—ฌ ์—…์  ๋‹ฌ์„ฑ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.
- ์—…์  ๋‹ฌ์„ฑ์‹œ, ํ•ด๋‹น ์ด์šฉ์ž์—๊ฒŒ ์•Œ๋žŒ์„ ๋ณด๋‚ด๊ธฐ์œ„ํ•ด kafka๋ฅผ ์ด์šฉํ•˜์—ฌ ์•Œ๋žŒ ์ด๋ฒคํŠธ๋ฅผ ์•Œ๋žŒ ์„œ๋น„์Šค์— ๋ณด๋ƒ…๋‹ˆ๋‹ค.
- ์—…์  ํ™•์ธ ์™ธ ์—…์  ๋“ฑ๋ก, ๋‹จ๊ฑด ์กฐํšŒ, ์ „์ฒด ๋ชฉ๋ก ์กฐํšŒ, ์‚ฌ์šฉ์ž ๋ณ„ ์กฐํšŒ, ๊ฒ€์ƒ‰, ์‚ญ์ œ๋ฅผ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
๊น€๋„ํ›ˆ ํŒ€์› โ–ถ ์ฑ—๋ด‡
- Spring AI, Google Vertext AI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ RAG๊ธฐ๋ฐ˜์˜ AI์ฑ—๋ด‡ ์„œ๋น„์Šค ๊ฐœ๋ฐœํ•˜์˜€์Šต๋‹ˆ๋‹ค.
- SSE๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‘๋‹ต์„ ์‚ฌ์šฉ์ž์—๊ฒŒ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
โ–ถ ์•Œ๋ฆผ
- ๋Œ€ํšŒ, ์—…์  ๋„๋ฉ”์ธ์—์„œ ์˜ค๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” Kafka ์ปจ์Šˆ๋จธ ๊ฐœ๋ฐœํ•˜์˜€์Šต๋‹ˆ๋‹ค.
- Kafka ์ปจ์Šˆ๋จธ์—์„œ ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜์—ฌ ์Šฌ๋ž™ ๋ฉ”์‹œ์ง€ ์ „์†กํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
- Prometheus, kafka expoter, Loki, Grafana๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Kafka Lag, ๋ฉ”์‹œ์ง€ ์ „์†ก ์„ฑ๊ณต/์‹คํŒจ ๋“ฑ ๋ชจ๋‹ˆํ„ฐ๋ง ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
๊น€์žฌํ˜„ ํŒ€์žฅ โ–ถ ์‚ฌ์šฉ์ž
- ์‚ฌ์šฉ์ž ์„œ๋น„์Šค๋Š” ์œ ์ €์˜ ํšŒ์›๊ฐ€์ž… , ํšŒ์›ํƒˆํ‡ด , ํšŒ์›์ •๋ณด ์ˆ˜์ • , ํšŒ์›์ •๋ณด ์กฐํšŒ, ํšŒ์› ๊ฒ€์ƒ‰๋“ฑ์„ ์ง€์›ํ•˜๋Š” ์„œ๋น„์Šค ์ž…๋‹ˆ๋‹ค.
- ์‚ฌ์šฉ์ž ์„œ๋น„์Šค๋Š” ์ฑ…์ž„ ๋ถ„๋ฆฌ ์›์น™์— ๋”ฐ๋ผ ์ธ์ฆ(Authentication) ๋ฐ ์ธ๊ฐ€(Authorization) ๊ด€๋ จ ๊ธฐ๋Šฅ์€ ๋ณ„๋„์˜ Auth ์„œ๋น„์Šค์—์„œ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
- ์‚ฌ์šฉ์ž ์ •๋ณด ์ƒ์„ฑ, ์ˆ˜์ • , ์‚ญ์ œ๋Š” ์ธ์ฆ ์„œ๋ฒ„๋กœ Kafka ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๊ตฌ์กฐ์™€ ์•„์›ƒ๋ฐ•์Šค(outbox)ํŒจํ„ด์„ ํ™œ์šฉํ•˜์—ฌ ๋‘ ์„œ๋น„์Šค๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์„ ๋ณด์žฅํ•˜๋ฉฐ, ์žฅ์• ์‹œ์—๋„ ์ด๋ฒคํŠธ์˜ ์œ ์‹ค ์—†์ด ๋ณต๊ตฌ ๋ฐ ์žฌ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.
โ–ถ ์ธ์ฆ/์ธ๊ฐ€ & Gateway
- JWT ๊ธฐ๋ฐ˜์˜ Stateless ์ธ์ฆ ๋ฐฉ์‹ ๊ตฌํ˜„
- Spring Security๋ฅผ ์ ์šฉํ•˜์—ฌ ๋กœ๊ทธ์ธ ์‹œ, Access Token ์„ ์งง์€ ์œ ํšจ๊ธฐ๊ฐ„์œผ๋กœ ๋ฐœ๊ธ‰ํ•˜๊ณ , Refresh Token ์„ ๊ฐ™์ด ๋ฐœ๊ธ‰ํ•˜์—ฌ Redis ์— ์„œ๋ฒ„ ๋‚ด๋ถ€์— ์„ค์ •ํ•ด๋‘” ์œ ํšจ๊ธฐ๊ฐ„๋งŒํผ TTL ์„ค์ •์„ ํ•˜์—ฌ ์‚ฌ์šฉ์ž ๊ถŒํ•œ ์ •๋ณด๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ €์žฅ ๋ฐ ๊ด€๋ฆฌํ•˜์—ฌ , ์ธ์ฆ ์ฒ˜๋ฆฌ ์†๋„๋ฅผ ๊ฐœ์„ ํ•˜๊ณ  ์„œ๋ฒ„ ๋ถ€ํ•˜๋ฅผ ์ตœ์†Œํ™” ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ ๋กœ๊ทธ์•„์›ƒ์‹œ ๋˜๋Š” ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ Access Token ์„ ํƒˆ์ทจ ๋‹นํ•˜๋”๋ผ๋„ ๋” ์ด์ƒ ์ด์šฉ ํ•  ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
- ์ธ์ฆ/์ธ๊ฐ€ ์„œ๋น„์Šค๋Š” ๊ฒŒ์ดํŠธ์›จ์ด์—์„œ ์ง์ ‘ ์ „๋‹ฌ๋œ JWT Access Token ์„ ํ•„ํ„ฐ์—์„œ ๋‚ด๋ถ€ ๋กœ์ง์— ๋”ฐ๋ผ ๊ฒ€์ฆํ•˜๊ณ  , ์œ ํšจ์„ฑ์„ ํ™•์ธ ํ›„ ๋ถ„์„ํ•˜์—ฌ X-User-Id, X-User-Name, X-User-Role ๋“ฑ์˜ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ํ—ค๋”์— ์‚ฝ์ž…ํ•œ ๋’ค , ๊ฒŒ์ดํŠธ์›จ์ด์— ๋ณด๋‚ด ๊ฐ ์„œ๋น„์Šค๋กœ ์ „ํŒŒํ•˜๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
- ์ด๋ฅผ ํ†ตํ•ด ๊ฐ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค์—์„œ๋Š” ๋ณ„๋„์˜ ์ธ์ฆ ๋กœ์ง ์—†์ด ํ—ค๋”์— ํฌํ•จ๋œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ ‘๊ทผ(์—ญํ• , ๋ณธ์ธํ™•์ธ) ์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ „์ฒด ์‹œ์Šคํ…œ์—์„œ ์ค‘์•™ ์ง‘์ค‘์‹ ์ธ์ฆ ๊ตฌ์กฐ๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ๋ณด์•ˆ ์ •์ฑ…์˜ ์ผ๊ด€์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜ ํšจ์œจ์„ฑ์„ ํ™•๋ณด ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
- CheckPermission ์ด๋ผ๋Š” Custom AOP ๊ตฌํ˜„ํ•˜์—ฌ ๊ฐ ์„œ๋น„์Šค์˜ ์ปจํŠธ๋กค๋Ÿฌ ๋‹จ์—์„œ ์‚ฌ์šฉ์ž์˜ ์—ญํ• ์„ ๊ฒ€์ฆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
- Gateway์—์„œ Swagger UI๋ฅผ ์—ฐ๋™ํ•˜์—ฌ , ๊ฐ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค์˜ API๋ฅผ ์ค‘์•™์—์„œ ํ†ตํ•ฉ ๋ฌธ์„œํ™” ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
โ–ถ ๋žญํ‚น
- ๋žญํ‚น ์„œ๋น„์Šค๋Š” ์ผ์ •๊ธฐ๊ฐ„(๋งค์ฃผ ์›”์š”์ผ ์˜ค์ „ 2์‹œ) ๋งˆ๋‹ค ์Šค์ผ€์ฅด๋ง์„ ํ†ตํ•ด ๋Ÿฌ๋‹๊ธฐ๋ก ๋ฐ์ดํ„ฐ ๋˜๋Š” ํฌ๋ฃจ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์™€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•˜๊ณ  , ๋žญํ‚น์„ ์‚ฐ์ •ํ•˜์—ฌ ์ด์šฉ์ž๋“ค์˜ ๋™๊ธฐ๋ถ€์—ฌ ๋ฐ ์ž๊ทน์ด ๋  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
- ๋žญํ‚น์ด ๊ธฐ์ค€์ด ๋˜๋Š” ์ง€ํ‘œ๋Š” ๋ฆฌํ”Œ๋ž™์…˜(Reflection) ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ๊ตฌํ˜„ ํ•˜์˜€์œผ๋ฉฐ , ๊ฐœ์ธ ๋žญํ‚น์˜ ๊ฒฝ์šฐ ๋Ÿฌ๋‹ ๋ฐ์ดํ„ฐ ๊ฐ์ฒด์—์„œ ์ด ๊ฑฐ๋ฆฌ , ์ด ์‹œ๊ฐ„ , ํ‰๊ท  ํŽ˜์ด์Šค , ํฌ๋ฃจ์› ์ˆ˜ , ๋ชจ์ž„์ฐธ์—ฌ ์ธ์›๋“ฑ์˜ ํ•„๋“œ๋ฅผ ๋™์ ์œผ๋กœ ์ถ”์ถœํ•˜์—ฌ ํ•ด๋‹น ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ๋žญํ‚น์„ ์‚ฐ์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
- ๊ฐ ์„œ๋น„์Šค์˜ ์ •๋ณด๋ฅผ ์š”์ฒญํ•  ๋•Œ, ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋Š” ์‹ค์‹œ๊ฐ„์„ฑ์ด ์ค‘์š”ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— , ๋น„๋™๊ธฐ๋‚˜ ์บ์‹ฑ์ด ํ•„์š”์—†๋Š” ๋‹จ์ˆœ ์š”์ฒญ-์‘๋‹ต ๊ตฌ์กฐ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด FeignClient๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ†ต์‹ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
- ๋žญํ‚น ์‚ฐ์ •์˜ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด TreeSet ์ž๋ฃŒ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์š”์†Œ๊ฐ€ ์‚ฝ์ž…๋ ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ์ •๋ ฌ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ถ”๊ฐ€์ ์ธ ์ •๋ ฌ ์ž‘์—… ์—†์ด๋„ ์ˆœ์œ„ ์‚ฐ์ •์ด ๊ฐ€๋Šฅํ–ˆ์œผ๋ฉฐ, ๋žญํ‚น ๊ณ„์‚ฐ ์†๋„๋ฅผ ํฌ๊ฒŒ ๊ฐœ์„  ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
โ–ถkafka Interceptor & Auditing
- Kafka ํ†ต์‹  ์‹œ ๋ณ„๋„์˜ ProducerInterceptor๋ฅผ ๋งŒ๋“ค์–ด ๋ฉ”์„ธ์ง€๋ฅผ ๋ณด๋‚ผ ๋•Œ , ํ—ค๋”์˜ ์œ ์ €์˜ ์ •๋ณด๋ฅผ ๊ฐ™์ด ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค.
- Kafka๋Š” Http๊ธฐ๋ฐ˜์ด ์•„๋‹ˆ๋ฏ€๋กœ ๊ธฐ์กด์˜ AuditorAware ๊ธฐ๋ฐ˜์˜ ์ž๋™ Auditing์ด ์ ์šฉ๋˜์ง€์•Š์•˜์œผ๋ฉฐ, Kafka Consumer ์ธก์—์„œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด ๋ณ„๋„์˜ AOP(AuditorKafkaAspect) ๋ฅผ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. โ†’ ํ•ด๋‹น ์–ด๋…ธํ…Œ์ด์…˜์ด ์ ์šฉ๋œ ๋ฉ”์†Œ๋“œ์—์„  userId๋ฅผ ์ถ”์ถœํ•˜์—ฌ AuditorAwareImpl ์— ์ง์ ‘ ๋„ฃ์–ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
๊น€์ง€์ˆ˜ ํŒ€์› โ–ถ ๋Œ€ํšŒ
- ์งง์€ย ์‘๋‹ตย ์‹œ๊ฐ„,ย ย ์ˆœ์„œ๊ฐ€ย ๊ผฌ์ด์ง€ย ์•Š๋Š”ย ๋‹ค๋‹จ๊ณ„ย ํŠธ๋žœ์žญ์…˜,ย ์žฅ์• ย ๋ฐœ์ƒย ์‹œย ๋ฐ์ดํ„ฐย ์œ ์‹คย ์—†์ดย ์ •ํ™•ํžˆย ๋ณต๊ตฌ๋˜๋Š”ย ์‹ ๋ขฐ์„ฑ์„ ์œ„ํ•ดย Kafkaย +ย Sagaย ํŒจํ„ดย +ย Redisย ๋กœ ๋ถ„์‚ฐ ํŠธ๋žœ์žญ์…˜ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
- ๋Œ€ํšŒ ์‹ ์ฒญ ์š”์ฒญ ์‹œ ์‚ฌ์šฉ์žยท๋Œ€ํšŒ(paticipant_id - competition_id)ย ์กฐํ•ฉ์—ย ๋Œ€ํ•œย SagaState๋ฅผย Redis์—์„œย ์ฐพ๊ณ (์—†์œผ๋ฉดย ์ƒˆย IDย ์ƒ์„ฑ)ย ํ˜„์žฌย ์ง„ํ–‰ย ๋‹จ๊ณ„๋ฅผย ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
- CompetitionSagaOrchestrator๊ฐ€ย ํ•ด๋‹นย ๋‹จ๊ณ„์˜ย ๋„๋ฉ”์ธย ๋ฐ์ดํ„ฐ๋ฅผย ์ €์žฅํ•˜๊ณ ย ๋™์ผํ•œย sagaId๋ฅผย ํ‚ค๋กœย ํ•˜๋Š”ย Kafkaย ์ด๋ฒคํŠธ๋ฅผย competition_sagaย ํ† ํ”ฝ์—ย ๋ฐœํ–‰ํ•ฉ๋‹ˆ๋‹ค.
- SagaEventConsumer๊ฐ€ย @KafkaListener๋กœย ํ•ด๋‹นย ํŒŒํ‹ฐ์…˜์„ย ๋‹จ์ผย ์Šค๋ ˆ๋“œ๋กœย ์†Œ๋น„ํ•ฉ๋‹ˆ๋‹ค.
- Consumer๋Š”ย Redis์˜ย SagaState๋ฅผย ๊ฐฑ์‹ ํ•˜๋ฉด์„œย ์•ฝ๊ด€ย โ†’ย ๊ธฐ๋…ํ’ˆย โ†’ย ๋ฐฐ์†ก์ง€ย โ†’ย ๊ฒฐ์ œย ์‹œ์ž‘ย โ†’ย ๊ฒฐ์ œย ์™„๋ฃŒย โ†’ย ์ž๊ฒฉย ๊ฒ€์‚ฌย โ†’ย ์ฐธ๊ฐ€ย ํ™•์ •ย โ†’ย ์•Œ๋ฆผย ๋ฐœ์†กย ์ˆœ์œผ๋กœย ๋„๋ฉ”์ธย ์„œ๋น„์Šค๋ฅผย ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. (๋‹จ์ผ ์—”๋“œ ํฌ์ธํŠธ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด์„œ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.)
- ๊ฒฐ์ œย ๋‹จ๊ณ„๊ฐ€ย ์„ฑ๊ณตํ•˜๋ฉดย Consumer๋Š”ย DB์—ย ์ฐธ๊ฐ€ย ํ™•์ •์„ย ์ ์žฌํ•ฉ๋‹ˆ๋‹ค.
- Kafkaย ํ† ํ”ฝ(competition_notification)์—ย ์•Œ๋ฆผย ์ด๋ฒคํŠธ๋ฅผย ๋ฐœํ–‰ํ•ฉ๋‹ˆ๋‹ค.
- ์ค‘๋ณตย ์‹ ์ฒญย ๋˜๋Š”ย ์ •์›ย ์ดˆ๊ณผ์ฒ˜๋Ÿผย ๊ฒ€์ฆ์ดย ์‹คํŒจํ•˜๋ฉดย Consumer๊ฐ€ย ๋ณด์ƒย ์ด๋ฒคํŠธ๋ฅผย ๋งŒ๋“ค์–ดย ์—ญ์ˆœ์œผ๋กœย ์ทจ์†Œ๋ฉ๋‹ˆ๋‹ค.
โ–ถ ๋ชจ๋‹ˆํ„ฐ๋ง
- ๋Œ€ํšŒ ์‹ ์ฒญ ํ”„๋กœ์„ธ์Šค์˜ ๋‹จ๊ณ„๋ณ„ ์™„๋ฃŒ์œจ๊ณผ ์ „์ฒด ํ”„๋กœ์„ธ์Šค ์„ฑ๊ณต๋ฅ ์„ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์ค‘ ๊ณ„์ธต์˜ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
- Micrometer ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉ,๊ฐ ๋‹จ๊ณ„๋ณ„ ์นด์šดํ„ฐ๋ฅผ ์ •์˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
- Spring Boot Actuator์˜ Prometheus ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•ด ๋ฉ”ํŠธ๋ฆญ ๋ฐ์ดํ„ฐ ๋…ธ์ถœ, ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•˜์˜€์Šต๋‹ˆ๋‹ค.
- ๋‹จ๊ณ„๋ณ„ ์™„๋ฃŒ์œจ๊ณผ ์ „์ฒด ํ”„๋กœ์„ธ์Šค ์„ฑ๊ณต๋ฅ ์„ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ดPrometheus์˜ PromQL ์ฟผ๋ฆฌ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. (์•ฝ๊ด€ ๋™์˜ ๋‹จ๊ณ„์˜ ์™„๋ฃŒ์œจ = ์•ฝ๊ด€ ๋™์˜ ์™„๋ฃŒ ํšŸ์ˆ˜ / ์‹ ์ฒญ ์‹œ์ž‘ ํšŸ์ˆ˜, ์ „์ฒด ํ”„๋กœ์„ธ์Šค ์„ฑ๊ณต๋ฅ  = ์ตœ์ข… ์™„๋ฃŒ ํšŸ์ˆ˜ / ์‹ ์ฒญ ์‹œ์ž‘ ํšŸ์ˆ˜)
- Grafana ๋Œ€์‹œ๋ณด๋“œ์—์„œ ์‹œ๊ฐํ™”. ๊ฒŒ์ด์ง€ ์ฐจํŠธ๋กœ ํ˜„์žฌ ์„ฑ๊ณต๋ฅ , ์‹œ๊ณ„์—ด ๊ทธ๋ž˜ํ”„๋ฅผ ํ†ตํ•ด ์‹œ๊ฐ„์— ๋”ฐ๋ฅธ ๋ณ€ํ™” ์ถ”์ด๋ฅผ ๋ณด์—ฌ์ฃผ๋„๋ก JSON ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.
์ตœํ•ด์ธ ํ…Œํฌ๋ฆฌ๋” โ–ถ ์ด์šฉ์ž ๋ณด๊ณ ์„œ
- ์ด ์„œ๋น„์Šค๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋Ÿฌ๋‹ ํ™œ๋™์„ ๊ธฐ๋กํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ ์ด์šฉ์ž ๋ณด๊ณ ์„œ ๊ธฐ๋Šฅ์€ ์‚ฌ์šฉ์ž์˜ ๋Ÿฌ๋‹ ๊ธฐ๋ก์—์„œ ์˜๋ฏธ ์žˆ๋Š” ์ˆ˜์น˜๋ฅผ ๊ฐ€๊ณตํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ๋Š” ํ†ต๊ณ„ ์ˆ˜์น˜๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค
- ํŠน์ • ๊ธฐ๊ฐ„ ๋™์•ˆ ์‚ฌ์šฉ์ž์˜ ๋Ÿฌ๋‹ ๊ธฐ๋ก์„ ์ด์šฉํ•ด ์ฃผ๊ธฐ์ ์œผ๋กœ ์ด์šฉ์ž ๋ณด๊ณ ์„œ๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ
ํŠน์ • ๊ธฐ๊ฐ„ (์˜ˆ๋ฅผ ๋“ค์–ด, ํ•œ ์ฃผ, ํ•œ ๋‹ฌ ๋™์•ˆ)์˜ ์ถ•์ ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ฐ๋Š” ๊ณผ์ •์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด Spring Scheduler ๊ณผ Spring Batch ๋ฅผ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.
- Spring Batch ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ์“ฐ๋Š” ๊ณผ์ •๊ณผ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ์„ ๋†’ํ˜”์Šต๋‹ˆ๋‹ค.
- Spring Batch ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š” ItemReader ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•˜๋Š” ItemProcessor ์ธํ„ฐํŽ˜์ด์Šค ๊ทธ๋ฆฌ๊ณ  ๊ฐ€๊ณต๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๋Š” ItemWriter ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋ฉฐ ์ด๋ฅผ ์žฌ์ •์˜ํ•˜์—ฌ ์‚ฌ์šฉ์ž ๋ณด๊ณ ์„œ ๋ฐฐ์น˜ ์ž‘์—…(Job)์„ ๊ตฌ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.
- ์‚ฌ์šฉ์ž ๋ณด๊ณ ์„œ ๋ฐฐ์น˜ ์ž‘์—…์€ ๋‹ค๋ฅธ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค๋Š” ๋Ÿฌ๋‹ ๊ธฐ๋ก ์„œ๋น„์Šค(runningRecord-service) ๋กœ ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ApiCallStep ๊ณผ ํ†ต๊ณ„ ์ˆ˜์น˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” reCapStep ๋‘๊ฐœ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ํ•˜๋‚˜์˜ ์ž‘์—…์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
- recapStep ์€ ์‚ฌ์šฉ์ž ๊ธฐ๋ก์—์„œ ๊ฐ€๊ณตํ•˜๊ณ  ์‹ถ์€ ํ•ญ๋ชฉ๋งˆ๋‹ค ๋…๋ฆฝ์ ์ธ Step ์„ ์ƒ์„ฑํ•˜์—ฌ ๋ณ„๊ฐœ ์Šค๋ ˆ๋“œ์— ํ• ๋‹นํ•˜๊ณ  ๊ฐ ํ•ญ๋ชฉ๋งˆ๋‹ค ๋ชฉํ‘œ ํ†ต๊ณ„ ์ˆ˜์น˜๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค. (์˜ˆ: ๋Ÿฌ๋‹ ๊ธฐ๋ก์˜ ๊ฑฐ๋ฆฌ ํ•ญ๋ชฉ์œผ๋กœ๋ถ€ํ„ฐ ๋ˆ„์  ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.)
- ์„œ๋น„์Šค ๋ฐœ์ „์— ๋”ฐ๋ผ ๋ชฉํ‘œ ํ†ต๊ณ„ ์ˆ˜์น˜๊ฐ€ ๋งŽ์•„์ ธ๋„ Batch ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋„๋ก ์ „๋žต ํŒจํ„ด์„ ์ด์šฉํ•ด Step์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
โ–ถ ๋ฐฐํฌ
โ€ข AWS ํ™˜๊ฒฝ์—์„œ ๋ฐฐํฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.
โ€ข ๋ณ„๋„์˜ ํ”„๋ก ํŠธ์—”๋“œ๋Š” ์—†์ง€๋งŒ ํ™•์žฅ์„ฑ๊ณผ ์„œ๋น„์Šค ๊ฐœ๋ฐœ์˜ ๋…๋ฆฝ์„ฑ์„ ํ™•๋ณดํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ALB, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ์ธํ”„๋ผ๋ฅผ AWS Private Subnet ์„ ์ด์šฉํ•ด ๋ณ„๋„์˜ ๊ณ„์ธต์œผ๋กœ ๋ถ„๋ฆฌํ•œ ์ „ํ˜•์ ์ธ 3ํ‹ฐ์–ด ๊ณ„์ธต ์•„ํ‚คํ…์ณ๋กœ ์„ค๊ณ„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
โ€ข ์‚ฌ์šฉ์ž๊ฐ€ ๋„๋ฉ”์ธ์„ ํ†ตํ•ด API ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ธํ„ฐ๋„ท ๊ฒŒ์ดํŠธ์›จ์ด๋ฅผ ํ†ตํ•ด ํŠธ๋ž˜ํ”ฝ์ด ์ ‘๊ทผํ•˜๊ณ  Route53 ๊ณผ ์—ฐ๊ฒฐ๋œ ALB๊ฐ€ ์ด๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์žˆ๋Š” Private Subnet์œผ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค ALB์™€ ์ง์ ‘์ ์œผ๋กœ ์—ฐ๊ฒฐ๋œ ์„œ๋น„์Šค๋Š” Spring Cloud Gateway ๊ฐ€ ์žˆ๋Š” Gateway ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.
โ€ข ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ECR์— ์ €์žฅํ•œ ๊ฐ MSA ์˜ ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ECS์— ๋…๋ฆฝ์ ์ธ ํ…Œ์Šคํฌ๋กœ ์ž‘์„ฑํ•˜๊ณ  ์ด๋ฅผ ์„œ๋น„์Šค๋กœ ์‹คํ–‰์‹œํ‚ค๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐฐํฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.
โ€ข ๊ฐœ๋ฐœ์ž๊ฐ€ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  Github ์— Push ํ•˜๋ฉด Github actions ๋ฅผ ์ด์šฉํ•ด ์–ด๋А ์„œ๋น„์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š” ์ง€ ๊ฐ์ง€ํ•˜๊ณ  ํ•ด๋‹น ์„œ๋น„์Šค์— ํ•ด๋‹นํ•˜๋Š” ์ด๋ฏธ์ง€๋ฅผ ECR ์— ๋‹ค์‹œ Push ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ECS ์„œ๋น„์Šค๋ฅผ ์žฌ๋ฐฐํฌํ•ฉ๋‹ˆ๋‹ค.
โ€ข ๋กค๋ง ๋ฐฐํฌ ๋ฐฉ์‹์˜ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ๋ฅผ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„๊ณผ ์˜ˆ์‚ฐ์˜ ํ•œ๊ณ„๋กœ ํ•œ ์„œ๋น„์Šค์— ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค๋ฅผ ์‹คํ–‰ํ•˜์ง€ ๋ชปํ•ด ์‹ค์งˆ์ ์ธ ๊ฒฝํ—˜์€ ๋ชป ํ•ด๋ดค๊ณ  ์ถ”ํ›„ ๊ณ ๋„ํ™”๊ฐ€ ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
โ€ข ์ธํ”„๋ผ ๊ณ„์ธต์€ AWS RDS, AWS ElasticCache๋ฅผ ์‚ฌ์šฉํ•ด ๋กœ์ปฌ์—์„œ ์‚ฌ์šฉํ•˜๋Š” docker-compose ์˜ postgresql, ๊ณผ redis ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋Œ€์ฒดํ•˜์˜€์Šต๋‹ˆ๋‹ค.
โ€ขkafka ๋Š”EC2์— ๋ณ„๋„๋กœ ์„ค์น˜ํ•˜์—ฌ ์„œ๋ฒ„๋ฅผ ์šด์˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
โ€ข ๋ชจ๋‹ˆํ„ฐ๋ง ์„œ๋ฒ„๋ฅผ ๋‘์–ด prometus ๋ฅผ ์ด์šฉํ•ด ์„œ๋น„์Šค๋“ค์˜ ๋งคํŠธ๋ฆญ์„ ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors