Skip to content

๐Ÿ† ๋Œ€์šฉ๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ์—๋„ ํ„ฐ์ง€์ง€ ์•Š๋Š” ์ฝ˜์„œํŠธ ํ‹ฐ์ผ“ํŒ… ํ”Œ๋žซํผ

Notifications You must be signed in to change notification settings

wnsdk/can-you-get-it

ย 
ย 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐ŸŽŸ๏ธ Can you get it - ํ„ฐ์ง€์ง€ ์•Š๋Š” ํ‹ฐ์ผ“ํŒ… ํ”Œ๋žซํผ

๋กœ๊ณ  ์ด๋ฏธ์ง€



๐Ÿ‘จโ€๐Ÿ’ป ํŒ€์› ์†Œ๊ฐœ

ํŒ€๋ช… : All Back
์ €ํฌ ํŒ€์€ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋ฐฑ์—”๋“œ ๋ฐ ์ธํ”„๋ผ ๊ธฐ์ˆ ์„ ์ง‘์ค‘์ ์œผ๋กœ ๊ณต๋ถ€ํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ๊ตฌ์„ฑ๋œ ํŒ€์œผ๋กœ, 5๋ช… ์ „์›์ด ๋ชจ๋‘ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์— ์ฐธ์—ฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ทจ์ง€๋ฅผ ๋‹ด์•„ ํŒ€๋ช…์„ All Back์œผ๋กœ ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์ด๋ฆ„ ์—ญํ•  github
์„ฑ์›์ค€(ํŒ€์žฅ) Payment ์„œ๋ฒ„ ๊ฐœ๋ฐœ, Gateway ๋ฐ Eureka ์„œ๋ฒ„ ๊ฐœ๋ฐœ, CI/CD, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ ์šฉ https://github.com/wlwlsus
๊น€๋™์—ฐ User ์„œ๋ฒ„ ๊ฐœ๋ฐœ ๋ฐ ๋ฐฐํฌ, ํ…Œ์ŠคํŠธ ๋ด‡ ๊ฐœ๋ฐœ, locust ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ https://github.com/EastFlovv
๊น€์ •์ˆ˜ ํ”„๋ก ํŠธ react ๊ฐœ๋ฐœ, Concert ์„œ๋ฒ„ ๊ฐœ๋ฐœ https://github.com/kjskjs356
์œคํ˜ธ์‚ฐ Concert ์„œ๋ฒ„ ๊ฐœ๋ฐœ, Spring Batch ์ •์‚ฐ ์‹œ์Šคํ…œ ๊ฐœ๋ฐœ https://github.com/hosanyoon
์ตœ์ค€์•„ ELK Stack ๋กœ๊ทธ ์ˆ˜์ง‘ ์‹œ์Šคํ…œ ๊ตฌ์ถ•, ๋Œ€๊ธฐ์—ด ์‹œ์Šคํ…œ ๊ฐœ๋ฐœ, ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€ https://github.com/wnsdk

โœจ ์„œ๋น„์Šค ๊ฐœ์š”

ํ‹ฐ์ผ“ํŒ… ์‚ฌ์ดํŠธ Can You Get It์€ ์ฃผ์ตœ์ž๊ฐ€ ๋“ฑ๋กํ•œ ๊ณต์—ฐ๋“ค ์ค‘์—์„œ ์›ํ•˜๋Š” ๊ณต์—ฐ์˜ ์ขŒ์„์„ ์„ ํƒํ•ด ๊ฒฐ์ œํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
ํ‹ฐ์ผ“ํŒ…์˜ ํŠน์ง•์ด๋ผ๊ณ  ํ•œ๋‹ค๋ฉด, ํŠน์ •ํ•œ ์‹œ๊ฐ์— ์‚ฌ๋žŒ๋“ค์ด ํ•œ๊บผ๋ฒˆ์— ๋ชฐ๋ ค ํŠธ๋ž˜ํ”ฝ์ด ์ง‘์ค‘๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ €ํฌ ํŒ€์€ ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์—์„œ๋„ ์„œ๋ฒ„๊ฐ€ ํ„ฐ์ง€์ง€ ์•Š๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•œ ์•ˆ์ •์ ์ธ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ณ ๋ฏผํ•ด๋ณด๊ณ  ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.



๐ŸŽฎ ์„œ๋น„์Šค ์†Œ๊ฐœ

  1. ๋กœ๊ทธ์ธ

  2. ๊ณต์—ฐ ๋ชฉ๋ก ์กฐํšŒ

  3. ๊ณต์—ฐ ์˜ˆ๋งค

  4. ๋งˆ์ดํŽ˜์ด์ง€ ์กฐํšŒ ๋ฐ ์˜ˆ์•ฝ ์ทจ์†Œ

  5. ์นด์นด์˜คํŽ˜์ด๋ฅผ ํ†ตํ•œ ํฌ์ธํŠธ ์ถฉ์ „

  6. ๋Œ€๊ธฐ์—ด ์‹œ์Šคํ…œ

  • ๋Œ€๊ธฐ์—ด ํ†ต๊ณผ

  • ๋Œ€๊ธฐ์—ด ์ทจ์†Œ

  1. ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€ ์กฐํšŒ


๐ŸŽฏ ์ฃผ์š” ๊ธฐ์ˆ 

โœ” MSA

spring ์„œ๋ฒ„ ๋ฐ DB๋ฅผ ๊ธฐ๋Šฅ๋ณ„๋กœ ๋ถ„๋ฆฌ

