[๐ ์ฌ์ดํด2 - ๋ฏธ์ (๊ธฐ๋ฌผ ํ์ฅ + DB ์ ์ฉ)] ๋ผํ ๋ฏธ์ ์ ์ถํฉ๋๋ค.#328
[๐ ์ฌ์ดํด2 - ๋ฏธ์
(๊ธฐ๋ฌผ ํ์ฅ + DB ์ ์ฉ)] ๋ผํ
๋ฏธ์
์ ์ถํฉ๋๋ค.#328bin1225 wants to merge 53 commits intowoowacourse:bin1225from
Conversation
- isSame() ๋ฉ์๋๋ฅผ ์ถ๊ฐ - PoCollisionDetector ๋ด ๊ธฐ๋ฌผ์ด ํฌ์ธ์ง ํ์ธํ๋ ๋ก์ง์์ isSame์ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝ
- ๋ณด๋์์ Piece๋ฅผ Intersection ์ผ๋ก ๊ฐ์ธ๊ณ , ๊ฐ ์์น์ ๋ํ ์ ๋ณด๋ฅผ ์ถ๊ฐ - Vector : ๋ฐฉํฅ ๋ฐ ๊ฑฐ๋ฆฌ - isPalace ๋ฅผ ์ถ๊ฐํ์ฌ ๊ถ์ฑ ์ฌ๋ถ ์ ์ฅ - PalaceIntersectionInitializer๋ฅผ ์ฌ์ฉํ์ฌ ์ฅ๊ธฐํ ์ด๊ธฐํ ์ ๊ฐ Location์ ๋ํ Intersection ์ ๋ณด๋ฅผ ์ด๊ธฐํ
- ์ง์ ์ด๋ ๊ธฐ๋ฌผ (๊ถ,์ฌ,์ฐจ,ํฌ,๋ณ) ์ด Intersection ๊ธฐ๋ฐ์ผ๋ก ์๋ํ๋ StraightRouteProvider๋ฅผ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝ - ๊ธฐ์กด GungSeongRouteProvider ๊ตฌํ์ฒด ์ญ์ - ๋ณ์ ๊ฒฝ์ฐ ๊ฒฝ๋ก๊ฐ ๋ค๋ก ์ด๋ํ๋์ง ๊ฒ์ฆ - ๊ฐ ๊ธฐ๋ฌผ์ด ์ต๋ ์ด๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ , ๊ฒฝ๋ก ๊ธธ์ด์ ๋น๊ตํ์ฌ ์ด๋๊ฐ๋ฅํ์ง ํ์ธ
- ํธ์ถ๋ถ์์ !isEmpty()๋ก ๋น์ด์์ง ์์์ ํ์ธํ๋ ๋ถ๋ถ์ isNotEmpty() ๋ฉ์๋๋ก ๋์ฒด
- Intersection ์ด๊ธฐํ ์ธ๋ฑ์ค๊ฐ view ์ถ๋ ฅ ๋ฒํธ ๊ธฐ์ค์ผ๋ก ๋์ด ์๋ ๋ถ๋ถ์ ์๋ฃ๊ตฌ์กฐ ๊ธฐ์ค์ผ๋ก ๋ณ๊ฒฝ
- Board.move ํธ์ถ ์ ๋์ฐฉ์ง์ ์๋ ๊ธฐ๋ฌผ์ ๋ฐํํ๋ค. - ๋ฐํ๋ฐ์ ๊ธฐ๋ฌผ์ GameContext.update ๋ฉ์๋์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ์ฌ ์ํ๋ฅผ ์ ๋ฐ์ดํธํ๋ค.
- PieceType์ ๊ธฐ๋ฌผ๋ณ ์ ์ ์์ฑ ๋ฐ ์กฐํ ๋ก์ง ๊ตฌํ - ์ง์๋ณ ์ต์ข ์ ์(๊ธฐ๋ณธ ์ ์ + ๋จ์ ๊ธฐ๋ฌผ ์ ์) ํฉ์ฐ ๊ธฐ๋ฅ ์ถ๊ฐ - ์ ์ง์ ์ ์๊ฐ ๊ธฐ์ค์น(30์ ) ์ดํ์ผ ๋, ๊ณ ๋์ ์ง์ ์น๋ฆฌ ์ฒ๋ฆฌ
- ConnectionProvider ๋ฅผ ์ฌ์ฉํ์ฌ DB ์ปค๋ฅ์ ์ ์ป๊ณ ์ฌ์ฉ
- Board, Piece ํ ์ด๋ธ์ด ์กด์ฌํ์ง ์์ผ๋ฉด ์์ฑ
- TransactionManager ๋ฅผ ์ฌ์ฉํ์ฌ ํธ๋์ญ์ ์ ๊ด๋ฆฌํ๋ค. - being() : ์์ ์คํ ์ ์คํ - getConnection() : ์์ ์งํ ๊ณผ์ ์์ ๋์ผ ์ปค๋ฅ์ ์กฐํ - commit() : ์์ ์๋ฃ ํ ์คํ - close() : ์ปค๋ฅ์ ์ ๋ฆฌ
- ์ ๊ท ๊ฒ์ ์ ๋ณด ์ ์ฅ ๋ก์ง ์ถ๊ฐ - ์งํ ์ค์ธ ๊ฒ์(isActive=true) ๋ชฉ๋ก ์กฐํ ๋ก์ง ์ถ๊ฐ - ํน์ ๊ฒ์์ ์งํ ์ํ(isActive) ๊ฐฑ์ ๋ก์ง ์ถ๊ฐ
- ๊ธฐ๋ฌผ ์ ์ฅ ๋ก์ง ์ถ๊ฐ - ๊ฒ์ id ๋ฅผ ํตํ ๊ธฐ๋ฌผ ๋ชฉ๋ก ์กฐํ ๋ก์ง ์ถ๊ฐ - ๊ธฐ๋ฌผ ์์น(row_idx, col_idx) ๋ณ๊ฒฝ ๋ก์ง ์ถ๊ฐ - ๊ธฐ๋ฌผ ์ญ์ ๋ก์ง ์ถ๊ฐ
- Piece ๋๋ฉ์ธ ์ด๋ฆ๊ณผ ์ค๋ณต๋๋ ๊ฒ์ ๊ตฌ๋ถํ๊ธฐ ์ํด PieceEntity๋ก ๋ณ๊ฒฝ
- ์งํ์ค์ธ ๊ฒ์์ด ์๋ ๊ฒฝ์ฐ ๊ฒ์ ์ ๋ณด๋ฅผ DB์์ ์กฐํ ํ ์งํ - ์งํ์ค์ธ ๊ฒ์์ด ์๋ ๊ฒฝ์ฐ ์๋ก์ด ๊ฒ์ ์์ฑ ํ ์ ์ฅ - PieceEntityMapper ๋ฅผ ์ถ๊ฐํ์ฌ Entity ๋ฅผ ๋๋ฉ์ธ์ผ๋ก ๋ณํํ๋ ๋ก์ง ์ถ๊ฐ - GameInformation DTO ์ถ๊ฐ - DB ์กฐํ ์ ๋ณด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ณด๋๋ฅผ ์์ฑํ๊ธฐ ์ํ DBArrangementStrategy ๋ฐฐ์น ์ ๋ต ํด๋์ค ์ถ๊ฐ
- y : ์ด์ด์ ์งํ - n : ์๋ก์ด ๊ฒ์ ์์ฑ
- sevice -> service
| public record Vector( | ||
| Direction direction, | ||
| int distance | ||
| ) { |
There was a problem hiding this comment.
ํ์ฌ๋ ์ฐจ, ํฌ ๊ฐ์ ์ง์ ์ด๋ ๊ธฐ๋ฌผ์ด ๋๊ฐ์ ์ด๋ ์ ๊ถ์ฑ์ ๋ฒ์ด๋ ์ ์๋ ์ํ์ด์ง๋ง, ๋ง์ฝ ๋ฒ์ด๋ ์ ์๊ฒ ๋๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ ๋ คํด์ ํ์ฌ์ ๊ฐ์ ๊ตฌ์กฐ๋ฅผ ์ ํํ์ต๋๋ค.
- ๊ถ์ฑ ๋ด์์ ์ด๋ํ๋ ๊ท์น์ ์๋ก ๋ง๋ค๊ณ , ํ์ฌ ์์น๊ฐ ๊ถ์ฑ์ผ ๋ ํด๋น ๊ท์น์ ์ฌ์ฉํ๊ฒ ๋ง๋๋ ๊ฒ๋ณด๋ค ์ง๊ธ์ฒ๋ผ ๊ฒฉ์์ ์ด ๋ฐฉํฅ๊ณผ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ์ง๋ ๊ฒ์ด ๋ณํ์ ์ ์ฐํ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
| public class Board { | ||
|
|
||
| private final Map<Location, Piece> boardState; | ||
| private final Map<Location, Intersection> boardState; |
There was a problem hiding this comment.
Board์์ Map์ value๊ฐ์ผ๋ก Piece ๋ฅผ ๊ฐ์ง๋ ๊ฒ์ Intersection์ผ๋ก ๊ฐ์ธ์ ๊ฐ์ง๋๋ก ํ์ต๋๋ค.
์ด๋ ๊ฒ ๊ตฌ์กฐ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒฐ๊ตญ Intersection ์ ์๋ Piece, Location์ ์ฌ์ฉํ๊ธฐ ์ํด์ ๋ชจ๋ getter๋ฅผ ์ ์ํ๊ฒ ๋์ต๋๋ค.
Intersection์ ๊ฒฉ์์ ๋ด ์ ๋ณด๋ฅผ ๋ชจ์๋๋ ๋ฐ๊ตฌ๋๊ฐ์ ์กด์ฌ๋ก ์๊ฐํ๋ฉด ์ ์ ํ๋ค๊ณ ์๊ฐ๋๋๋ฐ, ๊ฐ์ฒด์งํฅ์ ์์น ์ค ํ๋์ ํด๋น ๊ฐ์ฒด์๊ฒ ์์ํ๋ผ๋ ์ธก๋ฉด์์๋ ์ ์ ํ์ง ์์ ๊ฒ ๊ฐ๋ค๊ณ ๋ ์๊ฐ๋ฉ๋๋ค.
ํน์ ์์ฝ์ ์๊ฒฌ์ด ์๋ค๋ฉด ๊ณต์ ํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค!
| import java.util.List; | ||
| import java.util.Map; | ||
|
|
||
| public class InProgress implements GameState { |
There was a problem hiding this comment.
ํ์ฌ ์งํ์ค์ธ ๊ฒ์์ ์ ์์ ์ฐจ๋ก๋ฅผ ๊ฐ์ง๋ ์ํ์
๋๋ค.
๊ธฐ๋ฌผ ์ด๋์ ๋์ฐฉ์ง์ ์๋ ๊ธฐ๋ฌผ์ board.move()๋ฉ์๋์์ ๋ฐํํ๋๋ก ํ์๊ณ , ํด๋น ๋ฐํ๊ฐ์ GameState.update()์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํฉ๋๋ค.
์ญ์ ๋ ๊ธฐ๋ฌผ์ ๊ธฐ์ค์ผ๋ก ๊ฒ์ ์ ์๋ฅผ ์ ๋ฐ์ดํธ ํ๊ณ , ๊ถ์ด ์กํ๋์ง ํ์ธํ๋ ๋ฑ ๊ฒ์ ์ข ๋ฃ ์ฌ๋ถ๋ฅผ ํ๋จํ๋๋ก ๊ตฌํํ์ต๋๋ค.
| public record GameInformation( | ||
| Long gameId, | ||
| Board board, | ||
| Side currentSide | ||
| ) { | ||
| } |
There was a problem hiding this comment.
์ปจํธ๋กค๋ฌ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํ DTO์ ๋๋ค.
|
|
||
| public class TransactionManager { | ||
|
|
||
| private final ThreadLocal<Connection> connectionHolder = new ThreadLocal<>(); |
There was a problem hiding this comment.
Service ๊ณ์ธต์์ ํธ๋์ญ์ ์ ์์ํ๊ณ , ํด๋น ์ปค๋ฅ์ ์ DAO์ ๋ฉ์๋๋ง๋ค ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ์ง ์๊ณ ์ฌ์ฉํ๊ธฐ ์ํด์ TreadLocal์ ํ์ฉํ์ต๋๋ค.
|
|
||
| public class Gung extends ActivePiece { | ||
|
|
||
| private static final int MAX_MOVE_DISTANCE = 1; |
There was a problem hiding this comment.
๊ฐ ์ง์ ์ด๋ ๊ธฐ๋ฌผ์ด ์์ ์ด ์ด๋ ๊ฐ๋ฅํ ์ต๋ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ์ง๋๋ก ํ์์ต๋๋ค.
RouteProvider๋ฅผ ํตํด ๋ฐ์ ๊ฒฝ๋ก๊ฐ ์ด๋ ๊ฐ๋ฅ ๊ฑฐ๋ฆฌ๋ณด๋ค ๊ธธ๋ค๋ฉด, ์ด๋ํ ์ ์๋ค๊ณ ํ๋จํฉ๋๋ค.
| import janggi.domain.piece.Piece; | ||
| import java.util.Map; | ||
|
|
||
| public class DBArrangementStrategy implements ArrangementStrategy { |
There was a problem hiding this comment.
๊ธฐ์กด ๋ณด๋ ์์ฑ ๋ก์ง์ ๊ทธ๋๋ก ํ์ฉํ๊ธฐ ์ํด DB์์ ์กฐํํ ๋ฐ์ดํฐ๋ฅผ Map<Location, Piece> ๊ตฌ์กฐ๋ก ๋ณํํ๊ณ , DBArrangementStrategy ์ฌ์ฉํ์ฌ Board๋ฅผ ์ด๊ธฐํํ๋๋ก ๊ตฌํํ์ต๋๋ค.
- ๋ถํ์ํ ์ฃผ์ ์ญ์ - PieceViewResolver ์์ List<piece> ๋ฅผ ๋ฐ์์ ์ฒ๋ฆฌํด์ฃผ๋ ์ ํธ ๋ฉ์๋ ์ถ๊ฐ - process ๋ด๋ถ ๋ก์ง์ ๋ฉ์๋๋ก ๋ถ๋ฆฌ
- ResultSet์ผ๋ก๋ถํฐ ๋ฐ์ ์ ๋ณด๋ฅผ ์ํฐํฐ์ ๋งคํํ๊ธฐ ์ํด RowMapper ํจ์ํ ์ธํฐํ์ด์ค ์ถ๊ฐ - ์กฐํ, ์์ , ์ถ๊ฐ ์ ๋ํด์ ์ ๋ค๋ฆญ ๋ฉ์๋๋ฅผ ์ ์ํ์ฌ Dao์์ ์ฌ์ฉ - ์ฟผ๋ฆฌ ๋งค๊ฐ๋ณ์์ ํ์ํ ๊ฐ๋ค์ Object ๋ฐฐ์ด์ ์์๋๋ก ๋ด์์ ๋ฉ์๋ ํธ์ถ
echo724
left a comment
There was a problem hiding this comment.
์๋
ํ์ธ์ ๋ผํ
!
์ด๋ฒ ์ฌ์ดํด๋ ๊น๋ํ๊ฒ ์ ํด์ฃผ์
จ๋ค์! DB ์ฌ์ฉ์ด ์ด๋ ต๋ค๊ณ ํ์ ๊ฒ์ ๋นํด์ ์๊ฐ๋ณด๋ค ํธ๋์ ์
๋ ๊น๋ํ๊ฒ ์ ์ฒ๋ฆฌํด์ฃผ์
จ๊ณ ๊ณต์ฑ ๋ถ๋ถ๋ Intersection ํ์ฉํ์
์ ์ ํด๊ฒฐ ํ์ ๊ฒ ๊ฐ์ต๋๋ค! ๋ณ๊ฒฝ ์ฌํญ๋ ๋ณด๋ ๊ฒฉ์์ ์ ์ํ ๋ณ๊ฒฝ์ ์ ์ธํ๊ณ ๋ ํฌ๊ฒ ๊ตฌ์กฐ๊ฐ ๋ฐ๋ ๊ฒ ๊ฐ์ง์๊ตฌ์! ๋ฑ๋ด๋ ๋ฏธ์
์์ฒด๊ฐ ์ด๋ ค์ ์ ๊ฒ ๊ฐ์๋ฐ ๊ณ ์ ๋ง์์ต๋๋ค! ใ
์ผ๋จ ๋ฏธ์ ๊น๋ํ๊ฒ ์ ์ง์ ๊ฒ ๊ฐ์์ ํฌ๋ฆฌํฐ์ปฌํ ํผ๋๋ฐฑ์ ๋ฐ๋ก ์์ ๊ฒ ๊ฐ๊ตฌ์, ๋ค๋ง ๊ณ ๋ฏผํด๋ณผ๋งํ ๋ถ๋ถ, ์ถ๊ฐ๋ก ํ์ตํด๋ณด๋ฉด ์ข์ ๋ถ๋ถ๋ค ์ปค๋ฉํธ๋ก ๋จ๊ฒผ์ต๋๋ค ํ์ธํด๋ณด์๋ฉด ์ข์ ๊ฒ ๊ฐ์์. ์ถ๊ฐ๋ก PR ์ค๋ช ์ ๋จ๊ธฐ์ ์ง๋ฌธ ๋ต ๋๋ฆฌ๋ฉด:
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๋ฐ์ดํธ ๊ตฌ์กฐ
- ์ผ๋จ ๋ผํ ์ด ์ด๋ฏธ ๊ฐ๊ณ ์๋ ๊ณ ๋ฏผ์ฒ๋ผ ํ์ฌ ์ ๊ฐ ๋๋ผ๊ธฐ๋ก๋ ๋น์ง๋์ค ๋ก์ง์ ๋ด๋นํ๋ ๋๋ฉ์ธ๊ณผ ์์ํ๋ฅผ ์ํ ์ํฐํฐ๊ฐ ๋๋ฌด ๋ฐ๋ก ๋ ธ๋ ๋๋์ด ๋ค์์ต๋๋ค. ์ธ๋ฉ๋ชจ๋ฆฌ ์ํ๋ก ์์ง์์ ํ์ธ ํ ๋ค์์ ์์ง์์ด ์ฑ๊ณตํ๋ฉด ๊ฒ์ ์ํ์ ์ปค๋ฐ์ ํ๋๋ผ๊ตฌ์. ํด๋น ๊ตฌ์กฐ๊ฐ ์๋ฌด๋๋ DB์ถ๊ฐ ์๊ตฌ์ฌํญ์ ๋ง์ถฐ์ ์ค๊ณ๊ฐ ๊ทธ๋ ๊ฒ ์งํ๋ ๊ฒ ๊ฐ์์. ๋ง์ํ์ ๋๋ก ํด๋น ๋ก์ง์ด ๋์ ๊ฒ?์ ์๋์ง๋ง ๊ทธ๋๋ ์ฅ์ ์ฒ๋ฆฌ ๋ถ๋ถ๊ณผ ๋๋ฉ์ธ ๊ฒฐํฉ๋๋ก ๋ดค์๋๋ ๋ง์ด ๋จ์ด์ง๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ค ์ ๋ณด๊ฐ ์ง์ค์์ธ์ง (DB์ ์๋ ํผ์ค ์ ๋ณด๊ฐ ์ง์ค์ธ์ง, ์๋๋ฉด ์ธ๋ฉ๋ชจ๋ฆฌ์์ ์ ๋ณด๊ฐ ์ง์ค์ธ์ง), ์ฅ์ ๋ฌ์ ๊ฒฝ์ฐ์ DB์ ์ธ๋ฉ๋ชจ๋ฆฌ ์ํ ์ฐจ์ด๋ ์ด๋ป๊ฒ ๋ ์ ์์ผ๋ฉฐ ์ด๋ป๊ฒ ํด๊ฒฐํ ์ ์์์ง ๋ฑ ํ์ฌ ๊ตฌ์กฐ๋ก ๋ถํฐ ์ค๋ ๋ฌธ์ ์ ๋ค์ ํ ๋ฒ ๊ณ ๋ฏผํด๋ณด์๋ฉด ๋์์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค.|
- ํ
์คํธ ์ฝ๋
๋ง์ฐฌ๊ฐ์ง๋ก ํ์ฌ DB๊ฐ ์ถ๊ฐ๋๋ฉด์ ํ ์คํธ ๋ฒ์๋ ๋ฐฉ์์ ๋ํ ๊ณ ๋ฏผ์ด ์ข ์๊ธฐ์ จ์ ๊ฒ ๊ฐ์์. ๋ ๊ฐ์ง ํค์๋๋ก ์ถ๊ฐ ํ์ต ํด๋ณด์๋ฉด ๋์์ด ๋ ๊ฒ ๊ฐ์๋ฐ 1. ๊ด์ฌ์ฌ ๋ถ๋ฆฌ: TransactionManager์ฒ๋ผ ๋น์ง๋์ค ๋ก์ง๊ณผ ์ธํ๋ผ๋ ํธ๋์ ์ ์ ์ํ ๋ก์ง์ ๋ถ๋ฆฌํด๋์ จ๋๋ฐ, ํ ์คํธ๋ ๊ทธ์ ๋ฐ๋ผ ๊ฐ๊ฐ์ ๊ด์ฌ์ฌ๋ฅผ ์ ๋๋ก ํ ์คํธ ํด์ฃผ๋ฉด ์ข์ ๊ฒ ๊ฐ์ต๋๋ค. (์ด๋ฏธ ์ ํด๋์ ๊ฒ ๊ฐ์ง๋ง์) 2. ํ ์คํธ ํ๊ฒฝ ๋ถ๋ฆฌ: ํ์ฌ ํ๋ก๋์ ํ๊ฒฝ์ด ๋ฐ๋ก ์๊ธฐ ๋๋ฌธ์ In-memory db๋ก๋ง ํ ์คํธ์ ์ค์ ํ๋ก๊ทธ๋จ ํ๊ฒฝ ๋ชจ๋ ๋์ผํ๊ฒ ํด๋์ จ๋๋ผ๊ตฌ์. ์ด ๋ถ๋ถ ๋ฏธ์ ์์ ์ด์ง ๋ฒ์ด๋ ์ ์์ง๋ง ๊ฐ๋จํ๊ฒ ์ด๋ป๊ฒ ํ๋ฉด ํ ์คํธ ํ๊ฒฝ๊ณผ ํ๋ก๋์ ํ๊ฒฝ์ ๋ถ๋ฆฌํ ์ ์์๊น ๊ณ ๋ฏผํด๋ณด์๋ฉด ์ข์ ๊ฒ ๊ฐ์์.
์ด์ ๋๊ฐ ๋ต์ด ๋ ๊ฒ ๊ฐ์ต๋๋ค! ์ปค๋ฉํธ ๊ณ ๋ฏผํด๋ณด์๊ณ ๋ฆฌ๋ทฐ ์์ฒญ ๋ค์ ์ฃผ์ธ์. ํ์ดํ ์ ๋๋ค!
| private <T> T executeInTransaction(Supplier<T> action) { | ||
| boolean isNewTransaction = transactionManager.isNotActive(); | ||
| if (isNewTransaction) { | ||
| transactionManager.begin(); | ||
| } | ||
| try { | ||
| T result = action.get(); | ||
| if (isNewTransaction) { | ||
| transactionManager.commit(); | ||
| } | ||
| return result; | ||
| } catch (RuntimeException e) { | ||
| if (isNewTransaction) { | ||
| transactionManager.rollback(); | ||
| } | ||
| throw e; | ||
| } finally { | ||
| if (isNewTransaction) { | ||
| transactionManager.close(); | ||
| } | ||
| } | ||
| } |
There was a problem hiding this comment.
DB ์ฌ์ฉ์ด ์ด๋ ต๋ค ํ์ ๊ฒ ์น๊ณ ๋ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ(ํธ๋์ ์ ์ ํธ๋์ ์ ๋งค๋์ ๊ฐ ๋น์ง๋์ค/๋๋ฉ์ธ ๋ก์ง์ ๋๋ฉ์ธ์ด๋ ์๋น์ค๊ฐ)๋ฅผ ๋งค์ฐ ๊น๋ํ๊ฒ ์ ํ์ จ์ต๋๋ค?! ํน์ ์ ์ ์ฌ์ฉํ์ จ๊ฑฐ๋ ๋ฐ๋ก ๊ฒฝํ์ด ์์ผ์ ๊ฐ์?
There was a problem hiding this comment.
๋ค๋ง, ํ์ธํด๋ณด๋ executeInTransaction ๋ฉ์๋๋ค ๋ชจ๋ transactionManager์ public ๋ฉ์๋๋ก ๋ง๋ค๊ณ ๋๋จธ์ง isNotActive, commit, rollback, close ๋ฉ์๋๋ค ๋ด๋ถ ์ ๊ทผ์๋ก ๋ฐ๊ฟ ์ ์์ ๊ฒ ๊ฐ์๋ฐ ์ด๋ป๊ฒ ์๊ฐํ์ธ์? ๋ฑํ ๋ฉ์๋์์ ๋ค๋ฅธ ๊ฐ์ฒด๋ฅผ ์์กดํ์ง ์์์ transactionManager๋ก ๋ฃ์ด๋ ์ข์ ๊ฒ ๊ฐ์ต๋๋ค. ์๋ฏธ์์ผ๋ก๋ DefaultJanggiService๋ณด๋จ transactionManager๊ฐ ๋ด๋นํ๋๊ฒ ๋์ ๊ฒ ๊ฐ์์์!
There was a problem hiding this comment.
DB ์ฌ์ฉ์ด ์ด๋ ต๋ค ํ์ ๊ฒ ์น๊ณ ๋ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ(ํธ๋์ ์ ์ ํธ๋์ ์ ๋งค๋์ ๊ฐ ๋น์ง๋์ค/๋๋ฉ์ธ ๋ก์ง์ ๋๋ฉ์ธ์ด๋ ์๋น์ค๊ฐ)๋ฅผ ๋งค์ฐ ๊น๋ํ๊ฒ ์ ํ์ จ์ต๋๋ค?! ํน์ ์ ์ ์ฌ์ฉํ์ จ๊ฑฐ๋ ๋ฐ๋ก ๊ฒฝํ์ด ์์ผ์ ๊ฐ์?
๋๊ทธ๋ฝ๊ฒ ํ๊ฐํด์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค ใ
ใ
์คํ๋ง ํ๋ ์์ํฌ์์ @Transactional ์ด๋
ธํ
์ด์
์ผ๋ก ์๋น์ค ๋ ์ด์ด์์ ํธ๋์ญ์
๊ด๋ฆฌ๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฑธ๋ก ์๊ณ ์์๊ณ , ๊ทธ๋ ๊ฒ ํ๋ ๊ฒ์ด ์ฑ
์ ๋ถ๋ฆฌ ๊ด์ ์์ ์ณ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
๊ตฌํ์ ai๋ฅผ ๋ง์ด ์ฐธ๊ณ ํ์ต๋๋ค..
๋ค๋ง, ํ์ธํด๋ณด๋ executeInTransaction ๋ฉ์๋๋ค ๋ชจ๋ transactionManager์ public ๋ฉ์๋๋ก ๋ง๋ค๊ณ ๋๋จธ์ง isNotActive, commit, rollback, close ๋ฉ์๋๋ค ๋ด๋ถ ์ ๊ทผ์๋ก ๋ฐ๊ฟ ์ ์์ ๊ฒ ๊ฐ์๋ฐ ์ด๋ป๊ฒ ์๊ฐํ์ธ์?
์์ฝ ์๊ฒฌ์ ๋์ํฉ๋๋ค.
ํธ๋์ญ์
์ ์คํ ํ๋ฆ ๊ด๋ฆฌ๋ transactionManager์์ ์ํํ๋ ๊ฒ์ด ์ณ์ ๊ฒ ๊ฐ์ต๋๋ค. ๋ Service ๊ณ์ธต ๊ตฌํ์ฒด๊ฐ ์ถ๊ฐ๋๋ ๊ฒฝ์ฐ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค๋ ๋ฉด์์๋ ์ด๋ ์ํค๋ ๊ฒ์ด ์ ๋ต์ด๋ผ๊ณ ์๊ฐํด์.
commit, rollback ๊ณผ ๊ฐ์ ๋ฉ์๋๋ ๋
ธ์ถ์์ผ๋๋ ๊ฒ์ด ๋ฐ๋์งํด๋ณด์ด์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋์์ ์ฌ๋ฌ ๋ก์ง์ด ์คํ๋ ๋ (์ด๋ฏธ ์ด๋ฐ ๋ถ๋ถ์์ ๋ฌธ์ ๊ฐ ๋๋ ์ง์ ์ด 100๊ฐ์ง ์ ๋ ๋ ๊ฒ ๊ฐ์ง๋ง์), ํด๋น ๋ฉ์๋๋ค์ด ํธ์ถ๋๋ ๊ฒฝ์ฐ ์์ํ์ง ๋ชปํ ๋์์ด ๋ฐ์ํ ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
๊ฒฐ๋ก
TransactionManager๋ด๋ถ๋กexecuteInTransaction()๋ฉ์๋๋ฅผ ์ด๋ ์์ผฐ์ต๋๋ค.- ํ
์คํธ ์ฝ๋์์ ๋๋ฏธ ๋ฐ์ดํฐ๋ฅผ ์ด๊ธฐํํ์ฌ ํ
์คํธ๊ฐ ์ข
์์ฑ์ ์์ ๊ธฐ ์ํด
begin,rollback,close๋ฉ์๋๋ฅผ@BeforeEach,@AfterEach์์ ํธ์ถํ๋๋ฐ, ์ด ๋ก์ง์ ์ ์งํ๊ธฐ ์ํด์TransactionManger๋ฅผ ์ธํฐํ์ด์คํ ํ๊ณ , ํ ์คํธ์์๋TestTransactionManager๋ฅผ ์ฌ์ฉํ๋๋ก ํ์ต๋๋ค. ์ฌ์ค ์ด๋ ๊ฒ ๊ตฌํํ ๊ฒ ์ ์ ํ์ง ํ์ ์ด ์์ง ์๋ ๊ฒ ๊ฐ๋ค์..
| Long gameId = gameInformation.gameId(); | ||
| Board board = gameInformation.board(); | ||
| Piece removedPiece = board.move(from, to); | ||
|
|
||
| Optional<PieceEntity> fromPiece = pieceDao.findByGameIdAndLocation(gameId, from); | ||
| Optional<PieceEntity> toPiece = pieceDao.findByGameIdAndLocation(gameId, to); | ||
| fromPiece.ifPresent(pieceEntity -> pieceDao.updatePosition(pieceEntity.getId(), to)); | ||
| toPiece.ifPresent(pieceEntity -> pieceDao.deleteById(pieceEntity.getId())); | ||
|
|
||
| gameContext.update(removedPiece); | ||
| if(gameContext.isInProgress()) { | ||
| gameDao.updateTurn(gameId, gameContext.getCurrentSide().name()); | ||
| } |
There was a problem hiding this comment.
์ฅ๊ธฐ๋ง ์ฎ๊ธฐ๊ธฐ -> ์ฎ๊ธด ์ฅ๊ธฐ๋ง ์
๋ฐ์ดํธ -> ๊ฐ์์ํ ์
๋ฐ์ดํธ ์ด๋ฐ ์์ผ๋ก ์งํํ๋ ๊ฑธ๋ก ๋ณด์ด๋ค์? ์ผ๋จ์ ๊น๋ํ๊ฒ ๋ก์ง์ด ์ ๋ณด์ด๊ธด ํ๋๋ฐ ๋ช ๊ฐ์ง ๊ณ ๋ฏผํ์ค ๋ถ๋ถ์ด ์์ด ๋ณด์ด๋ค์! ๋ง์ฝ ์ธ๋ฉ๋ชจ๋ฆฌ ์(์์ํ ์ ์ธํ ๋ถ๋ถ)์์๋ ์ฑ๊ณต์ ์ผ๋ก ์งํ์ด ๋๋๋ฐ, pieceDao์์ ํผ์ค๋ฅผ ์ฐพ๊ฑฐ๋ ์
๋ฐ์ดํธ ํ๋ ๊ณผ์ ์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น์? Timeout์ด ๋ฐ์ํ ์ ๋ ์๊ณ , ์ปค๋ฅ์
์ ๋ฌธ์ ๊ฐ ์๊ฒผ์ ์ ๋ ์๊ตฌ์. ๋ค์ํ ์ด์ ๋ก ๋น์ง๋์ค ๋ก์ง์ด ์์ํ๊ฐ ์๋ ์ ์๋๋ฐ ์ด๋ฐ ์ฅ์ ์ํฉ ๋ฑ์ ์ด๋ป๊ฒ ๋๋นํ ์ ์์๊น์? ๋ํ ๋ง์ฝ ์ธ๋ฉ๋ชจ๋ฆฌ ์์์๋ ๋ณด๋(๊ต์ฐจ์ )์ ํด๋น ํผ์ค๊ฐ ์๋๋ฐ, pieceDao์์๋ ๋ชป์ฐพ๋ ๊ฒฝ์ฐ๋ ์์๊น์? ์ด๋ ๊ฒ ์ํฐํฐ์ ๋๋ฉ์ธ ๊ฐ์ฒด๊ฐ ๋ถ๋ฆฌ๋์์ ๊ฒฝ์ฐ์๋ ๊ฒ์ฆํด์ค์ผํ ๋ถ๋ถ๋ค์ด ์์ต๋๋ค. ์ด ๋ถ๋ถ 1. ํ์ฌ ๊ตฌ์กฐ๊ฐ ์ฅ์ ์ํฉ ํน์ ์ํ ๋ถ์ผ์น ์ํฉ์ ๊ด์ฐฎ์์ง 2. ์๋๋ผ๋ฉด ์ด๋ค ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ ์ ์์์ง -> ๋๋ฉ์ธ ์ํฐํฐ๋ก ์ค๊ณ ๋ณ๊ฒฝ? ํน์ ์ฌ์๋? ๋ฑ๋ฑ ๊ณ ๋ฏผํด๋ณด์๊ณ ์ ์ฉํด๋ณด์๊ฑฐ๋ ์ปค๋ฉํธ๋ก ์๋ ค์ฃผ์๋ฉด ์ข๊ฒ ๋ค์!
There was a problem hiding this comment.
๋จผ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ จ ์์ธ๊ฐ ๋ฐ์ํ์ ๋๋ ์ฌ์๋ ๋ก์ง์ ํฌํจ๋๋๋ก JanggiException์ ์์๋ฐ์ ์ปค์คํ
์์ธ๋ฅผ ์ ์ํ๊ณ ์ ์ฉํ์ต๋๋ค.
-
๋ฐ์ดํฐ ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๊ด๋ จ ๋ฌธ์ ๋ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃ์ํค๋ ๊ฒ๋ณด๋ค๋ ์ฌ์ฉ์์๊ฒ ์๋ฆฌ๊ณ , ๋ค์ ์ฌ์๋ ํ ์ ์๋๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ด ์ข๋ค๊ณ ์๊ฐํ์ต๋๋ค.
-
ํ๋ก๊ทธ๋จ ์์ ์์ฒด๊ฐ ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ, ์ฆ ์์ ์์ ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ฉํ ์ ์๋ ๊ฒฝ์ฐ๋ ๋ฐ๋ก ์ฌ์๋ ๋ก์ง ์์ด ์คํ์ด ์คํจํ๋ ๊ตฌ์กฐ์ ๋๋ค.
์ด๋ ๊ฒ ์์ ํ๋ ์์ฝ๊ฐ ๋ง์ํ์ ๋๋ก ๋ถ์ผ์น ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ํ์ธํ์ต๋๋ค.
์๋ ์ฝ๋์ ๊ฐ์ด ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๋ณด๋๋ฅผ ์ ๋ฐ์ดํธ ํ ํ ์์ธ๋ฅผ ๋ฐ์์ํค๋ ๊ฒฝ์ฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ๋ฅผ ๋กค๋ฐฑ์ด ๋์ง๋ง, ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ ๋กค๋ฐฑ ๋์ง ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ์ DB ๋ฐ์ดํฐ์ ์ผ๊ด์ฑ์ด ๊นจ์ง๋๋ค.
transactionManager.executeInTransaction(() -> {
Long gameId = gameInformation.getGameId();
Board board = gameInformation.getBoard();
Piece removedPiece = board.move(from, to);
Optional<PieceEntity> fromPiece = pieceDao.findByGameIdAndLocation(gameId, from);
Optional<PieceEntity> toPiece = pieceDao.findByGameIdAndLocation(gameId, to);
fromPiece.ifPresent(pieceEntity -> pieceDao.updatePosition(pieceEntity.getId(), to));
toPiece.ifPresent(pieceEntity -> pieceDao.deleteById(pieceEntity.getId()));
gameInformation.update(removedPiece);
if (gameInformation.isInProgress()) {
gameDao.updateTurn(gameId, gameInformation.getCurrentSide().name());
throw new JanggiException("์์๋ก ์์ธ ๋ฐ์!");
}
});๋ ์ด ๊ฒฝ์ฐ ์ฌ์๋ ๋ก์ง์ด ์คํ๋๊ธฐ ๋๋ฌธ์ view ๋ ๋ฒจ์์ ์บ์ฑํด๋ ๋ณด๋๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
public class ApplicationView {
private final Output outputWriter;
private final Input inputReader;
private List<List<String>> lastBoard;
private String lastSide;๊ฒฐ๊ณผ์ ์ผ๋ก ์ฌ์ฉ์ ์ ์ฅ์์๋ ์ ๋๋ก ์๋ํ์ง ์๋ ํ๋ก๊ทธ๋จ์ ๊ฒฝํํ๊ฒ ๋๋ ๊ฒ์ ํ์ธํ์ต๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์๊ฐํด๋ดค์ ๋,
- DB ๋จผ์ ์ ๋ฐ์ดํธ ํ ์ฑ๊ณต ์ ๋ฉ๋ชจ๋ฆฌ ์ ๋ฐ์ดํธ
- ๋ณด๋๋ฅผ ๋ฉ๋ชจ๋ฆฌ์์ ์ ์งํ์ง ์๊ณ ํญ์ DB์์ ์กฐํ
์ง๊ธ ์ํฉ์์๋ 1๋ฒ ๋ฐฉ์์ด ๊ฐ์ฅ ๊ฐํธํ๊ฒ ์ ์ฉํ ์ ์๋ ๋ฐฉ๋ฒ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ํ์ง๋ง ์ด ๋ถ๋ถ์ ์ฝ๋ ์์ฑํ๋ ๊ณผ์ ์์ ๊ฐ๋ฐ์๊ฐ ๋งค๋ฒ ์ ๊ฒฝ์จ์ผ ํ๋ค๋ ์ ์์ ๋ฌธ์ ์ธ ๊ฒ ๊ฐ์ต๋๋ค. ๋ ๋ก์ง์ด ๋ณต์กํด์ง๋ ๊ฒฝ์ฐ ์๋ฒฝํ ํต์ ๊ฐ ๋ถ๊ฐ๋ฅ ํ๋ค์.
2๋ฒ ๋ฐฉ์์ ์ ์ฉํ๊ธฐ ์ํด์๋ ์คํค๋ง, DAO ๋ก์ง์ ๋ง์ ์์ ์ด ํ์ํ ๊ฒ ๊ฐ์ต๋๋ค.
- ๋ณด๋ ์์ฑ ์ ๊ถ์ฑ ์์น ์ด๊ธฐํ ์ ๋ต๋ ์ง์ ์ด ํ์ํ๊ธฐ ๋๋ฌธ์, ํด๋น ์ ๋ต์ ๋ํ ์ ๋ณด๋ DB์ ์ ์ฅ ํ์ํฉ๋๋ค.
- ๋๋ฉ์ธ ๋ก์ง์ ํ์ํ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋งค๋ฒ DB์์ ์กฐํํด์ ์ฌ์ฉํ๊ณ ์ถ๋ ฅํด์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค.
๊ฒฐ๋ก
DB ๊ด๋ จ ์์ธ ๋ฐ์ ์, ์ด๊ธฐ ๋ก๋ฉ ์์ ์ด ์๋๋ผ๋ฉด ์ฌ์๋ ๋ก์ง์ด ์ ์ฉ๋๋๋ก ์ปค์คํ ์์ธ ๋์ ํ์์ต๋๋ค.
์ฅ์ ๋ฐ์ ์ ๋ฉ๋ชจ๋ฆฌ์ DB์ ๋๊ธฐํ๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด, DB ๊ด๋ จ ๋ก์ง์ ์ํํ๊ณ ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฐ์ดํธ ํ๋๋ก ํ์์ต๋๋ค.
์๋ฒฝํ์ง ์์ ์ํ์ด๊ณ ๋ฉ๋ชจ๋ฆฌ ์์์ ๋ฐ์ดํฐ๋ฅผ ์ ์งํจ์ผ๋ก์จ ์ป๋ ์กฐํ ๋น์ฉ ๊ฐ์์ ์ด์ ๋ณด๋ค ๋ฐ์ดํฐ ๋๊ธฐํ ๊ด๋ จํด์ ์์ ์ฑ์ด ๋จ์ด์ง๋ ๊ฒ์ด ๋ ํฌ๋ค๊ณ ์๊ฐ๋ฉ๋๋ค.
๋ ํ์ฌ GameInformation DTO๊ฐ ๊ฐ์ฒด๋ฅผ ๋ด๋ถ์ ์ผ๋ก ๊ฐ์ง๊ณ controller์ service ๊ณ์ธต์ ์๋ค ๊ฐ๋ค ํ๋ ๊ฒ๋ ๋ฉ๋ชจ๋ฆฌ ๋ด๋ถ์์ ์ ๋ณด๋ฅผ ์ ์งํ๊ธฐ ๋๋ฌธ์ด๋ผ๊ณ ์๊ฐ๋ฉ๋๋ค.
์๋ฒฝํ๊ฒ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋งค ๋ก์ง๋ง๋ค ํ์ํ ์ ๋ณด๋ฅผ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์กฐํํ๋ ๊ฒ์ด ์ ์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ตฌ์กฐ ๋ณ๊ฒฝ์ด ๋ง์ด ํ์ํ ๊ฒ ๊ฐ์์ ์กฐ๊ธ ๋ ๊ณ ๋ฏผํด๋ณผ ์๊ฐ์ด ํ์ํ ๊ฒ ๊ฐ์ต๋๋ค.
๋๋ฌด ์ข์ ๋ฆฌ๋ทฐ ๊ฐ์ฌ๋๋ฆฝ๋๋ค!
| ); | ||
| } | ||
|
|
||
| private enum PalaceConfiguration { |
There was a problem hiding this comment.
์บฌ ๊ณต์ฑ ์ง๊ธฐ ์ฝ์ง ์์๋ฐ ๊ทธ๋๋ ์ ํํํด๋ด์ จ๋ค์ ๐
| GameInformation gameInformation = initializeGameInformation(); | ||
| Board board = gameInformation.board(); | ||
|
|
||
| GameContext gameContext = GameContext.createInProgress(board.getAlivePieces(), gameInformation.currentSide()); | ||
| while (gameContext.isInProgress()) { | ||
| printBoard(board); | ||
| view.respondCurrentSide(SideViewResolver.toDisplayName(gameContext.getCurrentSide())); | ||
| retryAction(() -> playTurn(gameInformation, gameContext)); | ||
| } | ||
| finish(gameContext, gameInformation); |
There was a problem hiding this comment.
์ ์๊ฐ์ ๋๋ค๋ง, ํ์ฌ GameInformation, GameContext ์์ฑ ์์ , ์ฌ์ฉ๋๋ ์์น ์ ๋ถ ๋น์ทํ๊ฒ ์ฌ์ฉ๋๊ณ ์๋๋ฐ ์ด ๋ถ๋ถ ํฉ์น๋๊ฑฐ ๊ณ ๋ คํด๋ด๋ ์ข์ ๊ฒ ๊ฐ์์. ํ์ชฝ์ด DTO์ด๊ธด ํ์ง๋ง ๊ฒฐ๊ตญ์ ๋์ด ๊ฐ์ ๋ผ์ดํ์ฌ์ดํด๋ก ๊ฐ์ด ์์ง์ธ๋ค๋ฉด ์ถฉ๋ถํ ๊ฐ์ ๊ฐ์ฒด์ ๋ฌ๋ ๋์ง ์์๊น ์๊ฐํฉ๋๋ค.
There was a problem hiding this comment.
์์ฝ๊ฐ ๋งํ์ ๋๋ก ์์ฑ ์์ ๋ ๋์ผํ๊ณ , Service ๊ณ์ธต ๋ฉ์๋ ํธ์ถ ์์๋ GameContext์ GameInformation์ด ํจ๊ป ์ ๋ฌ๋๋ ๊ตฌ์กฐ์ธ ๊ฒ์ ํ์ธํ์ต๋๋ค.
๊ทธ๋์ GameInformation์ GameContext ํ๋๋ฅผ ์ถ๊ฐํ์ต๋๋ค.
์ด๋ ๊ฒ ์์ ํ๋ ์๋ก์ด ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํ์ต๋๋ค.
GameInformation์ DTO ๋ชฉ์ ์ผ๋ก ์ ์ํ๋๋ฐ, ๋ด๋ถ์ GameContext, Board ์ ๊ฐ์ ๊ฐ์ฒด๋ฅผ ๊ฐ์ง๊ฒ ๋๋, DTO์ธ์ง ๋๋ฉ์ธ์ธ์ง ๊ฒฝ๊ณ๊ฐ ๋ชจํธํด์ง๋ค๊ณ ๋๋๋๋ค.
๋จ์ getter๋ก ๊ฐ์ฒด๋ฅผ ์ ๊ณตํ๊ณ DTO๋ก์จ ์ญํ ์ ๋ช ํํ ํ๋ฉด ๋๋ฏธํฐ์ ๋ฒ์น์ ์๋ฐํ๊ณ ํธ์ถ๋ถ์์ ๋ค์๊ณผ ๊ฐ์ ํํ๋ก ํธ์ถ์ด ํ์ํฉ๋๋ค.
gameInformation.getGameContext().update();๊ทธ๋์ ํ์ฌ๋ GameInformation ๋ด๋ถ์ gameContext๋ฅผ ํธ์ถํด์ฃผ๋ ์๋น ๋ฉ์๋๋ฅผ ๋์์ต๋๋ค.
public void update(Piece removedPiece) {
gameContext.update(removedPiece);
}
ํ์ง๋ง ์ด ๊ตฌ์กฐ๋ DTO๊ฐ ๋๋ฉ์ธ์ฒ๋ผ ํ๋ํ๊ธฐ์ DTO๋ฅผ ์ ์ํ๋ ๋ชฉํ๊ฐ ์ฌ๋ผ์ง๊ณ ์ปจํธ๋กค๋ฌ์ ์๋น์ค๊ฐ ๊ฒฐ๊ตญ ๊ฒฐํฉ๋๋ค๊ณ ์๊ฐ๋ฉ๋๋ค.
๊ฒฐ๋ก
์๋ ๊ตฌ์กฐ ์ค๊ณ๊ฐ ์๋ชป๋์๋ ์๊ฐ์ด ๋๋ ์ํ์
๋๋ค.
๋งค ํด๋ง๋ค ๋ณด๋ ์ ๋ณด๋ฅผ ์กฐํํ๋ ๋น์ฉ์ ์๋ผ๊ณ ์ ๋ฉ๋ชจ๋ฆฌ์์ ๋ณด๋, ๊ฒ์ ํด ์ํ๋ฅผ ์ ์งํ๊ณ ์
๋ฐ์ดํธ ์ฟผ๋ฆฌ๋ง ํธ์ถํ๋๋ก ํ์์ต๋๋ค. ์ด๋ฌํ ๊ตฌ์กฐ๋๋ฌธ์ Controller์ Service๊ฐ ๋๋ฉ์ธ ๊ฐ์ฒด๋ฅผ ์ฃผ๊ณ ๋ฐ๊ฒ๋๊ณ , ๊ทธ๋์ DTO์ ๊ฐ์ฒด๊ฐ ๊ทธ๋๋ก ๋ค์ด๊ฐ๋ฉฐ ์ญํ ์ด ๋ชจํธํด์ง๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ด ๋ถ๋ถ์ ๋ํด์ ์ง๊ธ ๋ ์ค๋ฅด๋ ๋ฐฉ๋ฒ์ ๋ค์ ๋๊ฐ์ง์ ๋๋ค.
- ์กฐํ ๋น์ฉ์ ์๋ผ๊ธฐ ์ํด์ Service ๊ณ์ธต์์ ๋ณด๋ ๋ฐ ํด ์ ๋ณด๋ฅผ ํ๋๋ก ๊ฐ์ง๊ณ ์บ์ฑํด์ ์ฌ์ฉํ๋ค.
- ๋งค ์คํ ์๋ง๋ค DB์์ ๋ณด๋ ์ ๋ณด๋ฅผ ์กฐํํ๋ค.
๋จ์ผ ํธ์คํธ์์ ์คํ๋๋ ์ง๊ธ ๊ตฌ์กฐ๋ผ๋ฉด 1๋ฒ๋ ๋ฌธ์ ๊ฐ ๋์ง ์์ ๊ฒ ๊ฐ์๋ฐ,
์์ฝ๊ฐ ๋ณด์๊ธฐ์๋ ์ด๋ค ๋ฐฉํฅ์ด ๋ ์ ์ ํด๋ณด์ด์๋์?
| @Override | ||
| public List<Location> calculateRoute(Location from, Location to) { | ||
|
|
||
| protected List<Location> resolveRoute(Intersection from, Intersection to) { |
There was a problem hiding this comment.
resolveRoute๋ผ๋ ์ด๋ฆ์ด ์ดํด๊ฐ ์ ์๋๋๋ฐ์, calculate์์ ๋ณ๊ฒฝํ์ ์ด์ ๊ฐ ๋ฐ๋ก ์์๊น์?
There was a problem hiding this comment.
๊ธฐ๋ฌผ ๊ฒฝ๋ก ๊ณ์ฐ์์ ์ค๋ณต๋๋ ์์ธ ์ฒ๋ฆฌ ๋ก์ง์ ์ ๊ฑฐํ๊ธฐ ์ํด ํ ํ๋ฆฟ ๋ฉ์๋ ํจํด์ ์ ์ฉํ์ต๋๋ค!
๊ธฐ์กด์๋ ๊ธฐ๋ฌผ์ ์ด๋ ๊ฒฝ๋ก ๊ณ์ฐ ๊ณผ์ ์์ ์์ธ ๋ฐ์ ์ ๊ธฐ๋ฌผ์ด ๋ฌด์์ธ์ง ์ ๋ณด๋ฅผ ์ฃผ๊ธฐ ์ํด ๊ธฐ์กด ์ฝ๋์์ ๋ค์๊ณผ ๊ฐ์ด ์์ธ๋ฅผ ์ก์์ ๊ตฌ์ฒดํํ์ต๋๋ค.
@Override
public List<Location> calculateRoute(Location from, Location to) {
try {
return ROUTE_PROVIDER.calculateRoute(from, to);
} catch (RouteResolveException e) {
throw new RouteResolveException(pieceType, from, to);
}
}์ด๋ ๊ฒ try-catch๋ก ๊ฐ์ธ๋ ๋ก์ง์ด ๋ชจ๋ ๊ธฐ๋ฌผ์ ์ค๋ณต๋๋ค๊ณ ์๊ฐ๋์ด์ ํ
ํ๋ฆฟ ๋ฉ์๋ ํจํด์ ์ ์ฉํด๋ณด์์ต๋๋ค.
์ค์ ์ด๋ ๊ฐ๋ฅํ ๊ธฐ๋ฌผ์ ๋ถ๋ชจ์ธ ActivePiece ์ ๋ค์๊ณผ ๊ฐ์ด ์ ์ํ์ฌ ์์ธ ์ฒ๋ฆฌ๋ฅผ ๊ณตํต ์ฒ๋ฆฌํ๊ณ , ์์ ํด๋์ค์์ resolveRoute() ๋ฅผ ๊ตฌํํ๋๋ก ๊ฐ์ ํ์ต๋๋ค.
@Override
public final List<Location> calculateRoute(Intersection from, Intersection to) {
try {
return resolveRoute(from, to);
} catch (RouteResolveException e) {
throw new RouteResolveException(pieceType, from.getLocation(), to.getLocation());
}
}
protected abstract List<Location> resolveRoute(Intersection from, Intersection to);์ฌ์ค ์ด ๋ถ๋ถ ๊ด๋ จํด์๋ ์ ์ ํ ์ฝ๋์ธ์ง ํ์ ์ด ์์ง ์์ต๋๋ค.
์ฝ๋๋ฅผ ๋ณด๋ ์
์ฅ์์ Piece ์ธํฐํ์ด์ค์ calculateRoute๊ฐ ์์ ํด๋์ค์ ๊ตฌํ์ด ๋์ด ์์ง ์๊ธฐ ๋๋ฌธ์ ์ง์ ๋ถ๋ชจ ํด๋์ค๋ฅผ ํ์ธํ๋ฉด์ ์๋์ ์ดํดํ ํ์๊ฐ ์๋ค๋ ์ ์ด ๋ฌธ์ ๊ฐ ๋๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ฐ๋๋ก ๋ถ๋ชจ ํด๋์ค์์ ์์ธ ์ฒ๋ฆฌ ํ ํ๋ฆฟ ๋ฉ์๋๋ฅผ protected๋ก ์ ๊ณตํ ์ ์์ง๋ง, ์ด ๊ฒฝ์ฐ์๋ ์์ ํด๋์ค๋ฅผ ๊ตฌํํ ๋ ํด๋น ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ ๊ฒ์ ๋ํด์ ์ ์ ์๊ธฐ ๋๋ฌธ์, ๊ตฌํ์ ์ผ๊ด์ฑ์ด ๊นจ์ง ์ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
// ๋ถ๋ชจ ํด๋์ค (ActivePiece)
protected List<Location> calculateWithExceptionHandling(Intersection from, Intersection to, Supplier<List<Location>> routeSupplier) {
try {
return routeSupplier.get(); // ์์ ํด๋์ค์์ ์ ๋ฌํ ๋๋ค(์ค์ ๊ณ์ฐ ๋ก์ง) ์คํ
} catch (RouteResolveException e) {
// ๊ณตํต ์์ธ ์ฒ๋ฆฌ ๋ฐ ๊ตฌ์ฒดํ
throw new RouteResolveException(pieceType, from.getLocation(), to.getLocation());
}
}
// ์์ ํด๋์ค (์: Cha, Sang ๋ฑ)
@Override
public List<Location> calculateRoute(Intersection from, Intersection to) {
// ๋ถ๋ชจ์ protected ๋ฉ์๋๋ฅผ ๋ช
์์ ์ผ๋ก ํธ์ถํ๋ฉฐ ๋๋ค๋ก ์ค์ ๋ก์ง ์ ๋ฌ
return calculateWithExceptionHandling(from, to, () -> {
return ROUTE_PROVIDER.calculateRoute(from, to);
});
}ํน์ ์์ฝ๊ฐ ๋ณด์๊ธฐ์ ์ ์ ํ์ง ์๋ค๊ณ ํ๋จ๋์๋ฉด ์๊ฒฌ ๊ณต์ ๋ถํ๋๋ฆฝ๋๋ค :)
- ๋ผ์ดํ ์ฌ์ดํด์ด ๊ฐ์ ๋ ๊ฐ์ฒด๋ฅผ ํตํฉํ์ฌ ๊ฐ๋ ์ฑ ๋ฐ ์ฌ์ฉ์ฑ ๊ฐ์
- begin, commit, rollback ๋ฉ์๋ ์ ๊ทผ์ ์ด์๋ฅผ private๋ก ์์ - TransactionManager ๋ฅผ ์ธํฐํ์ด์ค๋ก ์ ์ํ๊ณ , Test์ ์ฉ TransactionManger๋ begin, rollback, close๋ฅผ ํ ์คํธ ๋ผ์ดํ์ฌ์ดํด์ ๋ฐ๋ผ ํธ์ถํ๋๋ก ๊ตฌํ
- transaction, connection ํจํค์ง ์ถ๊ฐ
โฆnsaction ํ์ธ ๋ก์ง ์ ๊ฑฐ - ํ ์คํธ์ฉ TransactionManager๋ฅผ ์ ์ํ๊ณ ์ฌ์ฉํจ์ ๋ฐ๋ผ ํ๋ก๋์ ์ฉ TransactionManger ์์ ๋ถํ์ํ ๋ก์ง ์ ๊ฑฐ
|
์์ฝ ์๋
ํ์ธ์ ๐ต |
์๋ ํ์ธ์ ์์ฝ.
์ฌ์ดํด 2 ๋ฆฌ๋ทฐ๋ ์ ๋ถํ๋๋ฆฝ๋๋ค!
๋ณ๊ฒฝ ๋ฐ ์ถ๊ฐ ์ฌํญ ๊ด๋ จํด์ ๊ฐ์์ ๊ฐ๋จํ ์ฝ๋ฉํธ ๋จ๊น๋๋ค. ๋ฆฌ๋ทฐ ๊ณผ์ ์์ ์ฐธ๊ณ ํด์ฃผ์ธ์:)
๋ณ๊ฒฝ ๋ฐ ์ถ๊ฐ ๊ฐ์
๋ฐ์ดํฐ๋ฒ ์ด์ค ์คํค๋ง ๊ตฌ์กฐ
โsrc/main/resources/schema.sqlโ
๊ธฐ๋ฌผ ์ด๋ ๊ท์น
๊ถ์ฑ ๋ด ๋๊ฐ์ ์ด๋์ ๋ํด์ "์ง์ ์ด๋ ๊ธฐ๋ฌผ์ ๊ฒฝ์ฐ ๊ฒฉ์์ ์ ๋๊ฐ์ ์ด ์์ผ๋ฉด ํด๋น ๋ฐฉํฅ์ผ๋ก ์ด๋๊ฐ๋ฅํ๋ค" ๋ผ๊ณ ํด์ํ์ต๋๋ค.
๊ทธ๋์ ๊ฒฉ์์ ์ ์๋ฏธํ๋
Intersection๊ฐ์ฒด๋ฅผ ์ถ๊ฐํ๊ณ ์ด๋ ๊ฐ๋ฅํ ๋ฐฉํฅ๊ณผ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ์ง๋Vector๋ฆฌ์คํธ๋ฅผ ๊ฐ์ง๋๋ก ๊ตฌํํ์ต๋๋ค.์ง์ ์ด๋ ๊ธฐ๋ฌผ(๊ถ,์ฌ,์ฐจ,ํฌ,์กธ)์ด ๊ณตํต์ ์ผ๋ก
StraightRouteProvider๋ฅผ ์ฌ์ฉํด์ ๊ฒฝ๋ก๋ฅผ ์ฐพ๊ณ , ๊ฐ ๊ธฐ๋ฌผ์ ํน์ง์ ์ํ ์ถ๊ฐ ๊ฒ์ฆ์ ๊ธฐ๋ฌผ ๋ด์์ ์งํํ๋๋ก ํ์์ต๋๋ค.๊ฒ์ ์ข ๋ฃ ๊ท์น
๊ฒ์ ์งํ ์ํ์ ์ํํจํด์ ๋์ ํด๋ณด์์ต๋๋ค.
domain/state์งํ์ค์ธ ์ํ์์ ์ข ๋ฃ ๊ธฐ์ค์ ๋ฐ๋ผ์ ์ข ๋ฃ ์ํ๋ก ์ค์ค๋ก ๋ณ๊ฒฝ๋๋ ๊ฒ์ด ์์ฐ์ค๋ฝ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
๋ ํ์ฌ๋ ๊ถ๊ณผ ๊ถ์ด ๋ง์ฃผ์น ์ํ์์ 1ํด์ด ์ง๋๋ ๊ฒฝ์ฐ ๋ฌด์น๋ถ ์ฒ๋ฆฌ๋๋ ๊ธฐ๋ฅ์ด ์กด์ฌํ์ง ์์ง๋ง, ์ถํ ๊ทธ๋ฌํ ๊ธฐ๋ฅ๋ค์ด ์ถ๊ฐ๋๋ ๊ฒฝ์ฐ์๋ ์ํ ํจํด์ด ์ ์ฉ๋์ด ์๋ค๋ฉด ๋ณ๊ฒฝ์ด ์ฉ์ดํ ๊ฒ ๊ฐ๋ค๊ณ ๋ ์๊ฐํ์ฌ ์ ์ฉํ์ต๋๋ค.
DB ์ ์ฉ
์งํ์ค์ธ ๊ฒ์์ด ์กด์ฌํ๋ค๋ฉด ๊ฒ์์ ์ด์ด์ ์งํํ๊ฑฐ๋, ์๋ก์ด ๊ฒ์์ ์์ฑํ๋๋ก ์ ํํ ์ ์๊ฒ ๊ตฌํํ์ต๋๋ค.
๊ฒ์ ์งํ ๋์ค ์ข ๋ฃํ๋ ๊ธฐ๋ฅ์ ๋ฐ๋ก ๊ตฌํ๋์ด ์์ง ์์์ ๊ฐ์ ๋ก ํ๋ก๊ทธ๋จ์ ์ข ๋ฃ์์ผ์ผ ํ๋ ์ํ์ ๋๋ค.
๋ฆฌ๋ทฐ ํฌ์ธํธ
๋ฐ์ดํฐ๋ฒ ์ด์ค
์ฌ์ค ์ด๋ฒ ์ฌ์ดํด์์ ๋ค๋ฅธ ํฌ๋ฃจ๋ค๊ณผ ๋ค๋ฅด๊ฒ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ์ฉ ํํธ๊ฐ ๊ฐ์ฅ ๋ํดํ๋ค๊ณ ๋๊ปด์ก์ต๋๋ค..
๊ธฐ์กด Controller ์ญํ ์ ํ๋
JanggiFlow์์ ๋ด๋นํด์ผ ํ๋ ์ญํ ๊ณผ ์๋ก ์ถ๊ฐํJanggiService์์ ๋ด๋นํด์ผ ํ๋ ์ญํ ์ ๋ํ ๊ธฐ์ค์ด ๋ช ํํ์ง ์์์ ๊ทธ๋ฌ๋ ๊ฒ ๊ฐ์์.๋ ์ผ๋ฐ์ ์ธ ์๋ฒ๋ ์์ฒญ๋ง๋ค ์ ๋ณด๋ฅผ DB์์ ์กฐํํ๊ณ ์ฒ๋ฆฌํ๊ณ ์ ์ฅํ๋ ํ๋ฆ์ด์ง๋ง, ์ด๋ฒ ์ฌ์ดํด์์๋ ์ฒ์์๋ง Board์ ๋ณด๋ฅผ ์กฐํํ๊ณ , ์ดํ ์ด๋ ์์๋ ์ด๋ ์ ๋ณด๋ง ์ ๋ฐ์ดํธ ํ๋ ๋ฐฉ์์ด๋ผ
๋ฉ๋ชจ๋ฆฌ ์์ ์กด์ฌํ๋ Board๋ฅผ ์ ๋ฐ์ดํธ ํ ํ ์ถ๊ฐ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ๋ฐ์ดํธ ํ๋ ๊ตฌ์กฐ๊ฐ ์ด์ํ๋ค๊ณ ๋๊ปด์ก๋ ๊ฐ์ต๋๋ค.
DB ์ ์ฉ ๊ณผ์ ์์ ์ถ๊ฐํ Service ํด๋์ค์ DAO ๊ด๋ จ ๋ก์ง์ ๊ฒฐํจ์ด ๊ฐ์ฅ ๋ง์ ๊ฒ์ด๋ผ๊ณ ์์์ด ๋ฉ๋๋ค ใ ใ
ํ ์คํธ ์ฝ๋
ํ ์คํธ ์ฝ๋๊ฐ ์๋๋ ์ฐธ ์ด๋ ต๋ค๊ณ ์๊ฐํ๋๋ฐ, ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ถ๊ฐํ๊ณ ํ ์คํธ๋ฅผ ์์ฑํ๋ ค๊ณ ํ๋ ๋ ๋ณต์กํด์ง๋ ๊ฒ ๊ฐ๋ค๊ณ ๋๊ปด์ง๋๋ค.
๋๋ฏธ ๋ฐ์ดํฐ ์ด๊ธฐํ, ํธ๋์ญ์ ๊ด๋ฆฌ๋ก ์ธํด ํ ์คํธ ์ฝ๋๊ฐ ์ง์ ๋ถํด์ง๋๋ฐ ๊ฐ์ ๋ฐฉํฅ์ฑ์ด ์ ๋ ์ค๋ฅด์ง ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ์ด๋ฒ ๋ฏธ์ ์ด ๋๋๋ฉด ๊ฐ์ธ์ ์ผ๋ก ํ ์คํธ ์ฝ๋ ๊ด๋ จํด์ ์ถ๊ฐ ํ์ต์ด ํ์ํ๋ค๊ณ ์๊ฐ๋ฉ๋๋ค.
๋ฌธ์ ๊ฐ ๋๋ฌด ๋ง์ ๊ฒ ๊ฐ์ง๋ง, ์น๋ช ์ ์ด๋ผ๊ณ ์๊ฐ๋๋ ๋ถ๋ถ์ด ์์ผ๋ฉด ํผ๋๋ฐฑ ๋ถํ๋๋ฆฝ๋๋ค!
ํ์ต
์ด๋ฒ ์ฅ๊ธฐ ๋ฏธ์ ์ ๋ง์ง๋ง์ผ๋ก ๋ ๋ฒจ 1์ด ๋ง๋ฌด๋ฆฌ ๋๋๋ฐ, ๋งค ์ฌ์ดํด๋ง๋ค ๋ฌด์งํจ์ ์๋กญ๊ฒ ์๊ธฐํ๋ ๊ฒ ๊ฐ์ต๋๋ค.. ํนํ ์ด๋ฒ DB ์ ์ฉ์ ๊ฐ๋จํ ๊ฑฐ๋ผ ์๊ฐํ๋๋ฐ ๋ณต์กํ๋ค๊ณ ๋๊ปด์ ธ์ ๋ ๊ทธ๋ฌ๋ ๊ฒ ๊ฐ์์.
์์ฝ๊ฐ ๋ฆฌ๋ทฐํ๋ ๊ณผ์ ์์ ๋ช ํํ ๋ณด์ด๋ ์ ๋ถ์กฑํ ๋ถ๋ถ์ด ์๋ค๋ฉด, ๋ณด์ํ๊ธฐ ์ํ ๋ฐฉํฅ์ ์ถ์ฒ๋ฐ์ ์ ์์๊น์?
๋๋ ์์ฝ๊ฐ ์๊ฐํ์๊ธฐ์ ์ง๊ธ ์ ๋จ๊ณ์์ ์๊ฐ์ ํฌ์ํด๋ณผ ๋งํ ์์๋ค์ด ์๋ค๋ฉด ๊ณต์ ํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
์ฒดํฌ ๋ฆฌ์คํธ
test๋ฅผ ์คํํ์ ๋, ๋ชจ๋ ํ ์คํธ๊ฐ ์ ์์ ์ผ๋ก ํต๊ณผํ๋์?