[๐ ์ฌ์ดํด2 - ๋ฏธ์ (๊ธฐ๋ฌผ ํ์ฅ + DB ์ ์ฉ)] ๋ ์ ๋ฏธ์ ์ ์ถํฉ๋๋ค.#327
[๐ ์ฌ์ดํด2 - ๋ฏธ์
(๊ธฐ๋ฌผ ํ์ฅ + DB ์ ์ฉ)] ๋ ์ ๋ฏธ์
์ ์ถํฉ๋๋ค.#327win9-tech wants to merge 43 commits intowoowacourse:win9-techfrom
Conversation
- Turn์ Game ๋ด๋ถ๋ก ์ด๋ - ConsoleView์์ Position ์ง์ ๋ฐํ - ์ปจํธ๋กค๋ฌ ์์ ๋จ์๋ก ๋ฉ์๋ ๋ถ๋ฆฌ
- public ๋ฉ์๋ ์ ๋ ฌ - OutputView ์ค๋ณต ์ฝ๋ ์ถ์ถ
| @@ -0,0 +1,70 @@ | |||
| package view; | |||
There was a problem hiding this comment.
Runner์ ์์กด์ฑ ๊ฐ์๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด InputView์ OutputView๋ฅผ ํ๋๋ก ๋ฌถ์ ConsoleView๋ฅผ ๋์ ํ์ต๋๋ค. ํ์ฌ ๊ตฌ์กฐ๋ Runner์ ์์กด์ฑ์ ๋จ์ํํ๊ณ , View ๊ด๋ จ ๋ณ๊ฒฝ ์ฌํญ์ ConsoleView ํ ๊ณณ์ผ๋ก ์์งํ ์ ์๋ค๋ ์ฅ์ ์ด ์๋ค๊ณ ์๊ฐํ๋๋ฐ์.
์ฌ๊ธฐ์ ํ ๊ฐ์ง ๊ณ ๋ฏผ์ด ์๊ฒผ์ต๋๋ค.
ConsoleView ์์กด (ํ์ฌ): ์์กด์ฑ ๊ฐ์๊ฐ ์ค์ด Runner๊ฐ ๊น๋ํด์ง์ง๋ง, ๋จ์ํ ๋ฉ์๋๋ฅผ ์ ๋ฌ๋ง ํ๋ ํด๋์ค๊ฐ ์๊ธฐ๋ ๊ฒ ์๋๊ฐ ํ๋ ์ฐ๋ ค๊ฐ ์์ต๋๋ค.
Input/OutputView ์ง์ ์์กด: ํด๋์ค ๊ฐ์๋ ์ค์ด๋ค์ง๋ง, Runner๊ฐ View์ ๊ตฌ์ฒด์ ์ธ ์ฑ ์(์ ๋ ฅ๊ณผ ์ถ๋ ฅ) ๋ ๊ฐ์ง๋ฅผ ๋ชจ๋ ์๊ฒ ๋ฉ๋๋ค.
์ฃผ๋๋ ๋จ์ํ ์์กด์ฑ ๊ฐ์๋ฅผ ์ค์ด๊ธฐ ์ํด ์ถ์ํ ๊ณ์ธต(Facade)์ ๋๋ ๊ฒ์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์๋์? ํน์ ์ด๋ฐ ์ํฉ์์ ์ด๋ค ๋ฐฉ์์ ๋ ์ ํธํ์๋์ง ๊ถ๊ธํฉ๋๋ค!
There was a problem hiding this comment.
์ ๋ Input/OutputView๊ฐ ํ๋ ์ญํ ์ด ํ์คํ๊ณ , ํ์ฌ ๊ตฌ์กฐ๋ ConsoleView์ ๋ณ๊ฒฝ์ด ์์ผ๋ฉด(๋ค๋ฅธ ์ญํ ์ด ์๊ฒจ ๋ฉ์๋๋ช
์ ๋ณ๊ฒฝํ๋ ๊ฒฝ์ฐ) ์ด์ฐจํผ ๋ชจ๋ ๊ณณ์์ ๋ณ๊ฒฝ์ด ์ผ์ด๋ ๊ฒ ๊ฐ์์
๊ทธ๋์ Input/OutputView ์ง์ ์์กด์ ๋ ์ ํธํฉ๋๋ค!
There was a problem hiding this comment.
์๊ฒฌ ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค! ์ ๋ ์ง์ ์์กด ๋ฐฉ์์ ๋ ์ ํธํ์ง๋ง, ์ด๋ฒ์๋ '์ธ์คํด์ค ๋ณ์ 3๊ฐ ์ดํ'๋ผ๋ ์ ์ฝ ์ฌํญ์ ์งํค๊ธฐ ์ํด ํ์ฌ ๊ตฌ์กฐ๋ฅผ ์ ์งํด๋ณด๊ฒ ์ต๋๋ค ใ ใ !!
|
|
||
| public class Palace { | ||
|
|
||
| private static final Palace INSTANCE = new Palace(); |
There was a problem hiding this comment.
๊ถ์ฑ ์ขํ์ ์ด๋ ๋ฐฉํฅ์ ๋ถ๋ณ ๋ฐ์ดํฐ์ด๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด์์ ํ๋๋ง ์กด์ฌํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ์ฑ๊ธํค์ผ๋ก ๊ตฌํํ์ต๋๋ค.
์ฑ๊ธํค์ด ํ ์คํธ๋ฅผ ์ด๋ ต๊ฒ ๋ง๋ ๋ค๋ ์๊ฒฌ์ด ์๋๋ฐ, ํ์ฌ ์ฝ๋์์๋ ๋ค์ ์ด์ ๋ก ๋ฌธ์ ๊ฐ ๋์ง ์๋๋ค๊ณ ํ๋จํ์ต๋๋ค.
- Palace๋ ๋ถ๋ณ ๋ฐ์ดํฐ
- ๊ธฐ๋ฌผ ํ ์คํธ ์ ์ค์ ๊ถ์ฑ ์ขํ๋ก ํ ์คํธํ๋๋ผ๋ ์ํ๊ฐ ๋ณ๊ฒฝ๋์ง ์๋๋ค.
ํน์ ์ฑ๊ธํค์ผ๋ก ์ธํด ํ ์คํธ๊ฐ ์ด๋ ค์์ง๋ ์ผ์ด์ค๊ฐ ์์๊น์? ์ด์ ๋ํด ์ด๋ป๊ฒ ์๊ฐํ์๋์??
There was a problem hiding this comment.
๋ ์๊ฐ ๋ง์์ฃผ์ ๋๋ก ๋ถ๋ณ ๋ฐ์ดํฐ ์ฑ๊ธํค์ ์ผ๋ฐ์ ์ธ ์ฑ๊ธํค ํ
์คํธ ๋ฌธ์ ์์ ์์ ๋ก์ด ๊ฒ ๋ง์์!
ํ
์คํธ๊ฐ ์ด๋ ค์ด ์ผ์ด์ค๋ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ์ธ๋ฐ, ํ์ฌ๋ ๋ช
์์ ์ผ๋ก 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)); |
There was a problem hiding this comment.
Optional๊ณผ Exception ์ค ๊ณ ๋ฏผ์ด ์์ด ์ง๋ฌธ๋๋ฆฝ๋๋ค.
"์ ์์ ์ผ๋ก ๊ฒฐ๊ณผ๊ฐ ์์ ์ ์๋ ๊ฒฝ์ฐ์ Optional, ์์ธ์ ์ธ ์ค๋ฅ ์ํฉ์ Exception"์ด๋ผ๋ ๊ธ์ ๋ณด๊ณ Optional์ ์ ํํ๋๋ฐ, ์กด์ฌํ์ง ์๋ ๊ฒ์์ ๋ถ๋ฌ์ค๋ ์ํฉ์ ์คํ๋ ค ์์ธ์ ํด๋นํ๋ ๊ฒ ์๋๊ฐ ํ๋ ์๊ฐ๋ ๋ค์ด์ ํ์ ์ด ์์ง ์์ต๋๋ค.
๋ํ Optional์ด null ๊ฐ๋ฅ์ฑ์ ๋ช ์์ ์ผ๋ก ๋๋ฌ๋ธ๋ค๋ ์ฅ์ ์ด ์๋ค๊ณ ํ์ง๋ง, Exception์ผ๋ก๋ "์ด ์ํฉ์ ๋ฐ์ํ๋ฉด ์ ๋๋ค"๋ ์๋๋ฅผ ์ถฉ๋ถํ ๋๋ฌ๋ผ ์ ์์ง ์๋ ํ๋ ์๋ฌธ๋ ์์ต๋๋ค.
์ด๋ฐ ์ํฉ์์ ๋์ ๊ธฐ์ค์ ์ด๋ค ์์ผ๋ก ์ก์ผ์๋์ง ๊ถ๊ธํฉ๋๋ค!
There was a problem hiding this comment.
๊ฒ์์ด ์์ผ๋ฉด NotFoundException์ ๋ด๋ ๊ฒ๋ ์ผ๋ฐ์ ์ธ ์ํฉ์ผ ๊ฒ ๊ฐ์์!
์ ์ฒด์ ์ผ๋ก ์๋ํ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด -> ์๋ฌ๋ฉ์ธ์ง -> ์ด์ ์
๋ ฅ์ ์ฌ์๋ํ๋ ๊ตฌ์กฐ๋ก ์ก์ผ์ ๊ฒ ๊ฐ์์ ์ผ๋จ ํ์ฌ ๊ตฌ์กฐ๊ฐ ํต์ผ์ฑ์ด ์๋ค์!
์ ๋ต์ ์๋์ง๋ง ์ ๋ ๊ฒ์ ํ๋ฆ์ ์์ธ๋ก ๊ฐ์ ธ๊ฐ์ง ์์์, ์ด๋ฐ ๊ตฌ์กฐ๊ฐ ์๋ Optional์ ์ธ ๊ฒ ๊ฐ๊ณ ์ฉ~ Optional์ Exception์ ์กฐํํ ๊ฐ์ฒด๊ฐ ์๋๊ฒ ์ ์์ ์ธ ์ํฉ์ด๋ผ๋ฉด Optional์ ์ฐ๊ณ ์๋๊ฒ ๋ฌธ์ ๋ผ๋ฉด Exception์ ์๋๋ค!
jurlring
left a comment
There was a problem hiding this comment.
๋ ์ ์๋
ํ์ธ์!
์ง๋ฌธ ์ฃผ์ ๋ถ๋ถ์ ๋ํ ๋ต๋ณ๊ณผ ์ฝ๋ฉํธ ๋ช๊ฐ์ง ๋ฌ์๋์์ต๋๋ค.
์๊ฐ ๊ด์ฐฎ์ผ์ค ๋ ํ์ธํด์ฃผ์ธ์ :)
src/main/java/JanggiRunner.java
Outdated
|
|
||
| private void playGame(Game game) { | ||
| boolean isRunning = true; | ||
| gameRepository.saveBoard(game.getId(), game.getTurn(), game.getBoard()); |
There was a problem hiding this comment.
gameRepository๋ฅผ ์ปฌ๋ ์
๋ณ๋ก ๋๋๋ฉด ์ด๋จ๊น์?
gameRepository์ธ๋ฐ saveBoard๋ฅผ ํ๋ ๋ถ๋ถ์ด ์ด์ํ๊ณ ํ๋ผ๋ฏธํฐ๋ก ๊ฐ ์ํ๋ฅผ ๋ชจ๋ ๊บผ๋ด์ง๋ง๊ณ game์ ๋๊ธฐ๋ฉด ์๋๋์?
game์ ์ํ๊ฐ ๋์ด๋ ๊ฒฝ์ฐ ์ด ๋ถ๋ถ๋ ๊ฐ์ด ์์ ์ด ํ์ํ ๊ฑฐ์์ ๐ข
There was a problem hiding this comment.
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์์ ๊บผ๋ด๋ ๊ฒ ๋ณ๊ฒฝ ๋ฒ์์ ์ต์ํ ๊ด์ ์์ ์ ์ ํ๋ค๊ณ ์๊ฐํ์๋ ๊ฑธ๊น์?
There was a problem hiding this comment.
- ์ ๊ฐ ๋งํ ๊ฑด document ๊ตฌ์กฐ ๋ถ๋ฆฌ๊ฐ ์๋๋ผ, gameRepository์ gameRepository ์ ๊ตฌํ์ ์ฒด์ธ MongoDBRepository ํด๋์ค ์์ boards ์ปฌ๋ ์ ๊ด๋ จ ๋ก์ง๊ณผ counters ์ปฌ๋ ์ ๊ด๋ จ ๋ก์ง์ด ํจ๊ป ์๋๋ฐ, ์ด๊ฑธ BoardRepository์ CounterRepository์ฒ๋ผ ํด๋์ค ๋ ๋ฒจ๋ก ๋๋๋ ๊ฒ ์ด๋ป๋๋ ์๋ฏธ์์ด์. MongoDBRepository๊ฐ ๊ฐ์ง ์ฑ ์์ด ๋๋ฌด ํฌ๋ค๊ณ ๋๊ผ์ต๋๋ค.
- ๐
- ๋ค ์์ ์ ์ต์ํ ์ธก๋ฉด์์ ๋ง์๋๋ ธ์ด์ :)
| public class Soldier extends Piece { | ||
|
|
||
| private final List<List<Direction>> paths; | ||
| private final List<List<Direction>> PATHS; |
There was a problem hiding this comment.
์์๊ฐ ์๋๋ฐ ๋๋ฌธ์๋ก ์ฐ์ ์ด์ ๊ฐ ์๋์~?
There was a problem hiding this comment.
Soldier๋ ๋ค๋ฅธ ๊ธฐ๋ฌผ๋ค๊ณผ ๋ค๋ฅด๊ฒ ์ง์์ ๋ฐ๋ผ paths๊ฐ ๋ฌ๋ผ์ง๋ค ๋ณด๋ ์ธ์คํด์ค ๋ณ์๋ก ๊ด๋ฆฌํด์ผ ํ๋๋ฐ, ์๊ฐ์ ์ผ๋ก ์์๋ผ๊ณ ์ฐฉ๊ฐํด์ ๋๋ฌธ์๋ก ๋ณ๊ฒฝํ์ต๋๋ค. ๐ ์ปจ๋ฒค์ ์ ๋ง๊ฒ ์์ ํ์ต๋๋ค. ๊ผผ๊ผผํ ํ์ธ ๊ฐ์ฌํฉ๋๋ค!
| 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(); | ||
| } |
There was a problem hiding this comment.
getChoScore(), getHanScore() getter๊ฐ ์๊ณ , ํ๋๋ double choScore, double hanScore๋ก ๊ฐ๋ณ ์ํ์์.
์๊ตฌ์ฌํญ์ ๊ฒํฐ/์ธํฐ๋ฅผ ์ฐ์ง ์๋๋ค ๊ฐ ์๋๋ฐ, ํ์ฌ ScoreStatus๊ฐ getter๋ฅผ ์ธ๋ถ์ ๊ณต๊ฐํ๊ณ ์๋ค์..!
๋ํ reflect()๋ก ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฐ๋ณ ๊ฐ์ฒด์ธ๋ฐ, ์ ์ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ถ๋ณ์ผ๋ก ๋ง๋ค๋ฉด ์ด๋จ๊น์?
There was a problem hiding this comment.
๋ฆฌ๋ทฐ ๊ฐ์ฌํฉ๋๋ค! ๋ง์ํ์ ๋๋ก ๊ฐ๋ณ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ ์ํํด ๋ณด์ฌ์ ์์ ๋ถ๋ณ ๊ฐ์ฒด๋ก ๊ตฌ์กฐ๋ฅผ ๋ฐ๊ฟจ์ต๋๋ค. ๐
์ฐ์ reflect() ๋ฉ์๋ ๋์ ํฉํ ๋ฆฌ ๋ฉ์๋๋ฅผ ์จ์ ์์ฑํ ๋ ๊ณ์ฐ์ ๋๋ด๋๋ก ํ์ต๋๋ค. ๋ํ Getter๋ฅผ ์ง์ฐ๊ณ winner()์ฒ๋ผ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ก ๋ฐํํ๋ ํ์ ๊ธฐ๋ฐ ๋ฉ์๋๋ค์ ์ถ๊ฐํด๋ดค์ต๋๋ค!
src/main/java/JanggiRunner.java
Outdated
| while (true) { | ||
| try { | ||
| return selectGame(); | ||
| } catch (IllegalArgumentException e) { | ||
| consoleView.printErrorMessage(e.getMessage()); | ||
| } | ||
| } |
There was a problem hiding this comment.
์ ํด๋์ค์์ while(true) + try/catch ํจํด์ด ๋์ผํ๊ฒ ๋ฐ๋ณต๋๋ ๊ฒ์ผ๋ก ๋ณด์ด๋๋ฐ์~
์ค๋ณต์ ์์จ ๋ฐฉ๋ฒ์ ์์๊น์?
There was a problem hiding this comment.
readOption(), readSourcePosition(), readTargetPosition() ๋ฑ์์ ๋์ผํ ํจํด์ด 6๋ฒ ๋ฐ๋ณต๋๊ณ ์๋ ๊ฑธ ํ์ธํ์ต๋๋ค.
ํจํด์ด ๋ฐ๋ณต๋๋ค๊ณ ์๊ฐ์ ํ์ง๋ง, ์ ๊ฑฐํ ์๊ฐ์ ๋ชป ํ๋๋ฐ์. ์ฐพ์๋ณด๋ ๋๋ค๋ก ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ด ์์๋ค์! ๊ฐ์ฌํฉ๋๋ค!!
| private final MongoClient client; | ||
|
|
||
| public MongoDBRepository() { | ||
| this.client = MongoClients.create(URI); |
There was a problem hiding this comment.
์ค๊ณ ๋น์์๋ ํด๋น ๋ฏธ์ ์ด ๋จ์ผ ์ฌ์ฉ์ ํ๊ฒฝ์ด๊ณ , ๋ก์ปฌ DB๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก๊ทธ๋จ ์ข ๋ฃ ์ OS๊ฐ ๋ฆฌ์์ค๋ฅผ ํ์ํ๋ค๋ ์ , ๊ทธ๋ฆฌ๊ณ ์น ์๋ฒ๋ก์ ํ์ฅ ๊ณํ์ด ์๋ค๋ ์ ์ ๊ณ ๋ คํ์ฌ ๋ณ๋์ close ์ฝ๋๋ฅผ ์์ฑํ์ง ์์์ต๋๋ค.
ํ์ง๋ง ์ถ๊ฐ๋ก ๊ฒํ ํด ๋ณธ ๊ฒฐ๊ณผ, CLI ํ๊ฒฝ์์๋ ๋ฌธ์ ๊ฐ ์๋๋ผ๋ ํ ์คํธ ์ฝ๋ ์คํ ์ Repository ๊ฐ์ฒด๊ฐ ๋ฐ๋ณต ์์ฑ๋๋ฉฐ ์ปค๋ฅ์ ๋์๊ฐ ๋ฐ์ํ ์ ์๋ค๋ ์ ์ ๊นจ๋ฌ์์ต๋๋ค.
๋ฌด์๋ณด๋ค๋, ๋ฆฌ์์ค ํด์ ๋ฅผ ๋ช
์ํ๋ ๊ฒ์ด ์ฝ๋์ ์๋๋ฅผ ๋ช
ํํ ์ ๋ฌํ๋ ์ข์ ์ต๊ด์ด๋ผ ํ๋จ๋์ด
ํ๋ก๊ทธ๋จ ์ ์ ์ข
๋ฃ, ์์ธ ์ข
๋ฃ ์ ์ปค๋ฅ์
์ ๋ซ๋ ๋ก์ง์ ์ถ๊ฐํ๋๋ฐ,
ํน์ ์ ๊ฐ ๋์น ๋ถ๋ถ์ด ์๊ฑฐ๋ ๋ค๋ฅธ ์๋๋ก ์ง๋ฌธ ์ฃผ์ ๊ฑด์ง ๊ถ๊ธํฉ๋๋ค :)
| @@ -0,0 +1,70 @@ | |||
| package view; | |||
There was a problem hiding this comment.
์ ๋ 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)); |
There was a problem hiding this comment.
๊ฒ์์ด ์์ผ๋ฉด NotFoundException์ ๋ด๋ ๊ฒ๋ ์ผ๋ฐ์ ์ธ ์ํฉ์ผ ๊ฒ ๊ฐ์์!
์ ์ฒด์ ์ผ๋ก ์๋ํ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด -> ์๋ฌ๋ฉ์ธ์ง -> ์ด์ ์
๋ ฅ์ ์ฌ์๋ํ๋ ๊ตฌ์กฐ๋ก ์ก์ผ์ ๊ฒ ๊ฐ์์ ์ผ๋จ ํ์ฌ ๊ตฌ์กฐ๊ฐ ํต์ผ์ฑ์ด ์๋ค์!
์ ๋ต์ ์๋์ง๋ง ์ ๋ ๊ฒ์ ํ๋ฆ์ ์์ธ๋ก ๊ฐ์ ธ๊ฐ์ง ์์์, ์ด๋ฐ ๊ตฌ์กฐ๊ฐ ์๋ Optional์ ์ธ ๊ฒ ๊ฐ๊ณ ์ฉ~ Optional์ Exception์ ์กฐํํ ๊ฐ์ฒด๊ฐ ์๋๊ฒ ์ ์์ ์ธ ์ํฉ์ด๋ผ๋ฉด Optional์ ์ฐ๊ณ ์๋๊ฒ ๋ฌธ์ ๋ผ๋ฉด Exception์ ์๋๋ค!
| @@ -280,28 +296,30 @@ class GuardMove { | |||
| @DisplayName("์ฌ๊ฐ ํ ์นธ ์ด๋ํ๋ค.") | |||
There was a problem hiding this comment.
๋๊ฐ์ ์ผ๋ก ๊ฐ๋ ์ผ์ด์ค๋ ์๋ ๊ฒ ๊ฐ์์
There was a problem hiding this comment.
์ฐจ,ํฌ,์ฌ, ์ซ, ๋ณ ๋๊ฐ์ ์ด๋ ํ ์คํธ์ผ์ด์ค ์ถ๊ฐํ์ต๋๋ค!
| } | ||
|
|
||
| private boolean handleMoveResult(Game game, Turn turn, Piece captured) { | ||
| if (captured.isKing()) { |
There was a problem hiding this comment.
์ ์ผ์ด์ค๋ ํ ์คํธ๊ฐ ์๋์~?
There was a problem hiding this comment.
handleMoveResult()๋ private ๋ฉ์๋์ด๊ณ , consoleView, gameRepository์ ๋ฐ์ ํ๊ฒ ๊ฒฐํฉ๋์ด ์์ด ์ง์ ํ ์คํธ๊ฐ ์ด๋ ต๋ค๊ณ ์๊ฐํ์ต๋๋ค
๊ทธ๋์ Game ์์ผ๋ก ๋ฃ์๊น๋ ์๊ฐํด๋ดค์ง๋ง ConsoleView, GameRepository์ ์์กดํด์ผํ๋ค๋ ์ , ํ๋ฆ์ ์ด ๋ํ ๋ด๋นํ๋ Runner์ ํน์ฑ์ ํ ์์น์ ๋ฐฐ์นํ๋๊ฒ ์ฌ๋ฐ๋ฅด๋ค๊ณ ์๊ฐํ๋๋ฐ์, ์ด์ ๋ํด์ ์ด๋ป๊ฒ ์๊ฐํ์๋์ง ๊ถ๊ธํฉ๋๋ค!
There was a problem hiding this comment.
์ด ๊ณ ๋ฏผ ์์ฒด๊ฐ ์ฌ์ค ์ค๊ณ ์ ํธ์ผ ์ ์์ด์!
ํ
์คํธํ๊ธฐ ์ด๋ ต๋ค๋ ๊ฒ์ ์ข
์ข
ํด๋น ๋ก์ง์ด ์ธ๋ถ ์์กด์ฑ๊ณผ ๋๋ฌด ๊ฐํ๊ฒ ๊ฒฐํฉ๋์ด ์๋ค๋ ์๋ฏธ์ด๊ธฐ๋ ํ๊ฑฐ๋ ์.
captured.isKing()์ด๋ฉด ๊ฒ์ ์ข
๋ฃ๋ผ๋ ํ๋จ ์์ฒด๋ ์ฌ์ค Game์ด ์๊ณ ์์ด๋ ๋๋ ๊ฒ ์๋๊น์?
Game.isOver()๋ Game.isCapturedKing(captured) ํํ๋ก ํ๋จ์ Game์, ํ์ ์ฒ๋ฆฌ(DB ์ญ์ , ์ถ๋ ฅ)๋ Runner์ ๋๋ ๊ตฌ์กฐ๋ฅผ ์๊ฐํด๋ณด์
๋ ์ข์ ๊ฒ ๊ฐ์์ ~
|
|
||
| public class Palace { | ||
|
|
||
| private static final Palace INSTANCE = new Palace(); |
There was a problem hiding this comment.
๋ ์๊ฐ ๋ง์์ฃผ์ ๋๋ก ๋ถ๋ณ ๋ฐ์ดํฐ ์ฑ๊ธํค์ ์ผ๋ฐ์ ์ธ ์ฑ๊ธํค ํ
์คํธ ๋ฌธ์ ์์ ์์ ๋ก์ด ๊ฒ ๋ง์์!
ํ
์คํธ๊ฐ ์ด๋ ค์ด ์ผ์ด์ค๋ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒฝ์ฐ์ธ๋ฐ, ํ์ฌ๋ ๋ช
์์ ์ผ๋ก 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]; |
There was a problem hiding this comment.
์ถ๊ฐ๋ก ์ ๋ฒ ๋ฏธ์
๋ง์ง๋ง์ ๋จ๊ฒจ์ฃผ์
จ๋ ํค๊ฐ ์์ฑ๋ฐฉ์ x * 100 + y์ ํ์ฅ์ฑ, ์์ ํจ์ ๋ํ ํ๋จ, ์๋์ ๋ฌ์ ๋ํ ๋ฌธ์ ๋ฅผ ๊ณ ๋ฏผํด๋ดค์ต๋๋ค.
๊ณ ๋ฏผ ๊ฒฐ๊ณผ 2์ฐจ์ ๋ฐฐ์ด์ ์ฌ์ฉํ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค. ์ฅ์ ์ ์๋์ ๊ฐ์ต๋๋ค.
- 2์ฐจ์ ์ขํ -> 2์ฐจ์ ๋ฐฐ์ด๋ก ์๋๊ฐ ๋ช ํํ๋ค
- ๋ฐฐ์ด ํฌ๊ธฐ๊ฐ MAX_X + 1, MAX_Y + 1๋ก ์ ์ธ๋์ด ๋ฒ์๊ฐ ๋ช ์์ ์ผ๋ก ๋๋ฌ๋๋ค
- ํค ๊ณ์ฐ์ด ์๊ธฐ๋๋ฌธ์ ์ถ๋ก ์ด ๋ถํ์ํ๋ค
๊ณ ๋ฏผ ๊ณผ์ ์์ ์ธ๋ฑ์ค 0์ด ๋ญ๋น๋๋ค๋ ์ ์ ๊ณ ๋ฏผํ๊ธด ํ์ง๋ง, ์ฌ์ํ ๋ถ๋ถ์ด๋ผ ์๊ฐํ์ฌ ์ด๋๋ก ์งํํ์ต๋๋ค!!
jurlring
left a comment
There was a problem hiding this comment.
๋ ์ ์๋
ํ์ธ์~
์ง๋ฌธ์ ๋ํ ๋ต๋ณ๊ณผ ์ฝ๋ฉํธ ๋ช๊ฐ์ง ๋ฌ์๋์์ต๋๋ค~!
์๊ฐ ๊ด์ฐฎ์ผ์ค ๋ ํ์ธํด์ฃผ์ธ์ :)
|
|
||
| import java.util.Map; | ||
|
|
||
| public class GameStatus { |
There was a problem hiding this comment.
์๊ตฌ์ฌํญ์ getter/setter ์ฌ์ฉ ๊ธ์ง๊ฐ ์๋๋ฐ, GameStatus ๊ด๋ จํด์๋ ์ด๋ป๊ฒ ์๊ฐํ์๋์? GameStatus๊ฐ ์ง์ Game์ ๋ง๋ค์ด ๋ฐํํ๋ ๋ฐฉ์์ ์ด๋จ๊น์ ~?
| return move(game, turn); | ||
| } | ||
|
|
||
| private boolean move(Game game, Turn turn) { |
There was a problem hiding this comment.
์ด๋ ์คํจ ํ ๊ฐ์ ํด์์ ๋ค์ ์ด๋์ ์๋ํ๊ฒ ํ๊ณ ์ถ๋ค๋ฉด ์ด๋ป๊ฒ ๋ฌ๋ผ์ ธ์ผ ํ ๊น์ ~?
| @@ -0,0 +1,9 @@ | |||
| package constant; | |||
|
|
|||
| public class BoardConstant { | |||
There was a problem hiding this comment.
์์๋ง ๋ด๋ ํด๋์ค์ธ๋ฐ private ์์ฑ์๊ฐ ์๋ค์!
์ธ๋ถ์์ new BoardConstant()๊ฐ ๊ฐ๋ฅํ ์ํ์ธ๋ฐ, ์ด๋ฐ ์ ํธ์ฑ ์์ ํด๋์ค๋ ์ธ์คํด์คํ๋ฅผ ๋ง์ผ๋ฉด ์ด๋์?
| return retryOnError(consoleView::readOption); | ||
| } | ||
|
|
||
| private void playGame(Game game) { |
There was a problem hiding this comment.
์ ๊ฒ์์ ์์ฑํ ๋๋ createNewGame()์์ ๋ณด๋ ์ํ๋ฅผ ์ถ๋ ฅํ์ง๋ง, ์ ์ฅ์ playGame()์์ ์ด๋ฃจ์ด์ง๊ณ ์๋ค์.
์ ๊ฒ์ ์์ฑ โ ๋ฐ๋ก ์ ์ฅ์ด ์๋๋ผ ๊ฒ์ ๋ฃจํ ์ง์
ํ ์ ์ฅ๋๋ ํ๋ฆ์ด ์์ฐ์ค๋ฌ์ด์ง, ์๋๋ฉด createNewGame() ์์์ ์ ์ฅํ๋ ํธ์ด ๋ ์์ง๋๊ฐ ๋์์ง์ ๋ํด์ ์ด๋ป๊ฒ ์๊ฐํ์๋์?
| } | ||
|
|
||
| private boolean handleMoveResult(Game game, Turn turn, Piece captured) { | ||
| if (captured.isKing()) { |
There was a problem hiding this comment.
์ด ๊ณ ๋ฏผ ์์ฒด๊ฐ ์ฌ์ค ์ค๊ณ ์ ํธ์ผ ์ ์์ด์!
ํ
์คํธํ๊ธฐ ์ด๋ ต๋ค๋ ๊ฒ์ ์ข
์ข
ํด๋น ๋ก์ง์ด ์ธ๋ถ ์์กด์ฑ๊ณผ ๋๋ฌด ๊ฐํ๊ฒ ๊ฒฐํฉ๋์ด ์๋ค๋ ์๋ฏธ์ด๊ธฐ๋ ํ๊ฑฐ๋ ์.
captured.isKing()์ด๋ฉด ๊ฒ์ ์ข
๋ฃ๋ผ๋ ํ๋จ ์์ฒด๋ ์ฌ์ค Game์ด ์๊ณ ์์ด๋ ๋๋ ๊ฒ ์๋๊น์?
Game.isOver()๋ Game.isCapturedKing(captured) ํํ๋ก ํ๋จ์ Game์, ํ์ ์ฒ๋ฆฌ(DB ์ญ์ , ์ถ๋ ฅ)๋ Runner์ ๋๋ ๊ตฌ์กฐ๋ฅผ ์๊ฐํด๋ณด์
๋ ์ข์ ๊ฒ ๊ฐ์์ ~
src/main/java/JanggiRunner.java
Outdated
|
|
||
| private void playGame(Game game) { | ||
| boolean isRunning = true; | ||
| gameRepository.saveBoard(game.getId(), game.getTurn(), game.getBoard()); |
There was a problem hiding this comment.
- ์ ๊ฐ ๋งํ ๊ฑด document ๊ตฌ์กฐ ๋ถ๋ฆฌ๊ฐ ์๋๋ผ, gameRepository์ gameRepository ์ ๊ตฌํ์ ์ฒด์ธ MongoDBRepository ํด๋์ค ์์ boards ์ปฌ๋ ์ ๊ด๋ จ ๋ก์ง๊ณผ counters ์ปฌ๋ ์ ๊ด๋ จ ๋ก์ง์ด ํจ๊ป ์๋๋ฐ, ์ด๊ฑธ BoardRepository์ CounterRepository์ฒ๋ผ ํด๋์ค ๋ ๋ฒจ๋ก ๋๋๋ ๊ฒ ์ด๋ป๋๋ ์๋ฏธ์์ด์. MongoDBRepository๊ฐ ๊ฐ์ง ์ฑ ์์ด ๋๋ฌด ํฌ๋ค๊ณ ๋๊ผ์ต๋๋ค.
- ๐
- ๋ค ์์ ์ ์ต์ํ ์ธก๋ฉด์์ ๋ง์๋๋ ธ์ด์ :)
|
|
||
| public class MongoDBRepository implements GameRepository { | ||
|
|
||
| private static final String URI = "mongodb://localhost:27017"; |
There was a problem hiding this comment.
NoSQL ์ข
๋ฅ๋ณ๋ก ์ง์ ์กฐ์ฌํ๊ณ ๋น๊ตํด์ ์ ํํ์ ๊ณผ์ ์ด ์ธ์ ๊น์์ด์! ๐
๋ค๋ง MongoDB๋ ํธ๋์ญ์
์ ์ง์ํ๊ณ ์์ด์ ACID ์ ๋ฌด๊ฐ ์ ํ์ ๊ทผ๊ฑฐ๊ฐ ๋๊ธด ์ด๋ ค์ธ ๊ฒ ๊ฐ์์! https://www.mongodb.com/ko-kr/docs/manual/core/transactions/
์ฅ๊ธฐํ ์ ์ฒด ์ํ๋ฅผ ํ๋์ ๋ํ๋จผํธ๋ก ์ ์ฅํ๋ ๊ตฌ์กฐ ์์ฒด๋ MongoDB๋ ์ ๋ง์์ ์ ํ ์์ฒด๋ ์์ฐ์ค๋ฝ๋ค๊ณ ์๊ฐํด์ ~
์ฒดํฌ ๋ฆฌ์คํธ
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์ ์กฐ์ธ์ ๋ฐ์๊ฐ๋ฉฐ ๊ฒจ์ฐ ๊ตฌํ์ ์๋ฃํ ์ ์์์ต๋๋ค. ๊ตฌํ์ ํ์ง๋ง, "์ฒ์๋ถํฐ ์ด ์ค๊ณ๋ฅผ ์ค์ค๋ก ๋ ์ฌ๋ฆด ์ ์์์๊น?" ํ๋ ์์ฌ์๊ณผ ์ค์ค๋ก์ ํ์ผ๋ก ํด๋ธ ๊ฒ ์๋๋ค ๋ณด๋, ์ฑ์ฅํ๊ธด ํ ๊ฑธ๊น? ๊ฐ์ ๊ณ ๋ฏผ์ด ๋จ์ต๋๋ค.
์ด๋ฐ ์ค๊ณ ์ญ๋์ ๊ฒฐ๊ตญ ์ ๋์ ์ธ ๊ฒฝํ์น๊ฐ ์์ฌ์ผ๋ง ์์ฐ์ค๋ฝ๊ฒ ๋์ด๋๋ ์์ญ์ธ์ง ๊ถ๊ธํฉ๋๋ค ๐ฅฒ