๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ ์•„ํ‚คํ…์ฒ˜๋กœ ๊ตฌํ˜„ํ•˜๋Š” ์€ํ–‰ ์„œ๋ฒ„ ํ•ต์‹ฌ ๊ธฐ๋Šฅ [ Kotlin & Spring ]

์ด ๊ฐ•์˜๋Š” Kotlin๊ณผ Spring Boot๋ฅผ ํ™œ์šฉํ•ด ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ๋ชจ๋“ˆํ™”์˜ ๊ธฐ๋ณธ ๊ฐœ๋…๋ถ€ํ„ฐ Gradle ์„ค์ •, ๋ชจ๋“ˆ ๊ฐ„ ์˜์กด์„ฑ ๊ด€๋ฆฌ, ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ๊นŒ์ง€ ์‹ค์Šต ์ค‘์‹ฌ์œผ๋กœ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๋ณด์ž๋ถ€ํ„ฐ ์ค‘๊ธ‰ ๊ฐœ๋ฐœ์ž๊นŒ์ง€ ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ์˜ ๊ธฐ์ดˆ์™€ ์‹ค๋ฌด ์ ์šฉ์„ ๋ฐฐ์šฐ๊ณ  ์‹ถ์„ ๋•Œ ํ•ด๋‹น ๊ฐ•์˜๋ฅผ ์ฐธ๊ณ ํ•ด ์ฃผ์„ธ์š”.

(4.5) ์ˆ˜๊ฐ•ํ‰ 31๊ฐœ

์ˆ˜๊ฐ•์ƒ 245๋ช…

๋‚œ์ด๋„ ์ดˆ๊ธ‰

์ˆ˜๊ฐ•๊ธฐํ•œ ๋ฌด์ œํ•œ

์‹ค์Šต ์ค‘์‹ฌ
์‹ค์Šต ์ค‘์‹ฌ
์•„ํ‚คํ…์ฒ˜
์•„ํ‚คํ…์ฒ˜
๋ฐฑ์—”๋“œ
๋ฐฑ์—”๋“œ
๋ฐฑ์—”๋“œ๊ฐœ๋ฐœ์ž
๋ฐฑ์—”๋“œ๊ฐœ๋ฐœ์ž
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
์‹ค์Šต ์ค‘์‹ฌ
์‹ค์Šต ์ค‘์‹ฌ
์•„ํ‚คํ…์ฒ˜
์•„ํ‚คํ…์ฒ˜
๋ฐฑ์—”๋“œ
๋ฐฑ์—”๋“œ
๋ฐฑ์—”๋“œ๊ฐœ๋ฐœ์ž
๋ฐฑ์—”๋“œ๊ฐœ๋ฐœ์ž
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

๋จผ์ € ๊ฒฝํ—˜ํ•œ ์ˆ˜๊ฐ•์ƒ๋“ค์˜ ํ›„๊ธฐ

๋จผ์ € ๊ฒฝํ—˜ํ•œ ์ˆ˜๊ฐ•์ƒ๋“ค์˜ ํ›„๊ธฐ

4.5

5.0

Hoos

100% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

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

5.0

๊ฐœ๋ฐœ ์ž˜ํ•˜๊ณ  ์‹ถ๋‹ค...

85% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

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

5.0

devHand

62% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

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

์ˆ˜๊ฐ• ํ›„ ์ด๋Ÿฐ๊ฑธ ์–ป์„ ์ˆ˜ ์žˆ์–ด์š”

  • ๋ช…๋ น(Command)์™€ ์กฐํšŒ(Query)๋ฅผ ๋ถ„๋ฆฌํ•˜๋Š” CQRS ์•„ํ‚คํ…์ฒ˜

  • Spring์„ ํ™œ์šฉํ•œ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ

  • Write/Read Model ๊ฐ„ ๋ฐ์ดํ„ฐ ๋™๊ธฐํ™” ์ฒ˜๋ฆฌ

  • Prometheus + Grafana๋ฅผ ํ™œ์šฉํ•œ ์‹œ์Šคํ…œ ๋ฉ”ํŠธ๋ฆญ ๋ชจ๋‹ˆํ„ฐ๋ง

  • ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ Multi Module ํ”„๋กœ์ ํŠธ ์„ค๊ณ„

  • Multi Module์„ ํ™œ์šฉํ•œ ์ฑ…์ž„ ๋ถ„๋ฆฌ ๋ฐ ์˜์กด์„ฑ ๊ด€๋ฆฌ ์ „๋žต

์ด ๊ฐ•์˜๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ๋ถ„์€...

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


