Skip to content

[๐Ÿš€ ์‚ฌ์ดํด2 - ๋ฏธ์…˜ (๊ธฐ๋ฌผ ํ™•์žฅ + DB ์ ์šฉ)] ๋ˆ„๋ˆ„ ๋ฏธ์…˜ ์ œ์ถœํ•ฉ๋‹ˆ๋‹ค.#342

Open
LEEJaeHyeok97 wants to merge 80 commits intowoowacourse:leejaehyeok97from
LEEJaeHyeok97:leejaehyeok97-step2

Conversation

@LEEJaeHyeok97
Copy link
Copy Markdown

@LEEJaeHyeok97 LEEJaeHyeok97 commented Apr 9, 2026

์•ˆ๋…•ํ•˜์„ธ์š”. ์ˆ˜๋‹ฌ, ๋‚˜๋ฆ„๋Œ€๋กœ ๊ณ ๋ฏผ ์ง€์ ์„ ๊ธฐ๋กํ•˜๋ฉด์„œ ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ, DB๊ฐ€ ์ถ”๊ฐ€๋˜๊ณ  ์ƒ์†Œํ•œ ์ฝ”๋“œ๋“ค์ด ๋งŽ์•„์ ธ์„œ ์ฒซ PR์ด ๋Šฆ์–ด์กŒ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜๋„ ์Šค์Šค๋กœ ๊ณ ๋ฏผํ•˜๊ณ  ํ•œ๊ฐ€์ง€๋ผ๋„ ์˜๋ฏธ ์žˆ๋Š” ๊ฒƒ์„ ์–ป์–ด๊ฐ€๊ณ  ์‹ถ๋‹ค๋Š” ๋งˆ์Œ์—
์ด๋ฒˆ ๋ฏธ์…˜์— ๋Œ€๋ถ€๋ถ„์ด ์„ ํƒํ•˜์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์€ MongoDB๋ผ๋Š” NoSQL์„ ์„ ํƒํ–ˆ๊ณ  ์ฝ˜์†” ํ”„๋กœ๊ทธ๋žจ์˜ DB ์—ฐ๊ฒฐ๊ณผ ๋ชฝ๊ณ  ๋””๋น„์˜ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ์ฒ˜์Œ ์•Œ์•„๊ฐ€๋ฉฐ ๋งŽ์€ ๊ฒƒ์„ ๋ฐฐ์šด๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ด๋ฒˆ ๋ฆฌ๋ทฐ๋„ ์ž˜ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

์ฒดํฌ ๋ฆฌ์ŠคํŠธ

  • ๋ฏธ์…˜์˜ ํ•„์ˆ˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ชจ๋‘ ๊ตฌํ˜„ํ–ˆ๋‚˜์š”?
  • Gradle test๋ฅผ ์‹คํ–‰ํ–ˆ์„ ๋•Œ, ๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ํ†ต๊ณผํ–ˆ๋‚˜์š”?
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ •์ƒ์ ์œผ๋กœ ์‹คํ–‰๋˜๋‚˜์š”?

์–ด๋–ค ๋ถ€๋ถ„์— ์ง‘์ค‘ํ•˜์—ฌ ๋ฆฌ๋ทฐํ•ด์•ผ ํ• ๊นŒ์š”?

๊ณ ๋ฏผํ–ˆ๋˜ ์ง€์ .

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

  2. ์™•์ด ์žกํžˆ๋Š” ๊ฒฝ์šฐ ๊ฒŒ์ž„์—์„œ ์ง„๋‹ค.
    ๋ณด๋“œ์—์„œ ์™•์ด ์‚ญ์ œ๋˜๋Š” ๊ฒฝ์šฐ ์ฆ‰์‹œ ๊ฒŒ์ž„์„ ์ข…๋ฃŒํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.
    ๋ณด๋“œ์˜ move์—์„œ ์ด๋™ํ•˜๋ฉฐ ๋””์˜คํ•  ์œ„์น˜์˜ ๊ธฐ๋ฌผ์„ ์ œ๊ฑฐํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ์ด๋™ ๋ฉ”์†Œ๋“œ์— ๊ฒŒ์ž„ ์ข…๋ฃŒ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•˜๋Š” ์ฑ…์ž„๊นŒ์ง€ ๊ฐ–๊ฒŒ ํ•˜๋Š”
    ๊ฒƒ์€ ๊ณผ๋„ํ•œ ์ฑ…์ž„์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.
    ๋”ฐ๋ผ์„œ, JanggiGame ๊ฐ์ฒด๋ฅผ ๋„์ž…ํ•˜์—ฌ ๊ฒŒ์ž„ ํ๋ฆ„์„ ๊ด€์ œํ•˜๊ณ  ๋ณด๋“œ๊ฐ์ฒด๋กœ ๋งคํ„ด ์žฅ๊ตฐ์˜ ์กด์žฌ๋ฅผ ์ฒดํฌํ•˜๊ฒŒ ํ•˜๊ณ  ๊ฒŒ์ž„ ์ข…๋ฃŒ๋ฅผ ์œ ์—ฐํ•˜๊ฒŒ
    ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
    JanggiGame ๊ฐ์ฒด๋ฅผ ๋„์ž…ํ•จ์œผ๋กœ์จ Board ๊ฐ์ฒด๊ฐ€ ์ปจํŠธ๋กค๋Ÿฌ์— ํ˜๋Ÿฌ๊ฐ„ ๊ฒƒ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ  ์ด๊ฒƒ์€ ๋ถ„๋ช…ํžˆ ๊ฐ์ฒด์ง€ํ–ฅ์  ๋…ธ๋ ฅ์˜ ์ˆ˜ํ™•์ด์—ˆ์Šต๋‹ˆ๋‹ค.

  3. ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ˆ˜์ •ํ•˜๋ฉฐ์„œ ๋“  ๊ถ๊ธˆ์ฆ
    Controller์˜ ์ƒ์ฐจ๋ฆผ์ด ์ด๋ฆ„๊ณผ ์Œ์œผ๋กœ ๋งค์นญ๋˜๋Š”๋ฐ BiFunction์„ ์“ฐ๋ฉด Formation enumํด๋ž˜์Šค์—์„œ ํ•œ๋ฒˆ์— ์ดˆ๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ๋งŒ ๊ฐ™์€๋ฐ ์ด ๊ฒฝ์šฐ Formation์ด Board๊ฐ์ฒด๋ฅผ ์˜์กดํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. Formation ์ฝ”๋“œ๋Š” ๋‹ค์†Œ ์ง€์ €๋ถ„ํ•ด์ง€๋Š” ์ฝ”๋“œ๊ฐ€ ๋˜๋Š”๋ฐ Controller์˜ ์ฝ”๋“œ๋Š” ์ƒ๋‹นํžˆ ๊น”๋”ํ•ด์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์„ค๊ณ„๊ฐ€ ์ ์ ˆํ•œ์ง€ ์˜๊ฒฌ์ด ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

  4. JanggiGame ๊ฐ์ฒด
    ์ƒˆ๋กœ ์žฅ๊ธฐ๊ฒŒ์ž„ ๊ฐ์ฒด๋ฅผ ๋„์ž…ํ–ˆ๋Š”๋ฐ, ๋ถˆ๋ณ€ ๊ฐ์ฒด๋กœ ์“ฐ๊ณ  ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ํ„ด์„ ์นด์šดํŠธํ•˜๋Š” ๋ฐ์ดํ„ฐ์ธ turnCount๋Š” ๊ฐ€๋ณ€์ธ๋ฐ, ์ด ๋ถ€๋ถ„์—์„œ๋Š” ์™„์ „ํ•œ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋Š” ๋‚ด๋ถ€์˜ ๋ถˆ๋ณ€ ๋ฐ์ดํ„ฐ ํ•˜๋‚˜๋งŒ ๋ฐ”๋€Œ์–ด๋„ ๋‹ค์‹œ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์„œ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์„ ํ•ด์น  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์–ด์„œ ๊ฐ€๋ณ€์œผ๋กœ turnCount๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์ด ๊ดœ์ฐฎ์„์ง€ ๋ฆฌ๋ทฐ ์š”์ฒญ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

  5. DB ์—ฐ๊ฒฐ์— ๋”ฐ๋ฅธ DAO ๋„์ž…๊ณผ ๊ธฐ์กด MVC ํŒจํ„ด์˜ ํ™•์žฅ ์„ค๊ณ„

