Skip to content

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

Open
win9-tech wants to merge 43 commits intowoowacourse:win9-techfrom
win9-tech:step2

Conversation

@win9-tech
Copy link
Copy Markdown

@win9-tech win9-tech commented Apr 8, 2026

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

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

์•ˆ๋…•ํ•˜์„ธ์š” ์ฃผ๋”” ๐ŸฆŠ
ํ•ญ์ƒ ๊ผผ๊ผผํ•œ ๋ฆฌ๋ทฐ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ด๋ฒˆ ์‚ฌ์ดํด 2์—์„œ๋„ ์ž˜ ๋ถ€ํƒ๋“œ๋ ค์š”!

DB ์„ค์ •์€ README ํ•˜๋‹จ์— ์žˆ์Šต๋‹ˆ๋‹ค~!


1. DB ์„ ํƒ

์žฅ๊ธฐ ๋ฏธ์…˜์—์„œ๋Š” MongoDB(NoSQL)๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด์œ ๋Š” ์žฅ๊ธฐํŒ์˜ ํŠน์„ฑ์ž…๋‹ˆ๋‹ค. ์ €์žฅ์˜ ๋‹จ์œ„๊ฐ€ ๊ฐœ๋ณ„ ๊ธฐ๋ฌผ์ด ์•„๋‹ˆ๋ผ ์žฅ๊ธฐํŒ ์ „์ฒด ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ด๋ฅผ ํ•˜๋‚˜์˜ ๋ฌธ์„œ๋กœ ํ‘œํ˜„ํ•˜๋Š” ๊ฒƒ์ด ์ž์—ฐ์Šค๋Ÿฌ์› ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ RDS๋ฅผ ์‚ฌ์šฉํ•ด Piece๋ฅผ ์ •๊ทœํ™”ํ•˜๋ฉด ๋นˆ์นธ์„ ํฌํ•จํ•˜์—ฌ ๊ฒŒ์ž„๋‹น 90๊ฐœ์˜ row๊ฐ€ ํ•„์š”ํ•˜๊ณ , ํŒ ์ƒํƒœ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ๋•Œ๋งˆ๋‹ค JOIN์ด ๋ฐœ์ƒํ•˜์—ฌ ๋ถˆํ•„์š”ํ•œ ์ฟผ๋ฆฌ ๋น„์šฉ์ด ์ƒ๊น๋‹ˆ๋‹ค.

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

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

ํ–ฅํ›„ ์œ ์ € ์‹œ์Šคํ…œ, ๋Œ€์ „ ๊ธฐ๋ก, ํ†ต๊ณ„ ๋ถ„์„ ๊ฐ™์€ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋œ๋‹ค๋ฉด ๊ทธ๋•Œ ๊ฐ€์„œ RDS๋กœ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค!


2. ๋„ค์ด๋ฐ ๋ฐ ๋„๋ฉ”์ธ ์ฑ…์ž„ ๋ณ€๊ฒฝ

Board โ†’ Game

๊ธฐ์กด Board ํด๋ž˜์Šค๋ฅผ Game์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. DB ์ €์žฅ/์กฐํšŒ์˜ ๋‹จ์œ„๊ฐ€ board ์ƒํƒœ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ id, turn์„ ํฌํ•จํ•œ ๊ฒŒ์ž„ ์ „์ฒด์˜€๊ณ , ์ด๋ฅผ ํ•˜๋‚˜์˜ ํด๋ž˜์Šค์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ ์ ˆํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. Board๋Š” ๊ธฐ๋ฌผ ๋ฐฐ์น˜ ์ƒํƒœ๋งŒ์„ ์˜๋ฏธํ•˜๋ฏ€๋กœ, ๊ฒŒ์ž„ ์ „์ฒด ์ƒํƒœ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” Game์ด ๋” ์ ํ•ฉํ•œ ์ด๋ฆ„์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

Controller โ†’ Runner

๊ธฐ์กด์—๋Š” View์™€ Domain์„ ์—ฐ๊ฒฐํ•˜๋Š” ์ค‘๊ฐœ์ž ์—ญํ• ์— ์ดˆ์ ์„ ๋งž์ถฐ Controller๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Repository๊ฐ€ ์ถ”๊ฐ€๋˜๋ฉด์„œ ์ด ํด๋ž˜์Šค์˜ ์ฑ…์ž„์ด ํ™•์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ์ž„ ID ๋ฐœ๊ธ‰, ์ƒํƒœ ์ €์žฅ, ๋ณต๊ตฌ, ์‚ญ์ œ๊นŒ์ง€ ๊ฒŒ์ž„์˜ ์ „์ฒด ์ƒ๋ช…์ฃผ๊ธฐ๋ฅผ ๊ด€๋ฆฌํ•˜๊ฒŒ ๋˜์—ˆ๊ณ , ์—ฐ๊ฒฐ๋ณด๋‹ค๋Š” ์ฃผ๋„์˜ ํŠน์„ฑ์„ ๋„๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ ๋„ค์ด๋ฐ์„ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.


3. ๋„๋ฉ”์ธ ๋กœ์ง ์„ค๊ณ„

