Skip to content

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

Open
choubung wants to merge 71 commits intowoowacourse:choubungfrom
choubung:step2

Conversation

@choubung
Copy link
Copy Markdown

@choubung choubung commented Apr 8, 2026

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

์•ˆ๋…•ํ•˜์„ธ์š” ๋ฒ ๋ฃจ์Šค!
์‚ฌ์ดํด 2๋„ ์ž˜ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค!!

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

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

๊ถ์„ฑ

1. Place์˜ ์ค‘๋ณต

  • ํ˜„์žฌ Board๋Š” ์–‘ ์ง„์˜ ์ „์ฒด์˜ ๊ถ์„ฑ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ๊ถ์„ฑ ๋‚ด๋ถ€ ๊ธฐ๋ฌผ(์™•๊ณผ ์‚ฌ)๋Š” MoveRule์„ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ์ž์‹ ์ด ์†ํ•œ ์ง„์˜์˜ ๊ถ์„ฑ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๊ธฐ๋ฌผ์ด ์ด๋™์ „๋žต์„ ๊ณ„์‚ฐํ•  ๋•Œ board๋ฅผ ๊ฒฝ์œ ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค, ์Šค์Šค๋กœ ์ด๋™ ์ œ์•ฝ ์กฐ๊ฑด์„ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒƒ(์ •ํ™•ํžˆ๋Š” Place ๊ฐ์ฒด๋ฅผ ์กฐํ•ฉ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ)์ด ๊ฐ์ฒด์˜ ์ž์œจ์„ฑ ์ธก๋ฉด์—์„œ ๋” ํƒ€๋‹นํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ง€๊ธˆ ๊ตฌ์กฐ๊ฐ€ ๋‚˜์„์ง€ ์•„๋‹ˆ๋ฉด Board๋งŒ์ด Place ์ •๋ณด๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒƒ์ด ์ข‹์„์ง€(Place๋„ ๊ฒฐ๊ตญ์€ ๋ณด๋“œ์˜ ์ง€ํ˜•์ด๋ฏ€๋กœ) ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค!

2. ์ฐจํฌ์กธ์˜ ๊ถ์„ฑ ๋‚ด ์ด๋™

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

์˜์†์„ฑ

1. ์ „์ฒด ์‚ญ์ œ ํ›„ ์ „์ฒด ์—…๋ฐ์ดํŠธ

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

2. ๋ทฐ์™€ ๋„๋ฉ”์ธ๊ณผ ์˜์†์„ฑ ์ฝ”๋“œ์˜ ๋ถ„๋ฆฌ, ์—ฐ๊ฒฐ

  • Enum(PieceType, Team)๊ณผ ๋ทฐ(View)๋ฅผ ๋ถ„๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด, ๊ธฐ์กด์˜ ํ•œ๊ธ€ ๋ช…์นญ์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ๊ทธ๋Ÿฌ๋‹ค ๋ณด๋‹ˆ DB์— ์ €์žฅํ•  ๋•Œ ์‚ฌ์šฉํ•  String์ •๋ณด๊ฐ€ ๋ชจํ˜ธํ•ด์„œ ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ DB ์ €์žฅ ๋ฐ ์‹๋ณ„์„ ์œ„ํ•œ '์ฝ”๋“œ(Code)' ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์š”๊ตฌ์‚ฌํ•ญ์— ๊ธฐ์กด์˜ ๋„๋ฉ”์ธ ์ฝ”๋“œ๋ฅผ ์ตœ๋Œ€ํ•œ ๊ฑด๋“œ๋ฆฌ์ง€ ๋ง๋ผ๊ณ  ํ–ˆ๋Š”๋ฐ, ์‹๋ณ„์ž๋ฅผ ๋„ฃ๋Š” ์œ„์™€ ๊ฐ™์€ ํ–‰๋™์€ ๋„๋ฉ”์ธ ํ›ผ์†์ธ์ง€ ๋ถˆ๊ฐ€๊ฒฐํ•œ ์„ ํƒ์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.
  1. Empty ๊ธฐ๋ฌผ์˜ ์ €์žฅ ์ œ์™ธ
  • ์žฅ๊ธฐํŒ์˜ ๋ชจ๋“  ์ขŒํ‘œ(90์นธ)๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๊ณ , ์‹ค์ œ ๊ธฐ๋ฌผ์ด ์กด์žฌํ•˜๋Š” ์ขŒํ‘œ๋งŒ DB์— ๊ธฐ๋กํ•˜๋„๋ก Board์™€ Repository์—์„œ ํ•„ํ„ฐ๋ง์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.
  • ์ง€๊ธˆ์€ ์–‘์ธก์—์„œ ๊ฑฐ๋ฅด๋„๋ก ํ•˜๊ณ  ์žˆ์ง€๋งŒ, ํ•œ ์ชฝ์ด ๊ฒฌ๊ณ ํ•˜๋‹ค๋ฉด ๋‹ค๋ฅธ ํ•œ ์ชฝ์€ ๋ถˆํ•„์š”ํ•œ ๋ฐฉ์–ด๋กœ์ง์ธ๊ฐ€ ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ญ๋‹ˆ๋‹ค. Board ์ชฝ์œผ๋กœ ๊ฒ€์ฆ ๋กœ์ง์„ ๋ชฐ์•„์„œ ์• ์ดˆ์— ๋ณด๋“œ๊ฐ€ EmptyPiece๋Š” ๋“ค๊ณ  ์žˆ์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒŒ ์ข‹์„๊นŒ์š”? ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹œ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