image

DB๋ฅผ ๋„์ž…ํ•˜๋ฉด์„œ ๊ธฐ์กด MVC ๊ตฌ์กฐ์— DAO ๊ณ„์ธต์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
BoardDao๋ฅผ Controller์— ์ฃผ์ž…ํ•˜์—ฌ, Controller๊ฐ€ ๊ฒŒ์ž„ ํ๋ฆ„(์ƒˆ ๊ฒŒ์ž„/์ด์–ดํ•˜๊ธฐ)์— ๋”ฐ๋ผ DAO๋ฅผ ํ†ตํ•ด ๊ฒŒ์ž„ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณต์›ํ•˜๋„๋ก ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ด ๊ณผ์ •์—์„œ ๊ณ ๋ฏผํ–ˆ๋˜ ์ ์€ DAO๊ฐ€ ๋„๋ฉ”์ธ ๊ฐ์ฒด(Board)๋ฅผ ์ง์ ‘ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๊ณผ์—ฐ ์ ์ ˆํ•œ๊ฐ€ ์ž…๋‹ˆ๋‹ค.
ํ˜„์žฌ findBoardByGameId()๋Š” Document(๋ชฝ๊ณ DB์˜ ๋ฌธ์„œ)๋ฅผ Board๋กœ ๋ฐ˜ํ™˜ํ•˜์—ฌ DAO๊ฐ€ ๋„๋ฉ”์ธ ๊ฐ์ฒด์˜ ์ƒ์„ฑ ๋ฐฉ์‹์„ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.
DTO๋Š” ์ข‹์€ ์„ ํƒ์ง€๊ฐ€ ๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ํ˜„์žฌ ๊ทœ๋ชจ์—์„œ๋Š” ์˜คํžˆ๋ ค ๊ณผํ•œ ์ถ”์ƒํ™”๋ผ๊ณ  ์ƒ๊ฐํ•ด์„œ(ํ˜„์žฌ ์ž‘์€ ๊ทœ๋ชจ๋ผ ๋ทฐ๋„ ๋„๋ฉ”์ธ์„ ์˜์กดํ•˜๊ณ  ์žˆ์Œ)
DAO๊ฐ€ ๋„๋ฉ”์ธ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ฒŒ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.(์‹ค์„  ํ‘œ์‹œ)

  1. MongoDB ์‚ฌ์šฉ์— ๋”ฐ๋ฅธ ์žฅ๋‹จ์  ์ธ์‚ฌ์ดํŠธ
    ์žฅ์ :
  • ์Šคํ‚ค๋งˆ ์œ ์—ฐ์„ฑ: ์žฅ๊ธฐํŒ์˜ ๊ธฐ๋ฌผ ์ •๋ณด๋ฅผ pieces ๋ฐฐ์—ด๋กœ ํ•˜๋‚˜์˜ Document์— ๋‹ด์„ ์ˆ˜ ์žˆ์–ด, ๋ณ„๋„์˜ ํ…Œ์ด๋ธ” ์„ค๊ณ„(๊ฒŒ์ž„ ํ…Œ์ด๋ธ” + ๊ธฐ๋ฌผ ํ…Œ์ด๋ธ” + JOIN)๊ฐ€ ํ•„์š” ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ์ƒํƒœ๋ฅผ ํ•˜๋‚˜์˜ ๋ฌธ์„œ๋กœ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ํŠนํžˆ ์žฅ๊ธฐ ๋„๋ฉ”์ธ๊ณผ ์ž˜ ๋งž์•˜์Šต๋‹ˆ๋‹ค.
  • ๋น ๋ฅธ ํ”„๋กœํ† ํƒ€์ดํ•‘: DDL ์ž‘์„ฑ์ด๋‚˜ ์Šคํ‚ค๋งˆ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์—†์ด ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์–ด, ๋„๋ฉ”์ธ ๋กœ์ง ๊ตฌํ˜„์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ObjectId ์ž๋™ ์ƒ์„ฑ: ๋ณ„๋„์˜ ์‹œํ€€์Šค๋‚˜ Auto Increment ์„ค์ • ์—†์ด ๊ณ ์œ ํ•œ ํƒ€์ž„ ์Šคํ…œํ”„ ๊ธฐ๋ฐ˜ ๊ฒŒ์ž„ ID๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋‹จ์ :

  • ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™” ๋น„์šฉ: Board โ†” Document ๋ณ€ํ™˜์„ ์ง์ ‘ ๊ตฌํ˜„ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. Team, Type ๊ฐ™์€ Enum์„ ๋ฌธ์ž์—ด๋กœ ์ €์žฅํ•˜๊ณ  ๋‹ค์‹œ ์ฐพ์•„์˜ค๋Š” ๊ณผ์ •(findTeamByName, findTypeByName)์ด ํ•„์š”ํ–ˆ๊ณ ,RDBMS + ORM์„ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด ์ด ๋ถ€๋ถ„์ด ๋” ๊ฐ„๊ฒฐํ–ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํŠธ๋žœ์žญ์…˜ ๋ฏธ์ง€์›(๋‹จ์ผ ๋…ธ๋“œ): ํ˜„์žฌ ๊ตฌ์กฐ์—์„œ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ, ๊ฒŒ์ž„ ์ƒํƒœ ์ €์žฅ์ด ์—ฌ๋Ÿฌ ์ปฌ๋ ‰์…˜์— ๊ฑธ์น˜๊ฒŒ ๋œ๋‹ค๋ฉด ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ๊ฐ€ RDBMS๋ณด๋‹ค ๊นŒ๋‹ค๋กœ์šธ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ธ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค

Copy link
Copy Markdown

@her0807 her0807 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์•ˆ๋…•ํ•˜์„ธ์š” ๋ˆ„๋ˆ„! ใ…Žใ…Ž

๋ชฝ๊ณ ๋””๋น„๋ฅผ ์—ฐ๊ฒฐํ•ด๋ณด์…จ๊ตฐ์š”?

์ ์–ด์ฃผ์‹  ๋‚ด์šฉ์œผ๋กœ ๋ฏธ๋ฃจ์–ด๋ณด์•˜์„ ๋•Œ ์ „๊ณต์ž ์ด์‹ ๊ฒƒ ๊ฐ™์€๋ฐ ๋งž์„๊นŒ์š”?
ํ˜น์‹œ ๋‹ค๋ฅธ ๋””๋น„๋“ค์„ ์‚ฌ์šฉํ•ด๋ณด์‹œ๊ณ  ๋ชฝ๊ณ ๋””๋น„๋ฅผ ์—ฐ๊ฒฐํ•ด๋ณด์‹  ๊ฒƒ์ธ์ง€, ๋น„์ •ํ˜•๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋””๋น„๋„ ๋ชฝ๊ณ ๋””๋น„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๋””๋น„๋“ค๋„ ์žˆ๋Š”๋ฐ ์–ด๋–ค์ด์œ ๋กœ ์„ ํƒํ–ˆ๋Š”์ง€ ์กฐ๊ธˆ ๋” ์ž์„ธํžˆ ๋“ฃ๊ณ ์‹ถ์–ด์š”!

Comment on lines +5 to +16