์ด๋ฒˆ ๋ฏธ์…˜์„ ์ง„ํ–‰ํ•˜๋ฉฐ ๊ธฐ๋ฌผ ์ด๋™ ๊ฒฝ๋กœ๋‚˜ ๊ถ์„ฑ ์˜์—ญ๊ณผ ๊ฐ™์€ ๋ณต์žกํ•œ ๋„๋ฉ”์ธ ๋กœ์ง์„ ์„ค๊ณ„ํ•˜๋Š” ๊ณผ์ •์ด ๋จธ๋ฆฟ์†์— ์ž˜ ๊ทธ๋ ค์ง€์ง€ ์•Š์•„ ๊ฝค ํฐ ์–ด๋ ค์›€์„ ๊ฒช์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ํ•œ๊ณ„๋ฅผ ๋А๊ปด ํฌ๋ฃจ์›๋“ค๊ณผ ์˜๊ฒฌ์„ ๋‚˜๋ˆ„๊ณ , ๋‹ค๋ฅธ ์ฝ”๋“œ๋“ค์„ ์ฐธ๊ณ ํ•˜๊ฑฐ๋‚˜ AI์˜ ์กฐ์–ธ์„ ๋ฐ›์•„๊ฐ€๋ฉฐ ๊ฒจ์šฐ ๊ตฌํ˜„์„ ์™„๋ฃŒํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„์€ ํ–ˆ์ง€๋งŒ, "์ฒ˜์Œ๋ถ€ํ„ฐ ์ด ์„ค๊ณ„๋ฅผ ์Šค์Šค๋กœ ๋– ์˜ฌ๋ฆด ์ˆ˜ ์žˆ์—ˆ์„๊นŒ?" ํ•˜๋Š” ์•„์‰ฌ์›€๊ณผ ์Šค์Šค๋กœ์˜ ํž˜์œผ๋กœ ํ•ด๋‚ธ ๊ฒŒ ์•„๋‹ˆ๋‹ค ๋ณด๋‹ˆ, ์„ฑ์žฅํ•˜๊ธด ํ•œ ๊ฑธ๊นŒ? ๊ฐ™์€ ๊ณ ๋ฏผ์ด ๋‚จ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์„ค๊ณ„ ์—ญ๋Ÿ‰์€ ๊ฒฐ๊ตญ ์ ˆ๋Œ€์ ์ธ ๊ฒฝํ—˜์น˜๊ฐ€ ์Œ“์—ฌ์•ผ๋งŒ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋Š˜์–ด๋‚˜๋Š” ์˜์—ญ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค ๐Ÿฅฒ

win9-tech added 30 commits April 3, 2026 13:21
- Turn์„ Game ๋‚ด๋ถ€๋กœ ์ด๋™
- ConsoleView์—์„œ Position ์ง์ ‘ ๋ฐ˜ํ™˜
- ์ปจํŠธ๋กค๋Ÿฌ ์ž‘์—… ๋‹จ์œ„๋กœ ๋ฉ”์„œ๋“œ ๋ถ„๋ฆฌ
- public ๋ฉ”์„œ๋“œ ์ •๋ ฌ
- OutputView ์ค‘๋ณต ์ฝ”๋“œ ์ถ”์ถœ
@@ -0,0 +1,70 @@
package view;
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.

Runner์˜ ์˜์กด์„ฑ ๊ฐœ์ˆ˜๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด InputView์™€ OutputView๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ์€ ConsoleView๋ฅผ ๋„์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ๊ตฌ์กฐ๋Š” Runner์˜ ์˜์กด์„ฑ์„ ๋‹จ์ˆœํ™”ํ•˜๊ณ , View ๊ด€๋ จ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ConsoleView ํ•œ ๊ณณ์œผ๋กœ ์‘์ง‘ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š”๋ฐ์š”.

์—ฌ๊ธฐ์„œ ํ•œ ๊ฐ€์ง€ ๊ณ ๋ฏผ์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค.

ConsoleView ์˜์กด (ํ˜„์žฌ): ์˜์กด์„ฑ ๊ฐœ์ˆ˜๊ฐ€ ์ค„์–ด Runner๊ฐ€ ๊น”๋”ํ•ด์ง€์ง€๋งŒ, ๋‹จ์ˆœํžˆ ๋ฉ”์„œ๋“œ๋ฅผ ์ „๋‹ฌ๋งŒ ํ•˜๋Š” ํด๋ž˜์Šค๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒƒ ์•„๋‹Œ๊ฐ€ ํ•˜๋Š” ์šฐ๋ ค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Input/OutputView ์ง์ ‘ ์˜์กด: ํด๋ž˜์Šค ๊ฐœ์ˆ˜๋Š” ์ค„์–ด๋“ค์ง€๋งŒ, Runner๊ฐ€ View์˜ ๊ตฌ์ฒด์ ์ธ ์ฑ…์ž„(์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ) ๋‘ ๊ฐ€์ง€๋ฅผ ๋ชจ๋‘ ์•Œ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ฃผ๋””๋Š” ๋‹จ์ˆœํžˆ ์˜์กด์„ฑ ๊ฐœ์ˆ˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ถ”์ƒํ™” ๊ณ„์ธต(Facade)์„ ๋‘๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹œ๋‚˜์š”? ํ˜น์€ ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ์–ด๋–ค ๋ฐฉ์‹์„ ๋” ์„ ํ˜ธํ•˜์‹œ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค!

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์ €๋Š” Input/OutputView๊ฐ€ ํ•˜๋Š” ์—ญํ• ์ด ํ™•์‹คํ•˜๊ณ , ํ˜„์žฌ ๊ตฌ์กฐ๋Š” ConsoleView์— ๋ณ€๊ฒฝ์ด ์žˆ์œผ๋ฉด(๋‹ค๋ฅธ ์—ญํ• ์ด ์ƒ๊ฒจ ๋ฉ”์„œ๋“œ๋ช…์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ) ์–ด์ฐจํ”ผ ๋ชจ๋“  ๊ณณ์—์„œ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚  ๊ฒƒ ๊ฐ™์•„์š”
๊ทธ๋ž˜์„œ Input/OutputView ์ง์ ‘ ์˜์กด์„ ๋” ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค!

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.

์˜๊ฒฌ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ €๋„ ์ง์ ‘ ์˜์กด ๋ฐฉ์‹์„ ๋” ์„ ํ˜ธํ•˜์ง€๋งŒ, ์ด๋ฒˆ์—๋Š” '์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜ 3๊ฐœ ์ดํ•˜'๋ผ๋Š” ์ œ์•ฝ ์‚ฌํ•ญ์„ ์ง€ํ‚ค๊ธฐ ์œ„ํ•ด ํ˜„์žฌ ๊ตฌ์กฐ๋ฅผ ์œ ์ง€ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค ใ…œใ…œ!!


public class Palace {

private static final Palace INSTANCE = new Palace();
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.

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

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