MSA๋ž€ MicroService Architecture์˜ ์•ฝ์ž๋กœ, ๊ธฐ์กด์˜ Monolithic Architecture์˜ ํ•œ๊ณ„๋ฅผ ๋ฒ—์–ด๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋Š์Šจํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋œ ์„œ๋น„์Šค์˜ ๋ชจ์ž„์œผ๋กœ ๊ตฌ์กฐํ™”ํ•˜๋Š” ์„œ๋น„์Šค ์ง€ํ–ฅ ์•„ํ‚คํ…์ฒ˜(SOA) ์Šคํƒ€์ผ์˜ ์ผ์ข…์ธ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ์„ ํฌ๊ฒŒ 4๊ฐ€์ง€๋กœ ๋ถ„๋ฅ˜ํ•˜๊ณ , ์„œ๋ฒ„์™€ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๊ฐ ๊ธฐ๋Šฅ์— ๋งž๊ฒŒ ๋ถ„๋ฅ˜ํ•˜์—ฌ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๊ธฐ๋Šฅ Server DB
์‚ฌ์šฉ์ž User Server User DB
๊ณต์—ฐ Concert Server Concert DB
๊ฒฐ์ œ Payment Server Payment DB
๊ด€๋ฆฌ์ž Admin Server

์ €ํฌ๋Š” MSA ๋ฅผ ํ†ตํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฅ์ ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  1. ๋ฐฐํฌ
    • ์„œ๋น„์Šค๋ณ„ ๊ฐœ๋ณ„ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    • ํŠน์ • ์„œ๋น„์Šค์˜ ์š”๊ตฌ์‚ฌํ•ญ๋งŒ์„ ๋ฐ˜์˜ํ•˜์—ฌ, ๋น ๋ฅด๊ฒŒ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
  2. ํ™•์žฅ
    • ํŠน์ • ์„œ๋น„์Šค์— ๋Œ€ํ•œ ํ™•์žฅ์„ฑ(scale-out)์ด ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค ์‚ฌ์šฉ์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.
  3. ์žฅ์• 
    • ์ผ๋ถ€ ์žฅ์• ๊ฐ€ ์ „์ฒด ์„œ๋น„์Šค๋กœ ํ™•์žฅ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์ ์Šต๋‹ˆ๋‹ค.
    • ๋ถ€๋ถ„์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ์žฅ์• ์— ๋Œ€ํ•œ ๊ฒฉ๋ฆฌ๊ฐ€ ์ˆ˜์›”ํ•ฉ๋‹ˆ๋‹ค.
  4. ๊ทธ ์™ธ
    • ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์„ ์ ์šฉํ•˜๊ธฐ ์œ ์—ฐํ•ฉ๋‹ˆ๋‹ค.
    • ๊ฐ๊ฐ์˜ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ๊ตฌ์กฐ ํŒŒ์•… ๋ฐ ๋ถ„์„์ด ๋ชจ๋†€๋ฆฌ์‹ ๊ตฌ์กฐ์— ๋น„ํ•ด ์‰ฝ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ, MSA ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ ๊ธฐ๋Šฅ๊ณผ ์—ญํ• ๋ณ„๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ๋ธŒ๋žœ์น˜๋ฅผ ๊ตฌ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Branch Name Convention : (deploy/dev) - (back/front) - (service)




spring gateway ๋ฐ spring eureka

๊ธฐ๋Šฅ๋ณ„๋กœ ์„œ๋ฒ„๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ๋กœ ๋ถ„๋ฆฌํ•˜์˜€๊ธฐ ๋•Œ๋ฌธ์—, client์—์„œ server๋กœ ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ ์–ด๋–ค ์„œ๋ฒ„๋กœ ์š”์ฒญ์„ ์ „๋‹ฌํ•ด์•ผ ํ•  ์ง€ ํ˜ผ๋ž€์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €ํฌ๋Š” ๋”ฐ๋ผ์„œ gateway ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ ๋“ค์–ด์˜จ ์š”์ฒญ์„ ๋ผ์šฐํŒ…ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Spring Cloud Gateway : ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜์—์„œ API ๊ฒŒ์ดํŠธ์›จ์ด๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. API ๊ฒŒ์ดํŠธ์›จ์ด๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ๊ฐ„์˜ ํ†ต์‹ ์„ ์ค‘๊ฐœํ•˜๊ณ  ๋ผ์šฐํŒ…ํ•˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
Eureka์™€ ๊ฐ™์€ ์„œ๋น„์Šค ๋””์Šค์ปค๋ฒ„๋ฆฌ ํด๋ผ์ด์–ธํŠธ์™€ ํ†ตํ•ฉํ•˜์—ฌ ๋™์ ์œผ๋กœ ์„œ๋น„์Šค๋ฅผ ๋ฐœ๊ฒฌ(discovery)ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Spring Cloud Eureka : ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ๋งŽ์€ ์ˆ˜์˜ ์„œ๋น„์Šค ์ธ์Šคํ„ด์Šค๊ฐ€ ๋™์ ์œผ๋กœ ์ƒ์„ฑ๋˜๊ณ  ์ œ๊ฑฐ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋Ÿฌํ•œ ์„œ๋น„์Šค๋“ค์„ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. Eureka๋Š” ์ด๋Ÿฌํ•œ ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
์„œ๋น„์Šค ์ธ์Šคํ„ด์Šค๋“ค์€ Eureka ์„œ๋ฒ„์— ์ž์‹ ์˜ ์ •๋ณด๋ฅผ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๋Š” Eureka ์„œ๋ฒ„์— ๋“ฑ๋ก๋œ ์„œ๋น„์Šค๋ฅผ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋™์ ์œผ๋กœ ์„œ๋น„์Šค ์ธ์Šคํ„ด์Šค๋ฅผ ์ฐพ์•„ ์š”์ฒญ์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

eureka ์„œ๋ฒ„๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ๋„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ €ํฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์ ์šฉํ•˜๊ธฐ ์ „ ๋‹จ๊ณ„๊นŒ์ง€๋งŒ eureka ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์˜€๊ณ , ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์ ์šฉ ์ดํ›„์—๋Š” eureka ์„œ๋ฒ„๋ฅผ ์ค‘์ง€ํ•˜์˜€์Šต๋‹ˆ๋‹ค.