public class JanggiGame {

private static final int DEFAULT_TURN_COUNT = 0;

private final Board board;
private TurnCount turnCount;

private JanggiGame(final Board board) {
this.board = board;
this.turnCount = TurnCount.of(DEFAULT_TURN_COUNT);
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Board์—์„œ ๊ฒŒ์ž„ ํ๋ฆ„ ๊ด€๋ฆฌ๋ฅผ ๋ถ„๋ฆฌํ•ด JanggiGame์œผ๋กœ ์˜ฎ๊ธฐ์…จ๊ตฐ์š”? ๐Ÿ‘๐Ÿป

์ด์ „์—๋Š” Controller๊ฐ€ Board๋ฅผ ์ง์ ‘ ๋‹ค๋ฃจ๋ฉด์„œ ํ„ด ๊ด€๋ฆฌ๊นŒ์ง€ ํ–ˆ์„ ํ…๋ฐ, JanggiGame์ด move(), isFinished(), passTheTurn(), currentTurn()์„ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด์„œ ๊ฒŒ์ž„์˜ ๊ทœ์น™์„ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋์–ด์š”. ์•„์ฃผ ์ข‹์€ ๋ฐฉํ–ฅ์ด๋„ค์šฉ!!

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ด Game์ด๋ผ๋Š” Orchestration ์—ญํ• ์„ ํ•˜๋Š” ๋„๋ฉ”์ธ์„ ๋งŒ๋“ค๊ฒŒ ๋จ์œผ๋กœ์จ ๋ฐœ์ƒํ•˜๋Š” ๋‹จ์ ์€ ์—†์„๊นŒ์š”?
๋งค๋ฒˆ ์ €๋Š” ์ด๋Ÿฐ ๋„๋ฉ”์ธ์„ ๋งŒ๋“ค๊ณค ํ•ฉ๋‹ˆ๋‹ค. Lotto ๋ฏธ์…˜์—์„œ๋„ LottoGame, RacingCar ๋ฏธ์…˜์—์„œ๋„ RacingCarGame, ... ๋งค๋ฒˆ ํ–ˆ๋˜ ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ,
๊ฒŒ์ž„์ด๋ผ๋Š” ์ด๋ฆ„์ด ์‹ค์ฒด๊ฐ€ ์—†์œผ๋ฉด์„œ ์—ญํ• ์ด ๋ชจํ˜ธํ•œ ๊ฒƒ ๊ฐ™์•„์„œ ๋งค๋ฒˆ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉด์„œ๋„ ๋งˆ์Œ ๊นŠ์€ ๊ณณ์—์„œ๋Š” ๋ถˆํŽธํ•จ์ด ์กฐ๊ธˆ ์ž๋ฆฌ์žก๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฐจ๋ผ๋ฆฌ Service ๊ณ„์ธต์„ ๋„์ž…ํ•ด์„œ Game ๋„๋ฉ”์ธ์ด ์•„๋‹Œ Service์—์„œ ํ๋ฆ„์„ ์กฐ์ •ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๋„ ์ข‹์€ ์„ ํƒ์ด์ง€ ์•Š์„๊นŒ ํ•˜๋Š” ๊ณ ๋ฏผ๋„ ๋ฉ๋‹ˆ๋‹ค.
์Šคํ”„๋ง ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ ์‹œ domain-service-controller-repository ๋ ˆ์ด์–ด๋“œ ์•„ํ‚คํ…์ฒ˜๋กœ service ๊ณ„์ธต์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ค„๊ณง ์ž˜ ์“ฐ๊ณ  ์žˆ์–ด์„œ ์ผ์ง€๋„ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

Comment on lines +63 to +74

private boolean isInPalaceAndCanDiagonalMove(final Position position) {
int row = position.getRow();
int column = position.getCol();
if ((row == 0 && column == 4) || (row == 2 && column == 4) || (row == 1 && column == 3) || (row == 1 && column == 5)
|| (row == 7 && column == 4) || (row == 9 && column == 4) || (row == 8 && column == 3) || (row == 8 && column == 5)) {
return false;
}

return true;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ด ๋ฉ”์„œ๋“œ๊ฐ€ ๊ถ์„ฑ ์•ˆ์ธ์ง€ ์ž์ฒด๋ฅผ ํ™•์ธํ•˜์ง€ ์•Š๊ณ  ์žˆ์–ด์š”. ํŠน์ • ์œ„์น˜๊ฐ€ ์•„๋‹ˆ๋ฉด ๋ฌด์กฐ๊ฑด true๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์žˆ์–ด์„œ, ๊ถ์„ฑ ๋ฐ– (5,5)์— ์žˆ๋Š” ์ฐจ๋‚˜ ํฌ๋„ ๊ถ์„ฑ์—์„œ ๋Œ€๊ฐ์„  ์ด๋™ ๊ฐ€๋Šฅ์œผ๋กœ ํŒ์ •๋˜์–ด์š”!

ํ•œ๋ฒˆ ๋”ฐ๋ผ๊ฐ€๋ณด๋ฉด์š”,,

  • from = (5,5), to = (6,6)
  • isInPalaceAndCanDiagonalMove((5,5)) โ†’ (5,5)๋Š” ๋ธ”๋ก ๋ชฉ๋ก์— ์—†์œผ๋‹ˆ๊นŒ โ†’ true
  • isDiagonal โ†’ true
  • ๊ฑฐ๋ฆฌ ํ•ฉ = 2 <= 4 โ†’ true
  • isNotCorrectPath โ†’ false

๊ฒฐ๊ณผ์ ์œผ๋กœ ๊ถ์„ฑ ๋ฐ– ๋ชจ๋“  ์œ„์น˜์—์„œ ๋Œ€๊ฐ์„  ์ด๋™์ด ํ—ˆ์šฉ๋˜๋Š” ์ƒํ™ฉ์ด์—์š”. ์ด ๋ฉ”์„œ๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ "๊ถ์„ฑ ๋ฐ– ์œ„์น˜"์—์„œ ํ˜ธ์ถœ๋˜๋ฉด ์–ด๋–ค ๊ฐ’์ด ๋ฐ˜ํ™˜๋˜๋Š”์ง€ ํ•œ๋ฒˆ ์ถ”์ ํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”!

Copy link
Copy Markdown
Author

@LEEJaeHyeok97 LEEJaeHyeok97 Apr 12, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

isNotCorrectPath(...) ์˜ณ์ง€ ์•Š์€ ๊ธธ์ธ๊ฐ€๋ฅผ ์ฒดํฌํ•  ๋•Œ ๊ถ์„ฑ ์•ˆ์ด ์•„๋‹Œ๋ฐ ๋Œ€๊ฐ ์ด๋™ -> ์ด๋™ ๋ถˆ๊ฐ€ ํŒ์ •์„ ๋น ๋œจ๋ฆฌ๊ณ 
๊ถ์„ฑ ์•ˆ์ด๋ฉด์„œ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋Œ€๊ฐ์„  ์ด๋™์ธ๊ฐ€? -> ์ด๋™ ๋ถˆ๊ฐ€ ๋งŒ ์ฒดํฌํ•˜๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ถ์„ฑ ์•ˆ์ด ์•„๋‹ ๋•Œ ๊ฐ์„  ์ด๋™ ์ฒดํฌํ•˜๋Š” ๊ฒƒ์„ ๋จผ์ € ํ•ด์„œ ํ•ด๋‹น ๋ถ€๋ถ„์„ ์ˆ˜์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค!

private boolean isNotCorrectPath(final Position from, final Position to) {
        if (!palaceInRange(from)) {
            if (isDiagonal(from, to)) {
                return true;
            }
        }
...

Comment on lines 32 to +51
@@ -38,6 +43,40 @@ private boolean isNotCorrectPath(final Position from, final Position to) {
return true;
}

if (hanSoldierCanDiagonalMoveInPalace(from, to) || chuSoldierCanDiagonalMoveInPalace(from, to)) {
return true;
}

return false;
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๋Œ€๊ฐ์„  ์ด๋™์„ ์ฐจ๋‹จํ•˜๋Š” ์œ„์น˜ ๋ชฉ๋ก (0,4), (9,4) ๊ฐ€ ๋ˆ„๋ฝ๋œ ๊ฒƒ ๊ฐ™์•„์š”! ๐Ÿ‘€
๊ถ์„ฑ ๋Œ€๊ฐ์„ ์€ ์ค‘์•™(1,4)/(8,4)๊ณผ ๊ผญ์ง“์ ๋งŒ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฑด๋ฐ์š”, (0,4)๋Š” ๊ถ์„ฑ ์ƒ๋‹จ ๋ณ€์˜ ์ค‘๊ฐ„์ด๋ผ ๋Œ€๊ฐ์„  ๋ผ์ธ ์œ„์— ์—†๊ฑฐ๋“ ์š”. ํ˜„์žฌ ์ฝ”๋“œ์—์„œ ๊ถ(General)์ด (0,4)โ†’(1,5)๋กœ ๋Œ€๊ฐ์„  ์ด๋™์ด ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค!

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๋ˆ„๋ฝ๋œ ๋ถ€๋ถ„ ์ถ”๊ฐ€ํ•˜๊ณ  ํ…Œ์ŠคํŠธ๊นŒ์ง€ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค!
๋ณด์‹œ๋‹ค์‹œํ”ผ ์ด๋ ‡๊ฒŒ ๋งŽ์€ ์กฐ๊ฑด๋“ค์ด || ์—ฐ์‚ฐ์œผ๋กœ ์ด์–ด์ง€๋ฉด ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ์‹œ ๋ฏธ์Šค๊ฐ€ ๋‚  ํ™•๋ฅ ์ด ๋†’์•„์ง€๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ, ๊ฐ์ฒด ์ง€ํ–ฅ์  ์„ค๊ณ„๊ฐ€ ์ž˜๋ชป๋œ ์‹ ํ˜ธ๋กœ ๋ณผ ์ˆ˜ ์žˆ์„๊นŒ์š”?

Comment on lines +123 to +128

String input = inputView.readPosition();
if (input.equals("ํ•ญ๋ณต")) {
outputView.printGameFinishMessage();
return;
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ํ•ญ๋ณตํ•˜๋ฉด movePosition()์—์„œ returnํ•˜๋Š”๋ฐ, playGame()์˜ while ๋ฃจํ”„๋Š” ๊ณ„์† ๋Œ์•„์š”. isFinished()๋Š” ์žฅ๊ตฐ์ด ์‚ด์•„์žˆ๋Š”์ง€๋งŒ ํ™•์ธํ•˜๋‹ˆ๊นŒ ํ•ญ๋ณต ์ƒํƒœ๋ฅผ ๋ชจ๋ฅด๊ฑฐ๋“ ์š”. ํ•ญ๋ณต ํ›„์— ๋‹ค์‹œ ์ด๋™ ์ž…๋ ฅ์„ ์š”์ฒญํ•˜๋Š” ์ƒํ™ฉ์ด ๋ฉ๋‹ˆ๋‹ค.

isFinished()์— ํ•ญ๋ณต ์ƒํƒœ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ฐ˜์˜ํ•˜๋ฉด ์ข‹์„์ง€ ๊ณ ๋ฏผํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”! JanggiGame์— ์ƒํƒœ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๊ณ , movePosition์˜ ๋ฐ˜ํ™˜๊ฐ’์œผ๋กœ ์•Œ๋ ค์ฃผ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋Š”๋ฐ ์–ด๋–ค ๊ฒŒ ๋” ์ž์—ฐ์Šค๋Ÿฌ์šธ๊นŒ์š”?

Comment on lines 36 to 40

board.remove(from);
board.put(to, fromPiece);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Document document = new Document()
.append("row", position.getRow())
.append("col", position.getCol())
.append("team", piece.getTeamName())
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Team/Type์˜ getName()์„ DB ์ €์žฅ๊ฐ’์œผ๋กœ ์“ฐ๊ณ  ์žˆ๋Š”๋ฐ, ์ด๊ฒŒ ์–ด๋–ค ์œ„ํ—˜์ด ์žˆ์„๊นŒ์š”? ๐Ÿค”

ํ˜„์žฌ getName()์ด ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’์€ OutputView์—์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ฃผ๋Š” ํ‘œ์‹œ๋ช…์ด๊ธฐ๋„ ํ•˜๊ณ , DB์— ์ €์žฅ๋˜๋Š” ๊ฐ’์ด๊ธฐ๋„ ํ•ด์š”. ๋งŒ์•ฝ ์ถœ๋ ฅ ํ˜•์‹์„ "์ดˆ" โ†’ "ๆฅš"๋กœ ๋ฐ”๊พธ๊ณ  ์‹ถ๋‹ค๋ฉด, ๊ธฐ์กด์— DB์— "์ดˆ"๋กœ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋Š” ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”?

ํ‘œ์‹œ์šฉ ๊ฐ’๊ณผ ์ €์žฅ์šฉ ๊ฐ’์„ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”!

HashMap<Position, Piece> boardMap = new HashMap<>();

for (Document doc : pieces) {
Position position = Position.of(doc.getInteger("row"), doc.getInteger("col"));
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

BoardDao๊ฐ€ ๋„๋ฉ”์ธ ๊ฐ์ฒด๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ์ด ๊ตฌ์กฐ๋ฅผ ์„ ํƒํ•œ ์ด์œ ๊ฐ€ ๊ถ๊ธˆํ•ด์š”.

DAO๊ฐ€ Position.of(), Piece.of(), Board.of()๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•ด์„œ ๋„๋ฉ”์ธ ๊ฐ์ฒด์˜ ์ƒ์„ฑ ๋ฐฉ์‹์„ ์•Œ๊ณ  ์žˆ๋Š” ์ƒํƒœ์ธ๋ฐ์š”. PR ์„ค๋ช…์—์„œ "ํ˜„์žฌ ๊ทœ๋ชจ์—์„œ๋Š” DTO๊ฐ€ ๊ณผํ•œ ์ถ”์ƒํ™”"๋ผ๊ณ  ํ–ˆ์ž–์•„์š”? ๊ทธ ํŒ๋‹จ ์ž์ฒด๋Š” ๊ดœ์ฐฎ์€๋ฐ, ํ•œ ๊ฐ€์ง€ ๋” ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”.

๋งŒ์•ฝ Board ์ƒ์„ฑ์ž๊ฐ€ ๋ฐ”๋€Œ๊ฑฐ๋‚˜(์˜ˆ: ๊ฒ€์ฆ ๋กœ์ง ์ถ”๊ฐ€), Piece ์ƒ์„ฑ ๋ฐฉ์‹์ด ๋‹ฌ๋ผ์ง€๋ฉด DAO ์ฝ”๋“œ๋„ ๊ฐ™์ด ์ˆ˜์ •ํ•ด์•ผ ํ•˜๊ฑฐ๋“ ์š”. ์ด๊ฒŒ "DB ์ ์šฉ ์‹œ ๋„๋ฉ”์ธ ๊ฐ์ฒด์˜ ๋ณ€๊ฒฝ์„ ์ตœ์†Œํ™”"๋ผ๋Š” ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜๋Š”์ง€ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ข‹๊ฒ ์–ด์š”!

Comment on lines +90 to +95

collection.replaceOne(
Filters.eq("_id", new ObjectId(gameId)),
updateDoc
);
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๋ˆ„๋ˆ„๊ฐ€ ์ •๋ฆฌํ•œ MongoDB ์žฅ์  ์ค‘ ์Šคํ‚ค๋งˆ ์œ ์—ฐ์„ฑ: pieces ๋ฐฐ์—ด๋กœ ํ•˜๋‚˜์˜ Document์— ๋‹ด์„ ์ˆ˜ ์žˆ์–ด JOIN์ด ๋ถˆํ•„์š”๋ผ๋Š” ๋ถ€๋ถ„์ด ์žˆ์—ˆ๋Š”๋ฐ์š”, ํ•œ ๊ฐ€์ง€ ๋” ๊นŠ์ด ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”.

ํ˜„์žฌ ๊ตฌ์กฐ์—์„œ๋Š” ๋งค ํ„ด๋งˆ๋‹ค ์ „์ฒด ๊ธฐ๋ฌผ ๋ฐฐ์—ด์„ ํ†ต์งธ๋กœ ๊ต์ฒดํ•˜๊ณ  ์žˆ์–ด์š”.

RDBMS์˜€๋‹ค๋ฉด ์ด๋™ํ•œ ๊ธฐ๋ฌผ 1~2๊ฐœ๋งŒ UPDATEํ•˜๋ฉด ๋˜๋Š”๋ฐ, MongoDB Document ๊ตฌ์กฐ์—์„œ๋Š” ๊ธฐ๋ฌผ 32๊ฐœ๋ฅผ ๋งค๋ฒˆ ์ „๋ถ€ ์ง๋ ฌํ™”ํ•ด์„œ ์ €์žฅํ•˜๊ณ  ์žˆ๊ฑฐ๋“ ์š”. ์ด trade-off๋ฅผ ์ธ์ง€ํ•˜๊ณ  ์žˆ์—ˆ๋‚˜์š”? ํ˜„์žฌ ๊ทœ๋ชจ์—์„œ๋Š” ๋ฌธ์ œ ์—†์ง€๋งŒ, Document๋กœ ํ•œ ๋ฒˆ์— ๋‹ด๋Š” ๊ฒŒ ํ•ญ์ƒ ์ข‹์€ ๊ฑด์ง€ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”!

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR ์„ค๋ช…์—์„œ ์ด๋ ‡๊ฒŒ ์ ์–ด์ฃผ์…จ๋Š”๋ฐ์š”!

ํŠธ๋žœ์žญ์…˜ ๋ฏธ์ง€์›(๋‹จ์ผ ๋…ธ๋“œ): ํ˜„์žฌ ๊ตฌ์กฐ์—์„œ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ, ๊ฒŒ์ž„ ์ƒํƒœ ์ €์žฅ์ด ์—ฌ๋Ÿฌ ์ปฌ๋ ‰์…˜์— ๊ฑธ์น˜๊ฒŒ ๋œ๋‹ค๋ฉด ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ๊ฐ€ RDBMS๋ณด๋‹ค ๊นŒ๋‹ค๋กœ์šธ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ธ์ง€ํ–ˆ์Šต๋‹ˆ๋‹ค

์ด ๋ถ€๋ถ„์€ ์‚ฌ์‹ค ์ •ํ™•ํ•˜์ง€ ์•Š์•„์š”! MongoDB๋Š” 4.0(2018๋…„)๋ถ€ํ„ฐ ๋ฉ€ํ‹ฐ ๋„ํ๋จผํŠธ ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๋ˆ„๊ฐ€ ์‚ฌ์šฉ ์ค‘์ธ ๋“œ๋ผ์ด๋ฒ„(mongodb-driver-sync:5.3.1)๋„ ๋‹น์—ฐํžˆ ์ง€์›ํ•˜๊ณ ์š”.

// MongoDB์—์„œ๋„ ํŠธ๋žœ์žญ์…˜์ด ๊ฐ€๋Šฅํ•ด์š”
try (ClientSession session = client.startSession()) {
    session.startTransaction();
    collection1.insertOne(session, doc1);
    collection2.insertOne(session, doc2);
    session.commitTransaction();
}

๋‹ค๋งŒ ๋ˆ„๋ˆ„์˜ ํ˜„์žฌ ๊ตฌ์กฐ์—์„œ๋Š” ๊ฒŒ์ž„ ์ƒํƒœ๊ฐ€ ๋‹จ์ผ Document ํ•˜๋‚˜์— ์ „๋ถ€ ๋“ค์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— ํŠธ๋žœ์žญ์…˜์ด ํ•„์š” ์—†๋Š” ๊ตฌ์กฐ์ด๊ธด ํ•ด์š”. MongoDB๋Š” ๋‹จ์ผ Document์— ๋Œ€ํ•œ ์›์ž์  ์“ฐ๊ธฐ๋ฅผ ๊ธฐ๋ณธ ๋ณด์žฅํ•˜๊ฑฐ๋“ ์š”. ๊ทธ๋ž˜์„œ replaceOne()์ด ์ค‘๊ฐ„์— ์‹คํŒจํ•ด๋„ ๋ฐ˜์ฏค ์ €์žฅ๋˜๋Š” ์ผ์€ ์—†์–ด์š”.

์ •๋ฆฌํ•˜๋ฉด, ํŠธ๋žœ์žญ์…˜์ด ์•ˆ ๋ผ์„œ ๊นŒ๋‹ค๋กญ๋‹ค๊ฐ€ ์•„๋‹ˆ๋ผ ๋‹จ์ผ Document ๊ตฌ์กฐ๋ผ์„œ ํŠธ๋žœ์žญ์…˜์ด ์• ์ดˆ์— ํ•„์š” ์—†๋‹ค๊ฐ€ ๋” ์ •ํ™•ํ•œ ํ‘œํ˜„์ด์—์š”!

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์žฅ๊ธฐ ๋„๋ฉ”์ธ์— MongoDB๊ฐ€ ์ •๋ง ์ ํ•ฉํ•œ ์„ ํƒ์ผ๊นŒ? ๐Ÿค”

๋ˆ„๋ˆ„๊ฐ€ MongoDB๋ฅผ ์„ ํƒํ•œ ๋„์ „ ์ •์‹ ์€ ์ •๋ง ์ข‹์•˜์–ด์š”! ๋‹ค๋งŒ ์†”์งํ•˜๊ฒŒ ์ด์•ผ๊ธฐํ•˜๋ฉด, ์žฅ๊ธฐ๋Š” RDBMS๊ฐ€ ๋” ์ž์—ฐ์Šค๋Ÿฌ์šด ๋„๋ฉ”์ธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด์š”. ์ด์œ ๋ฅผ ๋ช‡ ๊ฐ€์ง€ ์ •๋ฆฌํ•ด๋ณผ๊ฒŒ์š”.

์žฅ๊ธฐ๊ฐ€ RDBMS์— ๋” ๋งž๋Š” ์ด์œ 

  • ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ๋งค์šฐ ๊ณ ์ •์ ์ด์—์š”. 9x10 ๋ณด๋“œ, ๊ณ ์ •๋œ ๊ธฐ๋ฌผ ํƒ€์ž…, ๊ณ ์ •๋œ ํŒ€ โ€” ์Šคํ‚ค๋งˆ๊ฐ€ ๋ณ€ํ•  ์ผ์ด ์—†์–ด์š”, ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ชฝ๊ณ ๋””๋น„์˜ ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ด์ ์„ ๋ชป๋ˆ„๋ฆฌ๋Š” ์ƒํ™ฉ์ด์—์š”.
  • ๊ธฐ๋ฌผ ์ด๋™์€ 1~2๊ฐœ ํ–‰๋งŒ ๋ณ€๊ฒฝํ•˜๋ฉด ๋˜๋Š”๋ฐ, Document ๊ตฌ์กฐ๋Š” ๋งค๋ฒˆ 32๊ฐœ ๊ธฐ๋ฌผ์„ ์ „๋ถ€ ์ง๋ ฌํ™”ํ•ด์•ผ ํ•ด์š”
  • "์ง„ํ–‰ ์ค‘์ธ ๊ฒŒ์ž„ ๋ชฉ๋ก", "ํŠน์ • ํ”Œ๋ ˆ์ด์–ด์˜ ์ „์ " ๊ฐ™์€ ์ฟผ๋ฆฌ๋Š” RDBMS๊ฐ€ ํ›จ์”ฌ ์ž์—ฐ์Šค๋Ÿฌ์›Œ์š”
  • ์Šคํ‚ค๋งˆ ๊ฐ•์ œ๊ฐ€ ์˜คํžˆ๋ ค ์ž˜๋ชป๋œ ๋ฐ์ดํ„ฐ ์ €์žฅ์„ ๋ฐฉ์ง€ํ•ด์ค˜์š” ์˜ˆ๋ฅผ๋“ค๋ฉด piece_type์— ์˜คํƒ€๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉด ์ œ์•ฝ ์กฐ๊ฑด์—์„œ ์žกํžˆ๋‹ˆ๊นŒ์š”. ์ง€๊ธˆ์€ ์ž˜๋ชป ์ €์žฅ๋˜๋ฉด ๋‚˜์ค‘์— enum ์ด๋‚˜ ๋‹ค๋ฅธ๊ฑธ๋กœ ์กฐํšŒํ•  ๋•Œ ์บ์ŠคํŒ…ํ•˜๋Š” ๊ณผ์ •์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋‚˜๊ฒ ์ฃ ?

MongoDB๊ฐ€ ๋น›๋‚˜๋Š” ๋„๋ฉ”์ธ์€

  • ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ์œ ๋™์ ์ธ ๊ฒฝ์šฐ (์˜ˆ: ์‚ฌ์šฉ์ž๋ณ„ ์„ค์ •, ๋กœ๊ทธ, CMS ์ฝ˜ํ…์ธ )
  • ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ
  • ์ˆ˜ํ‰ ํ™•์žฅ์ด ํ•„์š”ํ•œ ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ

๋ฌผ๋ก  ํ˜„์žฌ ๋ฏธ์…˜ ๋ฒ”์œ„์—์„œ๋Š” ๋‘˜ ๋‹ค ์ถฉ๋ถ„ํžˆ ๋™์ž‘ํ•˜๊ณ , MongoDB๋ฅผ ์ง์ ‘ ์จ๋ณธ ๊ฒฝํ—˜ ์ž์ฒด๊ฐ€ ๊ท€ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š”. ํ•™์Šต๋ชฉ์ ์œผ๋กœ ์„ ํƒํ•œ๊ฒƒ๋„ ์ด์œ ๊ฐ€ ๋˜๋‹ˆ๊นŒ์š”!

Comment on lines +50 to +54
private void resumeGame() {
String gameId = inputView.readGameId();
Board board = boardDao.findBoardByGameId(gameId);
int turnCount = boardDao.findTurnCountByGameId(gameId);
JanggiGame janggiGame = JanggiGame.of(board, turnCount);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

gameId๋งŒ ์ž…๋ ฅํ•˜๋ฉด ์–ด๋–ค ๊ฒŒ์ž„์ด๋“  ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋Š”๋ฐ์š”, ๋งŒ์•ฝ ์ด๋ฏธ ์™•์ด ์žกํ˜€์„œ ๋๋‚œ ๊ฒŒ์ž„์„ ๋ถˆ๋Ÿฌ์˜ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? isFinished()๊ฐ€ ๋ฐ”๋กœ true๋ฅผ ๋ฐ˜ํ™˜ํ•ด์„œ ๊ฒŒ์ž„์ด ์ฆ‰์‹œ ๋๋‚˜๊ฒ ์ง€๋งŒ, ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ๋Š” ์ด์–ดํ•˜๊ธฐ๋ฅผ ์„ ํƒํ–ˆ๋Š”๋ฐ ๋ฐ”๋กœ ์ข…๋ฃŒ ๋ฉ”์‹œ์ง€๊ฐ€ ๋‚˜์˜ค๋Š” ์ƒํ™ฉ์ด์—์š”.

MongoDB Document์— ๊ฒŒ์ž„ ์ข…๋ฃŒ ์—ฌ๋ถ€(isFinished)๋ฅผ ์ €์žฅํ•˜๊ณ , ์ด์–ดํ•˜๊ธฐ ์‹œ ๋๋‚˜์ง€ ์•Š์€ ๊ฒŒ์ž„๋งŒ ๋ถˆ๋Ÿฌ์˜ค๋„๋ก ํ•˜๋ฉด ์–ด๋–จ๊นŒ์š”?

Comment on lines +52 to +53
Board board = boardDao.findBoardByGameId(gameId);
int turnCount = boardDao.findTurnCountByGameId(gameId);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

๋‘ ๋ฉ”์„œ๋“œ ๋ชจ๋‘ _id๋กœ ๊ฐ™์€ Document๋ฅผ ์กฐํšŒํ•˜๋Š”๋ฐ, ๋„คํŠธ์›Œํฌ ์š”์ฒญ์ด 2๋ฒˆ ๋‚˜๊ฐ€๊ณ  ์žˆ์–ด์š”. ํ•˜๋‚˜์˜ ๋ฉ”์„œ๋“œ์—์„œ Document๋ฅผ ํ•œ ๋ฒˆ๋งŒ ์กฐํšŒํ•ด์„œ Board์™€ turnCount๋ฅผ ๊ฐ™์ด ๋ฐ˜ํ™˜ํ•˜๋ฉด ์–ด๋–จ๊นŒ์š”?

์ด๊ฑธ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ•˜๋ฉด Board์™€ turnCount๋ฅผ ๋ฌถ์–ด์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ํ•„์š”ํ•ด์ง€๋Š”๋ฐ์š”, ์ด๊ฒŒ ์‚ฌ์‹ค ๋ˆ„๋ˆ„๊ฐ€ PR ์„ค๋ช…์—์„œ ์–ธ๊ธ‰ํ•œ DTO์˜ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋„์ž… ์‹œ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ด์š”.

@LEEJaeHyeok97
Copy link
Copy Markdown
Author

LEEJaeHyeok97 commented Apr 11, 2026

์œตํ•ฉ์†Œํ”„ํŠธ์›จ์–ดํ•™๋ถ€๋ฅผ ์กธ์—…ํ•œ ์ „๊ณต์ž ๋งž์Šต๋‹ˆ๋‹ค!
์˜ˆ๋ฆฌํ•˜์‹œ๊ตฐ์š” :)

๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” redis ๋“ฑ ๋‹ค๋ฅธ ๊ฒƒ๋„ ๋งŽ์ง€๋งŒ, ์ฒ˜์Œ์— Redis ์‚ฌ์šฉ์„ ๊ณ ๋ คํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์œ ๋Š” ๋ ˆ๋””์Šค๊ฐ€ ์ธ๋ฉ”๋ชจ๋ฆฌ DB์ด๊ณ  ๋งˆ๋น„๋…ธ๊ธฐ ๊ฐ™์€ ๊ฒŒ์ž„์˜ DB๋กœ๋„ ์‚ฌ์šฉ๋˜๋Š”๋ฐ, ์žฅ๊ธฐ๊ฒŒ์ž„์— ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ• ๊นŒ๋ผ๋Š” ์ƒ๊ฐ์œผ๋กœ ๊ณ ๋ฏผ์„ ์‹œ์ž‘ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™์•„์š”.
Redis๋ฅผ ๊ณ ๋ คํ–ˆ์„ ๋•Œ ์žฅ๊ธฐ๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ Key-Value ํ˜•ํƒœ๋กœ ์ €์žฅ์„ ํ•ด์•ผํ•ด์„œ ์–ด๋–ค ๊ฐ’์„ Key๋กœ ์žก๋Š”๊ฐ€๊ฐ€ ์„ค๊ณ„ํ•˜๊ธฐ ์–ด๋ ต๋‹ค๊ณ  ๋А๊ปด์„œ RDBMS๋ณด๋‹ค ๊ทธ๋Ÿผ ์žฅ์ ์ด ์—†๋Š” ๊ฒƒ ์•„๋‹Œ๊ฐ€? ์–ด์ฐจํ”ผ RDB๋„ ํ…Œ์ด๋ธ”์„ ์„ค๊ณ„ํ•ด์•ผ ํ•˜๋Š”๋ฐ ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๊ณ  Redis๋Š” ์„ ํƒ์ง€์—์„œ ์ง€์› ์Šต๋‹ˆ๋‹ค.
๋˜ ํ…Œ์ด๋ธ” ๊ฐœ๋…์ด ์—†์–ด์„œ redis๋Š” prefix๋กœ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ํ…Œ์ด๋ธ”์„ ๊ตฌ๋ถ„ํ•ด์•ผ ํ•˜๋Š”๊ฒŒ ๋ถˆํŽธํ–ˆ๋Š”๋ฐ,
MongoDB๋Š” collection์ด๋ผ๋Š” ํ…Œ์ด๋ธ” ๊ฐœ๋…์ด ์žˆ๋Š” NoSQL DB์˜€๊ณ  ๋น„์ •ํ˜• ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” DB ๋ผ๋Š” ์ ์ด ํฐ ์žฅ์ ์œผ๋กœ ๋А๊ปด์กŒ์Šต๋‹ˆ๋‹ค.

๊ทธ ์ด์œ ๋กœ๋Š” MySQL ๊ฐ™์€ RDB๋กœ ํ…Œ์ด๋ธ” ์„ค๊ณ„ ์‹œ,
Game(id, turn) -1:N - PieceType(id, game_id, type) - 1:N - Piece(id, piece_type_id, team, row, col)
์ด๋Ÿฐ ์‹์œผ๋กœ ์„ค๊ณ„๊ฐ€ ๋  ๊ฒƒ ๊ฐ™์€๋ฐ, ๊ทธ๋Ÿฌ๋ฉด ๋งค๋ฒ„ ์žฅ๊ธฐ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ์ˆ˜์ •ํ•˜๊ณ  ์กฐํšŒํ•˜๋Š”๋ฐ, RDB์˜ ๊ฒฝ์šฐ ์กฐ์ธ์ด
๋งŽ์•„์ง€๊ณ , ์ €ํฌ ํ† ๋ก ์กฐ์˜ ์‚ฐ์ถœ๋ฌผ์ด ๋งค ์ž…๋ ฅ๋งˆ๋‹ค ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์„ ๋ฃฐ๋กœ ์ •ํ•ด์กŒ์œผ๋ฏ€๋กœ ๋งค๋ฒˆ ์ž…๋ ฅ๋งˆ๋‹ค
์ €์žฅํ•˜๊ธฐ์—๋Š” RDB๋ณด๋‹ค NoSQL ์žฅ์ ์ด ์žˆ๋‹ค๊ณ  ๋А๊ผˆ์Šต๋‹ˆ๋‹ค.
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•œ๋‹ค๋ฉด MySQL์€ ์ธ๋ฑ์Šค๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๊ณ  B-Tree ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ๋„ ํ•ด์•ผํ•˜๊ณ  ์กฐ์ธ์„ ๋งค ์š”์ฒญ๋งˆ๋‹ค O(N)์œผ๋กœ ํƒ์ƒ‰ํ•ด์„œ ํ•˜๋Š” ๊ฒƒ ๋ณด๋‹ค NoSQL์ธ MongoDB๊ฐ€ ๋‹จ์ˆœํžˆ Document๋งŒ ์ €์žฅํ•˜๋Š”๊ฒŒ ๋‹ค ์ด๋ฏ€๋กœ ํ˜„์žฌ ๋‹จ์ˆœํžˆ ์žฅ๊ธฐํŒ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊บผ๋‚ด๋Š” ์ƒํ™ฉ์—์„œ ํšจ์œจ์ ์ธ ํŒ๋‹จ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

Document ์ˆ˜์ • ์‹œ์—๋„ ์ „์ฒด ๋ฌธ์„œ๋ฅผ ๋ฎ์–ด์“ฐ๊ธฐํ•˜๋Š” ๋ฐฉ์‹๋ง๊ณ  ๋ถ€๋ถ„ field๋งŒ ๊บผ๋‚ด updateํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์กด์žฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฐฉ์‹์€ Document ํ•„๋“œ offset์„ ํ†ตํ•ด ์ „์ฒด ๋ฌธ์„œ๋ฅผ ๊ต์ฒดํ•˜์ง€ ์•Š๊ณ  ํŠน์ • ํ•„๋“œ๋งŒ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค!

RDB๋Š” ์žฅ๊ธฐํŒ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋ ค๋ฉด Game ํ…Œ์ด๋ธ”๊ณผ Piece ํ…Œ์ด๋ธ” ๋“ฑ์„ ๋‚˜๋ˆ„๊ณ  ์™ธ๋ž˜ํ‚ค๋กœ ์—ฐ๊ฒฐํ•˜๊ณ  ์กฐ์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ฌผ ํ•˜๋‚˜๋ฅผ ์›€์ง์ผ ๋•Œ๋งˆ๋‹ค Piece ๋“ฑ์—์„œ ํŠน์ • ํ–‰์„ ์ฐพ์€ ํ›„ ์—…๋ฐ์ดํŠธ ํ•˜๊ณ , ์กฐํšŒ์‹œ์—๋Š” ๋˜ ๋‹ค์‹œ ์—ฌ๋Ÿฌ ํ–‰์„ Joinํ•ด์„œ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ACID ์›์น™์— ์˜ํ•œ ์—„๊ฒฉํ•œ ๊ฒ€์ฆ ์ ˆ์ฐจ๋Š” ๋ค์ด๊ณ ์š”

MongoDB๋Š” BASE ์›์น™์„ ๋”ฐ๋ผ RDB๋ณด๋‹ค ์œ ์—ฐํ•œ ์›์น™์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ์žฅ๊ธฐํŒ ์ž์ฒด๋ฅผ ํ•˜๋‚˜์˜ ์• ๊ทธ๋ฆฌ๊ฑฐํŠธ(์—ฐ๊ด€๋œ ๊ฐ์ฒด ๋ฌถ์Œ)์œผ๋กœ ๋ณด๊ณ , ๊ฒŒ์ž„ ํ•˜๋‚˜ = ๋ฌธ์„œ ํ•˜๋‚˜๋ผ๋Š” ์ง๊ด€์ ์ธ ๊ตฌ์กฐ ๋•๋ถ„์— ์ฝ”๋“œ๊ฐ€ ๋‹จ์ˆœํ•ด์ง€๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ ๋‹จ ํ•œ ๋ฒˆ์˜ ๋””์Šคํฌ I/O๋กœ ํŒ ์ „์ฒด ์ƒํƒœ๋ฅผ ๋ณต์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ, NoSQL์ด ๋ฐ์ดํ„ฐ ๋ชจ๋ธ๋ง์˜ ํšจ์œจ์„ฑ์˜ ์ด์ ์ด ํฌ๊ณ  ์žฆ์€ ์ €์žฅ์ด ํ•„์š”ํ•œ ์žฅ๊ธฐ ๊ฒŒ์ž„์—์„œ ์†๋„๋„ ๋น ๋ฅด๋‹ค๋ฉด ์„ ํƒํ•˜์ง€ ์•Š์„ ์ด์œ ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ  ์ž๋ฃŒ
https://www.youtube.com/watch?v=DrEDCn4X7gQ

๋งˆ๋น„๋…ธ๊ธฐ ๋ชจ๋ฐ”์ผ์€ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ํ˜์‹ ์„ ์œ„ํ•ด Amazon MemoryDB๋ฅผ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants