[๐ ์ฌ์ดํด2 - ๋ฏธ์ (๊ธฐ๋ฌผ ํ์ฅ + DB ์ ์ฉ)] ํ๋ ๋ฏธ์ ์ ์ถํฉ๋๋ค.#330
[๐ ์ฌ์ดํด2 - ๋ฏธ์
(๊ธฐ๋ฌผ ํ์ฅ + DB ์ ์ฉ)] ํ๋ ๋ฏธ์
์ ์ถํฉ๋๋ค.#330choubung wants to merge 71 commits intowoowacourse:choubungfrom
Conversation
candidatePositions -> createByDirections beteween -> straightPathBetween
โฆ๋ฐ์์ํค๋๋ก ๋ณ๊ฒฝ
verus-j
left a comment
There was a problem hiding this comment.
์๋
ํ์ธ์ ํ๋~
2๋จ๊ณ ์งํํ์๋๋ผ ๊ณ ์ํ์
จ์ต๋๋ค. Palace๋ก ๋ถ๋ฆฌ ์ํ์
จ์ต๋๋ค. ์์ฌ์ด ์ ์ Board์ AdvisorMoveRule์ด ๊ฐ๊ฐ Palace๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์์น์ ๋ํด ๊ณ ๋ฏผํ์
จ๋๋ฐ ๋๊ฐ Palace๋ฅผ ๋ ํ์ํ๋์ง ๊ณ ๋ฏผํด๋ณด๊ณ ์์น๋ฅผ ๊ฒฐ์ ํ๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ฐจํฌ์กธ์ ๊ถ์ฑ ์์์ ์ ํจ์ฑ ๊ฒ์ฆ ์์๋ ํฌ๊ฒ ์๊ด์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐ ํ ์๋กญ๊ฒ ์ ์ฅํ๋ ๋ฐฉ์์ ์ฌ์ฉํ์ จ๋๋ฐ, ์ฑ๋ฅ์ ์ผ๋ก ์ด์๊ฐ ์๋ค๋ฉด ์ ์ง๋ณด์ํ๊ธฐ ํธํ ์ชฝ์ผ๋ก ์ ํ๋ฉด ๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ ์ฒด ์ ๊ฑฐ, ์ ์ฒด ์ ์ฅ์ด ์ฌํํ ๊ฒ ๊ฐ๊ธดํ๋ค์.
DB์์ ๋ทฐ์ ๊ด๋ จ๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ฑฐํ๊ฑด ์ํ์ ๊ฒ ๊ฐ์ต๋๋ค. ๋ค๋ง code๋ก ์กฐํํ๋ ๋ก์ง์์ Map์ผ๋ก ๊ด๋ฆฌํ ํ์๋ ์์ ๊ฒ ๊ฐ์์.
EmptyPiece์ ๋ํด ๊ณ ๋ฏผ์ ํ์ จ๋๋ฐ, DB์ ๋๋ฉ์ธ ๊ฐ์ฒด๋ฅผ ํญ์ ๋์ผํ๊ฒ ๋ง์ถ ํ์๋ ์์ต๋๋ค. Board์ EmptyPiece๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ง๋ง DB์ EmptyPiece ์ ๋ณด๋ฅผ ์ ์ฅํ ์๋ ์๊ณ ๋ฐ๋๋ก Board์ EmptyPiece ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ง๋ง DB์ EmptyPiece ์ ๋ณด๋ฅผ ์ ์ฅํ์ง ์์ ์๋ ์์ด์. ์๋ก ๋ค๋ฅด๊ฒ ๋ณํํ๋ค๊ณ ์๊ฐ์ ํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์์~
| janggiGame.decideWinner(); | ||
| assertThat(janggiGame.getWinner()).isEqualTo(Team.CHO); |
There was a problem hiding this comment.
decideWinner์ getWinner๋ฅผ ํฉ์น๋๊ฑด ์ด๋ค๊ฐ์?
There was a problem hiding this comment.
์ฝ๋ฉํธ ๋ณด๊ณ ์๊ฐํด๋ณด๋ getWinner๊ฐ ๋จ์ getter์ด๊ณ , decide Winner๋ ๋จ์ด์ ธ์ ์ฌ์ฉ๋ ์ผ์ด ์์ ๊ฒ ๊ฐ์์ decideWinner๊ฐ ์ด๊ธด ์ง์์ ๋ฐํํ๋ ๊ฒ๊น์ง ํ๋๋ก ์์ ํ์ต๋๋ค!
| janggiGame.skipTurn(); // ์ด(CHO) ํด ์ผ | ||
| janggiGame.changeTurn(); | ||
| janggiGame.skipTurn(); // ํ(HAN) ํด ์ผ |
There was a problem hiding this comment.
์ฃผ์ ์ค๋ช ์ด ์๋ชป ๋ ๊ฒ ๊ฐ์ต๋๋ค.
There was a problem hiding this comment.
ํด ์ผ์ด๋ผ๋ ํํ์ด ๋ชจํธํด์์ผ๊น์? ์ข ๋ ์ง๊ด์ ์ผ๋ก ์ดํดํ๊ธฐ ์ฝ๋๋ก "ํด ์ดํํ์ง ์์" ์ผ๋ก ์์ ํ์ต๋๋ค!! ๊ฒ์ ์์์ ์ด๋๋ผ๊ฐ ์๋์ผ๋ก ์ ์ด ๋๊ธฐ ๋๋ฌธ์ ํด์ ์ฌ์ด๊ฐ๋ ํ ์์ ์์ฒด๋ ์ ์์์ ๋๋ค!
| janggiGame.skipTurn(); | ||
| janggiGame.changeTurn(); |
There was a problem hiding this comment.
skipTurn ์์๋ changeTurn์ ํธ์ถํด์ค์ผ ํ๋์?
There was a problem hiding this comment.
์ ์ด ๋ถ๋ถ๋๋ฌธ์ ์ ์ฝ๋ฉํธ๋ ๋ฌ์์ฃผ์ ๊ฑฐ์๊ตฐ์! ํด ๋๊น์ ํฉ์น ์ ์๋๋ก ์์ ํ๊ฒ ์ต๋๋ค!
| @Test | ||
| void save_ํ ์คํธ() { | ||
| // when | ||
| Long id = gameRepository.save(false, Team.CHO); |
There was a problem hiding this comment.
ํด๋น ๋ถ๋ถ ๋ฐ๋ก ์๋ณํ๊ธฐ ์ด๋ ต๋ค๊ณ ํ๋จํ์ฌ, 'FinishStatus'๋ผ๋ vo๋ฅผ ๋ง๋ค์ด ๊ฐ์์ต๋๋ค!
| Long id = gameRepository.save(false, Team.CHO); | ||
|
|
||
| // when | ||
| gameRepository.update(id, true, Team.HAN); |
There was a problem hiding this comment.
๋ฉ์๋๋ช ๋ง ๋ด๋ ์ง๊ด์ ์ผ๋ก ์ ์ ์๋๋ก updateStatus๋ก ๋ณ๊ฒฝํ์ต๋๋ค!
| @Override | ||
| public boolean canMove(Position from, Position to, BoardView board) { | ||
| return Path.candidatePositions(from, ADVISOR_PATHS).contains(to); | ||
| return palace.canInnerGo(from, to); |
There was a problem hiding this comment.
ํธ์ถํ๊ธฐ ์ ์ 1์นธ๋ง ์ด๋ํ๋์ง ๊ฒ์ฆ์ด ํ์ํ ๊ฒ ๊ฐ๋ค์. ์ฌ๋ฌ์นธ ์ด๋ ์ Palace.canInnerGo์ Direction.between์์ ๋ฐฉํฅ์ ์ฐพ๊ธฐ ๋ชปํ๋ค๊ณ ์์ธ๊ฐ ๋์ฌ ๊ฒ ๊ฐ์ต๋๋ค.
There was a problem hiding this comment.
ํด๋น ๊ฒ์ฆ ๋ก์ง ์ถ๊ฐํ์ต๋๋ค!
| @Override | ||
| public boolean canMove(Position from, Position to, BoardView board) { | ||
| if (!from.isStraightLine(to)) { | ||
| if (!(board.palace().isOnDiagonalPath(from, to) || from.isStraightLine(to))){ |
There was a problem hiding this comment.
Palace๋ฅผ ๊ด๋ฆฌํ๋ ๊ณณ์ด AdvisorMoveRule๊ณผ ๋ค๋ฅด๋ค์. ํต์ผํ๋๊ฒ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค~
There was a problem hiding this comment.
Palace๋ ์งํ์ด๋ฏ๋ก ๋ณด๋์์ ๊ด๋ฆฌํ๋ ๊ฒ ๋ง๋ค๊ณ ์๊ฐํด ๋ณด๋๋ก ์ ๋ถ ์ฎ๊ฒผ์ต๋๋ค!
There was a problem hiding this comment.
๋๋ฏธํฐ ๋ฒ์น์ ์์ค๊น์? board.place().isOnDiagonalPath๋ ๋๋ฏธํฐ ๋ฒ์น์ ์ด๊ฒผ๋์ง ํ์ตํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์์.
| public static PieceType fromCode(String code) { | ||
| if (!BY_CODE.containsKey(code)) { | ||
| throw new IllegalArgumentException("์ ์ ์๋ ๊ธฐ๋ฌผ ์ฝ๋์ ๋๋ค: " + code); | ||
| } | ||
|
|
||
| return BY_CODE.get(code); |
There was a problem hiding this comment.
code๋ก pieceType์ ๋ณํํ ๋ ๊ผญ Map์ ์จ์ผํ ๊น์? ๊ทธ๋ฅ values()๋ก ์ํํด์ ์ฐพ์๋ ๋ ๊ฒ ๊ฐ์ต๋๋ค.
There was a problem hiding this comment.
๋ต!! ๋น์ทํ๊ฒ Team๋ stream์ ํตํด ๊ฐ์ ์ฐพ์ ๋ฐํํ๋๋ก ์์ ํ์ต๋๋ค!
| Long save(Boolean isFinished, Team currentTurn); | ||
| Optional<GameData> findLatestOngoingGame(); | ||
| void update(Long id, boolean isFinished, Team currentTurn); |
There was a problem hiding this comment.
CRUD๋ฅผ ๊ฐ ์ปฌ๋ผ์ ๊ฐ์ ๋ฐ์ง ๋ง๊ณ Game ์์ฒด๋ฅผ ๋ฐ์์ ์ฒ๋ฆฌํ๋๊ฑด ์ด๋จ๊น์?
There was a problem hiding this comment.
๊ทธ๊ฒ ํ์คํ ์บก์ํ๋ฅผ ๋ ์ ์งํฌ ์ ์๋ ๋ฐฉ๋ฒ์ธ ๊ฒ ๊ฐ๋ค์ ๊ทธ๋ ๊ฒ ์์ ํ๊ฒ ์ต๋๋ค!
| void updateALL(Long gameId, Map<Position, Piece> map); | ||
| List<PieceData> findAll(Long gameId); |
There was a problem hiding this comment.
Map<Position, Piece>๋ฅผ ๊ฐ์ผ ๊ฐ์ฒด๋ฅผ ํ๋ ๋ง๋๋ ๊ฒ๋ ์ข์ ๊ฒ ๊ฐ๋ค์. ๊ฑฐ๊ธฐ์ gameId๋ฅผ ์ง์ ํ๋ฉด ํธํ๊ฒ ์กฐํ ๋ฐ ์์ ์ ๊ฐ์ฒดํ๋ ๋จ์๋ก ํ ์ ์์ ๊ฒ ๊ฐ์์~
There was a problem hiding this comment.
BoardSnapshot ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝํ์ต๋๋ค!
๊ธฐ์กด์ ํด ์ผ์ผ๋ก ๋์ด ์๋ ์ฃผ์์ ๋ก์ง ํ์์ ๊ฐ์ ๋งฅ๋ฝ์ผ๋ก ์ดํดํ๊ธฐ ์ฝ๋๋ก ํด ์ดํํ์ง ์์์ผ๋ก ์์ ํจ
โฆ<Position, Piece>๋ก ๋ณ๊ฒฝ
๋ฌด์์ ์ ๋ฐ์ดํธํ๋์ง ์ง๊ด์ ์ผ๋ก ์ ์ ์๋๋ก ๋ฉ์๋๋ช ์ ๋ณ๊ฒฝ
|
์๋ ํ์ธ์ ๋ฒ ๋ฃจ์ค! Palace๋ ์งํ์ด๋ฏ๋ก Board๊ฐ ๊ด๋ฆฌํ๋ ๊ฒ์ด ๋ง๋ค๊ณ ์๊ฐํ์ฌ, ๊ธฐ๋ฌผ๋ค์ Board๋ฅผ ํตํด ๋จ์ ์์ฒญ๋ง ์งํํ๊ณ ์ง์ ํ๋จ ๋ฐ Palace ํ์ฉ์ Board๊ฐ ์์์ ์ํํ๋๋ก ์์ ํ์์ต๋๋ค. Enum์์ code๋ก ์กฐํํ๋ ๋ก์ง๋ ์ฝ๋ฉํธ์ ๋จ ๊ฒ์ฒ๋ผ ์์ ํ์์ด์! DB์ ๋ํด์๋ ๋๋ฉ์ธ๊ณผ ๋ง์ถฐ์ผํ๋ค๋ ์๊ฐ๋ ํ๊ณ , ์กด์ฌ ๊ธฐ๋ฌผ๋ง ๊ด๋ฆฌํ๋ ํธ์ด ๊ฐ์๊ฐ ์ ์ด์ ๋ ์ข์ง ์์๊น ์๊ฐํ ๊ฒ๋ ์์์ต๋๋ค! ์ฌํ๊น์ง๋ DB์ ๋๋ฉ์ธ์ ์ต๋ํ ์ผ์น์์ผ์ผํ๋ค๊ณ ์๊ฐํ๋๋ฐ, ๋ฆฌ๋ทฐ ๋๋ถ์ ์๋ก์ด ์ธ์ฌ์ดํธ๋ฅผ ์ป์์ด์. ์ถ๊ฐ๋ก ์ด๋ฒ PR์์ ์ฌ์ญค๋ณด๊ณ ์ถ์ ๊ฒ ํ ๊ฐ์ง ์๋๋ฐ, fileChanged์ ์ฝ๋ฉํธ๋ก ๋จ๊ฒจ๋๊ฒ ์ต๋๋ค. ๊ฐ์ฌํฉ๋๋ค! |
| this.pieceRepository = pieceRepository; | ||
| this.janggiGame = janggiGame; | ||
| this.boardSnapshot = boardSnapshot; | ||
| this.isResumed = isResumed; |
There was a problem hiding this comment.
์ด ๋ณ์๋ '์ด์ ๊ฒ์์ด ์ฌ์์๋๊ฑด์ง/์๋ก์ด ๊ฒ์์ด ์์๋๊ฑด์ง' ์ฌ๋ถ๋ฅผ ์ ์ฅํ๋ ๋ณ์์
๋๋ค.
view์์ ์ด์ ๊ฒ์์ด ์ฌ์์๋๊ฑด์ง ์๋๋ฉด ์ ๊ฒ์์ด ์์๋ ๊ฑด์ง๋ฅผ ์ถ๋ ฅํ๊ณ ์ถ์ด์ ๋ฃ์์ด์,
๊ทธ๋ฐ๋ฐ ์ด๊ฑด ์์ ํ ๋ฒ๋ง ์ฌ์ฉ๋๋ ๋ณ์๋ผ ๋๋๋ก์ด๋ฉด service์ ์ํ๋ก ๋๊ณ ์ถ์ง ์์๋ฐ, ํ์ฌ ์ฝ๋์์ ์ ์์ด๋์ด๋ก๋ service์ isResumed๋ฅผ ํจ๊ป ๊ฐ์ธ ๋ ๋ฆฌ๋ ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๊ฒ๋ฐ์ ์๊ฐ์ด ์ ๋๋๋ผ๊ณ ์.
๊ทธ๋ฐ๋ฐ ์ด ํ ๋ฒ์ ์ํด ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ๊ฒ ์ ์ ํ๊ฐ๋ผ๋ ์๊ฐ๋ ๋ค์ด์ ๊ณ ๋ฏผ์ด ๋ฉ๋๋ค...
There was a problem hiding this comment.
๊ฐ์ธ์ ์ผ๋ก ์ง๊ธ์ Service๋ฅผ ํ์ฉํ์ง ์์๋ ๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ฌํํ๊ฒ Controller์์ Repository๋ฅผ ์ด์ฉํ๋๋ก ๊ตฌํํด๋ ์ข์ ๊ฒ ๊ฐ์์. ๋ค๋ฅธ ๊ณณ์ ํผ๋๋ฐฑ ๋จ๊ฒจ๋จ๋๋ฐ, Service์ ๋ํ ํ์ต์ ๋ ๋ฒจ2์์ ์ง์คํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์์~
verus-j
left a comment
There was a problem hiding this comment.
์๋
ํ์ธ์ ํ๋~
๋ฆฌ๋ทฐ๊ฐ ๋ฆ์์ต๋๋ค. ๋ง์ง๋ง์ผ๋ก ํผ๋๋ฐฑ๋ค ๋จ๊ฒจ๋จ๋๋ฐ ํ์ธ๋ถํ๋๋ ค์~
| this.janggiService = JanggiService.startGame(gameRepository, pieceRepository); | ||
| } | ||
|
|
||
| public void run() { |
There was a problem hiding this comment.
run ๋ฉ์๋๊ฐ ๋๋ฌด ๊ธฐ๋ค์ ใ ใ ์ ๋ฆฌ๋ฅผ ์กฐ๊ธํ๋ฉด ์ข์ ๊ฒ ๊ฐ์์~
| Piece findByPosition(Position position); | ||
|
|
||
| boolean isEmptyPosition(Position position); | ||
|
|
||
| PieceType findTypeByPosition(Position position); | ||
|
|
||
| Team findTeamByPosition(Position position); |
There was a problem hiding this comment.
๋ฌธ๋ ๋๋ ์๊ฐ์ด ์ด 4๊ฐ์ง ์ธํฐํ์ด์ค๋ findByPosition๋ง ์ ๊ณตํด๋ ์ถฉ๋ถํ ๋ฐ๋ ์ชฝ์์ ์ฒ๋ฆฌํ ์ ์์ ๊ฒ ๊ฐ๋ค์. ํธ๋ฆฌํ๊ฒ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๊ฒ๋ ์ข์ง๋ง BoardView์ ์ธํฐํ์ด์ค๋ฅผ ์๊ฒ ๊ตฌ์ฑํ๋ ๊ฒ๋ ํ๋ฒ ๊ณ ๋ฏผํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์์.
| } | ||
|
|
||
| public void skipTurn() { | ||
| skip.put(currentTurn, true); |
There was a problem hiding this comment.
skip์ ์ดํ์ ๋ค์ false๋ก ์ธํ ํ๋ ๊ณณ์ด ์๋๋ฐ ์๋ํ๊ฑธ๊น์?
There was a problem hiding this comment.
์ ์๋์..! 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))){ |
There was a problem hiding this comment.
๋๋ฏธํฐ ๋ฒ์น์ ์์ค๊น์? board.place().isOnDiagonalPath๋ ๋๋ฏธํฐ ๋ฒ์น์ ์ด๊ฒผ๋์ง ํ์ตํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์์.
| this.isResumed = isResumed; | ||
| } | ||
|
|
||
| public static JanggiService startGame(GameRepository gameRepository, PieceRepository pieceRepository) { |
There was a problem hiding this comment.
startGame๋ ๋๋ฌด ๊ธด ๋ฉ์๋๋ค์. ์ ๋ฆฌ๋ฅผ ํ๋ฉด ์ข์ ๊ฒ ๊ฐ์์~
| janggiGame.move(moveCommand.getFrom(), moveCommand.getTo()); | ||
| boardSnapshot = boardSnapshot.updatePieces(janggiGame.getBoard()); |
There was a problem hiding this comment.
boardSnapshot์ janggiGame์์ ์์ฑํ๋ ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํด๋ ๋์ง ์์๊น์? janggiGame์์ ์ต์ ์ค๋ ์ท์ ๊ฐ์ ธ์์ DB์ ์ ์ฅํ๋๊ฒ ๊น๋ํด๋ณด์ ๋๋ค.
๋ฆฌํฉํ ๋ง ๊ณผ์ ์์, play์ skip์ฌ๋ถ๋ฅผ false๋ก ๋ง๋๋ ๊ตฌ๋ฌธ์ด ์ญ์ ๋์์ ๋ฒ๊ทธ์ด๋ฏ๋ก move ๋ฉ์๋์ ํด๋น ๋ก์ง์ ์ถ๊ฐํ๋ ๊ฒ์ผ๋ก ์์ ํจ
์ฒดํฌ ๋ฆฌ์คํธ
test๋ฅผ ์คํํ์ ๋, ๋ชจ๋ ํ ์คํธ๊ฐ ์ ์์ ์ผ๋ก ํต๊ณผํ๋์?์ด๋ค ๋ถ๋ถ์ ์ง์คํ์ฌ ๋ฆฌ๋ทฐํด์ผ ํ ๊น์?
๊ถ์ฑ
1. Place์ ์ค๋ณต
2. ์ฐจํฌ์กธ์ ๊ถ์ฑ ๋ด ์ด๋
์์์ฑ
1. ์ ์ฒด ์ญ์ ํ ์ ์ฒด ์ ๋ฐ์ดํธ
2. ๋ทฐ์ ๋๋ฉ์ธ๊ณผ ์์์ฑ ์ฝ๋์ ๋ถ๋ฆฌ, ์ฐ๊ฒฐ