Feign Client๋ฅผ ์ด์šฉํ•œ ์„œ๋ฒ„ ๊ฐ„ ํ†ต์‹ 

MSA๋ฅผ ์ ์šฉํ•จ์œผ๋กœ์จ ์„œ๋ฒ„๋“ค์ด ๊ธฐ๋Šฅ๋ณ„๋กœ ๋ถ„๋ฆฌ๋จ์— ๋”ฐ๋ผ ๊ฐ ์„œ๋ฒ„๋Š” ์ž์‹ ์ด ๊ด€ํ• ํ•˜๋Š” DB์—๋งŒ ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋กœ ์ธํ•ด ์ž์‹ ์ด ๊ด€ํ• ํ•˜์ง€ ์•Š๋Š” DB์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•  ๊ฒฝ์šฐ, ํ•ด๋‹น DB๋ฅผ ๋‹ด๋‹นํ•˜๊ณ  ์žˆ๋Š” ์„œ๋ฒ„์—๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
์ €ํฌ๋Š” ์„œ๋ฒ„ ๊ฐ„ ํ†ต์‹ ์„ ํ•˜๊ธฐ ์œ„ํ•ด Feign Client๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ์กด์˜ RestTemplate ๋ณด๋‹ค Rest API๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ์„ค์ •์„ ๊ฐ„์†Œํ™”ํ•˜์˜€๊ณ , ์ด๋กœ ์ธํ•ด ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง์— ๋” ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

  • Feign - Netflix ์—์„œ ๊ฐœ๋ฐœ๋œ Http client binder
  • ์›น ์„œ๋น„์Šค ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋ณด๋‹ค ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•˜์—ฌ ์‚ฌ์šฉ
  • interface ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  annotation ์„ ์„ ์–ธํ•˜์—ฌ ์‚ฌ์šฉ
  • @EnableFeignClients ์„ ํ†ตํ•ด @FeignClient์˜ ๊ตฌํ˜„์ฒด๋ฅผ ๊ตฌํ˜„




โœ” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค

๋„์ปค ์ปจํ…Œ์ด๋„ˆ ์˜ค์ผ€์ŠคํŠธ๋ ˆ์ด์…˜




์˜คํ†  ์Šค์ผ€์ผ๋ง

์ ‘์€ ๋‚ด์šฉ




๋กค๋ง ์—…๋ฐ์ดํŠธ๋ฅผ ํ†ตํ•œ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ




ํ—ฌ๋ฆ„์ฐจํŠธ๋ฅผ ์ด์šฉํ•œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ

์ ‘์€ ๋‚ด์šฉ




โœ” ํ…Œ์ŠคํŠธ ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง

locust๋ฅผ ์ด์šฉํ•œ ํ‹ฐ์ผ“ํŒ… ๋ด‡ ๋ฐ ์„ฑ๋Šฅํ…Œ์ŠคํŠธ

ํ‹ฐ์ผ“ํŒ… ์„œ๋น„์Šค์˜ ํŠน์„ฑ์ƒ, ํŠน์ •ํ•œ ์‹œ๊ฐ์— ๋Œ€๋Ÿ‰์˜ ํŠธ๋ž˜ํ”ฝ์„ ๋ฐœ์ƒ์‹œํ‚ค๊ณ  ์„ฑ๋Šฅ์„ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ €ํฌ ํŒ€์—์„œ๋Š” locust๋ฅผ ์ฑ„ํƒํ•˜์—ฌ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค. locust๋ฅผ ์‚ฌ์šฉํ•  ๊ฒฝ์šฐ, ์–ด๋–ค ๋™์ž‘(Task)์œผ๋กœ ์„œ๋ฒ„์— ๋ถ€ํ•˜๋ฅผ ๊ฐ€ํ•  ๊ฒƒ์ธ์ง€ python ์ฝ”๋“œ๋กœ ์ปค์Šคํ…€ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๊ณ  ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฑ„ํƒํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

locust๋ฅผ ํ†ตํ•ด ๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ์™€ ๋ถ€ํ•˜ ํ…Œ์ŠคํŠธ๋ฅผ ๋™์‹œ์— ์ง„ํ–‰ํ•˜์˜€์œผ๋ฉฐ, ๊ฐ ์š”์ฒญ๋“ค์˜ ํ‰๊ท  ์‘๋‹ต์‹œ๊ฐ„๊ณผ ์ดˆ๋‹น ์š”์ฒญ ํšŸ์ˆ˜(RPS)๋ฅผ ์‰ฝ๊ฒŒ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, master / slave ๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ๋™์‹œ์— ์—ฌ๋Ÿฌ request๋ฅผ server๋กœ ์ „๋‹ฌํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๊ณต์—ฐ ์„ ํƒ๋ถ€ํ„ฐ ์ขŒ์„ ๊ฒฐ์ œ๊นŒ์ง€์˜ ์ผ๋ จ์˜ ๊ณผ์ •์„ ์ˆœ์ฐจ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ํ‹ฐ์ผ“ํŒ… ๋ด‡ python ์ฝ”๋“œ์˜ task๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • get_concert_info : ๊ณต์—ฐ ์ •๋ณด ์กฐํšŒ
  • check_seat : ๋‚จ์€ ์ขŒ์„ ์ˆ˜ ์กฐํšŒ, ๋‚จ์€ ์ขŒ์„์ด ์—†์œผ๋ฉด ํ…Œ์ŠคํŠธ ์ค‘์ง€
  • change_seat_state : ์ ์œ ๋œ ์ขŒ์„ ๋ชฉ๋ก์„ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์ ์œ ๋˜์ง€ ์•Š์€ ์ขŒ์„์„ ์„ ํƒํ•˜๊ณ  ์ ์œ ํ•จ
  • commit_reservation : ์ด์ „ task์—์„œ ์ ์œ ํ•œ ์ขŒ์„์„ ์˜ˆ๋งค, ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ…Œ์ŠคํŠธ ์ค‘์ง€