choubung added 30 commits April 3, 2026 14:49
candidatePositions -> createByDirections
beteween -> straightPathBetween
Copy link
Copy Markdown

@verus-j verus-j left a comment

Choose a reason for hiding this comment

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

์•ˆ๋…•ํ•˜์„ธ์š” ํŒŒ๋„~
2๋‹จ๊ณ„ ์ง„ํ–‰ํ•˜์‹œ๋А๋ผ ๊ณ ์ƒํ•˜์…จ์Šต๋‹ˆ๋‹ค. Palace๋กœ ๋ถ„๋ฆฌ ์ž˜ํ•˜์…จ์Šต๋‹ˆ๋‹ค. ์•„์‰ฌ์šด ์ ์€ Board์™€ AdvisorMoveRule์ด ๊ฐ๊ฐ Palace๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์œ„์น˜์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•˜์…จ๋Š”๋ฐ ๋ˆ„๊ฐ€ Palace๋ฅผ ๋” ํ•„์š”ํ•˜๋Š”์ง€ ๊ณ ๋ฏผํ•ด๋ณด๊ณ  ์œ„์น˜๋ฅผ ๊ฒฐ์ •ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

DB์—์„œ ๋ทฐ์™€ ๊ด€๋ จ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•œ๊ฑด ์ž˜ํ•˜์‹  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ code๋กœ ์กฐํšŒํ•˜๋Š” ๋กœ์ง์—์„œ Map์œผ๋กœ ๊ด€๋ฆฌํ•  ํ•„์š”๋Š” ์—†์„ ๊ฒƒ ๊ฐ™์•„์š”.

EmptyPiece์— ๋Œ€ํ•ด ๊ณ ๋ฏผ์„ ํ•˜์…จ๋Š”๋ฐ, DB์™€ ๋„๋ฉ”์ธ ๊ฐ์ฒด๋ฅผ ํ•ญ์ƒ ๋™์ผํ•˜๊ฒŒ ๋งž์ถœ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. Board์— EmptyPiece๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์ง€๋งŒ DB์— EmptyPiece ์ •๋ณด๋ฅผ ์ €์žฅํ•  ์ˆ˜๋„ ์žˆ๊ณ  ๋ฐ˜๋Œ€๋กœ Board์— EmptyPiece ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ DB์— EmptyPiece ์ •๋ณด๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์–ด์š”. ์„œ๋กœ ๋‹ค๋ฅด๊ฒŒ ๋ณ€ํ™”ํ•œ๋‹ค๊ณ  ์ƒ๊ฐ์„ ํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”~

Comment on lines +37 to +38
janggiGame.decideWinner();
assertThat(janggiGame.getWinner()).isEqualTo(Team.CHO);
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

decideWinner์™€ getWinner๋ฅผ ํ•ฉ์น˜๋Š”๊ฑด ์–ด๋–ค๊ฐ€์š”?

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.