๐Ÿ›. ๋‹จ์ˆœํžˆ CRUD API๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ๋„˜์–ด, ์‹œ๊ฐ„์ด ์ง€๋‚˜๋„ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฝ๊ณ  ๋น„์ฆˆ๋‹ˆ์Šค ์„ฑ์žฅ์— ๋”ฐ๋ผ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์•„ํ‚คํ…์ฒ˜์˜ ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ์ฒด๋“ํ•ฉ๋‹ˆ๋‹ค. ๋จผ์ €, ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„(DDD)๋ฅผ ํ†ตํ•ด ๋ณต์žกํ•œ ๊ธˆ์œต ๋„๋ฉ”์ธ์„ ์ฝ”๋“œ๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ชจ๋ธ๋งํ•˜๊ณ  ๐Ÿ“, CQRS (๋ช…๋ น ์กฐํšŒ ์ฑ…์ž„ ๋ถ„๋ฆฌ) ํŒจํ„ด์„ ์ ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ๊ณผ ์กฐํšŒ๋ฅผ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์“ฐ๊ธฐ ์ž‘์—…์˜ ์•ˆ์ •์„ฑ๊ณผ ์กฐํšŒ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ผ๋Š” ๋‘ ๋งˆ๋ฆฌ ํ† ๋ผ๋ฅผ ๋ชจ๋‘ ์žก๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›๋‹ˆ๋‹ค.


์‹œ์Šคํ…œ ์ „์ฒด๊ฐ€ ํ•˜๋‚˜์˜ ์‹คํŒจ์— ๋ฌด๋„ˆ์ง€์ง€ ์•Š๋Š” ๊ฐ•๋ ฅํ•œ ํƒ„๋ ฅ์„ฑ์„ ๊ฐ–์ถ”๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๐Ÿ“จ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜(EDA)๋ฅผ ๋„์ž…ํ•˜์—ฌ ๊ฐ ๋ชจ๋“ˆ ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ  ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ํ†ต์‹ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ๋ฉฐ, ๐Ÿ”‘๋ถ„์‚ฐ ๋ฝ(Distributed Lock)์„ ํ™œ์šฉํ•ด ์—ฌ๋Ÿฌ ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ๋„ ๋ฐ์ดํ„ฐ์˜ ์ •ํ•ฉ์„ฑ์„ ์™„๋ฒฝํ•˜๊ฒŒ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ๐Ÿ›ก์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค ํŒจํ„ด์„ ๋”ํ•ด, ํŠน์ • ์„œ๋น„์Šค์˜ ์žฅ์• ๊ฐ€ ์‹œ์Šคํ…œ ์ „์ฒด๋กœ ์ „ํŒŒ๋˜๋Š” ๊ฒƒ์„ ๋ง‰๋Š” ๋ฐฉํ™”๋ฒฝ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋…ธํ•˜์šฐ๋ฅผ ์ตํžˆ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.


๋งˆ์ง€๋ง‰์œผ๋กœ, '๊ฐ'์ด ์•„๋‹Œ ๋ฐ์ดํ„ฐ์— ๊ทผ๊ฑฐํ•˜์—ฌ ์‹œ์Šคํ…œ์„ ์šด์˜ํ•˜๋Š” '๊ด€์ธก ๊ฐ€๋Šฅ์„ฑ(Observability)'์„ ํ™•๋ณดํ•ฉ๋‹ˆ๋‹ค. Prometheus์™€ Grafana๋ฅผ ์—ฐ๋™ํ•˜์—ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ•ต์‹ฌ ๋ฉ”ํŠธ๋ฆญ์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ˆ˜์ง‘ํ•˜๊ณ  ๐Ÿ“Š, ์ด๋ฅผ ์‹œ๊ฐํ™”ํ•˜์—ฌ ์ž ์žฌ์ ์ธ ๋ฌธ์ œ๋ฅผ ์‚ฌ์ „์— ํƒ์ง€ํ•˜๊ณ  ์„ฑ๋Šฅ ๋ณ‘๋ชฉ ์ง€์ ์„ ์ •ํ™•ํžˆ ์ฐพ์•„๋‚ด๋Š” ๊ธฐ์ˆ ์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค ๐Ÿฉบ.


์ด๋ก ์œผ๋กœ๋งŒ ๋๋‚˜์ง€ ์•Š๊ณ , ์‹ค์ œ ์„œ๋น„์Šค์— ๋ฐ”๋กœ ์ ์šฉ ๊ฐ€๋Šฅํ•œ ๊ธฐ์ˆ ์„ ์—ฌ๋Ÿฌ๋ถ„์˜ ๊ฒƒ์œผ๋กœ ๋งŒ๋“ค์–ด ๋ณด์„ธ์š”. ํ•จ๊ป˜ ๊ณ ๋ฏผํ•˜๊ณ , ์„ฑ์žฅํ•˜๋Š” ์‹œ๊ฐ„์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Kotlin ์™œ ๋ฐฐ์›Œ์•ผ ํ•˜์ง€..?

Spring Boot์™€ 100% ํ˜ผ์šฉ์ด ๋œ๋‹ค๊ณ  ๋งํ•˜๋ฉฐ, Jetbrain์—์„œ ๋งŒ๋“  Kotlin์ด๋ผ๋Š” ์–ธ์–ด๋Š” Spring์—์„œ ์ ํ•ฉํ•˜์ง€ ์•Š์€ ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“š๊ฐ„๊ฒฐํ•˜๊ณ  ์ง๊ด€์ ์ธ ๋ฌธ๋ฒ•


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

๐Ÿ“š ๋†’์€ ์ƒ์‚ฐ์„ฑ๊ณผ ์•ˆ์ „์„ฑ


