-
Notifications
You must be signed in to change notification settings - Fork 3
[4단계 - DB 적용] 이유빈 미션 제출합니다 #11
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: leeshin20
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -30,3 +30,4 @@ out/ | |
|
|
||
| ### VS Code ### | ||
| .vscode/ | ||
| .env | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,5 +1,5 @@ | ||
| distributionBase=GRADLE_USER_HOME | ||
| distributionPath=wrapper/dists | ||
| distributionUrl=https\://services.gradle.org/distributions/gradle-6.8.1-bin.zip | ||
| distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip | ||
| zipStoreBase=GRADLE_USER_HOME | ||
| zipStorePath=wrapper/dists | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -3,6 +3,7 @@ | |
| import chess.piece.*; | ||
| import chess.position.Position; | ||
| import chess.position.StartPiecePosition; | ||
| import chess.ui.PieceSymbol; | ||
| import java.util.HashMap; | ||
| import java.util.List; | ||
| import java.util.Map; | ||
|
|
@@ -74,6 +75,33 @@ public void verifyPath(Position start, Position target) { | |
| } | ||
| } | ||
|
|
||
| public String convertBoardStateToString() { | ||
| StringBuilder stringBuilder = new StringBuilder(); | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. StringBuilder 사용 👍👍 |
||
| for (int rank = Position.LAST_RANK; rank >= Position.FIRST_RANK; rank--) { | ||
| for (int file = Position.FIRST_FILE; file <= Position.LAST_FILE; file++) { | ||
| Position position = new Position(file, rank); | ||
| Piece piece = board.get(position); | ||
| stringBuilder.append(PieceSymbol.convertTypeToSymbol(piece)); | ||
| } | ||
| } | ||
| return stringBuilder.toString(); | ||
| } | ||
|
|
||
|
|
||
| public void loadBoardState(String boardState) { | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Board는 현재 실직적인 체스의 비즈니스 로직(기물들의 움직임 규칙, 게임 턴 관리...)을 담고 있는 객체로 보이는데, 보드의 상태를 문자열로 받아서 초기화 하는 기능이 여기에 있어도 괜찮을까요? 지금 형태라면 비즈니스 로직과 상관없이 DB에 저장하는 형태가 변경되는데도 (ex. 각 기물들이 기물 테이블에 개별 행으로 저장됨) 비즈니스 로직을 담당하고 있는 Board 객체도 같이 변경이 일어나야할 것 같아요. |
||
| board.clear(); | ||
| Piece piece; | ||
| int index = 0; | ||
| for (int rank = Position.LAST_RANK; rank >= Position.FIRST_RANK; rank--) { | ||
| for (int file = Position.FIRST_FILE; file <= Position.LAST_FILE; file++) { | ||
| char symbol = boardState.charAt(index++); | ||
| piece = PieceSymbol.convertSymbolToPiece(symbol); | ||
| Position position = new Position(file, rank); | ||
| board.put(position, piece); | ||
| } | ||
| } | ||
|
Comment on lines
+93
to
+102
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
| } | ||
|
|
||
| public void checkPositionIsEmpty(Position position, Position target) { | ||
| if (!this.findPiece(position).isEmpty() && !position.equals(target)) { | ||
| throw new IllegalArgumentException("다른 기물이 존재해서 지나갈 수 없습니다."); | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,116 @@ | ||
| package chess.dao; | ||
|
|
||
| import chess.board.Board; | ||
| import chess.utils.DatabaseUtil; | ||
| import chess.piece.Team; | ||
| import java.sql.Connection; | ||
| import java.sql.PreparedStatement; | ||
| import java.sql.ResultSet; | ||
| import java.sql.SQLException; | ||
|
|
||
| public class ChessGameDao { | ||
| public void createNewRoom() { | ||
| String query = "INSERT INTO game (boardState, turn, status) VALUES (?, ?, ?)"; | ||
| Board board = new Board(); | ||
|
Comment on lines
+12
to
+14
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 이렇게 데이터베이스와 직접 소통하는 기능에 대한 테스트는 왜 없나요? |
||
|
|
||
| try (Connection conn = DatabaseUtil.getConnection(); PreparedStatement pstmt = conn.prepareStatement(query)) { | ||
| pstmt.setString(1, board.convertBoardStateToString()); | ||
| pstmt.setBoolean(2, true); | ||
| pstmt.setString(3, "ready"); | ||
| pstmt.executeUpdate(); | ||
| } catch (SQLException e) { | ||
| e.printStackTrace(); | ||
| } | ||
| } | ||
|
|
||
| public int selectRoom(int gameId) { | ||
| String query = "SELECT status FROM game WHERE gameId = ?"; | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 현재 보드 상태를 하나의 문자열로 쭉 이어서 저장하는 방법이 너무 참신하네요ㅋㅋㅋ 이 방식에는 다른 방식과 비교했을 때 어떤 장단점이 있을까요? |
||
|
|
||
| try (Connection conn = DatabaseUtil.getConnection(); | ||
| PreparedStatement pstmt = conn.prepareStatement(query)) { | ||
| pstmt.setInt(1, gameId); // gameId를 쿼리에 설정 | ||
| try (ResultSet rs = pstmt.executeQuery()) { | ||
| if (rs.next()) { | ||
| return gameId; | ||
| } | ||
| } | ||
| } catch (SQLException e) { | ||
| e.printStackTrace(); | ||
| } | ||
| throw new IllegalStateException("존재하지 않는 방 번호입니다."); | ||
| } | ||
|
|
||
| public void saveGame(int gameId, String boardState, boolean turn, String status) { | ||
| String query = "INSERT INTO game (gameId, boardState, turn, status) VALUES (?, ?, ?, ?) " + "ON DUPLICATE KEY UPDATE boardState = VALUES(boardState), turn = VALUES(turn), status = VALUES(status)"; | ||
|
|
||
|
Comment on lines
+44
to
+45
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
| try (Connection conn = DatabaseUtil.getConnection(); PreparedStatement pstmt = conn.prepareStatement(query)) { | ||
| pstmt.setInt(1, gameId); | ||
| pstmt.setString(2, boardState); | ||
| pstmt.setBoolean(3, turn); | ||
| pstmt.setString(4, status); | ||
| pstmt.executeUpdate(); | ||
|
Comment on lines
+46
to
+51
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. preparedStatement 사용 👍👍 |
||
| } catch (SQLException e) { | ||
| e.printStackTrace(); | ||
| } | ||
| } | ||
|
|
||
| public void updateCurrentBoard(int gameId, Board board) { | ||
| String query = "SELECT boardState, status FROM game WHERE gameId = ?"; | ||
| try (Connection conn = DatabaseUtil.getConnection(); PreparedStatement pstmt = conn.prepareStatement(query)) { | ||
| pstmt.setInt(1, gameId); | ||
| try (ResultSet rs = pstmt.executeQuery()) { | ||
| if (rs.next()) { | ||
| String boardState = rs.getString("boardState"); | ||
| board.loadBoardState(boardState); | ||
| } | ||
| } | ||
| } catch (SQLException e) { | ||
| e.printStackTrace(); | ||
| } | ||
| } | ||
|
|
||
| public Team getCurrentTurn(int gameId, Team turn) { | ||
| String query = "SELECT turn FROM game WHERE gameID = ?"; | ||
| try (Connection conn = DatabaseUtil.getConnection(); | ||
| PreparedStatement pstmt = conn.prepareStatement(query)) { | ||
| pstmt.setInt(1, gameId); | ||
| try (ResultSet rs = pstmt.executeQuery()) { | ||
| if (rs.next()) { | ||
| return turn.getTurnByBinary(rs.getInt("turn")); | ||
| } | ||
| } | ||
| } catch (SQLException e) { | ||
| e.printStackTrace(); | ||
| } | ||
| return turn; | ||
| } | ||
|
|
||
| public String getCurrentStatus(int gameId) { | ||
| String query = "SELECT status FROM game WHERE gameId = ?"; | ||
|
|
||
| try (Connection conn = DatabaseUtil.getConnection(); | ||
| PreparedStatement pstmt = conn.prepareStatement(query)) { | ||
| pstmt.setInt(1, gameId); | ||
| try (ResultSet rs = pstmt.executeQuery()) { | ||
| if (rs.next()) { | ||
| return rs.getString("status"); | ||
| } | ||
| } | ||
| } catch (SQLException e) { | ||
| e.printStackTrace(); | ||
| } | ||
| throw new IllegalStateException("존재하지 않는 방입니다."); | ||
| } | ||
|
|
||
| public void changeStatus(int gameId) { | ||
| String query = "UPDATE game SET status = ? WHERE gameId = ?"; | ||
| try (Connection conn = DatabaseUtil.getConnection(); | ||
| PreparedStatement pstmt = conn.prepareStatement(query)) { | ||
| pstmt.setString(1, "end"); | ||
| pstmt.setInt(2, gameId); | ||
| pstmt.executeUpdate(); | ||
| } catch (SQLException e) { | ||
| e.printStackTrace(); | ||
| } | ||
| } | ||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -15,4 +15,9 @@ public Team changeTurn() { | |
| } | ||
| return BLACK; | ||
| } | ||
|
|
||
| public Team getTurnByBinary(int n) { | ||
| if (n == 0) return Team.BLACK; | ||
| return Team.WHITE; | ||
| } | ||
|
Comment on lines
+19
to
+22
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
| } | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,31 +1,51 @@ | ||
| package chess.ui; | ||
|
|
||
| import chess.piece.*; | ||
|
|
||
| import java.util.HashMap; | ||
| import java.util.Map; | ||
|
|
||
| public class PieceSymbol { | ||
| private static final Map<Class<?>, String> symbolMap = new HashMap<>(); | ||
| private static final Map<Class<?>, String> typeToSymbolMap = new HashMap<>(); | ||
|
Owner
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Class<?> 와 Type 은 뭐가 다를까요? |
||
| private static final Map<Character, Piece> pieceMap = new HashMap<>(); | ||
|
|
||
| static { | ||
| symbolMap.put(Pawn.class, "P"); | ||
| symbolMap.put(Rook.class, "R"); | ||
| symbolMap.put(Bishop.class, "B"); | ||
| symbolMap.put(Knight.class, "N"); | ||
| symbolMap.put(Queen.class, "Q"); | ||
| symbolMap.put(King.class, "K"); | ||
| symbolMap.put(Empty.class, "."); | ||
| typeToSymbolMap.put(Pawn.class, "P"); | ||
| typeToSymbolMap.put(Rook.class, "R"); | ||
| typeToSymbolMap.put(Bishop.class, "B"); | ||
| typeToSymbolMap.put(Knight.class, "N"); | ||
| typeToSymbolMap.put(Queen.class, "Q"); | ||
| typeToSymbolMap.put(King.class, "K"); | ||
| typeToSymbolMap.put(Empty.class, "."); | ||
|
|
||
| pieceMap.put('p', new Pawn(Team.WHITE)); | ||
| pieceMap.put('r', new Rook(Team.WHITE)); | ||
| pieceMap.put('b', new Bishop(Team.WHITE)); | ||
| pieceMap.put('n', new Knight(Team.WHITE)); | ||
| pieceMap.put('q', new Queen(Team.WHITE)); | ||
| pieceMap.put('k', new King(Team.WHITE)); | ||
| pieceMap.put('P', new Pawn(Team.BLACK)); | ||
| pieceMap.put('R', new Rook(Team.BLACK)); | ||
| pieceMap.put('B', new Bishop(Team.BLACK)); | ||
| pieceMap.put('N', new Knight(Team.BLACK)); | ||
| pieceMap.put('Q', new Queen(Team.BLACK)); | ||
| pieceMap.put('K', new King(Team.BLACK)); | ||
| pieceMap.put('.', new Empty(Team.NONE)); | ||
| } | ||
|
|
||
| private PieceSymbol() { | ||
| } | ||
|
|
||
| public static String convertTypeToSymbol(Piece piece) { | ||
| String symbol = symbolMap.get(piece.getClass()); | ||
| String symbol = typeToSymbolMap.get(piece.getClass()); | ||
|
|
||
| if (piece.isSameTeam(Team.WHITE)) { | ||
| return symbol.toLowerCase(); | ||
| } | ||
| return symbol; | ||
| } | ||
|
|
||
| public static Piece convertSymbolToPiece(char symbol) { | ||
| return pieceMap.get(symbol); | ||
| } | ||
| } | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
gradle 버전을 업데이트 한 이유는 뭔가요?