์ฝ”๋ฉ˜ํŠธ ๋ณด๊ณ  ์ƒ๊ฐํ•ด๋ณด๋‹ˆ getWinner๊ฐ€ ๋‹จ์ˆœ getter์ด๊ณ , decide Winner๋ž‘ ๋–จ์–ด์ ธ์„œ ์‚ฌ์šฉ๋  ์ผ์ด ์—†์„ ๊ฒƒ ๊ฐ™์•„์„œ decideWinner๊ฐ€ ์ด๊ธด ์ง„์˜์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ๊นŒ์ง€ ํ•˜๋„๋ก ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค!

Comment on lines +50 to +52
janggiGame.skipTurn(); // ์ดˆ(CHO) ํ„ด ์‰ผ
janggiGame.changeTurn();
janggiGame.skipTurn(); // ํ•œ(HAN) ํ„ด ์‰ผ
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.

ํ„ด ์‰ผ์ด๋ผ๋Š” ํ‘œํ˜„์ด ๋ชจํ˜ธํ•ด์„œ์ผ๊นŒ์š”? ์ข€ ๋” ์ง๊ด€์ ์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋„๋ก "ํ„ด ์ดํ–‰ํ•˜์ง€ ์•Š์Œ" ์œผ๋กœ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค!! ๊ฒŒ์ž„ ์‹œ์ž‘์‹œ ์ดˆ๋‚˜๋ผ๊ฐ€ ์ž๋™์œผ๋กœ ์„ ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ„ด์„ ์‰ฌ์–ด๊ฐ€๋Š” ํŒ€ ์ˆœ์„œ ์ž์ฒด๋Š” ์ € ์ˆœ์„œ์ž…๋‹ˆ๋‹ค!

Comment on lines +68 to +69
janggiGame.skipTurn();
janggiGame.changeTurn();
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

skipTurn ์ž„์—๋„ changeTurn์„ ํ˜ธ์ถœํ•ด์ค˜์•ผ ํ•˜๋‚˜์š”?

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.

์•„ ์ด ๋ถ€๋ถ„๋•Œ๋ฌธ์— ์œ„ ์ฝ”๋ฉ˜ํŠธ๋„ ๋‹ฌ์•„์ฃผ์‹  ๊ฑฐ์˜€๊ตฐ์š”! ํ„ด ๋„˜๊น€์„ ํ•ฉ์น  ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

