์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ์„œ๋ฒ„ ๊ตฌ์ถ•: ๋ถ„์‚ฐ ์ฒ˜๋ฆฌ๋ถ€ํ„ฐ ์„ฑ๋Šฅ ์ตœ์ ํ™”๊นŒ์ง€

Spring Boot 3.x + Kotlin์œผ๋กœ 3๊ฐœ ์ธ์Šคํ„ด์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ , Redis Pub/Sub ๋ถ„์‚ฐ ๋ฉ”์‹œ์ง•๊ณผ Nginx ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋Œ€์šฉ๋Ÿ‰ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ WebSocket ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ์„œ๋ฒ„๋ฅผ ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค.

(4.9) ์ˆ˜๊ฐ•ํ‰ 29๊ฐœ

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

๋‚œ์ด๋„ ์ž…๋ฌธ

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

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

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

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

4.9

5.0

Jlos Ho

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

์ด ๊ฐ•์˜๋„ ์ •๋ง Goat์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฐ•์˜๋„ ์ˆ˜๊ฐ•ํ•˜์˜€์ง€๋งŒ ์ด๋ ‡๊ฒŒ ํ˜„์‹ค์ ์ด๊ณ  ์˜†์—์„œ ์•Œ๋ ค์ฃผ๋Š”๋“ฏํ•œ ๊ฐ•์˜๋Š” ์ด ์ธํ”„๋Ÿฐ ํ”Œ๋žซํผ์—์„œ ์œ ์ผํ•œ๊ฑฐ ๊ฐ™๋„ค์š” ๋งŽ์€ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

5.0

Hoos

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

์ด๋Ÿฐ ์•„ํ‚คํ…์ฒ˜๋„ ์žˆ๊ตฌ๋‚˜... Kotlin๋ถ€ํ„ฐ ํ”Œ๋žซํผ์— ๋Œ€ํ•œ ์•„ํ‚คํ…์ฒ˜ ๋ฐ ์‹ค์ œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ์ฑ„ํŒ… ํ”Œ๋žซํผ์— ๋Œ€ํ•ด์„œ ๋งŽ์€ ๋ถ„๋“ค์ด ์ดํ•ด๋ฅผ ํ•˜์‹ค ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๊ฐ•์˜์ธ๊ฑฐ ๊ฐ™์Šต๋‹ˆ๋‹ค.

5.0

๋ฏธ๋ž˜ 1์ธ ๊ฐœ๋ฐœ์ž

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

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

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

  • Redis Pub/Sub์„ ํ™œ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค ๊ฐ„ ์‹ค์‹œ๊ฐ„ ๋ฉ”์‹œ์ง€๋ฅผ ๋™๊ธฐํ™”ํ•˜๋Š” ๋ถ„์‚ฐ ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ

  • Docker Compose๋กœ 3๊ฐœ ์ธ์Šคํ„ด์Šค ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ  Nginx ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ๋ถ„์‚ฐ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•

  • Spring WebSocket์„ ์ด์šฉํ•˜์—ฌ ์–‘๋ฐฉํ–ฅ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ ๊ตฌํ˜„

  • ๋ฉ€ํ‹ฐ๋ชจ๋“ˆ ๊ตฌ์กฐ๋กœ Domain-driven Design์„ ์ ์šฉํ•˜์—ฌ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๋ฐฉ๋ฒ•

  • Redis๋ฅผ ํ™œ์šฉํ•œ ๋ฉ”์‹œ์ง€ ์‹œํ€€์Šค ๊ด€๋ฆฌ๋กœ ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ๋„ ๋ฉ”์‹œ์ง€ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜๋Š” ๊ธฐ๋ฒ•

  • Docker ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜ ๋ฐฐํฌ์™€ ํ—ฌ์Šค์ฒดํฌ, ๋กœ๊ทธ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ํ†ตํ•œ ์„œ๋น„์Šค ์šด์˜ ๋ฐฉ๋ฒ•

  • Spring Boot 3.x + Kotlin์˜ ์ตœ์‹  ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•œ ๋ชจ๋˜ ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ ๋ฐฉ๋ฒ•

  • ๋ฉ”์‹œ์ง€ ์ค‘๋ณต ์ฒ˜๋ฆฌ ๋ฐฉ์ง€, ์„ธ์…˜ ์ •๋ฆฌ, ๋ฆฌ์†Œ์Šค ํ•ด์ œ ๋“ฑ ์•ˆ์ •์ ์ธ ์„œ๋น„์Šค ์šด์˜์„ ์œ„ํ•œ ๋ฐฉ์–ด ์ฝ”๋”ฉ ๊ธฐ๋ฒ•

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