  • Palace๋Š” ๋ถˆ๋ณ€ ๋ฐ์ดํ„ฐ
  • ๊ธฐ๋ฌผ ํ…Œ์ŠคํŠธ ์‹œ ์‹ค์ œ ๊ถ์„ฑ ์ขŒํ‘œ๋กœ ํ…Œ์ŠคํŠธํ•˜๋”๋ผ๋„ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š”๋‹ค.

ํ˜น์‹œ ์‹ฑ๊ธ€ํ†ค์œผ๋กœ ์ธํ•ด ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋ ค์›Œ์ง€๋Š” ์ผ€์ด์Šค๊ฐ€ ์žˆ์„๊นŒ์š”? ์ด์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹œ๋‚˜์š”??

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

๋ ˆ์„œ๊ฐ€ ๋ง์”€์ฃผ์‹ ๋Œ€๋กœ ๋ถˆ๋ณ€ ๋ฐ์ดํ„ฐ ์‹ฑ๊ธ€ํ†ค์€ ์ผ๋ฐ˜์ ์ธ ์‹ฑ๊ธ€ํ†ค ํ…Œ์ŠคํŠธ ๋ฌธ์ œ์—์„œ ์ž์œ ๋กœ์šด ๊ฒŒ ๋งž์•„์š”!
ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋ ค์šด ์ผ€์ด์Šค๋Š” ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ์ธ๋ฐ, ํ˜„์žฌ๋Š” ๋ช…์‹œ์ ์œผ๋กœ Palace ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š”๊ฒŒ ์—†๋„ค์š”!

MongoCollection<Document> collection = getCollection(client, "boards");
Long id = Long.parseLong(gameId);
Document document = collection.find(Filters.eq("_id", id)).first();
return Optional.ofNullable(parseGameStatus(id, document));
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.

Optional๊ณผ Exception ์ค‘ ๊ณ ๋ฏผ์ด ์žˆ์–ด ์งˆ๋ฌธ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

"์ •์ƒ์ ์œผ๋กœ ๊ฒฐ๊ณผ๊ฐ€ ์—†์„ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—” Optional, ์˜ˆ์™ธ์ ์ธ ์˜ค๋ฅ˜ ์ƒํ™ฉ์—” Exception"์ด๋ผ๋Š” ๊ธ€์„ ๋ณด๊ณ  Optional์„ ์„ ํƒํ–ˆ๋Š”๋ฐ, ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒŒ์ž„์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ƒํ™ฉ์€ ์˜คํžˆ๋ ค ์˜ˆ์™ธ์— ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ ์•„๋‹Œ๊ฐ€ ํ•˜๋Š” ์ƒ๊ฐ๋„ ๋“ค์–ด์„œ ํ™•์‹ ์ด ์„œ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ Optional์ด null ๊ฐ€๋Šฅ์„ฑ์„ ๋ช…์‹œ์ ์œผ๋กœ ๋“œ๋Ÿฌ๋‚ธ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค๊ณ  ํ•˜์ง€๋งŒ, Exception์œผ๋กœ๋„ "์ด ์ƒํ™ฉ์€ ๋ฐœ์ƒํ•˜๋ฉด ์•ˆ ๋œ๋‹ค"๋Š” ์˜๋„๋ฅผ ์ถฉ๋ถ„ํžˆ ๋“œ๋Ÿฌ๋‚ผ ์ˆ˜ ์žˆ์ง€ ์•Š๋‚˜ ํ•˜๋Š” ์˜๋ฌธ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ๋‘˜์˜ ๊ธฐ์ค€์„ ์–ด๋–ค ์‹์œผ๋กœ ์žก์œผ์‹œ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค!

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

๊ฒŒ์ž„์ด ์—†์œผ๋ฉด NotFoundException์„ ๋‚ด๋Š” ๊ฒƒ๋„ ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ์ผ ๊ฒƒ ๊ฐ™์•„์š”!
์ „์ฒด์ ์œผ๋กœ ์˜๋„ํ•œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด -> ์—๋Ÿฌ๋ฉ”์„ธ์ง€ -> ์ด์ „ ์ž…๋ ฅ์„ ์žฌ์‹œ๋„ํ•˜๋Š” ๊ตฌ์กฐ๋กœ ์žก์œผ์‹  ๊ฒƒ ๊ฐ™์•„์„œ ์ผ๋‹จ ํ˜„์žฌ ๊ตฌ์กฐ๊ฐ€ ํ†ต์ผ์„ฑ์ด ์žˆ๋„ค์š”!
์ •๋‹ต์€ ์•„๋‹ˆ์ง€๋งŒ ์ €๋Š” ๊ฒŒ์ž„ ํ๋ฆ„์„ ์˜ˆ์™ธ๋กœ ๊ฐ€์ ธ๊ฐ€์ง„ ์•Š์•„์„œ, ์ด๋Ÿฐ ๊ตฌ์กฐ๊ฐ€ ์•„๋‹Œ Optional์„ ์“ธ ๊ฒƒ ๊ฐ™๊ณ ์šฉ~ Optional์™€ Exception์€ ์กฐํšŒํ•œ ๊ฐ์ฒด๊ฐ€ ์—†๋Š”๊ฒŒ ์ •์ƒ์ ์ธ ์ƒํ™ฉ์ด๋ผ๋ฉด Optional์„ ์“ฐ๊ณ  ์—†๋Š”๊ฒŒ ๋ฌธ์ œ๋ผ๋ฉด Exception์„ ์”๋‹ˆ๋‹ค!

Copy link
Copy Markdown

@jurlring jurlring left a comment

Choose a reason for hiding this comment

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

๋ ˆ์„œ ์•ˆ๋…•ํ•˜์„ธ์š”!
์งˆ๋ฌธ ์ฃผ์‹  ๋ถ€๋ถ„์— ๋Œ€ํ•œ ๋‹ต๋ณ€๊ณผ ์ฝ”๋ฉ˜ํŠธ ๋ช‡๊ฐ€์ง€ ๋‹ฌ์•„๋‘์—ˆ์Šต๋‹ˆ๋‹ค.
์‹œ๊ฐ„ ๊ดœ์ฐฎ์œผ์‹ค ๋•Œ ํ™•์ธํ•ด์ฃผ์„ธ์š” :)