Kotlin์€ ๋„ ์•ˆ์ •์„ฑ์„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜์—ฌ ๋„ ํฌ์ธํ„ฐ ์˜ˆ์™ธ(NullPointerException)๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ง€์›ํ•˜์—ฌ ๋ณด๋‹ค ๊ธฐ๋Šฅ์ ์ด๊ณ  ์„ ์–ธ์ ์ธ ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ๋“ค์€ ๊ฐœ๋ฐœ ์ƒ์‚ฐ์„ฑ์„ ๋†’์ด๊ณ , ๋ฒ„๊ทธ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์„ ์ค„์—ฌ์ค๋‹ˆ๋‹ค.

๐Ÿ“š ๋†’์€ ํ˜ธํ™˜์„ฑ


Kotlin์€ 100% ์ž๋ฐ”์™€ ํ˜ธํ™˜๋˜๋ฏ€๋กœ ๊ธฐ์กด ์ž๋ฐ” ํ”„๋กœ์ ํŠธ์— ์‰ฝ๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ž๋ฐ” ๊ฐœ๋ฐœ์ž๋“ค์ด Kotlin์„ ๋ฐฐ์šฐ๋Š”๋ฐ ํฐ ์žฅ๋ฒฝ์ด ์—†์œผ๋ฉฐ, ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ์ƒˆ๋กœ์šด Kotlin ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ๋‚˜๋ฉด ์ด๋Ÿฐ ๊ฒฐ๊ณผ๋ฌผ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”

๋ชจ๋“ˆํ˜• ์•„ํ‚คํ…์ฒ˜์™€ ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„ (DDD)

MSA(๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜)์˜ ๊ธฐ๋ณธ์ด ๋˜๋Š” ๋ชจ๋“ˆ ์„ค๊ณ„ ๋ฐฉ๋ฒ•๊ณผ ๋„๋ฉ”์ธ ์ฃผ๋„ ์„ค๊ณ„์— ๋Œ€ํ•ด ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ช…ํ™•ํ•˜๊ณ  ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ ์‰ฌ์šด ์ฝ”๋“œ๋กœ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›๋‹ˆ๋‹ค. ๊ฐ ๋ชจ๋“ˆ(api, core, domain, event)์ด ์–ด๋–ป๊ฒŒ ์—ญํ• ์„ ๋ถ„๋‹ดํ•˜๊ณ , ๋„๋ฉ”์ธ ๋ชจ๋ธ์„ ์ค‘์‹ฌ์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค๊ณ„ํ•˜๋Š”์ง€ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

CQRS (๋ช…๋ น ์กฐํšŒ ์ฑ…์ž„ ๋ถ„๋ฆฌ) ํŒจํ„ด

๋ฐ์ดํ„ฐ์˜ ๋ณ€๊ฒฝ(Command)๊ณผ ์กฐํšŒ(Query) ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜์—ฌ ์‹œ์Šคํ…œ์˜ ์„ฑ๋Šฅ๊ณผ ํ™•์žฅ์„ฑ์„ ๋†’์ด๋Š” CQRS ํŒจํ„ด์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค. ์“ฐ๊ธฐ ์ „์šฉ ๋ชจ๋ธ๊ณผ ์ฝ๊ธฐ ์ „์šฉ ๋ชจ๋ธ์„ ๊ฐ๊ฐ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•˜๊ณ  ์‹ค์ œ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•˜๋ฉฐ, ๋™์‹œ์„ฑ ์ด์Šˆ๋ฅผ ์ค„์ด๊ณ  ๊ฐ ๋ชจ๋ธ์— ๋งž๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์„ ํƒํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ํ•จ๊ป˜ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜ (EDA)

์‹œ์Šคํ…œ์˜ ๊ฐ ๋ถ€๋ถ„์„ ๋…๋ฆฝ์ ์ธ ์„œ๋น„์Šค๋กœ ๋งŒ๋“ค๊ณ , ์ด๋ฒคํŠธ(Event)๋ฅผ ํ†ตํ•ด ์„œ๋กœ ํ†ต์‹ ํ•˜๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›๋‹ˆ๋‹ค. ๋ชจ๋“ˆ ๊ฐ„์˜ ๊ฒฐํ•ฉ๋„๋ฅผ ๋‚ฎ์ถ”๊ณ , ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ†ตํ•ด ์ „์ฒด ์‹œ์Šคํ…œ์˜ ์‘๋‹ต์„ฑ๊ณผ ํƒ„๋ ฅ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ์›๋ฆฌ๋ฅผ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

๋ถ„์‚ฐ ์‹œ์Šคํ…œ์˜ ์•ˆ์ •์„ฑ ํ™•๋ณด (์„œํ‚ท ๋ธŒ๋ ˆ์ด์ปค)

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

๋™์‹œ์„ฑ ์ œ์–ด์™€ ๋ถ„์‚ฐ ๋ฝ (Distributed Lock)

์—ฌ๋Ÿฌ ์„œ๋ฒ„์—์„œ ๋™์‹œ์— ๊ฐ™์€ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ถ„์‚ฐ ๋ฝ์˜ ์›๋ฆฌ๋ฅผ ๋ฐฐ์›๋‹ˆ๋‹ค. Redis์™€ ๊ฐ™์€ ์™ธ๋ถ€ ์ €์žฅ์†Œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ์˜ ์ •ํ•ฉ์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•˜๊ณ  ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋™์‹œ์„ฑ ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋Šฅ๋ ฅ์„ ๊ธฐ๋ฆ…๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๊ด€์ธก (Observability)

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํŒŒ์•…ํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ์‹ ์†ํ•˜๊ฒŒ ์ง„๋‹จํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›๋‹ˆ๋‹ค. Prometheus๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”ํŠธ๋ฆญ์„ ์ˆ˜์ง‘ํ•˜๊ณ , Grafana๋ฅผ ํ†ตํ•ด ์‹œ๊ฐํ™”ํ•˜๋Š” ์ „์ฒด ๋ชจ๋‹ˆํ„ฐ๋ง ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ตฌ์ถ•ํ•˜๊ณ  ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์˜ ํˆฌ๋ช…์„ฑ์„ ๋†’์—ฌ ์šด์˜ ํšจ์œจ์„ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์•„ํ‚คํ…์ฒ˜ ๋ง›๋ณด๊ธฐ

Module๊ฐ„์˜ ์˜์กด์„ฑ

Event Sourcing

Monitoring Metrics

๊ฐ•์˜ ๋‚ด์šฉ ๋ง›๋ณด๊ธฐ

๐Ÿ“š 'Grafana๋ฅผ ํ™œ์šฉํ•œ ๋ชจ๋‹ˆํ„ฐ๋ง ๋Œ€์‹œ๋ณด๋“œ' ์ˆ˜์—… ไธญ


๐Ÿ“š 'Multi Module์„ ์œ„ํ•œ Gradle' ์ˆ˜์—… ไธญ


๐Ÿ“š '@Transactional ํ•œ๊ณ„ ๊ทน๋ณต์„ ์œ„ํ•œ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ' ์ˆ˜์—… ไธญ


๊ฐ•์˜์—์„œ ๋‹ค๋ฃจ๋Š” ๊ธฐ์ˆ  ์Šคํƒ

MySQL

์—ฐ๊ด€ ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃจ๊ธฐ ์œ„ํ•ด์„œ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์ธ MySQL์ด ์‚ฌ์šฉ์ด ๋ฉ๋‹ˆ๋‹ค.

JPA๊ตฌ์„ฑํ•˜๊ณ , Entity๋ฅผ ์ž‘์„ฑํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ๊ฐ„์˜ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋ช…์‹œํ•˜๋Š” ์ฝ”๋“œ ๋ฐฉ์‹์„ ํ†ตํ•ด ์„œ๋น„์Šค ๊ฐœ๋ฐœ์— ๋Œ€ํ•ด ์œ ์—ฐํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ ธ๊ฐ€์‹œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  • ์‹ค์ œ MySQL Database์— ์—ฐ๊ฒฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. SQL ์ฟผ๋ฆฌ๋งŒ์„ ์ž‘์„ฑํ•˜๊ณ  H2๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š”๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

Circuit Breaker

Resilience4j๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜ํ˜• ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋˜๋ฉฐ, ์„œ๋น„์Šค๋ณ„๋กœ ๋…๋ฆฝ์ ์ธ CircuitBreaker ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์žฅ์•  ์ƒํ™ฉ์— ๋Œ€ํ•œ ๊ฒฉ๋ฆฌ์™€ ๋ณต๊ตฌ๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์„œ๋น„์Šค์˜ ์‹ ๋ขฐ์„ฑ์„ ๋†’์ด๊ณ  ์žฅ์•  ์ „ํŒŒ๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

Redis

Redis์˜ ๋ถ„์‚ฐ๋ฝ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉฐ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ธ์Šคํ„ด์Šค ์ƒํ™ฉ์—์„œ ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

CQRS Architecture

๋ช…๋ น๊ณผ ์กฐํšŒ์˜ ์ฑ…์ž„์„ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด CQRS ํŒจํ„ด์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

Command์™€ Query๋ฅผ ๋ถ„๋ฆฌ๋œ ๋ชจ๋“ˆ๋กœ ๊ตฌ์„ฑํ•˜์—ฌ ๊ฐ๊ฐ์˜ ์ตœ์ ํ™”๋œ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๊ณผ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ ์ž‘์—…์˜ ๋…๋ฆฝ์ ์ธ ์Šค์ผ€์ผ๋ง๊ณผ ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค.

Event Driven Architecture

์„œ๋น„์Šค ๊ฐ„์˜ ๋А์Šจํ•œ ๊ฒฐํ•ฉ์„ ์œ„ํ•ด ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ์ด๋ฒคํŠธ ๋ฐœํ–‰-๊ตฌ๋… ํŒจํ„ด์„ ํ™œ์šฉํ•˜๋ฉฐ, ํŠธ๋žœ์žญ์…˜ ๊ฐ„์— ๋ฌด์˜๋ฏธํ•œ ๊ฒฐํ•ฉ ๊ด€๊ณ„๋ฅผ ๋А์Šจํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Multi Module Architecture

๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌ์™€ ๋ชจ๋“ˆํ™”๋ฅผ ์œ„ํ•ด ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

Gradle์„ ์‚ฌ์šฉํ•˜์—ฌ bank-api, bank-core, bank-domain ๋“ฑ์œผ๋กœ ๋ชจ๋“ˆ์„ ๋ถ„๋ฆฌํ•˜๊ณ , ๊ฐ ๋ชจ๋“ˆ์˜ ์ฑ…์ž„๊ณผ ์˜์กด์„ฑ์„ ๋ช…ํ™•ํžˆ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.

Transaction Trailing Pattern

ํŠธ๋žœ์žญ์…˜์˜ ์ผ๊ด€์„ฑ๊ณผ ์ถ”์ ์„ฑ์„ ์œ„ํ•ด Transaction Trailing ํŒจํ„ด์ด ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.

AOP๋ฅผ ํ™œ์šฉํ•˜์—ฌ ํŠธ๋žœ์žญ์…˜์˜ ์‹œ์ž‘๊ณผ ์ข…๋ฃŒ๋ฅผ ์ถ”์ ํ•˜๊ณ , ๊ฐ ํŠธ๋žœ์žญ์…˜์˜ ์ƒํƒœ์™€ ๊ฒฐ๊ณผ๋ฅผ ๋กœ๊น…ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํŠธ๋žœ์žญ์…˜์˜ ๋ชจ๋‹ˆํ„ฐ๋ง๊ณผ ๋””๋ฒ„๊น…์ด ์šฉ์ดํ•ด์ง‘๋‹ˆ๋‹ค.

Open API (Swagger)

API ๋ฌธ์„œํ™”์™€ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด OpenAPI(Swagger)๊ฐ€ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

SpringDoc OpenAPI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ API์˜ ์—”๋“œํฌ์ธํŠธ, ์š”์ฒญ/์‘๋‹ต ์Šคํ‚ค๋งˆ, ์ธ์ฆ ๋ฐฉ์‹์„ ์ž๋™์œผ๋กœ ๋ฌธ์„œํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด API์˜ ๊ฐ€๋…์„ฑ๊ณผ ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ์„ ๋†’์ด๊ณ , ํด๋ผ์ด์–ธํŠธ ๊ฐœ๋ฐœ์ž์™€์˜ ํ˜‘์—…์„ ์›ํ™œํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

์ค‘์š”ํ•˜๊ฒŒ ์—ฌ๊ธฐ๋Š” 4๊ฐ€์ง€ ๊ฐ€์น˜๊ด€

โญ• 1. ๊ฐ•์˜๋Š” ์ธ๊ฐ„์ ์ด์–ด์•ผ ํ•œ๋‹ค.

์ „๋ฌธ์„ฑ์ด ๋–จ์–ด์ง€๋Š” ๋ชจ์Šต์œผ๋กœ ์—ฌ๊ฒจ์งˆ์ง€๋ผ๋„ ๋ณด์—ฌ์ฃผ๊ธฐ ํŽธํ•œ ๊ฐ•์˜๋Š” ๊ฐ•์˜๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋””๋ฒ„๊น…๋„ ์ง„ํ–‰ํ•˜๋Š” ์‹œ๊ฐ„๋˜ํ•œ ๊ฐ•์˜์˜ ์ผ๋ถ€ ์ž…๋‹ˆ๋‹ค.

โญ• 2. ์‹ค๋ฌด์— ํŠนํ™”๋˜์–ด์•ผ ํ•œ๋‹ค

๊ฐœ๋ฐœ์€ ๋ง๋กœํ•˜๋Š”๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์‹ค์ œ ๊ตฌํ˜„์„ ํ•ด๋ณด๊ณ  ๋™์ž‘ํ•˜๋Š” ๊ณผ์ •์„ ํ•จ๊ป˜ ํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ธฐํš์ž๋ถ„๋“ค... ์‚ด๋ ค์ฃผ์„ธ์š”..

โญ• 3. ์ˆ˜๊ฐ•์ƒ ๋ถ„๋“ค์—๊ฒŒ ๋„์›€์ด ๋˜์–ด์•ผ ํ•œ๋‹ค.

์ œ๊ฐ€ ์‹ค๋ฌด์—์„œ ์ ์šฉํ•ด์„œ ํšจ๊ณผ๋ฅผ ๋ณด์•˜๋˜ ๊ฐœ๋…๋“ค์„ ๋…น์ด๊ณ ์ž ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์„ ํ†ตํ•ด์„œ ์‹ค๋ฌด๋ฅผ ๊ฐ„์ ‘์ ์œผ๋กœ ์ฒดํ—˜ํ•˜์‹œ๊ฑฐ๋‚˜ ์‹ค๋ฌด์ž๋ผ๋ฉด ์‹ค๋ฌด ํ™˜๊ฒฝ์— ๋” ๋›ฐ์–ด๋‚œ ํผํฌ๋จผ์Šค๋ฅผ ๋ณด์—ฌ์ฃผ์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โญ• 4. ๊ฐ•์˜๊ฐ€ ๋์ด ์•„๋‹ˆ๋‹ค.

๊ฐ•์˜๋ฅผ ์ง„ํ–‰ํ•˜์‹œ๋ฉด์„œ ์งˆ์˜์‘๋‹ต์„ ๋งŽ์ด ๋‚จ๊ฒจ์ฃผ์‹œ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ด ๊ฐ•์˜๋Š” ์ € ํ˜ผ์ž๋งŒ์˜ ์ง€์‹์„ ํ†ตํ•ด์„œ ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ ๋Œ€๊ธฐ์—… ๊ฐœ๋ฐœ์ž๋ถ„๋“ค์˜ ์˜๊ฒฌ๋˜ํ•œ ์ทจํ•ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๊ฐ•์˜ ์™„์„ฑ์— ๋„์›€์„ ์ฃผ์‹ ๋ถ„๋“ค์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์ด๋ ฅ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.


private val supported_one = "์นด์นด์˜คํŽ˜์ด ํ”Œ๋žซํผ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž" private val supported_two = "ํ† ์Šค์ฆ๊ถŒ API ์„œ๋ฒ„ ๊ฐœ๋ฐœ์ž" private val supported_three = "๋น„๋ฐ€๋กœ ํ•ด๋‹ฌ๋ผ๋Š” ์œ ๋‹ˆ์ฝ˜ ์Šคํƒ€ํŠธ์—… ์„œ๋ฒ„ ๊ฐœ๋ฐœ์ž"

์ˆ˜๊ฐ• ์ „ ์ฐธ๊ณ  ์‚ฌํ•ญ

์‹ค์Šต ํ™˜๊ฒฝ

  • Macos M3๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ดฌ์˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

  • Docker๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • java --version : 17.0.12 2024-07-16 LTS

  • JetBrain ๊ณ„์—ด์˜ IDE๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • Gradle์„ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ธํ”„๋ผ์— ๋Œ€ํ•ด์„œ๋Š” ๋‹ค๋ฃจ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๐Ÿ˜ ๊ฐ™์ด ๋ณด๋ฉด ์ข‹์€ ์ฃผ์ œ

์ด๋Ÿฐ ๋ถ„๋“ค๊ป˜
์ถ”์ฒœ๋“œ๋ ค์š”

ํ•™์Šต ๋Œ€์ƒ์€
๋ˆ„๊ตฌ์ผ๊นŒ์š”?

  • ๋‹จ์ˆœํ•œ CRUD์—์„œ ๋ฒ—์–ด๋‚˜ ๋ณต์žกํ•œ ๋น„์ง€๋‹ˆ์Šค ๋กœ์ง ์ฒ˜๋ฆฌ ๊ธฐ๋ฒ•์„ ๋ฐฐ์šฐ๊ณ  ์‹ถ์€ ๊ฐœ๋ฐœ์ž

  • ์„ค๊ณ„ ์—ญ๋Ÿ‰์„ ํ‚ค์šฐ๊ณ  ์‹ถ์€ ๊ฐœ๋ฐœ์ž

  • MSA ์•„ํ‚คํ…์ฒ˜์˜ ์ž…๋ฌธ์ž

  • ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜์™€ ์„œ๋น„์Šค ๋ถ„๋ฆฌ ์ „๋žต์„ ๋ฐฐ์šฐ๊ณ  ์‹ถ์€ ๊ฐœ๋ฐœ์ž

  • Spring + Kotlin์„ ํ™œ์šฉํ•œ ์‹ค๋ฌด ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐฐ์šฐ๊ณ  ์‹ถ์€ ๊ฐœ๋ฐœ์ž

์•ˆ๋…•ํ•˜์„ธ์š”
Hong์ž…๋‹ˆ๋‹ค.

7,443

๋ช…

์ˆ˜๊ฐ•์ƒ

460

๊ฐœ

์ˆ˜๊ฐ•ํ‰

142

๊ฐœ

๋‹ต๋ณ€

4.7

์ 

๊ฐ•์˜ ํ‰์ 

24

๊ฐœ

๊ฐ•์˜

์ž๊ธฐ ์†Œ๊ฐœ

์ง‘์—์„œ ๋นˆ๋‘ฅ๋Œ€๋‹ค ๊ฐœ๋ฐœ์— ํฅ๋ฏธ๋ฅผ ๋А๊ปด ๊ฐœ๋ฐœ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ•˜์˜€๊ณ  ํ˜„์žฌ๋Š” ํŒ๊ต์—์„œ ํ”Œ๋žซํผ ์„œ๋ฒ„ ๊ฐœ๋ฐœ์„ ๋‹ด๋‹นํ•˜์—ฌ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๊ณต๋ถ€๋ฅผ ํ–ˆ๋˜ ๋ฐฉ๋ฒ•๊ณผ ์‹ค๋ฌด์—์„œ ์ ‘ํ•˜์‹ค ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋ฌธ์ œ์ ๋“ค๊ณผ ํ•ด๊ฒฐ์ฑ…์„ ์—ฌ๋Ÿฌ๋ถ„๋“ค์—๊ฒŒ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์–ด ์ง€์‹๊ณต์œ ์ž ํ™œ๋™์„ ์ด์–ด๋‚˜๊ฐ€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ฐ•์˜๋Š” ์˜ค๋กœ์ง€ ์ €๋งŒ์˜ ์ง€์‹์„ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฐ•์˜๋Š” ํ•จ๊ป˜ํ•˜์‹œ๋Š” ๋ถ„๋“ค์ด ๊ณ„์‹ญ๋‹ˆ๋‹ค.

 