์‹ค์ œ ์„œ๋น„์Šค ํ™˜๊ฒฝ์—์„œ ์ˆ˜๋งŒ ๋ช…์˜ ์‚ฌ์šฉ์ž๋ฅผ ๊ฐ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์ง์ ‘ ์„ค๊ณ„ํ•˜๊ณ  ๊ตฌ์ถ•ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ—. ๋‹จ์ˆœํžˆ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ๋„˜์–ด, ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ์—๋„ ์•ˆ์ •์ ์œผ๋กœ ๋™์ž‘ํ•˜๋Š” ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์˜ ํ•ต์‹ฌ ์›๋ฆฌ๋ฅผ ์ฒด๋“ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋จผ์ €, ์—ฌ๋Ÿฌ ๋Œ€์˜ ์„œ๋ฒ„๊ฐ€ ํ•˜๋‚˜์˜ ์‹œ์Šคํ…œ์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜๋„๋ก Nginx ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋กœ ํŠธ๋ž˜ํ”ฝ์„ ๋ถ„์‚ฐํ•˜๊ณ  ๐ŸŒ, Redis Pub/Sub์„ ์ด์šฉํ•ด ์„œ๋ฒ„ ๊ฐ„ ๋ฉ”์‹œ์ง€๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋™๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์›๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์—์„œ C10K (1๋งŒ ๋™์‹œ ์ ‘์†) ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋…ธํ•˜์šฐ๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ตํžˆ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.


๋˜ํ•œ โšก๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปค๋„ฅ์…˜ ํ’€์„ ํŠœ๋‹ํ•˜๊ณ , JPA ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ์™€ ์ปค์„œ ๊ธฐ๋ฐ˜ ํŽ˜์ด์ง€๋„ค์ด์…˜์„ ์ ์šฉํ•˜์—ฌ ์‘๋‹ต ์†๋„๋ฅผ ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๊นŒ์ง€ ๊ฐœ์„ ํ•˜๋Š” ๊ฒฝํ—˜์„ ํ•˜๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, Docker ์ปจํ…Œ์ด๋„ˆ๐Ÿณ ๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ๋ถ€ํ„ฐ ๋ฐฐํฌ๊นŒ์ง€ ์ผ๊ด€๋œ ํ™˜๊ฒฝ์„ ์œ ์ง€ํ•˜๊ณ , Health Check์™€ ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ๐Ÿฉบ ์„ ๊ตฌ์ถ•ํ•˜์—ฌ ์„œ๋น„์Šค ์žฅ์• ๋ฅผ ์‚ฌ์ „์— ๋ฐฉ์ง€ํ•˜๋Š” ์•ˆ์ •์ ์ธ ์šด์˜ ๊ธฐ๋ฒ•๊นŒ์ง€ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๊ณผ์ •์„ ์ตœ์‹  ์Šคํƒ์ธ Kotlin๊ณผ Spring Boot 3.x, websocket๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์„ธ๋ จ๋˜๊ณ  ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค โœจ.

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

ํ•˜๋‚˜์˜ ์™„์ „ํ•œ ๋ถ„์‚ฐ ์ฑ„ํŒ… ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๐Ÿ“ฆ

๋ช…๋ น์–ด๋กœ ์ „์ฒด ์‹œ์Šคํ…œ(์„œ๋ฒ„, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์บ์‹œ ๋“ฑ)์„ ํ•œ ๋ฒˆ์— ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”, ์™„์ „ํ•œ ํ˜•ํƒœ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํŒจํ‚ค์ง€๋ฅผ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ์ฝ”๋“œ ์กฐ๊ฐ์˜ ์ง‘ํ•ฉ์ด ์•„๋‹Œ, ์ฆ‰์‹œ ๋ฐฐํฌ ๊ฐ€๋Šฅํ•œ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

ํ”„๋กœ๋•์…˜ ๋ ˆ๋ฒจ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„๋„ ๐Ÿ—บ

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

์‹ค์‹œ๊ฐ„ ์–‘๋ฐฉํ–ฅ ์ฑ„ํŒ… ๊ธฐ๋Šฅ ๐Ÿ’ฌ

์‚ฌ์šฉ์ž๊ฐ€ ๋กœ๊ทธ์ธํ•˜๊ณ , ์ฑ„ํŒ…๋ฐฉ์„ ๋งŒ๋“ค๊ณ , ๋‹ค์–‘ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ฃผ๊ณ ๋ฐ›๋Š” ํ•ต์‹ฌ ์ฑ„ํŒ… ๊ธฐ๋Šฅ์ด ์™„๋ฒฝํ•˜๊ฒŒ ๊ตฌํ˜„๋œ ๊ฒฐ๊ณผ๋ฌผ์„ ๊ฐ–๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ˆ˜ํ‰ ํ™•์žฅ์ด ๊ฐ€๋Šฅํ•œ ์„œ๋ฒ„ ํด๋Ÿฌ์Šคํ„ฐ โ†”

n๊ฐœ์˜ Spring Boot ์„œ๋ฒ„๊ฐ€ Nginx ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ ์•„๋ž˜์—์„œ ๋™์ž‘ํ•˜๋Š” ์„œ๋ฒ„ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ํŠธ๋ž˜ํ”ฝ์ด ์ฆ๊ฐ€ํ•  ๋•Œ ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ์‹œ์Šคํ…œ์„ ํ™•์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฐฐ์šฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๊ณ ๊ฐ€์šฉ์„ฑ ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ ๐Ÿ“ก

ํ•œ ์„œ๋ฒ„์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜, ์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ์„œ๋ฒ„์— ์ ‘์†ํ•ด๋„ Redis Pub/Sub์„ ํ†ตํ•ด ๋ชจ๋“  ๋ฉ”์‹œ์ง€๊ฐ€ ๋ˆ„๋ฝ ์—†์ด ์ „๋‹ฌ๋˜๋Š” ์•ˆ์ •์ ์ธ ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค.

์ตœ์ ํ™”๋œ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ โšก

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

๐Ÿ“š๊ฐ•์˜ ์ฃผ์š” ๋‚ด์šฉ!

Redis Pub/Sub ๋ถ„์‚ฐ ๋ฉ”์‹œ์ง•

์—ฌ๋Ÿฌ ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค ๊ฐ„ ์‹ค์‹œ๊ฐ„ ๋ฉ”์‹œ์ง€ ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•ด Redis์˜ ๋ฐœํ–‰-๊ตฌ๋… ํŒจํ„ด์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ค‘๋ณต ๋ฉ”์‹œ์ง€ ๋ฐฉ์ง€, ๋ฉ”์‹œ์ง€ ์ˆœ์„œ ๋ณด์žฅ, ์„œ๋ฒ„๋ณ„ ๊ฒฉ๋ฆฌ ์ฒ˜๋ฆฌ ๋“ฑ ํ”„๋กœ๋•์…˜ ๋ ˆ๋ฒจ์˜ ๋ถ„์‚ฐ ๋ฉ”์‹œ์ง• ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜์—ฌ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์‹ค์‹œ๊ฐ„ ํ†ต์‹  ๊ธฐ๋ฐ˜์„ ๋งˆ๋ จํ•ฉ๋‹ˆ๋‹ค.

WebSocket ๊ธฐ๋ฐ˜ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ 