private void playGame(Game game) {
boolean isRunning = true;
gameRepository.saveBoard(game.getId(), game.getTurn(), game.getBoard());
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

gameRepository๋ฅผ ์ปฌ๋ ‰์…˜ ๋ณ„๋กœ ๋‚˜๋ˆ„๋ฉด ์–ด๋–จ๊นŒ์š”?
gameRepository์ธ๋ฐ saveBoard๋ฅผ ํ•˜๋Š” ๋ถ€๋ถ„์ด ์–ด์ƒ‰ํ•˜๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๊ฐ ์ƒํƒœ๋ฅผ ๋ชจ๋‘ ๊บผ๋‚ด์ง€๋ง๊ณ  game์„ ๋„˜๊ธฐ๋ฉด ์•ˆ๋˜๋‚˜์š”?
game์˜ ์ƒํƒœ๊ฐ€ ๋Š˜์–ด๋‚  ๊ฒฝ์šฐ ์ด ๋ถ€๋ถ„๋„ ๊ฐ™์ด ์ˆ˜์ •์ด ํ•„์š”ํ• ๊ฑฐ์—์š” ๐Ÿ˜ข

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.

1. gameRepository๋ฅผ ์ปฌ๋ ‰์…˜ ๋ณ„๋กœ ๋‚˜๋ˆ„๋ฉด ์–ด๋–จ๊นŒ์š”?

ํ˜„์žฌ ๊ตฌ์กฐ์—์„œ๋Š” (Id, Turn)๊ณผ Board๊ฐ€ ํ•ญ์ƒ ํ•จ๊ป˜ ์กฐํšŒ/์ €์žฅ๋˜๊ณ , MongoDB๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ , MongoDB๋Š” document ๋‹จ์œ„ atomicity๋ฅผ ๋ณด์žฅํ•˜๊ณ  JOIN์ด ์—†๋Š” ๊ตฌ์กฐ๋ผ, ์ปฌ๋ ‰์…˜์„ ๋ถ„๋ฆฌํ•  ๊ฒฝ์šฐ ์กฐํšŒ/์ €์žฅ ์‹œ ์˜คํžˆ๋ ค ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•œ๋‹ค๋Š” ์ ์— ๊ธฐ๋ฐ˜ํ•˜์—ฌ
ํ•˜๋‚˜์˜ document๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋” ์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.

๋งŒ์•ฝ ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด์žˆ๋Š” ๊ฒŒ์ž„์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ์ธ (Id, Turn)๊ณผ <-> ๋„๋ฉ”์ธ ๋ฐ์ดํ„ฐ board๋ฅผ ์—„๊ฒฉํžˆ ์ •๊ทœํ™”ํ•˜๊ณ  ๋ณ„๋„์˜ repository๋ฅผ ํ†ตํ•ด ๋ถ„๋ฆฌํ•˜์—ฌ ์ €์žฅํ•ด์•ผํ•˜๋Š” ์ƒํ™ฉ์ด์—ˆ๋‹ค๋ฉด RDS๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ๊ฐ™์€๋ฐ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹œ๋‚˜์š”??


2. gameRepository์ธ๋ฐ saveBoard๋ฅผ ํ•˜๋Š” ๋ถ€๋ถ„์ด ์–ด์ƒ‰ํ•˜๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๊ฐ ์ƒํƒœ๋ฅผ ๋ชจ๋‘ ๊บผ๋‚ด์ง€๋ง๊ณ  game์„ ๋„˜๊ธฐ๋ฉด ์•ˆ๋˜๋‚˜์š”?

๋ง์”€์ฃผ์‹  ๋ถ€๋ถ„ ์ƒ๊ฐํ•ด๋ณด๋‹ˆ ์ €์žฅํ•˜๋Š” ๋Œ€์ƒ์€ Game์ด๊ณ  Game์˜ Id, Turn, Board ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๊ณ ์žˆ๋Š”๋ฐ saveBoard ๋„ค์ด๋ฐ์€ ์–ด์ƒ‰ํ•œ๊ฑฐ๊ฐ™๋„ค์š” saveGame์œผ๋กœ ๋ฐ”๊ฟ”๋ณด์•˜์Šต๋‹ˆ๋‹ค!


3. ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๊ฐ ์ƒํƒœ๋ฅผ ๋ชจ๋‘ ๊บผ๋‚ด์ง€๋ง๊ณ  game์„ ๋„˜๊ธฐ๋ฉด ์•ˆ๋˜๋‚˜์š”? game์˜ ์ƒํƒœ๊ฐ€ ๋Š˜์–ด๋‚  ๊ฒฝ์šฐ ์ด ๋ถ€๋ถ„๋„ ๊ฐ™์ด ์ˆ˜์ •์ด ํ•„์š”ํ• ๊ฑฐ์—์š” ๐Ÿ˜ข

game ๊ฐ์ฒด๋ฅผ ๊ทธ๋Œ€๋กœ ๋„˜๊ธฐ๋ฉด repository ๋‚ด๋ถ€์—์„œ๋„ ๊ฒฐ๊ตญ ํ•„์š”ํ•œ ๊ฐ’๋“ค์„ ๊บผ๋‚ด์„œ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ธก๋ฉด์—์„œ "๊บผ๋‚ธ๋‹ค๋Š” ํ–‰์œ„"๋Š” ๋™์ผํ•˜์ง€๋งŒ
Runner์— ์žˆ์œผ๋ฉด Runner์™€ Repository Interface๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋Š” ๋ฐ˜๋ฉด, Repository์— ์žˆ์œผ๋ฉด Repository๋งŒ ๋ฐ”๊พธ๋ฉด ๋˜๋‹ˆ๊นŒ Runner์—์„œ ๊บผ๋‚ด๋Š” ๊ฒƒ๋ณด๋‹ค Repository์—์„œ ๊บผ๋‚ด๋Š” ๊ฒŒ ๋ณ€๊ฒฝ ๋ฒ”์œ„์˜ ์ตœ์†Œํ™” ๊ด€์ ์—์„œ ์ ์ ˆํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹œ๋Š” ๊ฑธ๊นŒ์š”?

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

  1. ์ œ๊ฐ€ ๋งํ•œ ๊ฑด document ๊ตฌ์กฐ ๋ถ„๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ, gameRepository์™€ gameRepository ์˜ ๊ตฌํ˜„์ œ์ฒด์ธ MongoDBRepository ํด๋ž˜์Šค ์•ˆ์— boards ์ปฌ๋ ‰์…˜ ๊ด€๋ จ ๋กœ์ง๊ณผ counters ์ปฌ๋ ‰์…˜ ๊ด€๋ จ ๋กœ์ง์ด ํ•จ๊ป˜ ์žˆ๋Š”๋ฐ, ์ด๊ฑธ BoardRepository์™€ CounterRepository์ฒ˜๋Ÿผ ํด๋ž˜์Šค ๋ ˆ๋ฒจ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒŒ ์–ด๋–ป๋ƒ๋Š” ์˜๋ฏธ์˜€์–ด์š”. MongoDBRepository๊ฐ€ ๊ฐ€์ง„ ์ฑ…์ž„์ด ๋„ˆ๋ฌด ํฌ๋‹ค๊ณ  ๋А๊ผˆ์Šต๋‹ˆ๋‹ค.
  2. ๐Ÿ‘
  3. ๋„ค ์ˆ˜์ •์˜ ์ตœ์†Œํ™” ์ธก๋ฉด์—์„œ ๋ง์”€๋“œ๋ ธ์–ด์š” :)