์ง€์‹๊ณต์œ ์ž ๊ฒฝ๋ ฅ

[ๅ‰] ์ƒŒ๋“œ๋ฐ•์ŠคIP ๊ด€๋ จ ๋ธ”๋ก์ฒด์ธ ๊ฐœ๋ฐœ์ž

[ๅ‰] ๋ฉ”ํƒ€๋ฒ„์Šค ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž

[็พ] ํŒ๊ต์—์„œ ๊ณ ์—ฌ๊ฐ€๋Š” ์„œ๋ฒ„ ๊ฐœ๋ฐœ์ž

 

์ธํ„ฐ๋ทฐ ์ด๋ ฅ

๊ธฐํƒ€ ๋ฌธ์˜

  • unduck2022@gmail.com

๋”๋ณด๊ธฐ

์ปค๋ฆฌํ˜๋Ÿผ

์ „์ฒด

34๊ฐœ โˆ™ (6์‹œ๊ฐ„ 41๋ถ„)

ํ•ด๋‹น ๊ฐ•์˜์—์„œ ์ œ๊ณต:

์ˆ˜์—…์ž๋ฃŒ
๊ฐ•์˜ ๊ฒŒ์‹œ์ผ: 
๋งˆ์ง€๋ง‰ ์—…๋ฐ์ดํŠธ์ผ: 

์ˆ˜๊ฐ•ํ‰

์ „์ฒด

31๊ฐœ

4.5