Spring WebSocket์„ ํ™œ์šฉํ•˜์—ฌ HTTP๋ณด๋‹ค ํ›จ์”ฌ ํšจ์œจ์ ์ธ ์–‘๋ฐฉํ–ฅ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์„ธ์…˜ ๊ด€๋ฆฌ, ์—ฐ๊ฒฐ ์ƒํƒœ ์ถ”์ , ์—๋Ÿฌ ํ•ธ๋“ค๋ง ๋“ฑ์„ ํ†ตํ•ด ์•ˆ์ •์ ์ธ ์‹ค์‹œ๊ฐ„ ์ฑ„ํŒ… ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ ํ•ด๊ฒฐ์„ ์œ„ํ•œ ์ตœ์ ํ™” ๊ธฐ๋ฒ•๋„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฉ€ํ‹ฐ๋ชจ๋“ˆ DDD ์•„ํ‚คํ…์ฒ˜

Domain-driven Design ์›์น™์— ๋”ฐ๋ผ API, Domain, Persistence, WebSocket ๊ณ„์ธต์„ ๋…๋ฆฝ์ ์ธ ๋ชจ๋“ˆ๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๋ชจ๋“ˆ์˜ ์ฑ…์ž„์„ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•˜๊ณ  ์˜์กด์„ฑ ๋ฐฉํ–ฅ์„ ์ œ์–ดํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•œ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค.

Nginx ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ + WebSocket ํ”„๋ก์‹œ

n๊ฐœ์˜ Spring Boot ์ธ์Šคํ„ด์Šค์— ํŠธ๋ž˜ํ”ฝ์„ ๊ท ๋“ฑ ๋ถ„์‚ฐํ•˜๋Š” Nginx ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋ฅผ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค. HTTP ์š”์ฒญ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ WebSocket ์—ฐ๊ฒฐ๋„ ์•ˆ์ •์ ์œผ๋กœ ํ”„๋ก์‹œํ•˜๋ฉฐ, ํ”„๋กœ๋•์…˜ ๋ ˆ๋ฒจ์˜ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ ์„ค์ •์œผ๋กœ ๊ณ ๊ฐ€์šฉ์„ฑ ์„œ๋น„์Šค ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“šํ”„๋กœ์ ํŠธ ๊ธฐ๋Šฅ ์•„ํ‚คํ…์ฒ˜ ๋งž๋ณด๊ธฐ

Redis Pub/Sub

๋ฉ”์‹œ์ง€ ์ฒ˜๋ฆฌ ํ”„๋กœ์„ธ์Šค

๐Ÿ“š๊ฐ•์˜ ๋ง›๋ณด๊ธฐ!

๐Ÿ“š WebSocket ์„ธ์…˜ ๊ด€๋ฆฌ Class ์ž‘์„ฑํ•˜๊ธฐ ไธญ



๐Ÿ“š ์ž๋™ํ™”๋œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ™œ์šฉํ•œ ์„œ๋ฒ„ ๋ฐฐํฌ ไธญ



๐Ÿ“š ํ™˜๊ฒฝ ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ Docker-Compose ไธญ



๐Ÿ“š Nginx ์„ฑ๋Šฅ ์ง€ํ‘œ ์„ค์ • ไธญ



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

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

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


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

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


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

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


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

websocket๋ฅผ ๊ทธ๋ƒฅ HTTP๋กœ ๊ตฌํ˜„์„ ํ•˜๋ฉด ๋˜๋Š”๊ฑฐ ์•„๋‹Œ๊ฐ€์š”? ๐Ÿค”

๐Ÿ“Œ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฐœ๋ฐœ ๋ฐฉ์‹์€ ์•„๋‹™๋‹ˆ๋‹ค.

๐Ÿ“Œ ํ•˜์ง€๋งŒ ์„œ๋ฒ„ ๊ฐœ๋ฐœ์ž๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์„œ๋ฒ„์— ๋Œ€ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ตœ๋Œ€ํ•œ ์ ˆ๊ฐ์„ ํ•˜์—ฌ ๊ฐ€์ ธ๊ฐ€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ๊ทธ๋Ÿฌ๊ธฐ ๋–„๋ฌธ์—, ์ฑ„ํŒ…์„œ๋ฒ„์™€ ๊ฐ™์ด ์ง€์†์ ์ธ Connection์ด ์œ ์ง€๋˜์–ด์•ผ ํ•˜๋Š” ํ†ต์‹  ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” WebSocket์„ ์‚ฌ์šฉํ•˜๋Š”๊ฒƒ์ด ๋งค์šฐ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