public class Soldier extends Piece {

private final List<List<Direction>> paths;
private final List<List<Direction>> PATHS;
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์ƒ์ˆ˜๊ฐ€ ์•„๋‹Œ๋ฐ ๋Œ€๋ฌธ์ž๋กœ ์“ฐ์‹  ์ด์œ ๊ฐ€ ์žˆ๋‚˜์š”~?

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.

Soldier๋Š” ๋‹ค๋ฅธ ๊ธฐ๋ฌผ๋“ค๊ณผ ๋‹ค๋ฅด๊ฒŒ ์ง„์˜์— ๋”ฐ๋ผ paths๊ฐ€ ๋‹ฌ๋ผ์ง€๋‹ค ๋ณด๋‹ˆ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š”๋ฐ, ์ˆœ๊ฐ„์ ์œผ๋กœ ์ƒ์ˆ˜๋ผ๊ณ  ์ฐฉ๊ฐํ•ด์„œ ๋Œ€๋ฌธ์ž๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜‚ ์ปจ๋ฒค์…˜์— ๋งž๊ฒŒ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ผผ๊ผผํ•œ ํ™•์ธ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

Comment on lines +5 to +16
public class ScoreStatus {

private double choScore = 0;
private double hanScore = 1.5;

public void reflect(Piece piece) {
if (piece.getSide() == Side.CHO) {
choScore += piece.getScore();
return;
}
hanScore += piece.getScore();
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

getChoScore(), getHanScore() getter๊ฐ€ ์žˆ๊ณ , ํ•„๋“œ๋„ double choScore, double hanScore๋กœ ๊ฐ€๋ณ€ ์ƒํƒœ์˜ˆ์š”.
์š”๊ตฌ์‚ฌํ•ญ์— ๊ฒŒํ„ฐ/์„ธํ„ฐ๋ฅผ ์“ฐ์ง€ ์•Š๋Š”๋‹ค ๊ฐ€ ์žˆ๋Š”๋ฐ, ํ˜„์žฌ ScoreStatus๊ฐ€ getter๋ฅผ ์™ธ๋ถ€์— ๊ณต๊ฐœํ•˜๊ณ  ์žˆ๋„ค์š”..!
๋˜ํ•œ reflect()๋กœ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฐ€๋ณ€ ๊ฐ์ฒด์ธ๋ฐ, ์ ์ˆ˜ ๊ณ„์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ถˆ๋ณ€์œผ๋กœ ๋งŒ๋“ค๋ฉด ์–ด๋–จ๊นŒ์š”?

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.

๋ฆฌ๋ทฐ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๋ง์”€ํ•˜์‹  ๋Œ€๋กœ ๊ฐ€๋ณ€ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒŒ ์œ„ํ—˜ํ•ด ๋ณด์—ฌ์„œ ์•„์˜ˆ ๋ถˆ๋ณ€ ๊ฐ์ฒด๋กœ ๊ตฌ์กฐ๋ฅผ ๋ฐ”๊ฟจ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜Š

์šฐ์„  reflect() ๋ฉ”์„œ๋“œ ๋Œ€์‹  ํŒฉํ† ๋ฆฌ ๋ฉ”์„œ๋“œ๋ฅผ ์จ์„œ ์ƒ์„ฑํ•  ๋•Œ ๊ณ„์‚ฐ์„ ๋๋‚ด๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ Getter๋ฅผ ์ง€์šฐ๊ณ  winner()์ฒ˜๋Ÿผ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ–‰์œ„ ๊ธฐ๋ฐ˜ ๋ฉ”์„œ๋“œ๋“ค์„ ์ถ”๊ฐ€ํ•ด๋ดค์Šต๋‹ˆ๋‹ค!

Comment on lines +28 to +34
while (true) {
try {
return selectGame();
} catch (IllegalArgumentException e) {
consoleView.printErrorMessage(e.getMessage());
}
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์š” ํด๋ž˜์Šค์—์„œ while(true) + try/catch ํŒจํ„ด์ด ๋™์ผํ•˜๊ฒŒ ๋ฐ˜๋ณต๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋Š”๋ฐ์š”~
์ค‘๋ณต์„ ์—†์•จ ๋ฐฉ๋ฒ•์€ ์—†์„๊นŒ์š”?

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.

readOption(), readSourcePosition(), readTargetPosition() ๋“ฑ์—์„œ ๋™์ผํ•œ ํŒจํ„ด์ด 6๋ฒˆ ๋ฐ˜๋ณต๋˜๊ณ  ์žˆ๋Š” ๊ฑธ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

ํŒจํ„ด์ด ๋ฐ˜๋ณต๋œ๋‹ค๊ณ  ์ƒ๊ฐ์€ ํ–ˆ์ง€๋งŒ, ์ œ๊ฑฐํ•  ์ƒ๊ฐ์€ ๋ชป ํ–ˆ๋Š”๋ฐ์š”. ์ฐพ์•„๋ณด๋‹ˆ ๋žŒ๋‹ค๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์—ˆ๋„ค์š”! ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!!

private final MongoClient client;

public MongoDBRepository() {
this.client = MongoClients.create(URI);
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์ปค๋„ฅ์…˜์€ ์–ธ์ œ ๋‹ซ๋‚˜์š”?

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.

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

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

๋ฌด์—‡๋ณด๋‹ค๋„, ๋ฆฌ์†Œ์Šค ํ•ด์ œ๋ฅผ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์ด ์ฝ”๋“œ์˜ ์˜๋„๋ฅผ ๋ช…ํ™•ํžˆ ์ „๋‹ฌํ•˜๋Š” ์ข‹์€ ์Šต๊ด€์ด๋ผ ํŒ๋‹จ๋˜์–ด
ํ”„๋กœ๊ทธ๋žจ ์ •์ƒ ์ข…๋ฃŒ, ์˜ˆ์™ธ ์ข…๋ฃŒ ์‹œ ์ปค๋„ฅ์…˜์„ ๋‹ซ๋Š” ๋กœ์ง์„ ์ถ”๊ฐ€ํ–ˆ๋Š”๋ฐ,

ํ˜น์‹œ ์ œ๊ฐ€ ๋†“์นœ ๋ถ€๋ถ„์ด ์žˆ๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์˜๋„๋กœ ์งˆ๋ฌธ ์ฃผ์‹ ๊ฑด์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค :)

@@ -0,0 +1,70 @@
package view;
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์ €๋Š” Input/OutputView๊ฐ€ ํ•˜๋Š” ์—ญํ• ์ด ํ™•์‹คํ•˜๊ณ , ํ˜„์žฌ ๊ตฌ์กฐ๋Š” ConsoleView์— ๋ณ€๊ฒฝ์ด ์žˆ์œผ๋ฉด(๋‹ค๋ฅธ ์—ญํ• ์ด ์ƒ๊ฒจ ๋ฉ”์„œ๋“œ๋ช…์„ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒฝ์šฐ) ์–ด์ฐจํ”ผ ๋ชจ๋“  ๊ณณ์—์„œ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚  ๊ฒƒ ๊ฐ™์•„์š”
๊ทธ๋ž˜์„œ Input/OutputView ์ง์ ‘ ์˜์กด์„ ๋” ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค!

MongoCollection<Document> collection = getCollection(client, "boards");
Long id = Long.parseLong(gameId);
Document document = collection.find(Filters.eq("_id", id)).first();
return Optional.ofNullable(parseGameStatus(id, 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.

๊ฒŒ์ž„์ด ์—†์œผ๋ฉด NotFoundException์„ ๋‚ด๋Š” ๊ฒƒ๋„ ์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ์ผ ๊ฒƒ ๊ฐ™์•„์š”!
์ „์ฒด์ ์œผ๋กœ ์˜๋„ํ•œ ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด -> ์—๋Ÿฌ๋ฉ”์„ธ์ง€ -> ์ด์ „ ์ž…๋ ฅ์„ ์žฌ์‹œ๋„ํ•˜๋Š” ๊ตฌ์กฐ๋กœ ์žก์œผ์‹  ๊ฒƒ ๊ฐ™์•„์„œ ์ผ๋‹จ ํ˜„์žฌ ๊ตฌ์กฐ๊ฐ€ ํ†ต์ผ์„ฑ์ด ์žˆ๋„ค์š”!
์ •๋‹ต์€ ์•„๋‹ˆ์ง€๋งŒ ์ €๋Š” ๊ฒŒ์ž„ ํ๋ฆ„์„ ์˜ˆ์™ธ๋กœ ๊ฐ€์ ธ๊ฐ€์ง„ ์•Š์•„์„œ, ์ด๋Ÿฐ ๊ตฌ์กฐ๊ฐ€ ์•„๋‹Œ Optional์„ ์“ธ ๊ฒƒ ๊ฐ™๊ณ ์šฉ~ Optional์™€ Exception์€ ์กฐํšŒํ•œ ๊ฐ์ฒด๊ฐ€ ์—†๋Š”๊ฒŒ ์ •์ƒ์ ์ธ ์ƒํ™ฉ์ด๋ผ๋ฉด Optional์„ ์“ฐ๊ณ  ์—†๋Š”๊ฒŒ ๋ฌธ์ œ๋ผ๋ฉด Exception์„ ์”๋‹ˆ๋‹ค!

@@ -280,28 +296,30 @@ class GuardMove {
@DisplayName("์‚ฌ๊ฐ€ ํ•œ ์นธ ์ด๋™ํ•œ๋‹ค.")
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

๋Œ€๊ฐ์„ ์œผ๋กœ ๊ฐ€๋Š” ์ผ€์ด์Šค๋Š” ์—†๋Š” ๊ฒƒ ๊ฐ™์•„์š”

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.

์ฐจ,ํฌ,์‚ฌ, ์ซ„, ๋ณ‘ ๋Œ€๊ฐ์„  ์ด๋™ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค!

}

private boolean handleMoveResult(Game game, Turn turn, Piece captured) {
if (captured.isKing()) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์š” ์ผ€์ด์Šค๋Š” ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ๋‚˜์š”~?

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.

handleMoveResult()๋Š” private ๋ฉ”์„œ๋“œ์ด๊ณ , consoleView, gameRepository์™€ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ์–ด ์ง์ ‘ ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋ ต๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค

๊ทธ๋ž˜์„œ Game ์•ˆ์œผ๋กœ ๋„ฃ์„๊นŒ๋„ ์ƒ๊ฐํ•ด๋ดค์ง€๋งŒ ConsoleView, GameRepository์— ์˜์กดํ•ด์•ผํ•œ๋‹ค๋Š” ์ , ํ๋ฆ„์ œ์–ด ๋˜ํ•œ ๋‹ด๋‹นํ•˜๋Š” Runner์˜ ํŠน์„ฑ์ƒ ํ˜„ ์œ„์น˜์— ๋ฐฐ์น˜ํ•˜๋Š”๊ฒŒ ์˜ฌ๋ฐ”๋ฅด๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ์š”, ์ด์— ๋Œ€ํ•ด์„œ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹œ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค!

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์ด ๊ณ ๋ฏผ ์ž์ฒด๊ฐ€ ์‚ฌ์‹ค ์„ค๊ณ„ ์‹ ํ˜ธ์ผ ์ˆ˜ ์žˆ์–ด์š”!
ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์€ ์ข…์ข… ํ•ด๋‹น ๋กœ์ง์ด ์™ธ๋ถ€ ์˜์กด์„ฑ๊ณผ ๋„ˆ๋ฌด ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ด๊ธฐ๋„ ํ•˜๊ฑฐ๋“ ์š”.
captured.isKing()์ด๋ฉด ๊ฒŒ์ž„ ์ข…๋ฃŒ๋ผ๋Š” ํŒ๋‹จ ์ž์ฒด๋Š” ์‚ฌ์‹ค Game์ด ์•Œ๊ณ  ์žˆ์–ด๋„ ๋˜๋Š” ๊ฒƒ ์•„๋‹๊นŒ์š”?
Game.isOver()๋‚˜ Game.isCapturedKing(captured) ํ˜•ํƒœ๋กœ ํŒ๋‹จ์€ Game์—, ํ›„์† ์ฒ˜๋ฆฌ(DB ์‚ญ์ œ, ์ถœ๋ ฅ)๋Š” Runner์— ๋‘๋Š” ๊ตฌ์กฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์…”๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š” ~


public class Palace {

private static final Palace INSTANCE = new Palace();
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

๋ ˆ์„œ๊ฐ€ ๋ง์”€์ฃผ์‹ ๋Œ€๋กœ ๋ถˆ๋ณ€ ๋ฐ์ดํ„ฐ ์‹ฑ๊ธ€ํ†ค์€ ์ผ๋ฐ˜์ ์ธ ์‹ฑ๊ธ€ํ†ค ํ…Œ์ŠคํŠธ ๋ฌธ์ œ์—์„œ ์ž์œ ๋กœ์šด ๊ฒŒ ๋งž์•„์š”!
ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋ ค์šด ์ผ€์ด์Šค๋Š” ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒฝ์šฐ์ธ๋ฐ, ํ˜„์žฌ๋Š” ๋ช…์‹œ์ ์œผ๋กœ Palace ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š”๊ฒŒ ์—†๋„ค์š”!

private static final String INVALID_POSITION_RANGE = "x ์ขŒํ‘œ๋Š” 1~9, y ์ขŒํ‘œ๋Š” 1~10, ์‚ฌ์ด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.";

private static final Map<Integer, Position> CACHE = new HashMap<>();
private static final Position[][] CACHE = new Position[MAX_X + 1][MAX_Y + 1];
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.

์ถ”๊ฐ€๋กœ ์ €๋ฒˆ ๋ฏธ์…˜ ๋งˆ์ง€๋ง‰์— ๋‚จ๊ฒจ์ฃผ์…จ๋˜ ํ‚ค๊ฐ’ ์ƒ์„ฑ๋ฐฉ์‹ x * 100 + y์˜ ํ™•์žฅ์„ฑ, ์•ˆ์ „ํ•จ์— ๋Œ€ํ•œ ํŒ๋‹จ, ์˜๋„์ „๋‹ฌ์— ๋Œ€ํ•œ ๋ฌธ์ œ๋ฅผ ๊ณ ๋ฏผํ•ด๋ดค์Šต๋‹ˆ๋‹ค.

๊ณ ๋ฏผ ๊ฒฐ๊ณผ 2์ฐจ์› ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์žฅ์ ์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. 2์ฐจ์› ์ขŒํ‘œ -> 2์ฐจ์› ๋ฐฐ์—ด๋กœ ์˜๋„๊ฐ€ ๋ช…ํ™•ํ•˜๋‹ค
  2. ๋ฐฐ์—ด ํฌ๊ธฐ๊ฐ€ MAX_X + 1, MAX_Y + 1๋กœ ์„ ์–ธ๋˜์–ด ๋ฒ”์œ„๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ๋“œ๋Ÿฌ๋‚œ๋‹ค
  3. ํ‚ค ๊ณ„์‚ฐ์ด ์—†๊ธฐ๋–„๋ฌธ์— ์ถ”๋ก ์ด ๋ถˆํ•„์š”ํ•˜๋‹ค

๊ณ ๋ฏผ ๊ณผ์ •์—์„œ ์ธ๋ฑ์Šค 0์ด ๋‚ญ๋น„๋œ๋‹ค๋Š” ์ ์„ ๊ณ ๋ฏผํ•˜๊ธด ํ–ˆ์ง€๋งŒ, ์‚ฌ์†Œํ•œ ๋ถ€๋ถ„์ด๋ผ ์ƒ๊ฐํ•˜์—ฌ ์ด๋Œ€๋กœ ์ง„ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค!!

Copy link
Copy Markdown

@jurlring jurlring left a comment

Choose a reason for hiding this comment

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

๋ ˆ์„œ ์•ˆ๋…•ํ•˜์„ธ์š”~
์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต๋ณ€๊ณผ ์ฝ”๋ฉ˜ํŠธ ๋ช‡๊ฐ€์ง€ ๋‹ฌ์•„๋‘์—ˆ์Šต๋‹ˆ๋‹ค~!
์‹œ๊ฐ„ ๊ดœ์ฐฎ์œผ์‹ค ๋•Œ ํ™•์ธํ•ด์ฃผ์„ธ์š” :)


import java.util.Map;

public class GameStatus {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์š”๊ตฌ์‚ฌํ•ญ์— getter/setter ์‚ฌ์šฉ ๊ธˆ์ง€๊ฐ€ ์žˆ๋Š”๋ฐ, GameStatus ๊ด€๋ จํ•ด์„œ๋Š” ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹œ๋‚˜์š”? GameStatus๊ฐ€ ์ง์ ‘ Game์„ ๋งŒ๋“ค์–ด ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐฉ์‹์€ ์–ด๋–จ๊นŒ์š” ~?

return move(game, turn);
}

private boolean move(Game game, Turn turn) {
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,0 +1,9 @@
package constant;

public class BoardConstant {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์ƒ์ˆ˜๋งŒ ๋‹ด๋Š” ํด๋ž˜์Šค์ธ๋ฐ private ์ƒ์„ฑ์ž๊ฐ€ ์—†๋„ค์š”!
์™ธ๋ถ€์—์„œ new BoardConstant()๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์ธ๋ฐ, ์ด๋Ÿฐ ์œ ํ‹ธ์„ฑ ์ƒ์ˆ˜ ํด๋ž˜์Šค๋Š” ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ๋ง‰์œผ๋ฉด ์–ด๋•Œ์š”?

return retryOnError(consoleView::readOption);
}

private void playGame(Game game) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์ƒˆ ๊ฒŒ์ž„์„ ์ƒ์„ฑํ•  ๋•Œ๋Š” createNewGame()์—์„œ ๋ณด๋“œ ์ƒํƒœ๋ฅผ ์ถœ๋ ฅํ•˜์ง€๋งŒ, ์ €์žฅ์€ playGame()์—์„œ ์ด๋ฃจ์–ด์ง€๊ณ  ์žˆ๋„ค์š”.
์ƒˆ ๊ฒŒ์ž„ ์ƒ์„ฑ โ†’ ๋ฐ”๋กœ ์ €์žฅ์ด ์•„๋‹ˆ๋ผ ๊ฒŒ์ž„ ๋ฃจํ”„ ์ง„์ž… ํ›„ ์ €์žฅ๋˜๋Š” ํ๋ฆ„์ด ์ž์—ฐ์Šค๋Ÿฌ์šด์ง€, ์•„๋‹ˆ๋ฉด createNewGame() ์•ˆ์—์„œ ์ €์žฅํ•˜๋Š” ํŽธ์ด ๋” ์‘์ง‘๋„๊ฐ€ ๋†’์€์ง€์— ๋Œ€ํ•ด์„œ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹œ๋‚˜์š”?

}

private boolean handleMoveResult(Game game, Turn turn, Piece captured) {
if (captured.isKing()) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์ด ๊ณ ๋ฏผ ์ž์ฒด๊ฐ€ ์‚ฌ์‹ค ์„ค๊ณ„ ์‹ ํ˜ธ์ผ ์ˆ˜ ์žˆ์–ด์š”!
ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์–ด๋ ต๋‹ค๋Š” ๊ฒƒ์€ ์ข…์ข… ํ•ด๋‹น ๋กœ์ง์ด ์™ธ๋ถ€ ์˜์กด์„ฑ๊ณผ ๋„ˆ๋ฌด ๊ฐ•ํ•˜๊ฒŒ ๊ฒฐํ•ฉ๋˜์–ด ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ด๊ธฐ๋„ ํ•˜๊ฑฐ๋“ ์š”.
captured.isKing()์ด๋ฉด ๊ฒŒ์ž„ ์ข…๋ฃŒ๋ผ๋Š” ํŒ๋‹จ ์ž์ฒด๋Š” ์‚ฌ์‹ค Game์ด ์•Œ๊ณ  ์žˆ์–ด๋„ ๋˜๋Š” ๊ฒƒ ์•„๋‹๊นŒ์š”?
Game.isOver()๋‚˜ Game.isCapturedKing(captured) ํ˜•ํƒœ๋กœ ํŒ๋‹จ์€ Game์—, ํ›„์† ์ฒ˜๋ฆฌ(DB ์‚ญ์ œ, ์ถœ๋ ฅ)๋Š” Runner์— ๋‘๋Š” ๊ตฌ์กฐ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์…”๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š” ~


private void playGame(Game game) {
boolean isRunning = true;
gameRepository.saveBoard(game.getId(), game.getTurn(), game.getBoard());
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

  1. ์ œ๊ฐ€ ๋งํ•œ ๊ฑด document ๊ตฌ์กฐ ๋ถ„๋ฆฌ๊ฐ€ ์•„๋‹ˆ๋ผ, gameRepository์™€ gameRepository ์˜ ๊ตฌํ˜„์ œ์ฒด์ธ MongoDBRepository ํด๋ž˜์Šค ์•ˆ์— boards ์ปฌ๋ ‰์…˜ ๊ด€๋ จ ๋กœ์ง๊ณผ counters ์ปฌ๋ ‰์…˜ ๊ด€๋ จ ๋กœ์ง์ด ํ•จ๊ป˜ ์žˆ๋Š”๋ฐ, ์ด๊ฑธ BoardRepository์™€ CounterRepository์ฒ˜๋Ÿผ ํด๋ž˜์Šค ๋ ˆ๋ฒจ๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒŒ ์–ด๋–ป๋ƒ๋Š” ์˜๋ฏธ์˜€์–ด์š”. MongoDBRepository๊ฐ€ ๊ฐ€์ง„ ์ฑ…์ž„์ด ๋„ˆ๋ฌด ํฌ๋‹ค๊ณ  ๋А๊ผˆ์Šต๋‹ˆ๋‹ค.
  2. ๐Ÿ‘
  3. ๋„ค ์ˆ˜์ •์˜ ์ตœ์†Œํ™” ์ธก๋ฉด์—์„œ ๋ง์”€๋“œ๋ ธ์–ด์š” :)


public class MongoDBRepository implements GameRepository {

private static final String URI = "mongodb://localhost:27017";
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

NoSQL ์ข…๋ฅ˜๋ณ„๋กœ ์ง์ ‘ ์กฐ์‚ฌํ•˜๊ณ  ๋น„๊ตํ•ด์„œ ์„ ํƒํ•˜์‹  ๊ณผ์ •์ด ์ธ์ƒ ๊นŠ์—ˆ์–ด์š”! ๐Ÿ‘
๋‹ค๋งŒ MongoDB๋„ ํŠธ๋žœ์žญ์…˜์„ ์ง€์›ํ•˜๊ณ  ์žˆ์–ด์„œ ACID ์œ ๋ฌด๊ฐ€ ์„ ํƒ์˜ ๊ทผ๊ฑฐ๊ฐ€ ๋˜๊ธด ์–ด๋ ค์šธ ๊ฒƒ ๊ฐ™์•„์š”! https://www.mongodb.com/ko-kr/docs/manual/core/transactions/
์žฅ๊ธฐํŒ ์ „์ฒด ์ƒํƒœ๋ฅผ ํ•˜๋‚˜์˜ ๋„ํ๋จผํŠธ๋กœ ์ €์žฅํ•˜๋Š” ๊ตฌ์กฐ ์ž์ฒด๋Š” MongoDB๋ž‘ ์ž˜ ๋งž์•„์„œ ์„ ํƒ ์ž์ฒด๋Š” ์ž์—ฐ์Šค๋Ÿฝ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š” ~

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.

2 participants