@Test
void save_ํ…Œ์ŠคํŠธ() {
// when
Long id = gameRepository.save(false, Team.CHO);
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

false๋Š” ์–ด๋–ค ๊ฐ’์ผ๊นŒ์š”?

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.

ํ•ด๋‹น ๋ถ€๋ถ„ ๋ฐ”๋กœ ์‹๋ณ„ํ•˜๊ธฐ ์–ด๋ ต๋‹ค๊ณ  ํŒ๋‹จํ•˜์—ฌ, 'FinishStatus'๋ผ๋Š” vo๋ฅผ ๋งŒ๋“ค์–ด ๊ฐ์ŒŒ์Šต๋‹ˆ๋‹ค!

Long id = gameRepository.save(false, Team.CHO);

// when
gameRepository.update(id, true, Team.HAN);
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

์–ด๋–ค๊ฑธ updateํ•˜๋Š”๊ฑธ๊นŒ์š”?

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.

๋ฉ”์„œ๋“œ๋ช…๋งŒ ๋ด๋„ ์ง๊ด€์ ์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ๋„๋ก updateStatus๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค!

@Override
public boolean canMove(Position from, Position to, BoardView board) {
return Path.candidatePositions(from, ADVISOR_PATHS).contains(to);
return palace.canInnerGo(from, to);
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์นธ๋งŒ ์ด๋™ํ•˜๋Š”์ง€ ๊ฒ€์ฆ์ด ํ•„์š”ํ•  ๊ฒƒ ๊ฐ™๋„ค์š”. ์—ฌ๋Ÿฌ์นธ ์ด๋™ ์‹œ Palace.canInnerGo์˜ Direction.between์—์„œ ๋ฐฉํ–ฅ์„ ์ฐพ๊ธฐ ๋ชปํ•œ๋‹ค๊ณ  ์˜ˆ์™ธ๊ฐ€ ๋‚˜์˜ฌ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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.

ํ•ด๋‹น ๊ฒ€์ฆ ๋กœ์ง ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค!

@Override
public boolean canMove(Position from, Position to, BoardView board) {
if (!from.isStraightLine(to)) {
if (!(board.palace().isOnDiagonalPath(from, to) || from.isStraightLine(to))){
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๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ณณ์ด AdvisorMoveRule๊ณผ ๋‹ค๋ฅด๋„ค์š”. ํ†ต์ผํ•˜๋Š”๊ฒŒ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค~

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.

๋””๋ฏธํ„ฐ ๋ฒ•์น™์„ ์•„์‹ค๊นŒ์š”? board.place().isOnDiagonalPath๋Š” ๋””๋ฏธํ„ฐ ๋ฒ•์น™์„ ์–ด๊ฒผ๋Š”์ง€ ํ•™์Šตํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”.

Comment on lines +34 to +39
public static PieceType fromCode(String code) {
if (!BY_CODE.containsKey(code)) {
throw new IllegalArgumentException("์•Œ ์ˆ˜ ์—†๋Š” ๊ธฐ๋ฌผ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค: " + code);
}

return BY_CODE.get(code);
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

code๋กœ pieceType์„ ๋ณ€ํ™˜ํ•  ๋•Œ ๊ผญ Map์„ ์จ์•ผํ• ๊นŒ์š”? ๊ทธ๋ƒฅ values()๋กœ ์ˆœํšŒํ•ด์„œ ์ฐพ์•„๋„ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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.

๋„ต!! ๋น„์Šทํ•˜๊ฒŒ Team๋„ stream์„ ํ†ตํ•ด ๊ฐ’์„ ์ฐพ์•„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค!

Comment on lines +8 to +10
Long save(Boolean isFinished, Team currentTurn);
Optional<GameData> findLatestOngoingGame();
void update(Long id, boolean isFinished, Team currentTurn);
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

CRUD๋ฅผ ๊ฐ ์ปฌ๋Ÿผ์˜ ๊ฐ’์„ ๋ฐ›์ง€ ๋ง๊ณ  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.

๊ทธ๊ฒŒ ํ™•์‹คํžˆ ์บก์Аํ™”๋ฅผ ๋” ์ž˜ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™๋„ค์š” ๊ทธ๋ ‡๊ฒŒ ์ˆ˜์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค!

Comment on lines +10 to +11
void updateALL(Long gameId, Map<Position, Piece> map);
List<PieceData> findAll(Long 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.

Map<Position, Piece>๋ฅผ ๊ฐ์‹ผ ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“œ๋Š” ๊ฒƒ๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™๋„ค์š”. ๊ฑฐ๊ธฐ์— gameId๋ฅผ ์ง€์ •ํ•˜๋ฉด ํŽธํ•˜๊ฒŒ ์กฐํšŒ ๋ฐ ์ˆ˜์ •์„ ๊ฐ์ฒดํ•˜๋‚˜ ๋‹จ์œ„๋กœ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์š”~

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.

BoardSnapshot ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•˜๋„๋ก ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค!

choubung added 23 commits April 10, 2026 09:55
๊ธฐ์กด์— ํ„ด ์‰ผ์œผ๋กœ ๋˜์–ด ์žˆ๋˜ ์ฃผ์„์„
๋กœ์ง ํ–‰์œ„์™€ ๊ฐ™์€ ๋งฅ๋ฝ์œผ๋กœ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋„๋ก
ํ„ด ์ดํ–‰ํ•˜์ง€ ์•Š์Œ์œผ๋กœ ์ˆ˜์ •ํ•จ
๋ฌด์—‡์„ ์—…๋ฐ์ดํŠธํ•˜๋Š”์ง€ ์ง๊ด€์ ์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ๋ฉ”์„œ๋“œ๋ช…์„ ๋ณ€๊ฒฝ
@choubung
Copy link
Copy Markdown
Author

์•ˆ๋…•ํ•˜์„ธ์š” ๋ฒ ๋ฃจ์Šค!

Palace๋Š” ์ง€ํ˜•์ด๋ฏ€๋กœ Board๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋งž๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ, ๊ธฐ๋ฌผ๋“ค์€ Board๋ฅผ ํ†ตํ•ด ๋‹จ์ˆœ ์š”์ฒญ๋งŒ ์ง„ํ–‰ํ•˜๊ณ  ์ง„์˜ ํŒ๋‹จ ๋ฐ Palace ํ™œ์šฉ์€ Board๊ฐ€ ์•Œ์•„์„œ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์ˆ˜์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

Enum์—์„œ code๋กœ ์กฐํšŒํ•˜๋Š” ๋กœ์ง๋„ ์ฝ”๋ฉ˜ํŠธ์— ๋‹จ ๊ฒƒ์ฒ˜๋Ÿผ ์ˆ˜์ •ํ•˜์˜€์–ด์š”!

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

์ถ”๊ฐ€๋กœ ์ด๋ฒˆ PR์—์„œ ์—ฌ์ญค๋ณด๊ณ  ์‹ถ์€ ๊ฒŒ ํ•œ ๊ฐ€์ง€ ์žˆ๋Š”๋ฐ, fileChanged์— ์ฝ”๋ฉ˜ํŠธ๋กœ ๋‚จ๊ฒจ๋†“๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

this.pieceRepository = pieceRepository;
this.janggiGame = janggiGame;
this.boardSnapshot = boardSnapshot;
this.isResumed = isResumed;
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.

์ด ๋ณ€์ˆ˜๋Š” '์ด์ „ ๊ฒŒ์ž„์ด ์žฌ์‹œ์ž‘๋œ๊ฑด์ง€/์ƒˆ๋กœ์šด ๊ฒŒ์ž„์ด ์‹œ์ž‘๋œ๊ฑด์ง€' ์—ฌ๋ถ€๋ฅผ ์ €์žฅํ•˜๋Š” ๋ณ€์ˆ˜์ž…๋‹ˆ๋‹ค.
view์—์„œ ์ด์ „ ๊ฒŒ์ž„์ด ์žฌ์‹œ์ž‘๋œ๊ฑด์ง€ ์•„๋‹ˆ๋ฉด ์ƒˆ ๊ฒŒ์ž„์ด ์‹œ์ž‘๋œ ๊ฑด์ง€๋ฅผ ์ถœ๋ ฅํ•˜๊ณ  ์‹ถ์–ด์„œ ๋„ฃ์—ˆ์–ด์š”,
๊ทธ๋Ÿฐ๋ฐ ์ด๊ฑด ์‹œ์ž‘ ํ•œ ๋ฒˆ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๋ณ€์ˆ˜๋ผ ๋˜๋„๋ก์ด๋ฉด service์˜ ์ƒํƒœ๋กœ ๋‘๊ณ  ์‹ถ์ง€ ์•Š์€๋ฐ, ํ˜„์žฌ ์ฝ”๋“œ์—์„œ ์ œ ์•„์ด๋””์–ด๋กœ๋Š” service์™€ isResumed๋ฅผ ํ•จ๊ป˜ ๊ฐ์‹ธ ๋‚ ๋ฆฌ๋Š” ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ๋ฐ–์— ์ƒ๊ฐ์ด ์•ˆ ๋‚˜๋”๋ผ๊ณ ์š”.
๊ทธ๋Ÿฐ๋ฐ ์ด ํ•œ ๋ฒˆ์„ ์œ„ํ•ด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒŒ ์ ์ ˆํ•œ๊ฐ€๋ผ๋Š” ์ƒ๊ฐ๋„ ๋“ค์–ด์„œ ๊ณ ๋ฏผ์ด ๋ฉ๋‹ˆ๋‹ค...

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

๊ฐœ์ธ์ ์œผ๋กœ ์ง€๊ธˆ์€ Service๋ฅผ ํ™œ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‹ฌํ”Œํ•˜๊ฒŒ Controller์—์„œ Repository๋ฅผ ์ด์šฉํ•˜๋„๋ก ๊ตฌํ˜„ํ•ด๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”. ๋‹ค๋ฅธ ๊ณณ์— ํ”ผ๋“œ๋ฐฑ ๋‚จ๊ฒจ๋†จ๋Š”๋ฐ, Service์— ๋Œ€ํ•œ ํ•™์Šต์€ ๋ ˆ๋ฒจ2์—์„œ ์ง‘์ค‘ํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”~

Copy link
Copy Markdown

@verus-j verus-j left a comment

Choose a reason for hiding this comment

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

์•ˆ๋…•ํ•˜์„ธ์š” ํŒŒ๋„~
๋ฆฌ๋ทฐ๊ฐ€ ๋Šฆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ํ”ผ๋“œ๋ฐฑ๋“ค ๋‚จ๊ฒจ๋†จ๋Š”๋ฐ ํ™•์ธ๋ถ€ํƒ๋“œ๋ ค์š”~

this.janggiService = JanggiService.startGame(gameRepository, pieceRepository);
}

public void run() {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

run ๋ฉ”์„œ๋“œ๊ฐ€ ๋„ˆ๋ฌด ๊ธฐ๋„ค์š” ใ… ใ…  ์ •๋ฆฌ๋ฅผ ์กฐ๊ธˆํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”~

Comment on lines 12 to +18
Piece findByPosition(Position position);

boolean isEmptyPosition(Position position);

PieceType findTypeByPosition(Position position);

Team findTeamByPosition(Position position);
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

๋ฌธ๋“ ๋“œ๋Š” ์ƒ๊ฐ์ด ์ด 4๊ฐ€์ง€ ์ธํ„ฐํŽ˜์ด์Šค๋Š” findByPosition๋งŒ ์ œ๊ณตํ•ด๋„ ์ถฉ๋ถ„ํžˆ ๋ฐ›๋Š” ์ชฝ์—์„œ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋„ค์š”. ํŽธ๋ฆฌํ•˜๊ฒŒ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์ง€๋งŒ BoardView์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ž‘๊ฒŒ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ๋„ ํ•œ๋ฒˆ ๊ณ ๋ฏผํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”.

}

public void skipTurn() {
skip.put(currentTurn, 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.

skip์„ ์ดํ›„์— ๋‹ค์‹œ false๋กœ ์„ธํŒ…ํ•˜๋Š” ๊ณณ์ด ์—†๋Š”๋ฐ ์˜๋„ํ•œ๊ฑธ๊นŒ์š”?

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.

์—‡ ์•„๋‹ˆ์š”..! play turn์„ move๋กœ ํ•ฉ์น˜๋Š” ๊ณผ์ •์—์„œ ์‹ค์ˆ˜๋กœ ๋ˆ„๋ฝํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค move ๋ฉ”์„œ๋“œ์— false ์„ธํŒ… ๊ตฌ๋ฌธ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

@Override
public boolean canMove(Position from, Position to, BoardView board) {
if (!from.isStraightLine(to)) {
if (!(board.palace().isOnDiagonalPath(from, to) || from.isStraightLine(to))){
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.place().isOnDiagonalPath๋Š” ๋””๋ฏธํ„ฐ ๋ฒ•์น™์„ ์–ด๊ฒผ๋Š”์ง€ ํ•™์Šตํ•ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”.

this.isResumed = isResumed;
}

public static JanggiService startGame(GameRepository gameRepository, PieceRepository pieceRepository) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

startGame๋„ ๋„ˆ๋ฌด ๊ธด ๋ฉ”์„œ๋“œ๋„ค์š”. ์ •๋ฆฌ๋ฅผ ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”~

Comment on lines +59 to +60
janggiGame.move(moveCommand.getFrom(), moveCommand.getTo());
boardSnapshot = boardSnapshot.updatePieces(janggiGame.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.

boardSnapshot์€ janggiGame์—์„œ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ด€๋ฆฌํ•ด๋„ ๋˜์ง€ ์•Š์„๊นŒ์š”? janggiGame์—์„œ ์ตœ์‹  ์Šค๋ƒ…์ƒท์„ ๊ฐ€์ ธ์™€์„œ DB์— ์ €์žฅํ•˜๋Š”๊ฒŒ ๊น”๋”ํ•ด๋ณด์ž…๋‹ˆ๋‹ค.

๋ฆฌํŒฉํ† ๋ง ๊ณผ์ •์—์„œ, play์‹œ skip์—ฌ๋ถ€๋ฅผ false๋กœ ๋งŒ๋“œ๋Š” ๊ตฌ๋ฌธ์ด ์‚ญ์ œ๋˜์—ˆ์Œ
๋ฒ„๊ทธ์ด๋ฏ€๋กœ move ๋ฉ”์„œ๋“œ์— ํ•ด๋‹น ๋กœ์ง์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ˆ˜์ •ํ•จ
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