์ค‘์š”ํ•˜๊ฒŒ ์—ฌ๊ธฐ๋Š” 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์„ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ ํ•ฉ๋‹ˆ๋‹ค.

    • ์†Œ์Šค์ฝ”๋“œ๋Š” ํ˜น์‹œ ๋ชจ๋ฅด๋Š” ๋ฒ„์ „ ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋นŒ๋“œ ํŒŒ์ผ๊นŒ์ง€ ์ „๋ถ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

  • ์ฃผ๋‹ˆ์–ดโ†’๋ฏธ๋“œ๋ ˆ๋ฒจ ์„ฑ์žฅ์„ ์›ํ•˜๋Š” ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž

  • ์‹ค์‹œ๊ฐ„ ์„œ๋น„์Šค ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ์Œ“๊ณ  ์‹ถ์€ ๊ฐœ๋ฐœ์ž

  • ๋ถ„์‚ฐ ์‹œ์Šคํ…œ ์•„ํ‚คํ…์ฒ˜์— ๊ด€์‹ฌ์žˆ๋Š” ๊ฐœ๋ฐœ์ž

  • ์‹œ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž๋กœ ์„ฑ์žฅํ•˜๊ณ  ์‹ถ์€ ๋ฏธ๋“œ๋ ˆ๋ฒจ ๊ฐœ๋ฐœ์ž

  • Docker ๊ธฐ์ดˆ ์ง€์‹์ด ์žˆ๋Š” ๊ฐœ๋ฐœ์ž ๋˜๋Š” ๋ฐฐ์šฐ๊ณ  ์‹ถ์€ ๊ฐœ๋ฐœ์ž

  • ๊ฒŒ์ž„/์ฑ„ํŒ…/์†Œ์…œ ์„œ๋น„์Šค ๊ฐœ๋ฐœ์ž

  • ํฌํŠธํด๋ฆฌ์˜ค๋ฅผ ๊ฐ•ํ™”ํ•˜๊ณ  ์‹ถ์€ ์ทจ์—… ์ค€๋น„์ƒ

  • ๊ธฐ์ˆ  ์Šคํƒ ํ™•์žฅ์„ ํ†ตํ•œ ์ด์ง์„ ๊ณ„ํš์ค‘์ธ ๊ฐœ๋ฐœ์ž

์„ ์ˆ˜ ์ง€์‹,
ํ•„์š”ํ• ๊นŒ์š”?

  • Spring์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ ์ธ ์ง€์‹์ด ์žˆ์œผ๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค.

  • ์›น ์†Œ์ผ“ ํ†ต์‹ ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ์ ์ธ ์ง€์‹์ด ์žˆ์œผ๋ฉด ์ข‹์Šต๋‹ˆ๋‹ค.

  • ์ด ๋ชจ๋“  ์ง€์‹์ด ์—†์–ด๋„ ๋ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๊ธฐ ๋–„๋ฌธ์— ๊ฐ™์ด ํ•™์Šต ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

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

7,445

๋ช…

์ˆ˜๊ฐ•์ƒ

461

๊ฐœ

์ˆ˜๊ฐ•ํ‰

142

๊ฐœ

๋‹ต๋ณ€

4.7

์ 

๊ฐ•์˜ ํ‰์ 

24

๊ฐœ

๊ฐ•์˜

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

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

 

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

 

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

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

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

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

 

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

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

  • unduck2022@gmail.com

๋”๋ณด๊ธฐ

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

์ „์ฒด

28๊ฐœ โˆ™ (4์‹œ๊ฐ„ 55๋ถ„)

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

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

์ˆ˜๊ฐ•ํ‰

์ „์ฒด

29๊ฐœ

