[๐ ์ฌ์ดํด2 - ๋ฏธ์ (๊ธฐ๋ฌผ ํ์ฅ + DB ์ ์ฉ)] ๋๋ ๋ฏธ์ ์ ์ถํฉ๋๋ค.#342
[๐ ์ฌ์ดํด2 - ๋ฏธ์
(๊ธฐ๋ฌผ ํ์ฅ + DB ์ ์ฉ)] ๋๋ ๋ฏธ์
์ ์ถํฉ๋๋ค.#342LEEJaeHyeok97 wants to merge 80 commits intowoowacourse:leejaehyeok97from
Conversation
her0807
left a comment
There was a problem hiding this comment.
์๋ ํ์ธ์ ๋๋! ใ ใ
๋ชฝ๊ณ ๋๋น๋ฅผ ์ฐ๊ฒฐํด๋ณด์ จ๊ตฐ์?
์ ์ด์ฃผ์ ๋ด์ฉ์ผ๋ก ๋ฏธ๋ฃจ์ด๋ณด์์ ๋ ์ ๊ณต์ ์ด์ ๊ฒ ๊ฐ์๋ฐ ๋ง์๊น์?
ํน์ ๋ค๋ฅธ ๋๋น๋ค์ ์ฌ์ฉํด๋ณด์๊ณ ๋ชฝ๊ณ ๋๋น๋ฅผ ์ฐ๊ฒฐํด๋ณด์ ๊ฒ์ธ์ง, ๋น์ ํ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋๋น๋ ๋ชฝ๊ณ ๋๋น ๋ฟ๋ง ์๋๋ผ ๋ค๋ฅธ ๋๋น๋ค๋ ์๋๋ฐ ์ด๋ค์ด์ ๋ก ์ ํํ๋์ง ์กฐ๊ธ ๋ ์์ธํ ๋ฃ๊ณ ์ถ์ด์!
|
|
||
| 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); | ||
| } |
There was a problem hiding this comment.
Board์์ ๊ฒ์ ํ๋ฆ ๊ด๋ฆฌ๋ฅผ ๋ถ๋ฆฌํด JanggiGame์ผ๋ก ์ฎ๊ธฐ์ จ๊ตฐ์? ๐๐ป
์ด์ ์๋ Controller๊ฐ Board๋ฅผ ์ง์ ๋ค๋ฃจ๋ฉด์ ํด ๊ด๋ฆฌ๊น์ง ํ์ ํ
๋ฐ, JanggiGame์ด move(), isFinished(), passTheTurn(), currentTurn()์ ํ๋๋ก ๋ฌถ์ด์ ๊ฒ์์ ๊ท์น์ ํ ๊ณณ์์ ๊ด๋ฆฌํ ์ ์๊ฒ ๋์ด์. ์์ฃผ ์ข์ ๋ฐฉํฅ์ด๋ค์ฉ!!
There was a problem hiding this comment.
์ด Game์ด๋ผ๋ Orchestration ์ญํ ์ ํ๋ ๋๋ฉ์ธ์ ๋ง๋ค๊ฒ ๋จ์ผ๋ก์จ ๋ฐ์ํ๋ ๋จ์ ์ ์์๊น์?
๋งค๋ฒ ์ ๋ ์ด๋ฐ ๋๋ฉ์ธ์ ๋ง๋ค๊ณค ํฉ๋๋ค. Lotto ๋ฏธ์
์์๋ LottoGame, RacingCar ๋ฏธ์
์์๋ RacingCarGame, ... ๋งค๋ฒ ํ๋ ๋ฐฉ์์ผ๋ก ์งํํ๊ฒ ๋๋๋ฐ,
๊ฒ์์ด๋ผ๋ ์ด๋ฆ์ด ์ค์ฒด๊ฐ ์์ผ๋ฉด์ ์ญํ ์ด ๋ชจํธํ ๊ฒ ๊ฐ์์ ๋งค๋ฒ ์ฌ์ฉํ๊ณ ์์ผ๋ฉด์๋ ๋ง์ ๊น์ ๊ณณ์์๋ ๋ถํธํจ์ด ์กฐ๊ธ ์๋ฆฌ์ก๊ณ ์์ต๋๋ค. ์ฐจ๋ผ๋ฆฌ Service ๊ณ์ธต์ ๋์
ํด์ Game ๋๋ฉ์ธ์ด ์๋ Service์์ ํ๋ฆ์ ์กฐ์ ํ๋ ๋ฐฉ์์ผ๋ก ํด๋ ์ข์ ์ ํ์ด์ง ์์๊น ํ๋ ๊ณ ๋ฏผ๋ ๋ฉ๋๋ค.
์คํ๋ง ํ๋ก์ ํธ ๊ฐ๋ฐ ์ domain-service-controller-repository ๋ ์ด์ด๋ ์ํคํ
์ฒ๋ก service ๊ณ์ธต์ ์์ฐ์ค๋ฝ๊ฒ ์ค๊ณง ์ ์ฐ๊ณ ์์ด์ ์ผ์ง๋ ๋ชจ๋ฆ
๋๋ค.
|
|
||
| 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; | ||
| } | ||
|
|
There was a problem hiding this comment.
์ด ๋ฉ์๋๊ฐ ๊ถ์ฑ ์์ธ์ง ์์ฒด๋ฅผ ํ์ธํ์ง ์๊ณ ์์ด์. ํน์ ์์น๊ฐ ์๋๋ฉด ๋ฌด์กฐ๊ฑด true๋ฅผ ๋ฐํํ๊ณ ์์ด์, ๊ถ์ฑ ๋ฐ (5,5)์ ์๋ ์ฐจ๋ ํฌ๋ ๊ถ์ฑ์์ ๋๊ฐ์ ์ด๋ ๊ฐ๋ฅ์ผ๋ก ํ์ ๋์ด์!
ํ๋ฒ ๋ฐ๋ผ๊ฐ๋ณด๋ฉด์,,
- from = (5,5), to = (6,6)
isInPalaceAndCanDiagonalMove((5,5))โ (5,5)๋ ๋ธ๋ก ๋ชฉ๋ก์ ์์ผ๋๊น โtrueisDiagonalโtrue- ๊ฑฐ๋ฆฌ ํฉ = 2 <= 4 โ
true isNotCorrectPathโfalse
๊ฒฐ๊ณผ์ ์ผ๋ก ๊ถ์ฑ ๋ฐ ๋ชจ๋ ์์น์์ ๋๊ฐ์ ์ด๋์ด ํ์ฉ๋๋ ์ํฉ์ด์์. ์ด ๋ฉ์๋๋ฅผ ์์ฑํ ๋ "๊ถ์ฑ ๋ฐ ์์น"์์ ํธ์ถ๋๋ฉด ์ด๋ค ๊ฐ์ด ๋ฐํ๋๋์ง ํ๋ฒ ์ถ์ ํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์์!
There was a problem hiding this comment.
isNotCorrectPath(...) ์ณ์ง ์์ ๊ธธ์ธ๊ฐ๋ฅผ ์ฒดํฌํ ๋ ๊ถ์ฑ ์์ด ์๋๋ฐ ๋๊ฐ ์ด๋ -> ์ด๋ ๋ถ๊ฐ ํ์ ์ ๋น ๋จ๋ฆฌ๊ณ
๊ถ์ฑ ์์ด๋ฉด์ ๋ถ๊ฐ๋ฅํ ๋๊ฐ์ ์ด๋์ธ๊ฐ? -> ์ด๋ ๋ถ๊ฐ ๋ง ์ฒดํฌํ๊ณ ์์์ต๋๋ค.
๊ถ์ฑ ์์ด ์๋ ๋ ๊ฐ์ ์ด๋ ์ฒดํฌํ๋ ๊ฒ์ ๋จผ์ ํด์ ํด๋น ๋ถ๋ถ์ ์์ ํ์์ต๋๋ค!
private boolean isNotCorrectPath(final Position from, final Position to) {
if (!palaceInRange(from)) {
if (isDiagonal(from, to)) {
return true;
}
}
...| @@ -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; | |||
| } | |||
There was a problem hiding this comment.
๋๊ฐ์ ์ด๋์ ์ฐจ๋จํ๋ ์์น ๋ชฉ๋ก (0,4), (9,4) ๊ฐ ๋๋ฝ๋ ๊ฒ ๊ฐ์์! ๐
๊ถ์ฑ ๋๊ฐ์ ์ ์ค์(1,4)/(8,4)๊ณผ ๊ผญ์ง์ ๋ง ์ฐ๊ฒฐํ๋ ๊ฑด๋ฐ์, (0,4)๋ ๊ถ์ฑ ์๋จ ๋ณ์ ์ค๊ฐ์ด๋ผ ๋๊ฐ์ ๋ผ์ธ ์์ ์๊ฑฐ๋ ์. ํ์ฌ ์ฝ๋์์ ๊ถ(General)์ด (0,4)โ(1,5)๋ก ๋๊ฐ์ ์ด๋์ด ๊ฐ๋ฅํ ์ํ์
๋๋ค!
There was a problem hiding this comment.
๋๋ฝ๋ ๋ถ๋ถ ์ถ๊ฐํ๊ณ ํ
์คํธ๊น์ง ์ถ๊ฐํ์ต๋๋ค!
๋ณด์๋ค์ํผ ์ด๋ ๊ฒ ๋ง์ ์กฐ๊ฑด๋ค์ด || ์ฐ์ฐ์ผ๋ก ์ด์ด์ง๋ฉด ์๋ก์ด ๊ธฐ๋ฅ ์ถ๊ฐ ์ ๋ฏธ์ค๊ฐ ๋ ํ๋ฅ ์ด ๋์์ง๋ ๊ฒ ๊ฐ์๋ฐ, ๊ฐ์ฒด ์งํฅ์ ์ค๊ณ๊ฐ ์๋ชป๋ ์ ํธ๋ก ๋ณผ ์ ์์๊น์?
|
|
||
| String input = inputView.readPosition(); | ||
| if (input.equals("ํญ๋ณต")) { | ||
| outputView.printGameFinishMessage(); | ||
| return; | ||
| } |
There was a problem hiding this comment.
ํญ๋ณตํ๋ฉด movePosition()์์ returnํ๋๋ฐ, playGame()์ while ๋ฃจํ๋ ๊ณ์ ๋์์. isFinished()๋ ์ฅ๊ตฐ์ด ์ด์์๋์ง๋ง ํ์ธํ๋๊น ํญ๋ณต ์ํ๋ฅผ ๋ชจ๋ฅด๊ฑฐ๋ ์. ํญ๋ณต ํ์ ๋ค์ ์ด๋ ์
๋ ฅ์ ์์ฒญํ๋ ์ํฉ์ด ๋ฉ๋๋ค.
isFinished()์ ํญ๋ณต ์ํ๋ฅผ ์ด๋ป๊ฒ ๋ฐ์ํ๋ฉด ์ข์์ง ๊ณ ๋ฏผํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์์! JanggiGame์ ์ํ๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ๋ ์๊ณ , movePosition์ ๋ฐํ๊ฐ์ผ๋ก ์๋ ค์ฃผ๋ ๋ฐฉ๋ฒ๋ ์๋๋ฐ ์ด๋ค ๊ฒ ๋ ์์ฐ์ค๋ฌ์ธ๊น์?
|
|
||
| board.remove(from); | ||
| board.put(to, fromPiece); | ||
| } | ||
|
|
There was a problem hiding this comment.
Map.put()์ด ๊ธฐ์กด ๊ฐ์ ๋ฎ์ด์ฐ๋๊น ๋์ ์์ฒด๋ ํ๋๋ฐ์, ์๋ ๊ธฐ๋ฌผ์ "์ก๋๋ค"๋ ๋๋ฉ์ธ ํ์๊ฐ ์ฝ๋์์ ๋ช
์์ ์ผ๋ก ์ ๋๋ฌ๋๊ณ ์์ด์. ์๋ํ ๊ฑฐ๋ผ๋ฉด ๊ด์ฐฎ์ง๋ง, ๋ง์ฝ ๋์ค์ "์กํ ๊ธฐ๋ฌผ ๋ชฉ๋ก"์ ๋ณด์ฌ์ค์ผ ํ๋ค๋ฉด ํ์ฌ ๊ตฌ์กฐ์์ ์ด๋ป๊ฒ ํ์ฅํ ์ ์์์ง ํ๋ฒ ์๊ฐํด๋ณด๋ฉด ์ข๊ฒ ์ด์!
| Document document = new Document() | ||
| .append("row", position.getRow()) | ||
| .append("col", position.getCol()) | ||
| .append("team", piece.getTeamName()) |
There was a problem hiding this comment.
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")); |
There was a problem hiding this comment.
BoardDao๊ฐ ๋๋ฉ์ธ ๊ฐ์ฒด๋ฅผ ์ง์ ์์ฑํ๊ณ ์๋๋ฐ, ์ด ๊ตฌ์กฐ๋ฅผ ์ ํํ ์ด์ ๊ฐ ๊ถ๊ธํด์.
DAO๊ฐ Position.of(), Piece.of(), Board.of()๋ฅผ ์ง์ ํธ์ถํด์ ๋๋ฉ์ธ ๊ฐ์ฒด์ ์์ฑ ๋ฐฉ์์ ์๊ณ ์๋ ์ํ์ธ๋ฐ์. PR ์ค๋ช
์์ "ํ์ฌ ๊ท๋ชจ์์๋ DTO๊ฐ ๊ณผํ ์ถ์ํ"๋ผ๊ณ ํ์์์? ๊ทธ ํ๋จ ์์ฒด๋ ๊ด์ฐฎ์๋ฐ, ํ ๊ฐ์ง ๋ ์๊ฐํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์์.
๋ง์ฝ Board ์์ฑ์๊ฐ ๋ฐ๋๊ฑฐ๋(์: ๊ฒ์ฆ ๋ก์ง ์ถ๊ฐ), Piece ์์ฑ ๋ฐฉ์์ด ๋ฌ๋ผ์ง๋ฉด DAO ์ฝ๋๋ ๊ฐ์ด ์์ ํด์ผ ํ๊ฑฐ๋ ์. ์ด๊ฒ "DB ์ ์ฉ ์ ๋๋ฉ์ธ ๊ฐ์ฒด์ ๋ณ๊ฒฝ์ ์ต์ํ"๋ผ๋ ์๊ตฌ์ฌํญ๊ณผ ์ด๋ป๊ฒ ์ฐ๊ฒฐ๋๋์ง ์๊ฐํด๋ณด๋ฉด ์ข๊ฒ ์ด์!
|
|
||
| collection.replaceOne( | ||
| Filters.eq("_id", new ObjectId(gameId)), | ||
| updateDoc | ||
| ); | ||
| } |
There was a problem hiding this comment.
๋๋๊ฐ ์ ๋ฆฌํ MongoDB ์ฅ์ ์ค ์คํค๋ง ์ ์ฐ์ฑ: pieces ๋ฐฐ์ด๋ก ํ๋์ Document์ ๋ด์ ์ ์์ด JOIN์ด ๋ถํ์๋ผ๋ ๋ถ๋ถ์ด ์์๋๋ฐ์, ํ ๊ฐ์ง ๋ ๊น์ด ์๊ฐํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์์.
ํ์ฌ ๊ตฌ์กฐ์์๋ ๋งค ํด๋ง๋ค ์ ์ฒด ๊ธฐ๋ฌผ ๋ฐฐ์ด์ ํต์งธ๋ก ๊ต์ฒดํ๊ณ ์์ด์.
RDBMS์๋ค๋ฉด ์ด๋ํ ๊ธฐ๋ฌผ 1~2๊ฐ๋ง UPDATEํ๋ฉด ๋๋๋ฐ, MongoDB Document ๊ตฌ์กฐ์์๋ ๊ธฐ๋ฌผ 32๊ฐ๋ฅผ ๋งค๋ฒ ์ ๋ถ ์ง๋ ฌํํด์ ์ ์ฅํ๊ณ ์๊ฑฐ๋ ์. ์ด trade-off๋ฅผ ์ธ์งํ๊ณ ์์๋์? ํ์ฌ ๊ท๋ชจ์์๋ ๋ฌธ์ ์์ง๋ง, Document๋ก ํ ๋ฒ์ ๋ด๋ ๊ฒ ํญ์ ์ข์ ๊ฑด์ง ์๊ฐํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์์!
There was a problem hiding this comment.
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 ๊ตฌ์กฐ๋ผ์ ํธ๋์ญ์ ์ด ์ ์ด์ ํ์ ์๋ค๊ฐ ๋ ์ ํํ ํํ์ด์์!
There was a problem hiding this comment.
์ฅ๊ธฐ ๋๋ฉ์ธ์ MongoDB๊ฐ ์ ๋ง ์ ํฉํ ์ ํ์ผ๊น? ๐ค
๋๋๊ฐ MongoDB๋ฅผ ์ ํํ ๋์ ์ ์ ์ ์ ๋ง ์ข์์ด์! ๋ค๋ง ์์งํ๊ฒ ์ด์ผ๊ธฐํ๋ฉด, ์ฅ๊ธฐ๋ RDBMS๊ฐ ๋ ์์ฐ์ค๋ฌ์ด ๋๋ฉ์ธ์ด๋ผ๊ณ ์๊ฐํด์. ์ด์ ๋ฅผ ๋ช ๊ฐ์ง ์ ๋ฆฌํด๋ณผ๊ฒ์.
์ฅ๊ธฐ๊ฐ RDBMS์ ๋ ๋ง๋ ์ด์
- ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ๋งค์ฐ ๊ณ ์ ์ ์ด์์. 9x10 ๋ณด๋, ๊ณ ์ ๋ ๊ธฐ๋ฌผ ํ์ , ๊ณ ์ ๋ ํ โ ์คํค๋ง๊ฐ ๋ณํ ์ผ์ด ์์ด์, ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ชฝ๊ณ ๋๋น์ ๋น์ ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์ด์ ์ ๋ชป๋๋ฆฌ๋ ์ํฉ์ด์์.
- ๊ธฐ๋ฌผ ์ด๋์ 1~2๊ฐ ํ๋ง ๋ณ๊ฒฝํ๋ฉด ๋๋๋ฐ, Document ๊ตฌ์กฐ๋ ๋งค๋ฒ 32๊ฐ ๊ธฐ๋ฌผ์ ์ ๋ถ ์ง๋ ฌํํด์ผ ํด์
- "์งํ ์ค์ธ ๊ฒ์ ๋ชฉ๋ก", "ํน์ ํ๋ ์ด์ด์ ์ ์ " ๊ฐ์ ์ฟผ๋ฆฌ๋ RDBMS๊ฐ ํจ์ฌ ์์ฐ์ค๋ฌ์์
- ์คํค๋ง ๊ฐ์ ๊ฐ ์คํ๋ ค ์๋ชป๋ ๋ฐ์ดํฐ ์ ์ฅ์ ๋ฐฉ์งํด์ค์ ์๋ฅผ๋ค๋ฉด piece_type์ ์คํ๊ฐ ๋ค์ด๊ฐ๋ฉด ์ ์ฝ ์กฐ๊ฑด์์ ์กํ๋๊น์. ์ง๊ธ์ ์๋ชป ์ ์ฅ๋๋ฉด ๋์ค์ enum ์ด๋ ๋ค๋ฅธ๊ฑธ๋ก ์กฐํํ ๋ ์บ์คํ ํ๋ ๊ณผ์ ์์ ์ค๋ฅ๊ฐ ๋๊ฒ ์ฃ ?
MongoDB๊ฐ ๋น๋๋ ๋๋ฉ์ธ์
- ๋ฐ์ดํฐ ๊ตฌ์กฐ๊ฐ ์ ๋์ ์ธ ๊ฒฝ์ฐ (์: ์ฌ์ฉ์๋ณ ์ค์ , ๋ก๊ทธ, CMS ์ฝํ ์ธ )
- ๋น์ ํ ๋ฐ์ดํฐ๊ฐ ๋ง์ ๊ฒฝ์ฐ
- ์ํ ํ์ฅ์ด ํ์ํ ๋๊ท๋ชจ ํธ๋ํฝ
๋ฌผ๋ก ํ์ฌ ๋ฏธ์ ๋ฒ์์์๋ ๋ ๋ค ์ถฉ๋ถํ ๋์ํ๊ณ , MongoDB๋ฅผ ์ง์ ์จ๋ณธ ๊ฒฝํ ์์ฒด๊ฐ ๊ทํ๋ค๊ณ ์๊ฐํด์. ํ์ต๋ชฉ์ ์ผ๋ก ์ ํํ๊ฒ๋ ์ด์ ๊ฐ ๋๋๊น์!
| private void resumeGame() { | ||
| String gameId = inputView.readGameId(); | ||
| Board board = boardDao.findBoardByGameId(gameId); | ||
| int turnCount = boardDao.findTurnCountByGameId(gameId); | ||
| JanggiGame janggiGame = JanggiGame.of(board, turnCount); |
There was a problem hiding this comment.
gameId๋ง ์
๋ ฅํ๋ฉด ์ด๋ค ๊ฒ์์ด๋ ๋ถ๋ฌ์ฌ ์ ์๋๋ฐ์, ๋ง์ฝ ์ด๋ฏธ ์์ด ์กํ์ ๋๋ ๊ฒ์์ ๋ถ๋ฌ์ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? isFinished()๊ฐ ๋ฐ๋ก true๋ฅผ ๋ฐํํด์ ๊ฒ์์ด ์ฆ์ ๋๋๊ฒ ์ง๋ง, ์ฌ์ฉ์ ์
์ฅ์์๋ ์ด์ดํ๊ธฐ๋ฅผ ์ ํํ๋๋ฐ ๋ฐ๋ก ์ข
๋ฃ ๋ฉ์์ง๊ฐ ๋์ค๋ ์ํฉ์ด์์.
MongoDB Document์ ๊ฒ์ ์ข
๋ฃ ์ฌ๋ถ(isFinished)๋ฅผ ์ ์ฅํ๊ณ , ์ด์ดํ๊ธฐ ์ ๋๋์ง ์์ ๊ฒ์๋ง ๋ถ๋ฌ์ค๋๋ก ํ๋ฉด ์ด๋จ๊น์?
| Board board = boardDao.findBoardByGameId(gameId); | ||
| int turnCount = boardDao.findTurnCountByGameId(gameId); |
There was a problem hiding this comment.
๋ ๋ฉ์๋ ๋ชจ๋ _id๋ก ๊ฐ์ Document๋ฅผ ์กฐํํ๋๋ฐ, ๋คํธ์ํฌ ์์ฒญ์ด 2๋ฒ ๋๊ฐ๊ณ ์์ด์. ํ๋์ ๋ฉ์๋์์ Document๋ฅผ ํ ๋ฒ๋ง ์กฐํํด์ Board์ turnCount๋ฅผ ๊ฐ์ด ๋ฐํํ๋ฉด ์ด๋จ๊น์?
์ด๊ฑธ ํด๊ฒฐํ๋ ค๊ณ ํ๋ฉด Board์ turnCount๋ฅผ ๋ฌถ์ด์ ๋ฐํํ๋ ๊ฐ์ฒด๊ฐ ํ์ํด์ง๋๋ฐ์, ์ด๊ฒ ์ฌ์ค ๋๋๊ฐ PR ์ค๋ช ์์ ์ธ๊ธํ DTO์ ์์ฐ์ค๋ฌ์ด ๋์ ์์ ์ด๋ผ๊ณ ์๊ฐํด์.
|
์ตํฉ์ํํธ์จ์ดํ๋ถ๋ฅผ ์กธ์
ํ ์ ๊ณต์ ๋ง์ต๋๋ค! ๋น์ ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ redis ๋ฑ ๋ค๋ฅธ ๊ฒ๋ ๋ง์ง๋ง, ์ฒ์์ Redis ์ฌ์ฉ์ ๊ณ ๋ คํ์ต๋๋ค. ์ด์ ๋ ๋ ๋์ค๊ฐ ์ธ๋ฉ๋ชจ๋ฆฌ DB์ด๊ณ ๋ง๋น๋
ธ๊ธฐ ๊ฐ์ ๊ฒ์์ DB๋ก๋ ์ฌ์ฉ๋๋๋ฐ, ์ฅ๊ธฐ๊ฒ์์ ์ฌ์ฉํ์ง ๋ชปํ ๊น๋ผ๋ ์๊ฐ์ผ๋ก ๊ณ ๋ฏผ์ ์์ํ๋ ๊ฒ ๊ฐ์์. ๊ทธ ์ด์ ๋ก๋ MySQL ๊ฐ์ RDB๋ก ํ
์ด๋ธ ์ค๊ณ ์, Document ์์ ์์๋ ์ ์ฒด ๋ฌธ์๋ฅผ ๋ฎ์ด์ฐ๊ธฐํ๋ ๋ฐฉ์๋ง๊ณ ๋ถ๋ถ field๋ง ๊บผ๋ด updateํ ์ ์๋ ๋ฐฉ๋ฒ์ด ์กด์ฌํ์ต๋๋ค. ์ด ๋ฐฉ์์ Document ํ๋ offset์ ํตํด ์ ์ฒด ๋ฌธ์๋ฅผ ๊ต์ฒดํ์ง ์๊ณ ํน์ ํ๋๋ง ์์ ํ ์ ์๋๋ก ์ด์ง ๋ฐ์ดํฐ๋ฅผ ๊ตํํ๋ ๋ฐฉ์์ผ๋ก ์คํํ ์ ์์์ต๋๋ค! RDB๋ ์ฅ๊ธฐํ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ค๋ฉด Game ํ ์ด๋ธ๊ณผ Piece ํ ์ด๋ธ ๋ฑ์ ๋๋๊ณ ์ธ๋ํค๋ก ์ฐ๊ฒฐํ๊ณ ์กฐ์ธํด์ผ ํฉ๋๋ค. ๊ธฐ๋ฌผ ํ๋๋ฅผ ์์ง์ผ ๋๋ง๋ค Piece ๋ฑ์์ ํน์ ํ์ ์ฐพ์ ํ ์ ๋ฐ์ดํธ ํ๊ณ , ์กฐํ์์๋ ๋ ๋ค์ ์ฌ๋ฌ ํ์ Joinํด์ ๊ฐ์ ธ์์ผ ํฉ๋๋ค. ACID ์์น์ ์ํ ์๊ฒฉํ ๊ฒ์ฆ ์ ์ฐจ๋ ๋ค์ด๊ณ ์ MongoDB๋ BASE ์์น์ ๋ฐ๋ผ RDB๋ณด๋ค ์ ์ฐํ ์์น์ ๋ฐ๋ฆ ๋๋ค. ์ฅ๊ธฐํ ์์ฒด๋ฅผ ํ๋์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ(์ฐ๊ด๋ ๊ฐ์ฒด ๋ฌถ์)์ผ๋ก ๋ณด๊ณ , ๊ฒ์ ํ๋ = ๋ฌธ์ ํ๋๋ผ๋ ์ง๊ด์ ์ธ ๊ตฌ์กฐ ๋๋ถ์ ์ฝ๋๊ฐ ๋จ์ํด์ง๊ณ , ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋ ๋จ ํ ๋ฒ์ ๋์คํฌ I/O๋ก ํ ์ ์ฒด ์ํ๋ฅผ ๋ณต์ํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์, NoSQL์ด ๋ฐ์ดํฐ ๋ชจ๋ธ๋ง์ ํจ์จ์ฑ์ ์ด์ ์ด ํฌ๊ณ ์ฆ์ ์ ์ฅ์ด ํ์ํ ์ฅ๊ธฐ ๊ฒ์์์ ์๋๋ ๋น ๋ฅด๋ค๋ฉด ์ ํํ์ง ์์ ์ด์ ๊ฐ ์๋ค๋ ๊ฒฐ๋ก ์ ๋๋ฌํ์ต๋๋ค. ์ฐธ๊ณ ์๋ฃ ๋ง๋น๋ ธ๊ธฐ ๋ชจ๋ฐ์ผ์ ์ค์๊ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ํ์ ์ ์ํด Amazon MemoryDB๋ฅผ ๋์ ํ์ต๋๋ค. |
๊ทธ๋๋ ์ค์ค๋ก ๊ณ ๋ฏผํ๊ณ ํ๊ฐ์ง๋ผ๋ ์๋ฏธ ์๋ ๊ฒ์ ์ป์ด๊ฐ๊ณ ์ถ๋ค๋ ๋ง์์
์ด๋ฒ ๋ฏธ์ ์ ๋๋ถ๋ถ์ด ์ ํํ์ง ์์ ๊ฒ ๊ฐ์ MongoDB๋ผ๋ NoSQL์ ์ ํํ๊ณ ์ฝ์ ํ๋ก๊ทธ๋จ์ DB ์ฐ๊ฒฐ๊ณผ ๋ชฝ๊ณ ๋๋น์ ๊ตฌ์กฐ์ ๋ํด ์ฒ์ ์์๊ฐ๋ฉฐ ๋ง์ ๊ฒ์ ๋ฐฐ์ด๊ฒ ๊ฐ์ต๋๋ค.
์ด๋ฒ ๋ฆฌ๋ทฐ๋ ์ ๋ถํ๋๋ฆฝ๋๋ค!
์ฒดํฌ ๋ฆฌ์คํธ
test๋ฅผ ์คํํ์ ๋, ๋ชจ๋ ํ ์คํธ๊ฐ ์ ์์ ์ผ๋ก ํต๊ณผํ๋์?์ด๋ค ๋ถ๋ถ์ ์ง์คํ์ฌ ๋ฆฌ๋ทฐํด์ผ ํ ๊น์?
๊ณ ๋ฏผํ๋ ์ง์ .
๊ถ์ฑ ๊ตฌํ
๊ถ์ฑ ์์์์ ์ด๋์ ๋ต์ ๊ธฐ์กด MoveStrategy์ ์์ฑํ๋ ๊ฒ์ ๋ฉ์๋์ ์๋ฅผ ๋๋ ค์ ๊ฐ๋ ์ฑ์ ์ ํดํ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
๋ฐ๋ผ์ ๊ถ์ฑ ์์ ์ด๋์ ๋ต์ ์๋ก ๋ง๋๋ ๊ฒ์ด ๊ฐ๋ ์ฑ์ ์ฅ์ ์ด ์๋ค๊ณ ์๊ฐ์ ํ๋ค๊ฐ,
ํ์ง๋ง, ์ด๋ ๊ฒฝ๋ก๋ฅผ ๊ฐ์ ธ์ค๋ getPath()๋ฅผ ๊ถ์ฑ ์์์๋ ๊ธฐ์กด ์ด๋ ๊ฒฝ๋ก๋ฅผ ํฌํจํ์ฌ ๊ถ์ฑ ์์ ์ด๋์์น๋ฅผ ๋ง๋ถ์ฌ ๋ฐํํด์ผ ํ๊ธฐ ๋๋ฌธ์๊ธฐ์กด ์ ๋ต์ ๊ถ์ฑ ์กฐ๊ฑด์ ๋จ์ํ ์ถ๊ฐํด(๋ง๋ถ์ฌ) ์ฃผ๋ ๊ฒ์ผ๋ก ๋ก์ง์ ์์ ํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
๋ถ๋ฆฌ๋ฅผ ํ์ง ์์์ผ๋ ํ ํด๋์ค์ ์ฝ๋๊ฐ ๊ธธ์ด์ง๊ณ ์กฐ๊ธ ๋ณด๊ธฐ ์ด๋ ค์์ง๋ค๋ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ๋๊ผ์ต๋๋ค.
์ด ๊ฒฐ์ ์ด ๋์์ง ์์ ๊ฒฐ์ ์ธ์ง ๋ฆฌ๋ทฐ ๋ถํ๋๋ฆฝ๋๋ค.
์์ด ์กํ๋ ๊ฒฝ์ฐ ๊ฒ์์์ ์ง๋ค.
๋ณด๋์์ ์์ด ์ญ์ ๋๋ ๊ฒฝ์ฐ ์ฆ์ ๊ฒ์์ ์ข ๋ฃํด์ผํฉ๋๋ค.
๋ณด๋์ move์์ ์ด๋ํ๋ฉฐ ๋์คํ ์์น์ ๊ธฐ๋ฌผ์ ์ ๊ฑฐํ๊ณ ์๋๋ฐ, ์ด๋ ๋ฉ์๋์ ๊ฒ์ ์ข ๋ฃ ์ฌ๋ถ๋ฅผ ํ์ธํ๋ ์ฑ ์๊น์ง ๊ฐ๊ฒ ํ๋
๊ฒ์ ๊ณผ๋ํ ์ฑ ์์ด๋ผ๋ ์๊ฐ์ด ๋ค์์ต๋๋ค.
๋ฐ๋ผ์, JanggiGame ๊ฐ์ฒด๋ฅผ ๋์ ํ์ฌ ๊ฒ์ ํ๋ฆ์ ๊ด์ ํ๊ณ ๋ณด๋๊ฐ์ฒด๋ก ๋งคํด ์ฅ๊ตฐ์ ์กด์ฌ๋ฅผ ์ฒดํฌํ๊ฒ ํ๊ณ ๊ฒ์ ์ข ๋ฃ๋ฅผ ์ ์ฐํ๊ฒ
๊ด๋ฆฌํ ์ ์๋๋ก ๊ตฌํํ์ต๋๋ค.
JanggiGame ๊ฐ์ฒด๋ฅผ ๋์ ํจ์ผ๋ก์จ Board ๊ฐ์ฒด๊ฐ ์ปจํธ๋กค๋ฌ์ ํ๋ฌ๊ฐ ๊ฒ์ ์ ๊ฑฐํ ์ ์์๊ณ ์ด๊ฒ์ ๋ถ๋ช ํ ๊ฐ์ฒด์งํฅ์ ๋ ธ๋ ฅ์ ์ํ์ด์์ต๋๋ค.
์ปจํธ๋กค๋ฌ๋ฅผ ์์ ํ๋ฉฐ์ ๋ ๊ถ๊ธ์ฆ
Controller์ ์์ฐจ๋ฆผ์ด ์ด๋ฆ๊ณผ ์์ผ๋ก ๋งค์นญ๋๋๋ฐ BiFunction์ ์ฐ๋ฉด Formation enumํด๋์ค์์ ํ๋ฒ์ ์ด๊ธฐํํ ์ ์์ ๊ฒ๋ง ๊ฐ์๋ฐ ์ด ๊ฒฝ์ฐ Formation์ด Board๊ฐ์ฒด๋ฅผ ์์กดํ๊ฒ ๋ฉ๋๋ค. Formation ์ฝ๋๋ ๋ค์ ์ง์ ๋ถํด์ง๋ ์ฝ๋๊ฐ ๋๋๋ฐ Controller์ ์ฝ๋๋ ์๋นํ ๊น๋ํด์ง๊ฒ ๋ฉ๋๋ค. ์ด๋ฌํ ์ค๊ณ๊ฐ ์ ์ ํ์ง ์๊ฒฌ์ด ๊ถ๊ธํฉ๋๋ค.
JanggiGame ๊ฐ์ฒด
์๋ก ์ฅ๊ธฐ๊ฒ์ ๊ฐ์ฒด๋ฅผ ๋์ ํ๋๋ฐ, ๋ถ๋ณ ๊ฐ์ฒด๋ก ์ฐ๊ณ ์ถ๋ค๋ ์๊ฐ์ด ๋ค์์ต๋๋ค. ํด์ ์นด์ดํธํ๋ ๋ฐ์ดํฐ์ธ turnCount๋ ๊ฐ๋ณ์ธ๋ฐ, ์ด ๋ถ๋ถ์์๋ ์์ ํ ๋ถ๋ณ ๊ฐ์ฒด๋ ๋ด๋ถ์ ๋ถ๋ณ ๋ฐ์ดํฐ ํ๋๋ง ๋ฐ๋์ด๋ ๋ค์ ์๋ก ๋ง๋ค์ด์ ๋ถ๋ณ ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํด์ผ ํ๊ธฐ ๋๋ฌธ์ ์ฝ๋์ ๊ฐ๋ ์ฑ์ ํด์น ์ ์๋ค๋ ์๊ฐ์ด ๋ค์ด์ ๊ฐ๋ณ์ผ๋ก turnCount๋ฅผ ๋ง๋ค์์ต๋๋ค. ์ด ๋ถ๋ถ์ด ๊ด์ฐฎ์์ง ๋ฆฌ๋ทฐ ์์ฒญ๋๋ฆฝ๋๋ค.
DB ์ฐ๊ฒฐ์ ๋ฐ๋ฅธ DAO ๋์ ๊ณผ ๊ธฐ์กด MVC ํจํด์ ํ์ฅ ์ค๊ณ
DB๋ฅผ ๋์ ํ๋ฉด์ ๊ธฐ์กด MVC ๊ตฌ์กฐ์ DAO ๊ณ์ธต์ ์ถ๊ฐํ์ต๋๋ค.
BoardDao๋ฅผ Controller์ ์ฃผ์ ํ์ฌ, Controller๊ฐ ๊ฒ์ ํ๋ฆ(์ ๊ฒ์/์ด์ดํ๊ธฐ)์ ๋ฐ๋ผ DAO๋ฅผ ํตํด ๊ฒ์ ์ํ๋ฅผ ์ ์ฅํ๊ณ ๋ณต์ํ๋๋ก ์ค๊ณํ์ต๋๋ค.
์ด ๊ณผ์ ์์ ๊ณ ๋ฏผํ๋ ์ ์ DAO๊ฐ ๋๋ฉ์ธ ๊ฐ์ฒด(Board)๋ฅผ ์ง์ ๋ฐํํ๋ ๊ฒ์ด ๊ณผ์ฐ ์ ์ ํ๊ฐ ์ ๋๋ค.
ํ์ฌ
findBoardByGameId()๋ Document(๋ชฝ๊ณ DB์ ๋ฌธ์)๋ฅผ Board๋ก ๋ฐํํ์ฌ DAO๊ฐ ๋๋ฉ์ธ ๊ฐ์ฒด์ ์์ฑ ๋ฐฉ์์ ์์์ผ ํฉ๋๋ค.DTO๋ ์ข์ ์ ํ์ง๊ฐ ๋ ์ ์์ง๋ง, ํ์ฌ ๊ท๋ชจ์์๋ ์คํ๋ ค ๊ณผํ ์ถ์ํ๋ผ๊ณ ์๊ฐํด์(ํ์ฌ ์์ ๊ท๋ชจ๋ผ ๋ทฐ๋ ๋๋ฉ์ธ์ ์์กดํ๊ณ ์์)
DAO๊ฐ ๋๋ฉ์ธ ๊ฐ์ฒด๋ฅผ ์ง์ ๋ค๋ฃฐ ์ ์๊ฒ ์ ํํ์ต๋๋ค.(์ค์ ํ์)
์ฅ์ :
๋จ์ :