-
Notifications
You must be signed in to change notification settings - Fork 415
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
[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 분리
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.
안녕하세요 후디.
어려운 요구사항이었을텐데, 잘 구현해주셨어요 👍
몇가지 피드백을 남겨드렸어요. 확인 부탁드려요 :)
private final PieceType pieceType; | ||
private final PieceColor pieceColor; |
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.
DTO 는 UI 단으로 도메인이 노출되어 실수로 변경되는 것으로부터 보호하기 위해 사용하는 것 으로 알고있습니다. 반대로 Enum 과 불변 도메인은 변경될일이 없으므로 DTO의 필드로 사용해도 된다고 판단하였습니다. 괜찮은 판단일까요?
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.
뷰에서 도메인을 직접 참조하면 도메인이 변경됐을 때 뷰에도 영향이 있겠네요.
만약 뷰와 도메인 사이에 DTO가 있다면 어떨까요?
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.
Enum 혹은 불변 클래스일 경우 도메인이 변경될일이 없다고 생각해서 뷰와 도메인 사이에 DTO를 만들고 (Enum 및 불변 클래스를) 필드로 사용하였습니다!
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.
앗, 제 답변이 중의적이었네요 😅
위에서 "도메인이 변경"된다는 의미는 도메인의 코드가 변경된다는 의미였어요!
도메인의 필드가 사라지거나 다른 타입으로 바뀌는 등 여러가지 변경이 생길 수 있는데요. 이러한 변경이 발생했을 때 DTO의 유무에 따라 어떤 차이가 생길까요?
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.
안녕하세요 후디.
잘 수정해주셨어요 👍
간단한 리팩터링과 테스트에 관해 의견을 남겨드렸어요. 확인 부탁드려요!
private final PieceType pieceType; | ||
private final PieceColor pieceColor; |
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.
뷰에서 도메인을 직접 참조하면 도메인이 변경됐을 때 뷰에도 영향이 있겠네요.
만약 뷰와 도메인 사이에 DTO가 있다면 어떨까요?
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.
안녕하세요 후디,
잘 수정해주셨네요!
이번 미션은 이만 머지하도록 할게요.
추가로 리팩터링해 볼 만한 곳과 질문 주셨던 부분에 코멘트를 남겨드렸어요.
확인 부탁드리고, 궁금하신 점 있으시면 언제든 DM 주세요.
레벨 1 고생 많으셨습니다. 다음 레벨도 화이팅하세요 :)
private final PieceType pieceType; | ||
private final PieceColor pieceColor; |
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.
앗, 제 답변이 중의적이었네요 😅
위에서 "도메인이 변경"된다는 의미는 도메인의 코드가 변경된다는 의미였어요!
도메인의 필드가 사라지거나 다른 타입으로 바뀌는 등 여러가지 변경이 생길 수 있는데요. 이러한 변경이 발생했을 때 DTO의 유무에 따라 어떤 차이가 생길까요?
import java.util.HashMap; | ||
import java.util.Map; | ||
|
||
public class BoardDaoImpl extends Dao implements BoardDao { |
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.
이 부분은 다른 크루에게 남겼던 코멘트를 참고해주세요!
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()); | ||
} |
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.
어떻게 하면 메서드의 길이를 줄일 수 있을까요?
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Connection
을 얻는 블럭이 중복되네요. 이 중복을 없앨 방법이 있을까요?
new Piece(PIECE_TYPE, PIECE_COLOR)); | ||
|
||
// when & then | ||
boardDao.createPiece(createPieceDto); |
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.
createPiece
가 정상적으로 동작하는지 테스트하는 것으로 보여요. 대상 메서드를 호출한 뒤 결과에 대한 검증은 어떻게 할 수 있을까요?
안녕하세요, 에단!
난이도가 높아서 코드 퀄리티가 좋지 않은 상태로 리뷰 요청을 드리게되어 아쉽습니다.
구현만 하기에도 시간이 빠듯할 것 같아 TDD 규칙을 제대로 지키지 못한 점도 아쉬워요.
그래도 예상보다는 도메인 코드의 변경은 별로 없어서 '나쁘지 않은 설계를 했구나' 라는 생각이 들었어요.
이번 미션에는 처음으로 DAO 와 Service 레이어를 사용해봤는데, Controller, Service 에 각각 적절한 책임을 부여하는 것이 어려웠어요.
추가적인 질문은 코멘트로 남길게요 감사합니다 😄