์ด๋ฒ ์ฒด์ค ๋ฏธ์
์์๋ ์น ์ ์ฉ์ ํ๋ฉด์ ์๋กญ๊ฒ ๋ฐฐ์ด ๊ฐ๋
๋ค์ด ๋๋ฌด ๋ง์๋ค.
๋๋ฌธ์ ์ด๋ฒ ๋ฏธ์
์ ์งํํ๋ฉด์ ์๋ก ๋ฐฐ์ด ๊ฐ๋
๋ค๊ณผ, ํด๊ฐ ์ฃผ์ ํผ๋๋ฐฑ์ ์ ๋ฆฌํ๋ ๋ฐฉ์์ผ๋ก ๊ธฐ๋กํด์ผ๊ฒ ๋ค โ๏ธ
step1์์์ DTO
์ฌ์ค DTO์ ๊ฐ๋
์ ๋๋ต ์๊ณ ์์ผ๋,
์ ๋ฏธ์
๊น์ง๋ DTO์ ํ์์ฑ์ ์ ๋ชป๋๋ผ๊ณ ์์ด์ ์ฌ์ฉํ์ง๋ ์์์๋ค.
์ด๋ ๊ฐ์ ๊ฒฝ์ฐ๋ ํ์ฌ ๊ธฐ๋ฌผ๋ค์ ๋ํ๋ด๋ Pices ๊ฐ์ฒด๋ค๋ง์ด ์กด์ฌํ ๋ฟ์ธ๋ฐ View์์๋ 64๊ฐ์ position์ ๋ํ ์ ๋ณด๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํด
Pieces์ ๋ฉ์๋๋ฅผ ํตํดpieces.findByPosition(CACHE.get(xy));
๋ก ๋๋ฉ์ธ์ ๋ํ ์์กด์ฑ์ด ์๊ธฐ๊ณ ์์๋ค.
๊ทธ๋์ ์ด๋ฅผ ์ ๊ฑฐํ๊ธฐ ์ํด ํด์ ๋ฆฌ๋ทฐ๋๋ก DTO๋ฅผ ๋ง๋ค์ด View์ ํ์ํ ๋ฐ์ดํฐ๋ค์ ์ ๋ฌํด์ฃผ๊ธฐ๋ก ํ๊ณ
์ด ๋ฐฉ๋ฒ์ ๋ํ ํ์ ์ ์ป๊ธฐ ์ํด ํด์๊ฒ ์ง๋ฌธ์ ํ์๋ค.
ํ์ง๋ง ์ง๋ต์ ํ๋ค๊ฐ ์ด๋ฒ ๋จ๊ณ์์ DTO๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ๋ณด๋ค ๋ค์ ๋จ๊ณ ์น UI๋ฅผ ์ ์ฉํ๋ฉด์
DTO์ ํ์์ฑ์ ๋ผ์ ๋ฆฌ๊ฒ ๋๋ผ๊ธฐ๋ก ํ๋ค.
์ฌ์ค ์ง๊ธ ์์ ์์ ๋์ด์ผ๋ณด๋ฉด piecesDto๋ฅผ ๋ง๋ค๋ฉด ํด๊ฒฐ๋ ์ผ์ธ๊ฒ ๊ฐ์ง๋ง, ๋ง์๋๋ก ๊ผญ DTO๊ฐ ํ์ํ๋ ์์ ์ด ์๋์๋ ๊ฒ ๊ฐ๋ค.
์ผ๋จ ํด์์ ์ง๋ต์ ํตํด ์ป์ DTO์ ๊ดํ ์ด์ผ๊ธฐ๋ ๋ค์๊ณผ ๊ฐ๋ค.
- DTO๋ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ธฐ ์ํ ๊ฐ์ฒด๋ก์ ๋ก์ง์ด ์์ด์ผ ํ๋ค.
๋์ model -> modelDto๋ก ๋ณํํ๋ ๊ณผ์ ์์ ํ์ํ ์์ ์ ๋ชจ๋ ์ํํ์ฌ View์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ธํ ํ ์ ์๋ค. - DTO์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ๋ ๋ก์ง์ ์ํํ๋๊ฒ ์๋ ์์ฑ ํ๋ ์์ ์ ๋ฏธ๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ๋ค ์ธํ ํ๊ณ DTO๋ฅผ ์ฌ์ฉํ๋ ์์ ์ ๋ฐ์ดํฐ๋ก์๋ง ์ฌ์ฉํ๋ค. (์ด ๋ถ๋ถ์ด dto ์์ฑ์์์ ํ์ํ ๊ฐ ์ธํ ์ ๋ง์น๋ค๋ ์๋ฏธ)
- ๊ฐ์ ๋ํ ํํ์ ์ด๋ป๊ฒ ํ ์ง์ ๋ํ ui ๋ก์ง์ View์์ ์์ฒด์ ์ผ๋ก ํ๋จํด๋ ๋๋ค.
๋ํ DTO๋ฅผ ์ ์ฉํ๊ธฐ ์ DTO์ ๊ดํด ์์๋ณด๊ณ ์ฝ๊ฐ์ ์ ๋ฆฌ๋ฅผ ํ๋ค.
๐ DTO vs VO ๊ฐ๋จ ์ ๋ฆฌ
DTO VO ํผ๋์ ์ด์
๋ฐ์ดํฐ ์ ๋ฌ์ฉ ๊ฐ์ฒด๋ฅผ VO์์ TO๋ก ๋ณ๊ฒฝ๋์๊ธฐ ๋๋ฌธ์ ํผ๋์ด ์จ๋ค.
DTO = Data Transfer Object
โ๊ณ์ธต ๊ฐโ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํ ๊ฐ์ฒด๋ก, ๋ฐ์ดํฐ๋ฅผ ๋ด์์ ์ ๋ฌํ๋ ๋ฐ๊ตฌ๋ ์ญํ ์ ํ๋ค.
- ์ฉ๋ : ๋ ์ด์ด ๊ฐ ๋ฐ์ดํฐ ์ ๋ฌ
- ๋๋ฑ ๊ฒฐ์ : ์์ฑ ๊ฐ์ด ๋ชจ๋ ๊ฐ๋ค๊ณ ํด์ ๊ฐ์ ๊ฐ์ฒด๋ ์๋๋ค.
- ๊ฐ๋ณ / ๋ถ๋ณ : setter ์กด์ฌ ์ ๊ฐ๋ณ, setter ๋น ์กด์ฌ ์ ๋ถ๋ณ
- ๋ก์ง : getter / setter ์ธ์ ๋ก์ง์ ๊ฐ์ง์ง ์๋๋ค.
getter/setter ๋ฉ์๋๋ง์ ๊ฐ๋๋ค.
๋ณด๋ด๋ ์ชฝ์์ setter๋ฅผ ์ฌ์ฉํด ๊ฐ์ ์ค์ ํ๊ณ getter๋ฅผ ์ฌ์ฉํด ๊ฐ์ ๋ฐ๋๋ค.
setter ๋ฉ์๋๋ฅผ ๊ฐ์ง ๊ฒฝ์ฐ ๋ฐ์ดํฐ๊ฐ ๊ฐ๋ณ์ด๊ธฐ ๋๋ฌธ์ ํ๋๋ฅผ final ๋ก ํ๊ณ ์์ฑ์๋ฅผ ํตํด set์ ํ๋ฉด ๋ ์์ ์ ์ด๋ค.
โ Entity
์ํฐํฐ ํด๋์ค๋ ์์ฒญ์ด๋ ์๋ต ๊ฐ์ ์ ๋ฌํ๋ ํด๋์ค๊ฐ ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋งคํ๋ ํต์ฌ ํด๋์ค๋ค.
์ด ์ํฐํฐ ํด๋์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ํ
์ด๋ธ์ด ์์ฑ๋๋ค.
๋ทฐ์ ์ํฐํฐ๊ฐ ์ง์ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉด ์ํฐํฐ์ ๋ณ๊ฒฝ์ด ์ผ์ด๋ ๋, ๋ทฐ์ ๋ชจ๋ ๋ถ๋ถ์ ์์ ํด์ฃผ์ด์ผ ํ๋ค.
VO = Value Object
๊ฐ ๊ทธ ์์ฒด๋ฅผ ํํํ๋ ๊ฐ์ฒด๋ก ๋ถ๋ณ์ด์ด์ผ ํ๋ค.
๊ฐ์ผ๋ก๋ง ๋น๊ต๋๋ ๊ฐ์ฒด๋ก equals / hashCode ์ค๋ฒ๋ผ์ด๋ฉ์ด ํต์ฌ์ด๋ค.
์์ฑ์๋ฅผ ํตํด์๋ง ๊ฐ์ ์ด๊ธฐํํด์ผ ํ๋ค.
- ์ฉ๋ : ๊ฐ ์์ฒด ํํ
- ์์ฑ ๊ฐ์ด ๋ชจ๋ ๊ฐ์ผ๋ฉด ๊ฐ์ ๊ฐ์ฒด
- ๊ฐ๋ณ / ๋ถ๋ณ : ๋ถ๋ณ
- ๋ก์ง : getter / setter ์ธ์ ๋ก์ง์ ๊ฐ์ง ์ ์๋ค.
step2์์์ DTO
View์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ชฉ์
4, 5๋จ๊ณ๋ฅผ ์งํํ๋ฉด์ ์น UI๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์ํด Gson์ ์ฌ์ฉํ์๊ณ , ์ด๋ก ๋ทฐ์ ๋ณด๋ด์ค ๋ฐ์ดํฐ๋ฅผ Json์ผ๋ก ๋ง๋ค ์ ์์๋ค.
String chessGameListJson = gson.toJson(chessGameList);
์ด๋ ๊ฒ Gson ๊ฐ์ฒด๋ฅผ ํตํด string ํํ์ json์ ๋ง๋ค๊ณ spark java์์ ๋ค์๊ณผ ๊ฐ์ด res ๊ฐ์ฒด์ body์ ์ด json์ ๋ด์ ๋ณด๋ธ๋ค.
get("/chess-game-list", (req, res) -> {
List<Integer> chessGameList = chessService.getAllChessGameId();
return gson.toJson(chessGameList);
});
โ ์ ๊น Gson์ ๋ํด ์ข ๋ ์ธ๊ธํ๋ฉด,
json์ ํค ๊ฐ๊ณผ ๊ฐ์ฒด์ ํ๋๋ฅผ ๋งค์นญ ์ํค๋ฉด ๋ค์๊ณผ ๊ฐ์ด req๋ก ๋ ์์จ json ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ฒด๋ก ์ฝ๊ฒ ์์ฑํ ์ ์๋ค.
MoveRequestDto moveRequestDto = gson.fromJson(req.body(), MoveRequestDto.class);
Gson์ ํตํด์ ๊ฐ์ฒด๋ฅผ json์ผ๋ก ๋ณ๊ฒฝํ ๋์ gson์ด ๊ฐ์ฒด์ ํ๋์ ์๋ ๊ฐ๋ค์ ์๋์ผ๋ก key-value์ json์ผ๋ก ๋ง๋ค์ด ์ค๋ค.
๊ทธ๋ฐ๋ฐ, ๊ฐ์ฒด ์์ฒด๋ฅผ Gson์ ํตํด json์ผ๋ก ๋ง๋ค๋ฉด
View์์ ์ํ๋ ๋ฐ์ดํฐ ์์์ ๋ง์ถ ์ ์๊ณ , ๋ View์์ ์ํ์ง ์๋ ๋ฐ์ดํฐ๋ ํจ๊ป ๋ค์ด๊ฐ๊ฒ ๋๋ค.
๊ทธ๋์ ์ด๋ ํ์ํ ๊ฒ์ด ๋ฐ๋ก DTO ์๋ค.
View์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์์๊ฐ ํ๋๋ก ๊ฐ์ง DTO๋ฅผ ๋ง๋ค๊ณ View์๊ฒ ๋ฐ์ดํฐ ์ ์ก์ ์ํด ์ด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
์ด ๊ฒฝํ ๋๋ถ์ ํด๊ฐ step1์์ ์ธ๊ธํ๋ DTO์ ์ฐ ํ์์ฑ์ ๋๋ ์ ์์๋ค.
DAO์์ ์๋ชป๋ DTO ์ฌ์ฉ
DTO์ ๋ํ ๊ฐ๋
์ ์ดํด๋ณด๋ฉด์ ๊ณ์ธต ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํ ๊ฐ์ฒด๋ผ๋ ์ฌ์ค์ ์ง์คํ์ฌ
๋งจ ์ฒ์์๋ DAO์ Service ๋ ์ด์ด๊ฐ ์ฃผ๊ณ ๋ฐ๋ ๋ฐ์ดํฐ์์๋ DTO๋ฅผ ์ฌ์ฉํ์์๋ค.
์ด์ ๋ํด์๋ ๋ค์๊ณผ ๊ฐ์ ํผ๋๋ฐฑ์ ๋ฐ์๋ค.
dao๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํด ์๋น์ค์์ dto๋ก ์ธ๊ณ , dao์์ dto๋ก ๋ฐํํ์ฌ ์๋น์ค ๋ ์ด์ด์์ ๊บผ๋ด ์ฐ๋ ์ด ๊ณผ์ ์ด,
๋์ด์ผ๋ณด๋ ๋๋ฉ์ธ์์ ๊บผ๋ด ์ธ ์ ์๋ ๊ฐ๋ค์ ๊ตณ์ด dto๋ก ์ ๋ฌํ๋ฉด์ ๋ถํ์ํ dto ๊ฐ์ฒด ์์ฑ๊ณผ ์ฝ๋๋ง ๋์ด๋๊ณ ์์๋ค.
๋ทฐ์์๋ gson์ ์ฌ์ฉํด json์ผ๋ก ๋ง๋ค๊ธฐ ์ํด dto์ ํ์์ฑ์ ์ ์คํ ๋๋ ์ ์์์ง๋ง,
dao์์ ๋ถํ์ํ dto๋ค์ ์ ๊ฑฐํ๋๋ dto๋ฅผ ๋ถํ์ํ๊ฒ ์ฌ์ฉํ๊ณ ์์๊ตฌ๋๋ฅผ ๋๊ผ๋ค.
๋ฐ์ดํฐ ์ ๋ฌ ๋ชฉ์
ํด์ ๋ง๋๋ก ๋์ ๊ตฌ์กฐ์์, ChessGame ๊ฐ์ฒด์ chess_game ํ
์ด๋ธ ๊ฐ์ ๋ถ์ผ์น๋ ๋ช
ํํ ์กด์ฌํ๋ค.
์ฌ์ค DB ์ฐ๋ ๊ฒฝํ์ด ์์ง๋ง ์ด๋ฒ ๋ฏธ์
์์ DB๋ฅผ ์ฐ๋ํ๋๋ฐ ์์ด๋ ๊ฒ ๋ง๋งํ ๊น ๋ง์ด ๊ณ ๋ฏผ์ด ๋์๋๋ฐ,
๊ฐ์ฒด๋ฅผ ํ
์ด๋ธ๋ก 1:1 ๋งตํ์ ํ๋ คํ๋ค ๋ณด๋ ์๊ธด ๋ฌธ์ ์๋ค.
(ํด์ ๋ง๋๋ก ๋์ค์๋ ORM์ ํตํด ํด๊ฒฐ์ด ๋๊ฒ ์ง..!)
์ด๋ฒ ๋จ๊ณ์์๋ ๊ฐ์ฒด์ ํ
์ด๋ธ ๊ฐ์ ๋ถ์ผ ์น ๋ฌธ์ ๋ฅผ DTO๋ก ํด๊ฒฐํ ๊ฒ์ ์ ์ํด์ฃผ์
จ๊ณ ,
ChessGame์ ๋ํด์๋ DAO์ Service ๊ฐ์ ๋ฐ์ดํฐ ์ ๋ฌ์์ DTO๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ฅํ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ก ํ์๋ค.
- ChessGameDao ์ผ๋ถ
public ChessGameStatusDto findChessGameStateById(int chessGameId) {
String query = "SELECT turn, IF(isFinish, 'true', 'false') isFinish FROM chess_game WHERE id = ?";
try (Connection connection = dbManager.getConnection();
PreparedStatement pstmt = connection.prepareStatement(query)) {
pstmt.setInt(1, chessGameId);
ResultSet rs = pstmt.executeQuery();
if (!rs.next()) return null;
return new ChessGameStatusDto(rs.getString("turn"), rs.getBoolean("isFinish"));
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
- ChessService ์ผ๋ถ
public ChessGame findChessGameById(int chessGameId) {
ChessGameStatusDto chessGameStatusDto = chessGameDao.findChessGameStateById(chessGameId);
List<Piece> pieces = pieceDao.findAllByChessGameId(chessGameId);
return ChessGameFactory.loadChessGameByInfo(pieces, chessGameStatusDto.getTurn(), chessGameStatusDto.isFinish());
}
์ด์ ๋ํ ํด์ ํผ๋๋ฐฑ์ OK ์์ง๋ง DTO์ ๋ํด์ ๋ฆฌ๋ทฐ์ด๋ง๋ค ๋ค๋ฅธ ๊ด์ ์ ๊ฐ์ง๊ณ ์์ ๊ฒ์ด๋ผ ํ์๋ค.
DTO์ ๋ํ ๊ฒฐ๋ก
DTO์ ๋ํด์ ํด๊ฐ ์ฃผ์ ์ฐธ๊ณ ์๋ฃ๋ฅผ ์ฝ๊ณ , ์ด๋ฒ ๋ฏธ์ ์์ ๊ฒฝํํ DTO๋ฅผ ๊ฐ๋ตํ ์ ๋ฆฌํ๊ณ ๋ง๋ฌด๋ฆฌํ๋ค.
๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก Json์ผ๋ก ๋ณ๊ฒฝํ ๊ฒฝ์ฐ ๊ฐ์ฒด์ ์กด์ฌํ๋ ๋ชจ๋ ์์ฑ๊ณผ ์กฐํฉ ๊ด๊ณ์ ์๋ ๊ฐ์ฒด์ ์์ฑ๊น์ง Json์ผ๋ก ์๋์ผ๋ก ๋ณํ๋๋ค.
์ด ๊ฒฝ์ฐ View์์ ๋ถํ์ํ ์์ฑ๊น์ง Json์ผ๋ก ๋ณํ๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ๊ฐ์ฒด์์ View์์ ํ์ํ ์์ฑ๋ง์ ๋ฝ์์ DTO๋ก ๋ง๋ค์ด ๊ณ์ธต ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ค.
ํ์ง๋ง ๋๋ฉ์ธ์์ ํน์ ์์ฑ๋ง์ ๋ฝ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ณ ์ถ๋ค๋ฉด, ์ถํ์ Lombok์ ํตํด ํ์ํ ์์ฑ๋ง์ ์ ๋ฌํ ์ ์๋ค.