์œ„ ํ‹ฐ์ผ“ํŒ… ๋ด‡์„ ์ด์šฉํ•˜์—ฌ ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•œ ๊ฒฐ๊ณผ๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์—‘์…€ ํŒŒ์ผ๋กœ๋„ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.




jacoco๋ฅผ ์ด์šฉํ•œ ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€ ์ธก์ •

์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€๋ž€ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์†Œ์Šค ์ฝ”๋“œ์˜ ์–ด๋Š ์ •๋„๋ฅผ ์‹คํ–‰ํ•˜๋Š”์ง€๋ฅผ ์ธก์ •ํ•˜๋Š” ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ ์ธก์ •ํ•˜๋ฉด ๊ฐœ๋ฐœ์ž๋Š” ํ…Œ์ŠคํŠธ๋œ ์ฝ”๋“œ์˜ ๋น„์œจ์„ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ…Œ์ŠคํŠธ๋˜์ง€ ์•Š์€ ์ฝ”๋“œ ๋ถ€๋ถ„์„ ์‹๋ณ„ํ•˜์—ฌ ์ถ”๊ฐ€ ํ…Œ์ŠคํŠธ๊ฐ€ ํ•„์š”ํ•œ ์˜์—ญ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Jacoco๋Š” Java Code Coverage์˜ ์•ฝ์ž๋กœ, ๋‹ค์–‘ํ•œ ์ปค๋ฒ„๋ฆฌ์ง€ ๋ฉ”ํŠธ๋ฆญ์„ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•œ ์˜คํ”ˆ ์†Œ์Šค ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. Jacoco๋Š” ๋Ÿฐํƒ€์ž„์— ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹คํ–‰ ๊ฒฝ๋กœ๋ฅผ ์ถ”์ ํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋œ ์ฝ”๋“œ์™€ ํ…Œ์ŠคํŠธ๋˜์ง€ ์•Š์€ ์ฝ”๋“œ์˜ ํ†ต๊ณ„๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ €ํฌ ํŒ€์—์„œ๋Š” TDD์˜ ์ค‘์š”์„ฑ์„ ์ธ์ง€ํ•˜๊ณ , ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋”์šฑ ์ž˜ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด jacoco๋ฅผ ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.


์œ„ ๊ทธ๋ฆผ์€ Concert ์„œ๋ฒ„์˜ Test Summary์ž…๋‹ˆ๋‹ค. Gradle์„ ํ†ตํ•ด jacoco๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ณ  ๋‚œ ํ›„, build > reports > tests > test > index.html ๊ฒฝ๋กœ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์„ฑํ•œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ๋Œ€ํ•œ ์š”์•ฝ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.



๋งˆ์ฐฌ๊ฐ€์ง€๋กœ Concert ์„œ๋ฒ„์—์„œ Gradle์„ ํ†ตํ•ด jacoco๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ณ  ๋‚œ ํ›„, `build > reports > jacoco > test > html > index.html` ๊ฒฝ๋กœ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ์†Œ์Šค ์ฝ”๋“œ๊ฐ€ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ํ†ตํ•ด ์‹คํ–‰๋๋Š”์ง€, ์•ˆ ๋๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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




ELK Stack + kafka๋ฅผ ์ด์šฉํ•œ ๋กœ๊ทธ ์ˆ˜์ง‘

ELK๋Š” Elastic Search, Logstash, Kibana์˜ ์•ฝ์ž๋กœ, ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ  ๋ถ„์„ํ•˜๋Š” ๋„๊ตฌ ๋ชจ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. Logstash๋Š” ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ํŒŒ์ดํ”„๋ผ์ธ ๋„๊ตฌ, Elastic Search๋Š” ๊ฒ€์ƒ‰ ์—”์ง„, Kibana๋Š” ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™” ๋Œ€์‹œ๋ณด๋“œ์ž…๋‹ˆ๋‹ค.
Beats๋Š” ๊ฒฝ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘๊ธฐ๋กœ์„œ, ๋กœ๊ทธ ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ณ  ๋ฐ์ดํ„ฐ ship ์—ญํ• ๋กœ์„œ Logstash๋กœ ์ „์†กํ•ฉ๋‹ˆ๋‹ค. Beats์™€ Logstash์˜ ์—ญํ• ์ด ๊ฑฐ์˜ ํก์‚ฌํ•˜๋‹ค๊ณ ๋„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€๋งŒ, log๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ๊ฐ spring ์„œ๋ฒ„๋งˆ๋‹ค Logstash๋ฅผ ์„ค์น˜ํ•˜๊ธฐ์—๋Š” ์šฉ๋Ÿ‰์ด ๋ฌด๊ฒ๊ธฐ ๋•Œ๋ฌธ์—, Beats๋ฅผ ๋„์ž…ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
ELK + Beats๋ฅผ ํ•ฉ์นœ ์šฉ์–ด๋กœ Elastic Stack์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

ELK๋Š” ๋‹ค์–‘ํ•œ ์šฉ๋„๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ €ํฌ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๊ฐ ์„œ๋ฒ„์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•˜๋Š” ๋ชฉ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.




grafana์™€ prometheus๋ฅผ ์ด์šฉํ•œ ์ž์› ๊ด€๋ฆฌ




โœ” ์ •์‚ฐ ์‹œ์Šคํ…œ

Spring Batch๋ฅผ ์ด์šฉํ•œ ์ •์‚ฐ ์‹œ์Šคํ…œ


์ •์‚ฐ ์ˆœ์„œ

1. ๋งค์ผ ์ข…๋ฃŒ๋˜๋Š” ๊ณต์—ฐ์˜ ์ •์‚ฐ๊ธˆ์•ก์„ ๊ณ„์‚ฐ
2. ๊ฐ ๊ณต์—ฐ ๋‹ด๋‹น์ž์—๊ฒŒ ์ •์‚ฐ๊ธˆ์•ก ์ง€๊ธ‰