31๊ฐœ์˜ ์ˆ˜๊ฐ•ํ‰

  • Choi๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
    Choi

    ์ˆ˜๊ฐ•ํ‰ 12

    โˆ™

    ํ‰๊ท  ํ‰์  5.0

    5

    32% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

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

    • Hong
      ์ง€์‹๊ณต์œ ์ž

      ํ•ญ์ƒ ๋„์›€ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!! ๋‹ค์Œ ๊ฐ•์˜๋„ ํ•จ๊ป˜ ๋งŒ๋“ค์–ด์„œ ๋งŽ์€ ๋ถ„๋“ค์—๊ฒŒ ์ข‹์€ ์ง€์‹ ๊ณต์œ ๋“œ๋ ค๋ด์š” ใ…Žใ…Ž

  • ๋ฐ•๊ธฐํ˜„๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
    ๋ฐ•๊ธฐํ˜„

    ์ˆ˜๊ฐ•ํ‰ 1

    โˆ™

    ํ‰๊ท  ํ‰์  5.0

    5

    100% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

    ์ข‹์€ ๊ฐ•์˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ๊ฐ•์˜ ๋‚œ์ด๋„๋Š” ๊ทธ๋ ‡๊ฒŒ ๋†’์€ ํŽธ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐ์ด ๋“ค์ง€๋งŒ, ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๊ฐ•์˜๋ฅผ ๊ตฌ์„ฑํ•ด์„œ ํŽธํ•˜๊ฒŒ ๋“ค์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์•„ํ‚คํ…์ฒ˜์— ๊ด€์‹ฌ์„ ๊ฐ€์ง€๋‹ค๋ณด๋‹ˆ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํŒจํ‚ค์ง€ ๋ถ„๋ฆฌ -> ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ๋กœ ๊ฐ•์˜๋ฅผ ๋“ฃ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ•์˜๋ฅผ ์„ ํƒํ•œ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์•˜์Šต๋‹ˆ๋‹ค. 1. CQRS์™€ ์ด๋ฒคํŠธ ํŒจํ„ด์„ ์•Œ๊ณ ๋Š” ์žˆ์ง€๋งŒ ์‹ค์ œ ๊ตฌํ˜„์ด ๋ณด๊ณ ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. 2. ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ์„ ์›ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ถ€๋ถ„์—์„œ ๋„ˆ๋ฌด ์ž˜ ๋งž๋Š” ๊ฐ•์˜์˜€๊ณ , ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ ์ถ”์ฒœํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„์‰ฌ์šด ๊ฒƒ์ด ํ•˜๋‚˜ ์žˆ๋‹ค๋ฉด, ์˜์–ด ๋ฐœ์Œ์ด ์€๊ทผํžˆ ์‹ ๊ฒฝ์ด ์“ฐ์ธ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. logger๋ฅผ ๋กœ์ €๋ผ๊ณ  ๋ฐœ์Œํ•˜์‹œ๊ฑฐ๋‚˜ Unknown์„ ์–ธ๋…ธํฐ์ด๋ผ๊ณ  ํ•˜๋Š” ๊ฒŒ ๊ฐ•์˜์— ํฐ ์˜ํ–ฅ์„ ๋ผ์น˜๋Š” ์ ์€ ์•„๋‹ˆ์ง€๋งŒ ์€๊ทผํžˆ ์‹ ๊ฒฝ์ด ์“ฐ์ด๋Š” ๋ถ€๋ถ„์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    • Hong
      ์ง€์‹๊ณต์œ ์ž

      ์•ˆ๋…•ํ•˜์„ธ์š” ๋ฐ•๊ธฐํ˜„๋‹˜ ์ข‹์€ ํ‰ ๋‚จ๊ฒจ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์•„๋ฌด๋ž˜๋„ ์ €๋Š” ๊ฐœ๋ฐœํ•˜๋Š” ๊ณผ์ •์ด ์ข€ ์ €๋งŒ์˜ ์Šคํƒ€์ผ์„ ๋”ฐ๋ผ๊ฐ€๋Š” ํŽธ์ด๋ผ์„œ ํ‰์†Œ์— ์ž…์— ๋ถ™๋Š”๋Œ€๋กœ ๋ฐœ์Œํ•˜๋‹ค๋ณด๋‹ˆ ๊ทธ๋Ÿฐ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ๋” ์ข‹์€๊ฐ•์˜ ์ œ๊ณตํ•ด๋“œ๋ฆฌ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

  • devHand๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
    devHand

    ์ˆ˜๊ฐ•ํ‰ 10

    โˆ™

    ํ‰๊ท  ํ‰์  5.0

    5

    62% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

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

    • Hong
      ์ง€์‹๊ณต์œ ์ž

      ์ข‹์€ ํ‰ ๋‚จ๊ฒจ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. devHand๋‹˜!! ์ด ๊ฐ•์˜๊ฐ€ devHand๋‹˜์—๊ฒŒ ์ข‹์€ ์ฃผ์ œ๋กœ์จ ์ ‘๊ทผ์ด ๋œ๊ฑฐ๊ฐ™์•„ ๊ธฐ๋ถ„์ด ์ข‹๋„ค์š”!! ๋‹ค์Œ ๊ฐ•์˜๋„ ๋” ์•Œ์ฐฌ ๊ฐ•์˜๋กœ ์ฐพ์•„๋ต™๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

  • 8๋ฒˆ์ด ์ข‹์•„๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
    8๋ฒˆ์ด ์ข‹์•„

    ์ˆ˜๊ฐ•ํ‰ 6

    โˆ™

    ํ‰๊ท  ํ‰์  5.0

    5

    97% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

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

    • Hong
      ์ง€์‹๊ณต์œ ์ž

      ์•ˆ๋…•ํ•˜์„ธ์š” 8๋ฒˆ์ด ์ข‹์•„๋‹˜! ์ œ ์Šค์Šค๋กœ๋„ ํ”„๋กœ์ ํŠธ ๋ฐฉ์‹์œผ๋กœ ๊ฐ•์˜๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์—ˆ๋Š”๋ฐ ๊ด€๋ จํ•˜์—ฌ ์ข‹์€ ํ‰์„ ๋‚จ๊ฒจ์ฃผ์…”์„œ ๋„ˆ๋ฌด ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

  • Hyunwoo Kim๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
    Hyunwoo Kim

    ์ˆ˜๊ฐ•ํ‰ 4

    โˆ™

    ํ‰๊ท  ํ‰์  5.0

    5

    100% ์ˆ˜๊ฐ• ํ›„ ์ž‘์„ฑ

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

    • Hong
      ์ง€์‹๊ณต์œ ์ž

      ์•ˆ๋…•ํ•˜์„ธ์š” Hyunwoo Kim ๊ฐ•์˜ ๋“ค์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋‹ค์–‘ํ•œ ์•„ํ‚คํ…์ฒ˜์™€ ์‚ฌ์šฉ๋ฐฉ๋ฒ• ๋ฐ ํ™œ์šฉ๋ฒ•์„ ์•Œ๋ ค๋“œ๋ฆฌ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๋ž˜๋„ ์ด ๋‚ด์šฉ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์‰ฝ์ง€ ์•Š์€ ๊ฐœ๋ฐœ๋ฐฉ์‹์ด๋„ ๋งŽ์€ ํˆด๋“ค์ด ํ•จ๊ป˜ ์‚ฌ์šฉ์ด ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„๊นŒ์ง€๋Š” ์ œ๊ฐ€ ๋‹ค๋ฃจ์ง€ ๋ชปํ•˜์˜€์ง€๋งŒ ๋ง์”€ํ•ด ์ฃผ์‹  ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ€๋ณ๊ฒŒ ํ•œ๋ฒˆ ๊ตฌํ˜„ํ•ด๋ณด๋ฉฐ ์ดํ•ด๋„๋ฅผ ๋†’์ด๊ณ  ์•Œ๋ ค๋“œ๋ฆฌ๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ๋” ์ข‹์€ ๊ฐ•์˜๋กœ ์ฐพ์•„๋ต™๋„๋ก ํ• ๊ฒŒ์š”! ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

Hong๋‹˜์˜ ๋‹ค๋ฅธ ๊ฐ•์˜

์ง€์‹๊ณต์œ ์ž๋‹˜์˜ ๋‹ค๋ฅธ ๊ฐ•์˜๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”!

๋น„์Šทํ•œ ๊ฐ•์˜

๊ฐ™์€ ๋ถ„์•ผ์˜ ๋‹ค๋ฅธ ๊ฐ•์˜๋ฅผ ๋งŒ๋‚˜๋ณด์„ธ์š”!

์›” โ‚ฉ17,820

5๊ฐœ์›” ํ• ๋ถ€ ์‹œ

โ‚ฉ89,100