4.9

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

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

    ์ˆ˜๊ฐ•ํ‰ 8

    โˆ™

    ํ‰๊ท  ํ‰์  5.0

    5

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

    ํ˜„์‹ค์ ์ธ ์ข‹์€ ๋‚ด์šฉ์œผ๋กœ ๊ฐ•์˜ ์ž˜ ๋ดค์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

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

      ์•ˆ๋…•ํ•˜์„ธ์š” ks ju๋‹˜ ํ‰ ๋‚จ๊ฒจ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ ์šด์˜ํ™˜๊ฒ…์—์„œ๋Š” ๋” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์ด ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋Š” ํ˜•ํƒœ๊ณ  ์ด๋Ÿฐํ˜•ํƒœ๋ฅผ ์œ„ํ•œ ๊ตฌ์กฐ๋ผ๊ณ  ๋ด์ฃผ์‹œ๋ฉด ๋ ๊บผ๊ฐ™์•„์š” ใ…Žใ…Ž ์•ž์œผ๋กœ ๋” ์œ ์ตํ•œ ๊ฐ•์˜๋ฅผ ์ œ๊ณตํ•ด๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ข‹์€ ํ•˜๋ฃจ ๋ณด๋‚ด์„ธ์š” :)

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

    ์ˆ˜๊ฐ•ํ‰ 3

    โˆ™

    ํ‰๊ท  ํ‰์  5.0

    5

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

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

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

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

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

    ์ˆ˜๊ฐ•ํ‰ 6

    โˆ™

    ํ‰๊ท  ํ‰์  5.0

    5

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

    ๋„ˆ๋ฌด ์ž˜ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค. ์ข‹์€ ๊ฐ•์˜๋ผ๊ณ  ์ƒ๊ฐํ•˜๋„ค์š”. ๋‹ค๋ฅธ ๊ฐ•์˜๋„ ์ˆ˜๊ฐ• ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

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

      ์•ˆ๋…•ํ•˜์„ธ์š” 8๋ฒˆ์ด ์ข‹์•„๋‹˜!! ๋‹ค๋ฅธ๊ฐ•์˜์—์„œ๋„ ๋ต™์œผ๋ฉด ์ข‹๊ฒ ๋„ค์š” ใ…Žใ…Ž ์ข‹์€ ํ‰ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

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

    ์ˆ˜๊ฐ•ํ‰ 5

    โˆ™

    ํ‰๊ท  ํ‰์  5.0

    5

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

    ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ์จ.. ์ง„์งœ ๋งŽ์€ ๋„์›€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

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

      ์•ˆ๋…•ํ•˜์„ธ์š” tasd os๋‹˜ ๊ฐ™์€ ์ง๋ฌด์ธ๋ฐ ๋„์›€์ด ๋งŽ์ด ๋œ๊ฑฐ๊ฐ™์•„์„œ ๋„ˆ๋ฌด ๋ฟŒ๋“ฏํ•˜๋„ค์š” ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

  • ํ…๋ฒ„๊ฑฐ!๋‹˜์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€
    ํ…๋ฒ„๊ฑฐ!

    ์ˆ˜๊ฐ•ํ‰ 7

    โˆ™

    ํ‰๊ท  ํ‰์  5.0

    ์ˆ˜์ •๋จ

    5

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

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

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

      ์•ˆ๋…•ํ•˜์„ธ์š” ํ…๋ฒ„๊ฑฐ๋‹˜! ์ทจ์—…์„ ์ค€๋น„ํ•˜์‹œ๋‹ค๋‹ˆ!! ์ด ๊ฐ•์˜๊ฐ€ ๋งŽ์€ ๋„์›€์ด ๋˜์—ˆ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค ์ถ”ํ›„์— ์ทจ์—…๋„ ์„ฑ๊ณตํ•˜์‹ ๋‹ค๋ฉด ์†Œ์‹ ์ „ํ•ด์ฃผ์„ธ์š” ใ…Žใ…Ž ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

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

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

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

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

์›” โ‚ฉ345,577

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

โ‚ฉ82,500