Spring Batch ๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ์‹œ์Šคํ…œ์˜ ์ผ์ƒ์ ์ธ ์šด์˜์— ํ•„์š”ํ•œ ๋ฐฐ์น˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‰ฝ๊ฒŒ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„๋œ ๊ฐ•๋ ฅํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๋กœ๊น…/์ถ”์ , ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ, ์ž‘์—… ์ฒ˜๋ฆฌ ํ†ต๊ณ„, ์ž‘์—… ํ”Œ๋กœ์šฐ ์ง€์ •(์ž‘์—…์„ ์žฌ์‹œ์ž‘ํ•˜๊ฑฐ๋‚˜ ์Šคํ‚ต), ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ ๋“ฑ ๋Œ€๋Ÿ‰์˜ ๋ ˆ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ธ ๊ธฐ๋Šฅ์„ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ˜•ํƒœ๋กœ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

Spiring Batch ๋ฅผ ์ด์šฉํ•œ ์ •์‚ฐ์‹œ์Šคํ…œ ๊ตฌํ˜„๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • Spring Batch ๊ด€๋ฆฌ ๋„๊ตฌ๋กœ์„œ Jenkins๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šค์ผ€์ฅด๋ง ๋ฐ ๋ฐฐ์น˜์„œ๋ฒ„ ๊ด€๋ฆฌ
  • ์กฐ๊ฑด๋ณ„ ํ๋ฆ„์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•œ FlowJob๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ Step์˜ ์ˆœ์„œ๋ฅผ ์ œ์–ด
  • Chuck ์ง€ํ–ฅ ์ฒ˜๋ฆฌ : ItemReader, ItemProcessor, ItemWriter๋ฅผ ํ†ตํ•ด Chuck ๋‹จ์œ„ ๋งŒํผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ํŠธ๋žœ์žญ์…˜์ด ๋ฐœ์ƒํ•˜๋„๋ก ๊ตฌํ˜„
  • ItemReader : ์ •์‚ฐ์ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ Chuck ๋‹จ์œ„๋กœ ์กฐํšŒ
  • ItemProcessor : ์ •์‚ฐ์ฒ˜๋ฆฌ ๋ฐ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜
  • ItemWriter : ์™„๋ฃŒ๋œ ์ •์‚ฐ๋ฐ์ดํ„ฐ ๋ฐ์ดํ„ฐ ๋“ฑ๋ก




โœ” ๋Œ€๊ธฐ์—ด ์‹œ์Šคํ…œ

kafka๋ฅผ ์ด์šฉํ•œ ๋Œ€๊ธฐ์—ด ์‹œ์Šคํ…œ

