[๐ ์ฌ์ดํด2 - ๋ฏธ์ (๊ธฐ๋ฌผ ํ์ฅ + DB ์ ์ฉ)] ๋ณด์ ๋ฏธ์ ์ ์ถํฉ๋๋ค.#337
[๐ ์ฌ์ดํด2 - ๋ฏธ์
(๊ธฐ๋ฌผ ํ์ฅ + DB ์ ์ฉ)] ๋ณด์ ๋ฏธ์
์ ์ถํฉ๋๋ค.#337boyekim wants to merge 20 commits intowoowacourse:boyekimfrom
Conversation
echo724
left a comment
There was a problem hiding this comment.
์๋
ํ์ธ์ ๋ณด์!
์ ๋ ๋ฆฌ๋ทฐ๊ฐ ๋ฆ์ด์ง ์ ์ฃ์กํฉ๋๋ค..
์ผ๋จ ๊ณต์ฑ๊ณผ DB ์๊ตฌ์ฌํญ ๊น๋ํ๊ฒ ์ ์ฒ๋ฆฌํ์ ๊ฒ ๊ฐ์์! ๊ธฐ์กด ํด์ ๊ธฐ๋ฐ ๊ตฌ์กฐ์ ๋ง๊ฒ ๋๋น์๋ ์ด๋ ์ ๋ณด ๊ธฐ๋ฐ์ผ๋ก๋ง ์ ๋ด์์ ํํํ์ ๊ฒ ๊ฐ์ต๋๋ค. ๋ค๋ฅธ ํฌ๋ฃจ๋ค์ ๊ตฌ์กฐ๋ฅผ ๋ณด๋ฉด ํธ๋์ ์
์ ์ด์ฉํด์ ํผ์ค๋ค์ ์ ์ฒด ์
๋ฐ์ดํธ ํด์ผํ๋ ๊ตฌ์กฐ์ธ๋ฐ, ํ์ฌ ๋ณด์ ์ฝ๋ ๊ธฐ์ค์ผ๋ก๋ ํธ๋์ ์
์ด ํ์ํ์ง๋ ์์์ ์ข์ ์ค๊ณ๊ฐ ์๋๊ฐ ์๊ฐ์ด ๋ญ๋๋ค! ์คํ๋ ค ๋ณด๋ ์ ์ฒด๋ฅผ ๋ด์๋ค๋ฉด ๊ตณ์ด ํ์ํ์ง ์์ ์ ๋ณด๋ค๊น์ง ์์ํ๊ฐ ๋์ด ๋์คํฌ์ ๋ถ๋ด์ ์ฃผ์์ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฆฌํ๋ ์ด๊ฐ ๋๋ค๋ฉด ๊ตณ์ด ๋ณด๋์ ์ค๋
์ท์ ์์ํ ํ ํ์๊ฐ ์์๊น์? ๋ฌผ๋ก ํด์ด ์๋ฐฑํด์ด ๋์ด๊ฐ๋ค๋ฉด ์ค๋
์ท์ ์ค๊ฐ์ค๊ฐ ๊ณ ๋ คํด๋ณผ ์ ์๊ฒ ์ง๋ง ๋ชจ๋ ํด์ ๋ณด๋ ์ ๋ณด๋ฅผ ๋ด๋๊ฒ์ ์ด๋ ค์ ์ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฐ ์๋ฏ์์ ์ ๋ ํ์ฌ ๊ตฌ์กฐ๊ฐ ํจ์ฌ ๋ซ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด์ ์ปค๋ฉํธ๋ ์ ๋ฐ์ํด์ฃผ์ ๊ฒ ๊ฐ์ต๋๋ค! ๊ตณ์ด ํผ์ค์๊ฒ ์์ด์ ๋ณด๋์ ๊ตฌํ ๋ด์ฉ์ ์ ํ์๋ ์์ผ๋ ์ข์ ๋ฐฉํฅ์ผ๋ก ์ค๊ณ ํด์ฃผ์ ๊ฒ ๊ฐ์์!
์ด๋ฒ ๋ฆฌํ์คํธ ์ฒด์ธ์ง์์๋ 1. Service, Game ๊ฐ์ฒด๋ค์ ๊ฒฐํฉ ๊ณ ๋ฏผ 2. ์๋น์ค, ๋ ํ์งํ ๋ฆฌ ํ ์คํธ๋ฅผ ์ถ๊ฐ๋ก ํด์ฃผ์ จ์ผ๋ฉด ํฉ๋๋ค. 1๋ฒ์ ๊ฒฝ์ฐ ์ปค๋ฉํธ๋ฅผ ๋จ๊ฒผ๊ณ , 2๋ฒ์ ๊ฒฝ์ฐ์๋ ๋๋น์ ๊ฒฝ์ฐ์๋ ํนํ ๋ฐฐํฌ ํ๊ฒฝ, ํ ์คํธ ํ๊ฒฝ์ ๋ฐ๋ผ ๋ค๋ฅธ DB๋ฅผ ์ฌ์ฉํ๋ค๊ฑฐ๋ ํ๋ ์์ผ๋ก ์ธ๋ถ ์ํฅ์ ๋ฐ์ต๋๋ค. 1. ์ด๋ป๊ฒ ํ๋ฉด ์ด ์์ํ ๊ณ์ธต๊ณผ ๊ณ์ธต์ ํฌํจํด์ ํ ์คํธ๋ฅผ ์งค ์ ์์๊น 2. ์ด๋ป๊ฒ ํ๋ฉด ํ๋ก๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ด ํ ์คํธํ ์ ์์์ง์ ๋ํด์ ๊ณ ๋ฏผํด๋ณด์๊ณ ์ง์ ํ ์คํธ ์์ฑํด๋ณด์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค! ํน์ ์ ๋งคํ ๋ถ๋ถ์ ์ปค๋ฉํธ ๋ฌ์์ฃผ์๊ฑฐ๋ DM ์ฃผ์ธ์ ํ์ดํ ์ ๋๋ค!
| package janggi.persistence.dto; | ||
|
|
||
| public record MoveHistory( | ||
| int turnNumber, |
There was a problem hiding this comment.
ํด ์ ๋ณด๊ฐ ์ ์ฅ์ ๋๋๋ฐ ๋ฐ๋ก ์ฐ์ด๋ ๊ณณ์ ์๋ ๊ฒ ๊ฐ๋ค์. ํน์ ๋ฃ์ ์ด์ ๊ฐ ์์๊น์?
There was a problem hiding this comment.
ํฌํจํด๋๋ฉด ์ ์ฉํ ๊ฒ ๊ฐ์์ ์ถ๊ฐํ์์ต๋๋ค!
๊ฐ์ฅ ์ต๊ทผ ํด์ ๊ฐ์ ธ์จ๋ค๊ฑฐ๋, ๋ช ๋ฒ ๋ง์ ๊ฒ์์ด ์ข
๋ฃ๋์๋์ง ๋ฑ ๊ธฐ๋ณธ ๊ฒ์ ์ ๋ณด์ ํด๋นํ๋ค๊ณ ์๊ฐํด์ ๋ฃ์์๋๋ฐ์, ์ฝ๋ ์์์๋ ์ฌ์ฉ์ด ์๋๋ ์ ๊ฑฐํ๋๊ฒ ๋์๊น์?
| private boolean isCancelCommand(String input) { | ||
| return CANCEL.equalsIgnoreCase(input.trim()); | ||
| } |
There was a problem hiding this comment.
์ค ์ทจ์ ์ปค๋ฉ๋ ์ข๋ค์! ์ค์ ์คํํด๋ณด๋ฉด์ ์์ผ๋ฉด ์ข๊ฒ ๋ค ์๊ฐํ์๋๋ฐ ์ ์ฒ๋ฆฌํ์ จ๋ค์!
There was a problem hiding this comment.
๋ค๋ง CANCEL์ด JanggiRunner์ ์์ด๋ ๋๋์ง์ ๋ํด์๋ ๊ณ ๋ฏผํด๋ณด์๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค. inputView์์ ์ฒ๋ฆฌํด์ฃผ๋๊ฒ ๋ง์ง ์์๊น์?
There was a problem hiding this comment.
์ ๊ฐ ์ ์ํ cancel์
- ์ดํ ์ขํ ๊ฒ์ฆ์ผ๋ก ๋ค์ด๊ฐ๊ธฐ ์ ์ ์ทจ์ํด์ผํจ
- ์ฅ๊ธฐ ๊ฒ์ ๊ท์น์ด๋ผ๊ณ ๋ณด๊ธฐ ์ด๋ ค์
- ์ฝ์๊ณผ ์ฌ์ฉ์์ ์ํธ์์ฉ์
์ด๋ฐ ํน์ง์ ๊ฐ์ง๊ณ ์๋ค๊ณ ์๊ฐํ์ต๋๋ค.
๋ฐ๋ผ์ ๊ฒ์๊ณผ ์ฌ์ฉ์์ ์ํธ์์ฉ๋ณด๋ค๋ ๊ทธ ์ด์ ๋จ๊ณ์ธ ์ฝ์๊ณผ์ ์ํธ์์ฉ์ด๋ผ๊ณ ์๊ฐํด์ Runner์ ์์น์์ผฐ์์ต๋๋ค.
ํ์ง๋ง ๊ฒ์๊ณผ ๊ด๋ จ๋ ๊ฒ์ด ์๋๋ ์์ InputView๊ฐ ์ฒ๋ฆฌํด์ค๋ ์ข์ ๊ฒ ๊ฐ๋ค์. ์คํ๋ ค Runner๊ฐ ๋ชฐ๋ผ๋ ๋๋ ์
๋ ฅ ๊ท์น์ ์๊ณ ์๊ฒ ๋๋ ๊ฒ ๊ฐ์์.
inputView์ readCancelableLine๋ผ๋ ๋ฉ์๋๋ฅผ ์ถ๊ฐํด์ค๋ณด์์ต๋๋ค.
์ด๋๋ณด์ด๋์?!
| private void play(JanggiGame janggiGame, Position startPosition, Optional<Position> endPosition) { | ||
| janggiGame.doGame(startPosition, endPosition.get()); | ||
| janggiService.saveMove(janggiGame, startPosition, endPosition.get()); | ||
| } |
There was a problem hiding this comment.
์ฅ๊ธฐ ๊ฒ์๊ณผ ์ฅ๊ธฐ ์๋น์ค ๋ผ์ดํ ์ฌ์ดํด์ด ๋น์ทํ๊ธฐ๋ ํ๊ณ , ์ฌ์ค janggiGame์ด Repository๋ฅผ ํ๋๋ก ๊ฐ๊ณ ์์ผ๋ฉด Service๊ฐ ๋ฑํ ํ์ํด๋ณด์ด์ง ์์ ๊ฒ ๊ฐ์๋ฐ ์ด๋ป๊ฒ ์๊ฐํ์๋์? ๊ฒ์์ด ๊ฒ์ ์คํ + ์ ์ฅ์ ๋งก์์ ํ๋ ์ ์ธ๊ฑฐ์ฃ
There was a problem hiding this comment.
ํด๋น ๊ตฌ์กฐ์ ์ฅ์ ์ ๊ฒ์์ ์คํํ ๋ค์ ์ ์ฅํ๋ ๊ฐ๊ทน์ ์ค์ผ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค์ด ์ฅ๊ธฐ๋ง์ ์ธ๋ฉ๋ชจ๋ฆฌ ์์์ ์ฑ๊ณต์ ์ผ๋ก ์์ง์ฌ์ก๋๋ฐ ๋ชจ์ข ์ ์ด์ ๋ก Service ์ชฝ์์ ์ ์ฅ์ด ์๋ ๊ฒฝ์ฐ๋ ์์์์? ๊ทธ๋ฌ๋ฉด ์ธ๋ฉ๋ชจ๋ฆฌ์ ์์ ์ํ๋ฅผ ์ด๋ป๊ฒ ์ผ์น์ํฌ ์ ์์๊น์ ๋ํ ๊ณ ๋ฏผ๋ ํ์ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
There was a problem hiding this comment.
์์์ ๋ํ ์ฑ
์์ ๊ธฐ์กด ๊ฒ์ ์คํ๊ณผ ์์ ์ด ๋ถ๋ฆฌ๋์ด์๋ค๊ณ ์๊ฐํด์, ๊ฒ์ ์คํ + ์ ์ฅ์ ๋ถ๋ฆฌํด์ฃผ๋ ค ํ์์ต๋๋ค.
ํ์ง๋ง ๊ฐ๊ทน์ ์ค์ด๋ ๊ฒ์ด ์ค์ํ ๊ฒ ๊ฐ์์ ์๊ฐ์ ์ ๊ฐํด๋ณด์๋๋ฐ์,
Service์์ ๊ฒ์ ์คํ๊ณผ ์ ์ฅ์ ๋ค๊ณ ์๋ ๊ฒ์ ์ด๋จ๊น์?
Input,Output์ ๋ํ ์ฌ์ฉ์์์ ์ํธ์์ฉ์ Runner๊ฐ ํ๊ณ , ๊ฒ์ ์งํ ๋ฐ ์ ์ฅ์ Service๊ฐ ํด์ค๋ค๋ฉด ๊ฐ๊ทน์ ์ค์ผ ์ ์๊ณ ์ญํ ๋ ๋ถ๋ฆฌํ ์ ์์ ๊ฒ ๊ฐ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
e95429f ํด๋น ์ปค๋ฐ์์ ๋ฐ์ํด๋ณด์์ต๋๋ค!
| import org.junit.jupiter.api.DisplayName; | ||
| import org.junit.jupiter.api.Test; | ||
|
|
||
| class JanggiGameTest { |
There was a problem hiding this comment.
ํ์ฌ ์๋น์ค์ ๋ํ ํ ์คํธ๋ ๋ณด์ด์ง ์๋ค์? DB์ ๋ํ ์์กด์ฑ๋ง ํด๊ฒฐํด์ฃผ๋ฉด ์์ฑ์ด ๊ฐ๋ฅํ ๊ฒ ๊ฐ์๋ฐ ์ด๋ป๊ฒ ํด๊ฒฐํ ์ ์์๊น์?
There was a problem hiding this comment.
Fake๊ฐ์ฒด๋ฅผ ํตํด ์๋น์ค ํ
์คํธ๋ฅผ ์ถ๊ฐํด๋ณด์์ต๋๋ค.
๋ค์ ๋๊ฐ์ง์์ ๊ณ ๋ฏผํ์๋๋ฐ์,
- test์ฉ ํ์ผ db๋ฅผ ํ๋ค.
- fake ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค.
ํ์ง๋ง ๊ด๋ฆฌ์ ๋ํ ๋น์ฉ, ๊ทธ๋ฆฌ๊ณ Service ๋ก์ง๋ง์ด ์คํจ ์์ธ์ด ์๋ ์๋ ์๊ฒ ๋ ๊ฒ ๊ฐ์์....์ฐ์ 2๋ฒ์ ํํด๋ณด์์ต๋๋ค.
| } catch (SQLException e) { | ||
| throw new IllegalStateException("์ ์ ์ฅ์ ์คํจํ์ต๋๋ค.", e); | ||
| } |
There was a problem hiding this comment.
์ ์ ์ฅ ์คํจ์ ๋ํ ์ฒ๋ฆฌ๊ฐ ์๊ณ ์์ธ๊ฐ ํฐ์ง๋ฉด ์ข
๋ฃ๋๋ ๊ตฌ์กฐ๋ค์. ํญ์ ๋๋น ๊ด๋ จ์ ์ํ ๋ถ์ผ์น์ ๋ํ ๊ณ ๋ฏผ์ด ํ์ํ๋ค๊ณ ์๊ฐํ๋๋ฐ ๊ฒ์์ ์ข
๋ฃํ๋ ๊ฒ ๋์ ํด๋ณผ ์ ์๋ ์ฌํญ์ด ์์๊น์? ์ฌ์๋๋ฅผ ํ๋ค๋์ง ํ๋์์ผ๋ก์. ๊ทธ๋ฆฌ๊ณ executeUpdate ์ฃผ์์๋ SQLTimeoutException์ด ๋์ ธ์ง๋ค๊ณ ๋ ํ๋๋ฐ ํ์ ์์์ ๋ํ ์์ธ์ฒ๋ฆฌ๋ ํ์ํ์ง ์์๊น์? ํ์
์์๋ ํนํ ํ์์์ ๊ด๋ จ ์์ธ๊ฐ ๋ง์ด ๋ฐ์ํ๋๋ฐ ์ด ๋ถ๋ถ๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง ๋ ์ํ ๋ถ์ผ์น๋ ์ด๋ป๊ฒ ํด๊ฒฐํ ์ ์์์ง ๊ณ ๋ฏผํด๋ณด๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค.
| janggiGame.findWinner() | ||
| .orElseThrow(() -> new IllegalStateException("์น์๊ฐ ์กด์ฌํ์ง ์์ต๋๋ค.")), | ||
| winnerScore |
There was a problem hiding this comment.
์ด ๋ถ๋ถ ์ฝ๊ฐ ์ด์ํ๋ฐ, winnerScore๋ ๊ตฌํ ์ ์๋๋ฐ Winner๋ฅผ ๋ชป์ฐพ์์ค๋ ๊ฒฝ์ฐ๊ฐ ์๋์? ์ด์ฐจํผ Turn์๊ฒ์ ์น์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ์์ด๋ผ๋ฉด ๋ฌถ์ด์ ๊ฐ์ ธ์ฌ ์ ์๋๋ฐฉ๋ฒ์ด ์์ง ์์๊น์?
์ฒดํฌ ๋ฆฌ์คํธ
test๋ฅผ ์คํํ์ ๋, ๋ชจ๋ ํ ์คํธ๊ฐ ์ ์์ ์ผ๋ก ํต๊ณผํ๋์?์ด๋ค ๋ถ๋ถ์ ์ง์คํ์ฌ ๋ฆฌ๋ทฐํด์ผ ํ ๊น์
๋ฆฌ๋ทฐ ์์ฒญ์ด ๋ฆ์ด์ง ์ ์ฃ์กํฉ๋๋ค...
DB ์ ์ฉ
DB๋ SQLite๋ฅผ ์ฌ์ฉํ์ต๋๋ค. ์ด์ ๋ ์๊ตฌ์ฌํญ์ ์ถฉ์กฑ์ํค๋ ค๋ฉด ํ์ผ DB์ฌ์ผํ๊ณ , H2๋ ์ด์ ์ ์์ฝ์ด ๋๋ฌธ์ ๊ท์ฐฎ์๋ ๊ฒฝํ์ด ์์ด ๋ฐ๊ฐ์ด ์์ต๋๋ค. ๊ทธ๋์ ํ๋ฒ๋ ์์จ๋ณธ SQLite๋ฅผ ์ฌ์ฉํด๋ดค์ต๋๋ค.
DB์ ์ด๋ค ์ ๋ณด๋ฅผ ์ ์ฅํ ์ง ๊ณ ๋ฏผํ ๋์, ๋ณด๋ ์ํ ์ ์ฒด๊ฐ ์๋๋ผ ์ด๋ ์ ๋ณด๋ง ์ ์ฅํ๋๋ก ๊ตฌ์ฑํ์ต๋๋ค.
๊ฒฐ๋ก ์ ์ด์ ์ ์์ฝ๊ฐ ๋จ๊ฒจ์ฃผ์ ์ด๋ ์ ๋ณด๋ง ๋จ๊ฒจ๋ณด์์ต๋๋ค! ์ด์ ๋ ์ด์ฐจํผ ์ ํ๋ฆฌ์ผ์ด์ ์ฌ์์ ์ Turn ์ ๋ณด๋ฅผ ์ฌ๊ตฌ์ฑํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด ๋ฐฉ์์ ๋ณด๋ ์ค๋ ์ท์ ์ง์ ์ ์ฅํ๋ ๊ฒ๋ณด๋ค ์ ์ฅ ๊ตฌ์กฐ๊ฐ ๋จ์ํ๊ณ , ๊ธฐ์กด doGame / move ํ๋ฆ์ ๊ทธ๋๋ก ์ฌ์ฌ์ฉํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค๊ณ ํ๋จํ์ด์.
์ด์ ์ฝ๋ฉํธ ์ ์ฉ
ํด๋น ์ฝ๋ฉํธ ์ ์ฉ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
AS-IS
TO-BE
์ด ๋ณ๊ฒฝ์ ํตํด Piece๊ฐ ๋ณด๋ ์ ์ฒด ๊ตฌ์กฐ๋ฅผ ์ง์ ์ ํ์๊ฐ ์์ด์ก๊ณ , Board์ Piece ์ฌ์ด์ ๊ฒฐํฉ๋๋ฅผ ๋ฎ์ถ ์ ์์์ต๋๋ค.