Repository navigation
[4, 5단계 - 체스] 후디(조동현) 미션 제출합니다. - #419
Conversation
- ChessController 를 ConsoleController 로 변경 - InputView와 OutputView를 console 패키지로 이동
- 기물 이동을 위한 POST 라우트 추가 - 기물 이동 명령을 위한 form 추가
- ScoreResultDto 구현 - OutputView 에서 ScoreResultDto 를 사용하도록 변경
- DAO 에 대한 테스트코드 추가 - Board 가 Map 을 직접 전달받아 생성될 수 있도록 정적 팩토리 메소드 구현 - Position 의 from(XAxis, YAxis) 메소드의 이름을 of 로 변경 - XAxis 와 YAxis 가 문자열 value 를 전달받아 해당하는 열거 객체를 반환하는 메소드 getByValue 메소드 오버로딩 - Board, Piece 에 toString 재정의
- 테스트 코드 작성 - init.sql 수정 - Position 에 XAxis, YAxis 게터 추가 - 기물 생성, 기물 제거, 기물 위치 변경에 대한 DTO 추가
- 변경된 DTO 에 따라 View 로직 변경 - DTO를 각각 성격에 따라 request, response 패키지로 분리
- GameDto 의 도메인 변환로직을 Service 로 옮김
- 킹이 잡혀도 GameState 가 ReadyToStart 로 변경되지 않음 - 킹이 잡힌 상태로 기물을 움직일 수 없게 되었음 - PieceColor를 전달해 해당 색상의 킹이 보드에 존재하는지 확인할 수 있음 - 웹뷰에 승자를 표시함
- GSON 라이브러리 의존성 추가 - html, css, js 작성 - TurnDto 를 PieceColorDto 로 이름 변경
- BodyParser 분리 - JsonMapper 분리
Laterality
left a comment
There was a problem hiding this comment.
안녕하세요 후디.
어려운 요구사항이었을텐데, 잘 구현해주셨어요 👍
몇가지 피드백을 남겨드렸어요. 확인 부탁드려요 :)
| private final PieceType pieceType; | ||
| private final PieceColor pieceColor; |
There was a problem hiding this comment.
DTO 는 UI 단으로 도메인이 노출되어 실수로 변경되는 것으로부터 보호하기 위해 사용하는 것 으로 알고있습니다. 반대로 Enum 과 불변 도메인은 변경될일이 없으므로 DTO의 필드로 사용해도 된다고 판단하였습니다. 괜찮은 판단일까요?
There was a problem hiding this comment.
뷰에서 도메인을 직접 참조하면 도메인이 변경됐을 때 뷰에도 영향이 있겠네요.
만약 뷰와 도메인 사이에 DTO가 있다면 어떨까요?
There was a problem hiding this comment.
Enum 혹은 불변 클래스일 경우 도메인이 변경될일이 없다고 생각해서 뷰와 도메인 사이에 DTO를 만들고 (Enum 및 불변 클래스를) 필드로 사용하였습니다!
There was a problem hiding this comment.
앗, 제 답변이 중의적이었네요 😅
위에서 "도메인이 변경"된다는 의미는 도메인의 코드가 변경된다는 의미였어요!
도메인의 필드가 사라지거나 다른 타입으로 바뀌는 등 여러가지 변경이 생길 수 있는데요. 이러한 변경이 발생했을 때 DTO의 유무에 따라 어떤 차이가 생길까요?
Laterality
left a comment
There was a problem hiding this comment.
안녕하세요 후디.
잘 수정해주셨어요 👍
간단한 리팩터링과 테스트에 관해 의견을 남겨드렸어요. 확인 부탁드려요!
| private final PieceType pieceType; | ||
| private final PieceColor pieceColor; |
There was a problem hiding this comment.
뷰에서 도메인을 직접 참조하면 도메인이 변경됐을 때 뷰에도 영향이 있겠네요.
만약 뷰와 도메인 사이에 DTO가 있다면 어떨까요?
Laterality
left a comment
There was a problem hiding this comment.
안녕하세요 후디,
잘 수정해주셨네요!
이번 미션은 이만 머지하도록 할게요.
추가로 리팩터링해 볼 만한 곳과 질문 주셨던 부분에 코멘트를 남겨드렸어요.
확인 부탁드리고, 궁금하신 점 있으시면 언제든 DM 주세요.
레벨 1 고생 많으셨습니다. 다음 레벨도 화이팅하세요 :)
| private final PieceType pieceType; | ||
| private final PieceColor pieceColor; |
There was a problem hiding this comment.
앗, 제 답변이 중의적이었네요 😅
위에서 "도메인이 변경"된다는 의미는 도메인의 코드가 변경된다는 의미였어요!
도메인의 필드가 사라지거나 다른 타입으로 바뀌는 등 여러가지 변경이 생길 수 있는데요. 이러한 변경이 발생했을 때 DTO의 유무에 따라 어떤 차이가 생길까요?
| import java.util.HashMap; | ||
| import java.util.Map; | ||
|
|
||
| public class BoardDaoImpl extends Dao implements BoardDao { |
| String query = String.format("SELECT x_axis, y_axis, piece_type, piece_color FROM %s WHERE game_id = ?", | ||
| TABLE_NAME); | ||
|
|
||
| try (Connection connection = getConnection()) { | ||
| PreparedStatement preparedStatement = connection.prepareStatement(query); | ||
| preparedStatement.setString(1, gameId); | ||
| ResultSet resultSet = preparedStatement.executeQuery(); | ||
|
|
||
| Map<Position, Piece> boardValue = new HashMap<>(); | ||
| while (resultSet.next()) { | ||
| XAxis xAxis = XAxis.getByValue(resultSet.getString("x_axis")); | ||
| YAxis yAxis = YAxis.getByValue(resultSet.getString("y_axis")); | ||
| PieceType pieceType = PieceType.valueOf(resultSet.getString("piece_type")); | ||
| PieceColor pieceColor = PieceColor.valueOf(resultSet.getString("piece_color")); | ||
|
|
||
| boardValue.put(Position.of(xAxis, yAxis), new Piece(pieceType, pieceColor)); | ||
| } | ||
|
|
||
| return BoardDto.from(boardValue); | ||
| } catch (SQLException e) { | ||
| throw new DatabaseException(e.getMessage()); | ||
| } |
| private void updateTurn(String gameId, String turn) { | ||
| String query = String.format("UPDATE %s SET turn = ? WHERE id = ?", TABLE_NAME); | ||
|
|
||
| try (Connection connection = getConnection()) { |
There was a problem hiding this comment.
Connection을 얻는 블럭이 중복되네요. 이 중복을 없앨 방법이 있을까요?
| new Piece(PIECE_TYPE, PIECE_COLOR)); | ||
|
|
||
| // when & then | ||
| boardDao.createPiece(createPieceDto); |
There was a problem hiding this comment.
createPiece가 정상적으로 동작하는지 테스트하는 것으로 보여요. 대상 메서드를 호출한 뒤 결과에 대한 검증은 어떻게 할 수 있을까요?
안녕하세요, 에단!
난이도가 높아서 코드 퀄리티가 좋지 않은 상태로 리뷰 요청을 드리게되어 아쉽습니다.
구현만 하기에도 시간이 빠듯할 것 같아 TDD 규칙을 제대로 지키지 못한 점도 아쉬워요.
그래도 예상보다는 도메인 코드의 변경은 별로 없어서 '나쁘지 않은 설계를 했구나' 라는 생각이 들었어요.
이번 미션에는 처음으로 DAO 와 Service 레이어를 사용해봤는데, Controller, Service 에 각각 적절한 책임을 부여하는 것이 어려웠어요.
추가적인 질문은 코멘트로 남길게요 감사합니다 😄