๋Œ€๊ธฐ์—ด ์‹œ์Šคํ…œ์€ client๊ฐ€ ์„œ๋น„์Šค๋ฅผ ์š”์ฒญํ–ˆ์„ ๋•Œ ์ด ์š”์ฒญ๋“ค์„ ์ฐจ๋ก€๋Œ€๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. ํ‹ฐ์ผ“ํŒ… ์‹œ๊ฐ์— ๋งž์ถ”์–ด ์ˆ˜๋งŽ์€ client๋“ค์ด ํ•œ๊บผ๋ฒˆ์— ์š”์ฒญ์„ ๋ณด๋‚ผ ๊ฒฝ์šฐ, ์„œ๋ฒ„๊ฐ€ ๋ถ€ํ•˜๋ฅผ ์ด๊ธฐ์ง€ ๋ชปํ•˜๊ณ  ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์„œ๋ฒ„ ์žฅ์• ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ์•ˆ์ •์ ์ธ ์šด์˜์„ ์œ„ํ•ด, ๋™์‹œ์— ๋ชฐ๋ฆฐ client๋“ค์˜ ์š”์ฒญ๋“ค์„ ์ฐจ๋ก€๋Œ€๋กœ ์ค„์„ ์„ธ์šฐ๊ณ  ์ฐจ๊ทผ์ฐจ๊ทผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋Œ€๊ธฐ์—ด ์‹œ์Šคํ…œ์„ ๋„์ž…ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
๋Œ€๊ธฐ์—ด ์‹œ์Šคํ…œ์„ ํ†ตํ•ด ์œ„์™€ ๊ฐ™์ด ๋‚ด ์•ž์— ๋ช‡ ๋ช…์˜ ์š”์ฒญ์ด ๋‚จ์•„์žˆ๋Š”์ง€, ๋‚ด ๋’ค์— ๋ช‡ ๋ช…์˜ ์š”์ฒญ์ด ์Œ“์—ฌ์žˆ๋Š”์ง€๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€๊ธฐ์—ด ์‹œ์Šคํ…œ์˜ client์˜ ์š”์ฒญ์€ ๋‹ค์Œ ์„ธ ๊ฐ€์ง€๋กœ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1. ์ตœ์ดˆ ์š”์ฒญ
    ์ผ๋ฐ˜ ๋‹ค๋ฅธ ์š”์ฒญ๋“ค๊ณผ ๋‹ค๋ฅผ ๋ฐ” ์—†์Šต๋‹ˆ๋‹ค. ๋งŒ์ผ ๋‚ด ์•ž์— ๋Œ€๊ธฐ์—ด์ด ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ๊ทธ ์ฆ‰์‹œ ์›ํ•˜๋Š” ์‘๋‹ต์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ๋ ‡์ง€ ์•Š๊ณ  ๋‚ด ์•ž์— ๋Œ€๊ธฐ์—ด์ด ์กด์žฌํ•  ๊ฒฝ์šฐ 307 http status code์™€ ํ•จ๊ป˜ ๋Œ€๊ธฐํ‘œ ์ •๋ณด๋ฅผ ์‘๋‹ต์œผ๋กœ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๋Œ€๊ธฐํ‘œ์—๋Š” ์•„๋ž˜ ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ์ ธ์„œ ์˜ต๋‹ˆ๋‹ค.
  • uuid : ๋Œ€๊ธฐํ‘œ ๊ณ ์œ  ๋ฒˆํ˜ธ
  • offset : kafka์— ๋‹ด๊ธด ๋Œ€๊ธฐํ‘œ ๋ ˆ์ฝ”๋“œ์˜ offset ๊ฐ’ (๋‚˜์˜ ๋Œ€๊ธฐ ์ˆœ๋ฒˆ)
  • partition : ๋‚˜์˜ ๋Œ€๊ธฐํ‘œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ๋‹ด๊ธด kafka์˜ partition ๋ฒˆํ˜ธ
  • committedOffset : ์ œ์ผ ์ตœ๊ทผ์— ์ฒ˜๋ฆฌ ์™„๋ฃŒ๋œ ๋ ˆ์ฝ”๋“œ์˜ offset ๊ฐ’
  • endOffset : ์ œ์ผ ์ตœ๊ทผ์— ์š”์ฒญ์ด ๋“ค์–ด์˜จ ๋ ˆ์ฝ”๋“œ์˜ offset ๊ฐ’
  1. ์žฌ์š”์ฒญ (polling)
    ์ตœ์ดˆ ์š”์ฒญ์—์„œ 307 ์ฝ”๋“œ๋ฅผ ์‘๋‹ต์œผ๋กœ ๋ฐ›์•˜๋‹ค๋ฉด, client๋Š” ์›๋ž˜ ์›ํ–ˆ๋˜ ์‘๋‹ต์„ ๋ฐ›์„ ๋•Œ ๊นŒ์ง€ ์„œ๋ฒ„์—๊ฒŒ ์žฌ์š”์ฒญ์„ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ์žฌ์š”์ฒญ์„ ๋ณด๋‚ผ ๋•Œ๋Š” ์ตœ์ดˆ ์š”์ฒญ์—์„œ ์‘๋‹ต๋ฐ›์•˜๋˜ ๋Œ€๊ธฐํ‘œ๋ฅผ ์š”์ฒญ ์ •๋ณด์— ํ•จ๊ป˜ ๋‹ด์•„์„œ ์ „์†กํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์ผ ๋Œ€๊ธฐํ‘œ๋ฅผ ์š”์ฒญ ์ •๋ณด์— ๋‹ด์ง€ ์•Š๊ณ  ๋ณด๋‚ธ๋‹ค๋ฉด, server์—์„œ๋Š” ํ•ด๋‹น ์š”์ฒญ์„ ์ตœ์ดˆ ์š”์ฒญ์œผ๋กœ ๊ฐ„์ฃผํ•˜๊ณ  ๋Œ€๊ธฐ์ˆœ์„œ๋ฅผ ๋งจ ๋’ค๋กœ ๋ณด๋‚ด๋ฒ„๋ฆฝ๋‹ˆ๋‹ค. ๊ณ„์†ํ•ด์„œ ์žฌ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด์„œ ๋‚ด ์ฐจ๋ก€๊ฐ€ ์™”๋Š”์ง€ ํ™•์ธํ•˜๊ณ , ๋‚ด ์ฐจ๋ก€๊ฐ€ ์™”๋‹ค๋ฉด 2xx ์‘๋‹ต ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์ •์ƒ ์‘๋‹ต์„ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์•„์ง ๋‚ด ์ฐจ๋ก€๊ฐ€ ์˜ค์ง€ ์•Š์•˜๋‹ค๋ฉด ์ตœ์ดˆ ์š”์ฒญ ๋•Œ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ 307 ์‘๋‹ต ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ๋Œ€๊ธฐํ‘œ ์ •๋ณด๋ฅผ ๊ฐฑ์‹ ํ•ด์„œ ๋ฐ›์Šต๋‹ˆ๋‹ค.
  • ๋‚ด ์•ž์— ์Œ“์ธ ์š”์ฒญ ์ˆ˜ = offset - committedOffset - 1
  • ๋‚ด ๋’ค์— ์Œ“์ธ ์š”์ฒญ ์ˆ˜ = endOffset - offset
  1. ์ทจ์†Œ ์š”์ฒญ
    client๊ฐ€ ๋Œ€๊ธฐํ‘œ๋ฅผ ๋Š์–ด๋†“์€ ํ›„, ์ •์ƒ ์‘๋‹ต์„ ๋ฐ›๊ธฐ๋„ ์ „์— ๋Œ€๊ธฐ์ค„์—์„œ ์ดํƒˆํ•  ๋•Œ ๋ณด๋‚ด๋Š” ์š”์ฒญ์ž…๋‹ˆ๋‹ค. ๋Œ€๊ธฐํ‘œ ์ทจ์†Œ ์š”์ฒญ์„ ์ „์†กํ•˜๋ฉด server์—์„œ๋Š” ํ•ด๋‹น ๋Œ€๊ธฐํ‘œ ์ˆœ์„œ๊ฐ€ ์™”์„ ๋•Œ ๊ฑด๋„ˆ๋›ฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. kafka์—์„œ๋Š” ํ•œ ๋ฒˆ ์Œ“์ธ ๋ ˆ์ฝ”๋“œ๋Š” ์‚ญ์ œ ๋ฐ ๋ณ€๊ฒฝ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ ๋กœ์ง์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.




โœ” ํ”„๋ก ํŠธ

Observer๋ฅผ ์ด์šฉํ•œ ๋ฌดํ•œ ์Šคํฌ๋กค ๊ตฌํ˜„


observer ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ํŽ˜์ด์ง€ ์œ„์น˜๊ฐ€ ํ•˜๋‹จ div๋ฅผ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‹จ div๋ฅผ ๊ฐ์ง€ํ•˜๋ฉด API ํ†ต์‹  refetch๋ฅผ ํ†ตํ•ด ๋‹ค์Œ ํŽ˜์ด์ง€์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋™์œผ๋กœ ํ˜ธ์ถœํ•จ์œผ๋กœ์จ ๋ฌดํ•œ ์Šคํฌ๋กค ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.




Recoil์„ ํ™œ์šฉํ•œ ๋กœ๊ทธ์ธ ์ •๋ณด ์œ ์ง€

๋กœ๊ทธ์ธ ํ›„ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•ด๋„ ๋กœ๊ทธ์ธ ์ •๋ณด๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Recoil ๋ณ€์ˆ˜์— ํšŒ์›์ •๋ณด๋ฅผ ๋‹ด์•„์„œ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.




โœ” ๊ธฐํƒ€

OAuth๋ฅผ ์ด์šฉํ•œ ์นด์นด์˜ค ๋กœ๊ทธ์ธ


Oauth๋ฅผ ์‚ฌ์šฉํ•ด kakao Id๋กœ ์‚ฌ์šฉ์ž ์ธ์ฆ์„ ์ง„ํ–‰
ํš๋“ํ•œ ์œ ์ € ์ •๋ณด๊ฐ€ DB์— ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ํšŒ์›๊ฐ€์ž…
ํš๋“ํ•œ ์œ ์ € ์ •๋ณด๊ฐ€ DB์— ์กด์žฌํ•˜๋ฉด JWT๋ฅผ ๋ฐœ๊ธ‰ํ•˜๊ณ  ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ
์œ ์ € ์ •๋ณด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐœ๊ธ‰ํ•œ JWT๋ฅผ OauthSuccessHandler์—์„œ Redis์— ์ €์žฅ
๋กœ๊ทธ์•„์›ƒ์‹œ Redis์—์„œ AccessToken๊ณผ RefrashToken์„ ๋ชจ๋‘ ์‚ญ์ œ




์นด์นด์˜คํŽ˜์ด ์—ฐ๋™์„ ํ†ตํ•œ ํฌ์ธํŠธ ์ถฉ์ „ ์‹œ์Šคํ…œ


ํ”„๋ก ํŠธ์—”๋“œ ์ฒ˜๋ฆฌ
์นด์นด์˜คํŽ˜์ด ์ถฉ์ „๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด cid, partner_order_id, partner_user_id, item_name, quantity, total_amount ๋“ฑ์˜ ์ •๋ณด๋ฅผ ๋‹ด์€
๋ฐ์ดํ„ฐ ๊ฐ์ฒด๋ฅผ parameter๋กœ ํ•˜์—ฌ post๋ฐฉ์‹์œผ๋กœ API ํ†ต์‹ 
์‘๋‹ต ์„ฑ๊ณต์‹œ ์ƒ์„ฑ๋˜๋Š” tid ๊ฐ’์„ localstorage์— ๋‹ด์•„ next_redirect_pc_url๋กœ ํŽ˜์ด์ง€ ์ด๋™
์นด์นด์˜คํŽ˜์ด ํŽ˜์ด์ง€ ์ด๋™ ์‹œ ๊ฒฐ์ œ ์Šน์ธ ์š”์ฐฝ : API POST ํ†ต์‹  => cid, tid, partner_order_id, partner_user_id, pg_token ๊ฐ’์ด ๋‹ด๊ธด ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ๋น„๊ต
์‘๋‹ต ์„ฑ๊ณต ์‹œ ๊ฒฐ์ œ ์Šน์ธ ์„ฑ๊ณต, ํฌ์ธํŠธ ์ถฉ์ „





๐Ÿ”ง ๊ธฐ์ˆ  ์Šคํƒ

Backend

  • intelliJ IDE
  • springboot 3.0.6
  • spring cloud netflix eureka
  • spring cloud gateway
  • spring cloud zipkin
  • spring cloud sleuth
  • spring cloud openfeign 4.0.2
  • spring Data JPA
  • spring batch
  • java 17
  • jacoco
  • mockito
  • jwt
  • junit
  • mapstruct
  • gradle
  • swagger

Data

  • mySQL
  • redis
  • AWS S3
  • kafka

Frontend

  • visual Studio Code IDE
  • reactJS 18.2.0
  • javaScript
  • recoil 0.7.7
  • nodeJS
  • axios 1.3.5
  • react-query

Infra

  • mobaxterm
  • AWS EC2
  • GKE
  • kubernetes
  • nginx
  • jenkins
  • docker
  • docker-compose

test

  • locust
  • python

monitoring

  • grafana

logging

  • elasticsearch
  • logstash
  • kibana
  • filebeat

etc

  • gitlab
  • notion
  • jira
  • mattermost


๐Ÿ“ƒ ํ”„๋กœ์ ํŠธ ์‚ฐ์ถœ๋ฌผ


๐Ÿ’‘ ํ˜‘์—… ํ™˜๊ฒฝ

Git

Git Convention

Git Message Convention

1) ๊ธฐ๋ณธ ํ˜•์‹

[commit type]: [commit message] ([jira ticket number])

ex:

add: ํ”„๋กœ์ ํŠธ ์ถ”๊ฐ€

feat: ๋กœ๊ทธ์ธ ๊ตฌํ˜„

2) commit type

๊ตฌ๋ถ„์ž ์ž‘์—… ์œ ํ˜• ์˜ˆ
add ํŒŒ์ผ ์ถ”๊ฐ€ ํ”„๋กœ์ ํŠธ๋‚˜, ์„ค์ • ํŒŒ์ผ ์ถ”๊ฐ€
feat ์ƒˆ ๊ธฐ๋Šฅ ๊ตฌํ˜„ feat: ๋ฝ์ปค ํšŒ์› ๋ชฉ๋ก ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ (S2-2345)
fix ๋ฒ„๊ทธ ์ˆ˜์ • fix: ์ƒ์  ๋ชฉ๋ก์˜ ์—๋Ÿฌ์ฒ˜๋ฆฌ ์˜ˆ์™ธ์ผ€์ด์Šค ๋Œ€์‘ (S2-2356)
docs ๋ฌธ์„œ(๋˜๋Š” ์ฃผ์„) ๊ด€๋ จ ์ž‘์—… docs: ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ์˜ต์…˜์— ๋Œ€ํ•œ ๋ฌธ์„œ ์ถ”๊ฐ€ (S2-2345)
refactor ๋ฆฌํŒฉํ„ฐ๋ง refactor: createStore์˜ ํ•จ์ˆ˜๋ฅผ ์ž‘์€ ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌ (S2-2345)
test ํ…Œ์ŠคํŠธ ๊ด€๋ จ ์ž‘์—… test: ์ƒ์  ์ƒ์„ฑ ํ…Œ์ŠคํŠธ ์ถ”๊ฐ€ (S2-2345)
chore ๊ธฐํƒ€ ์ž‘์—… chore: ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ์‹œ ์†Œ์Šค๋งต ์ƒ์„ฑํ•˜๋„๋ก ๋ณ€๊ฒฝ (S2-2334)

3) commit message

์ด๋ฒˆ ์ปค๋ฐ‹์—์„œ ์ž‘์—…ํ•œ ๋‚ด์šฉ์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

4) jira ticket number

Jira์— ๋“ฑ๋กํ•œ ์ด์Šˆ์˜ ๋ฒˆํ˜ธ๋ฅผ ์ ์Šต๋‹ˆ๋‹ค. ์—ฐ๊ด€ ํ‹ฐ์ผ“์ด ์—†๋‹ค๋ฉด ์ž‘์„ฑํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

2. ์ž‘์„ฑ ๊ทœ์น™

  • ์ œ๋ชฉ์€ 50์ž๋ฅผ ๋„˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ณธ๋ฌธ์€ ํ•œ ์ค„์— 80์ž๋ฅผ ๋„˜๊ธฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ฌธ์žฅ์˜ ๋์— ๊ตฌ๋‘์ (.)์„ ๋์— ์ฐ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋ฌธ์žฅ์€ ๋ช…์‚ฌ๋กœ ๋๋‚˜์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ œ๋ชฉ๊ณผ ๋ณธ๋ฌธ ์‚ฌ์ด๋Š” ํ•œ ์ค„์„ ๊ฐœํ–‰ํ•˜์—ฌ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

3. commit ์ž‘์„ฑ ์˜ˆ

feat: ํ”„๋ Œ์ฆˆ ์ง€์›ํ•˜๊ธฐ ๋ฒ„ํŠผ์— GA ์ด๋ฒคํŠธ ํƒœ๊ทธ ์ถ”๊ฐ€ (PP-2345)

[๋ณธ๋ฌธ] ๊ตฌ๊ธ€ ๊ด‘๊ณ ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด์„œ GA์ด๋ฒคํŠธ ํƒœ๊ทธ๊ฐ€ ์•„๋‹Œ ๊ตฌ๊ธ€ ์• ๋“œ์„ผ์Šค ์ถ”์  ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.
๋˜ํ•œ, ํ”„๋ Œ์ฆˆ ์ง€์›ํ•˜๊ธฐ ๋ฒ„ํŠผ์— ์ •์˜๋œ ์ด๋ฒคํŠธ ํƒœ๊ทธ๋ฅผ ๋ณด๋‚ด๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

Git Branch Convention

1) Branch Name ์ „๋žต

[branch name]/[๋‹ด๋‹น์ž ์ด๋‹ˆ์…œ]/[type]

ex) โ€˜๊น€๋™์—ฐ(DY)โ€™์ด oauth2 ๊ด€๋ จ ๋กœ์ง์„ ๊ฐœ๋ฐœํ•  ๊ฒฝ์šฐ ๋ธŒ๋žœ์น˜

  • feat/dy/oauth2

2) Branch Name

๊ตฌ๋ถ„์ž ์ž‘์—… ์œ ํ˜•
master ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์™„์„ฑ ์ƒํƒœ
release ๋ฐฐํฌ ์ค‘์ธ ์ƒํƒœ
develop ์˜ค๋ฅ˜ ์—†๋Š” ๊ตฌํ˜„ ์ƒํƒœ
feature ๊ฐœ๋ฐœ ์ค‘์ธ ์ƒํƒœ

3**)** Branch Type

๊ตฌ๋ถ„์ž ์ž‘์—… ์œ ํ˜•
AD ์•ˆ๋“œ๋กœ์ด๋“œ
FE WEB Front
BE Backend
BC ๋ธ”๋ก์ฒด์ธ
  • git branch ์ „๋žต

ํšŒ์˜

  • ์บ˜๋ฆฐ๋”๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ์ • ๊ด€๋ฆฌ

  • ์บ˜๋ฆฐ๋” ๋‚ด์šฉ ์„ธ๋ถ€์‚ฌํ•ญ

Notion

Jira

๋งค์ฃผ ์ธ๋‹น 40 story point ํ• ๋‹น ๋งค์ฃผ ์›”์š”์ผ ์Šคํ”„๋ฆฐํŠธ๋ฅผ ์‹œ์ž‘ํ•ด์„œ ๊ธˆ์š”์ผ์— ์ข…๋ฃŒ story -> ์‚ฐ์ถœ๋ฌผ ์—†์Œ task -> ์‚ฐ์ถœ๋ฌผ ์žˆ์Œ


About

๐Ÿ† ๋Œ€์šฉ๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ์—๋„ ํ„ฐ์ง€์ง€ ์•Š๋Š” ์ฝ˜์„œํŠธ ํ‹ฐ์ผ“ํŒ… ํ”Œ๋žซํผ

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 81.1%
  • JavaScript 13.8%
  • CSS 4.2%
  • Other 0.9%