Skip to content
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

[1, 2단계 - Spring 적용하기] 인비(김태희) 미션 제출합니다. #218

Merged
merged 54 commits into from
Apr 19, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
54 commits
Select commit Hold shift + click to select a range
08db9ee
feat: build.gradle mustache 의존성 추가
taehee-kim-dev Apr 13, 2021
e109d11
refactor: 사용하지 않는 파일 삭제
taehee-kim-dev Apr 13, 2021
a5b1e74
feat: Spring MVC, jdbcTemplate 적용
taehee-kim-dev Apr 13, 2021
f903e39
refactor: 테스트 의존성 주입 방식으로 변경
taehee-kim-dev Apr 13, 2021
050ecb2
docs: README 업데이트
taehee-kim-dev Apr 13, 2021
c3830f9
feat: sql 파일 추가
taehee-kim-dev Apr 13, 2021
bf02c37
refactor: 패키지 경로 수정
taehee-kim-dev Apr 16, 2021
5a8113a
refactor: 메인 화면 조회, 게임 생성 기능 추가
taehee-kim-dev Apr 16, 2021
80194b8
feat: 테이블 구조 변경
taehee-kim-dev Apr 16, 2021
2b4410a
feat: 게임 상태 반환 기능 추가
taehee-kim-dev Apr 16, 2021
c5a06df
refactor: 특정 게임 삭제 기능 추가
taehee-kim-dev Apr 16, 2021
fd47d46
feat: Thymeleaf 의존성 추가
taehee-kim-dev Apr 16, 2021
035e162
refactor: board 기물 출력 기능 수정
taehee-kim-dev Apr 16, 2021
0c526c2
feat: 체스 보드 위에 마우스 올렸을 때 색깔 어두워지는 기능 추가
taehee-kim-dev Apr 16, 2021
6d4def3
refactor: 게임 삭제 컨트롤러 분리 추가
taehee-kim-dev Apr 17, 2021
4b521a3
fix: javascript move 전송 버그 수정
taehee-kim-dev Apr 17, 2021
a7f2391
refactor: 말 이동 기능 리팩토링
taehee-kim-dev Apr 17, 2021
2bf1fd9
refactor: 클래스 이름, 패키지 경로 수정
taehee-kim-dev Apr 17, 2021
6c17710
refactor: 사용하지 않는 파일 삭제
taehee-kim-dev Apr 17, 2021
aaa79c8
refactor: application.properties 수정
taehee-kim-dev Apr 17, 2021
86b1469
refactor: 사용하지 않는 파일 삭제
taehee-kim-dev Apr 17, 2021
aca18f2
feat: h2 database 설정
taehee-kim-dev Apr 17, 2021
940a470
feat: chess_game.sql 생성
taehee-kim-dev Apr 17, 2021
8d63a1b
refactor: 테스트 패키지 정리
taehee-kim-dev Apr 17, 2021
d28c672
refactor: ChessGameRepository 테스트 수정
taehee-kim-dev Apr 17, 2021
96fc045
refactor: ChessGame 테스트 수정, DB 테이블 스키마에서 각 팀 점수 컬럼 제거
taehee-kim-dev Apr 17, 2021
95797d6
refactor: 함수 접근제어자 범위 수정
taehee-kim-dev Apr 17, 2021
fc3fddf
refactor: 출발 위치 유효성 검사 테스트 수정
taehee-kim-dev Apr 17, 2021
66a2ab8
refactor: ChessGame에서 score 관련 필드 삭제
taehee-kim-dev Apr 17, 2021
34010f2
refactor: King이 잡혔는지 확인하는 테스트 수정
taehee-kim-dev Apr 17, 2021
f7c1c8c
refactor: 점수 계산 테스트 수정
taehee-kim-dev Apr 17, 2021
f79de16
refactor: 테스트용 유틸 클래스 PositionConverter, 테스트 수정
taehee-kim-dev Apr 17, 2021
ad0b2a5
refactor: 함수 이름 변경
taehee-kim-dev Apr 17, 2021
d0e14ad
refactor: 이동, 이동불가 검사 함수 수정
taehee-kim-dev Apr 17, 2021
ad80e6f
refactor: Rook 이동 테스트 수정
taehee-kim-dev Apr 17, 2021
3b521b2
refactor: Bishop 이동 테스트 수정
taehee-kim-dev Apr 17, 2021
8dd7e2a
refactor: Queen 이동 테스트 수정
taehee-kim-dev Apr 17, 2021
3ae44ab
refactor: King 이동 테스트 수정
taehee-kim-dev Apr 17, 2021
b328592
refactor: Knight 이동 테스트 수정
taehee-kim-dev Apr 17, 2021
5c98ecb
refactor: 흑 팀 Pawn 이동 테스트 수정
taehee-kim-dev Apr 17, 2021
8e2ed28
refactor: 백 팀 Pawn 이동 테스트 수정
taehee-kim-dev Apr 17, 2021
65c00e0
refactor: 사용하지 않는 파일 삭제
taehee-kim-dev Apr 17, 2021
79792bf
refactor: 위치 캐싱 테스트 수정
taehee-kim-dev Apr 17, 2021
32e64c5
refactor: 위치 테스트 수정
taehee-kim-dev Apr 17, 2021
d843179
refactor: 패키지 경로 수정
taehee-kim-dev Apr 17, 2021
7b3a973
refactor: 매개변수 수정
taehee-kim-dev Apr 17, 2021
48180de
refactor: Spring을 사용하지 않고 콘솔 게임을 실행하도록 수정
taehee-kim-dev Apr 17, 2021
d3ed969
refactor: 자동 포맷팅 적용
taehee-kim-dev Apr 17, 2021
b98144a
refactor: Application들 패키지 경로 이동
taehee-kim-dev Apr 17, 2021
c41518b
fix: 기물 이동 요청 JSON key값 수정
taehee-kim-dev Apr 17, 2021
eadccfc
feat: 사용하지 않는 설정 삭제
taehee-kim-dev Apr 17, 2021
28dad58
refactor: 패키지 이동
taehee-kim-dev Apr 17, 2021
124a189
feat: 테스트 sql logging level DEBUG로 설정
taehee-kim-dev Apr 17, 2021
f7ab3e1
refactor: DTO setter 삭제, DTO -> Dto 로 네이밍 변경
taehee-kim-dev Apr 18, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
17 changes: 17 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# ♟ java-chess
체스 게임 구현을 위한 저장소

<br>

## 1, 2단계 - Spring 적용하기

- [x] 모든 객체 Spring Bean으로 등록
- [x] 모든 객체 생성자 Bean 주입
- [x] Spark Java 제거
- [x] 정적 파일 경로 Spring에 맞게 이동
- [x] Controller에 Spring Web MVC 적용
- [x] DAO에 JdbcTemplate 적용
- [x] 테스트 Bean 주입 방식으로 수정
- [x] Profile로 Web, Console 개별 Bean 등록 설정

<br>
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ dependencies {

implementation 'net.rakugakibox.spring.boot:logback-access-spring-boot-starter:2.7.1'
implementation 'pl.allegro.tech.boot:handlebars-spring-boot-starter:0.3.1'
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'

testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation 'io.rest-assured:rest-assured:3.3.0'
Expand Down
17 changes: 17 additions & 0 deletions chess_game.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
create user 'inbi'@'localhost' identified by '1234';

grant all privileges on *.* to 'inbi'@'localhost';

flush privileges;

CREATE DATABASE chess_game DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;

use chess_game;

CREATE TABLE chess_game (
`chess_game_id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`title` VARCHAR(255) NOT NULL,
`board_status` VARCHAR(255) NOT NULL,
`current_turn_team_color` VARCHAR(255) NOT NULL,
PRIMARY KEY (`chess_game_id`)
);
11 changes: 11 additions & 0 deletions src/main/java/chess/ConsoleApplication.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package chess;

import chess.console.controller.ConsoleController;

public class ConsoleApplication {

public static void main(String[] args) {
ConsoleController consoleController = new ConsoleController();
consoleController.run();
}
}
22 changes: 0 additions & 22 deletions src/main/java/chess/SparkChessApplication.java

This file was deleted.

20 changes: 0 additions & 20 deletions src/main/java/chess/SpringChessApplication.java

This file was deleted.

12 changes: 12 additions & 0 deletions src/main/java/chess/WebApplication.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package chess;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class WebApplication {

public static void main(String[] args) {
SpringApplication.run(WebApplication.class, args);
}
}
86 changes: 86 additions & 0 deletions src/main/java/chess/console/controller/ConsoleController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
package chess.console.controller;

import chess.console.controller.dto.request.CommandRequestDto;
import chess.console.view.InputView;
import chess.console.view.OutputView;
import chess.domain.game.ChessGame;
import chess.web.controller.dto.response.GameStatusResponseDto;

public class ConsoleController {

private static final String START_COMMAND_INPUT = "start";
private static final String MOVE_COMMAND_INPUT = "move";
private static final String STATUS_COMMAND_INPUT = "status";
private static final String END_COMMAND_INPUT = "end";
private static final String GAME_NOT_STARTED_ERROR_MESSAGE = "게임을 먼저 시작해야 합니다.";

private ChessGame chessGame;

public void run() {
OutputView.printGameStartMessage();
boolean isGameEnd = false;
while (!isGameEnd) {
CommandRequestDto commandRequestDto = InputView.getCommandRequest();
GameStatus gameStatus = handleCommandAndGetGameStatus(commandRequestDto);
isGameEnd = gameStatus.isGameEnd();
}
}

private GameStatus handleCommandAndGetGameStatus(CommandRequestDto commandRequestDto) {
if (START_COMMAND_INPUT.equals(commandRequestDto.getCommandInput())) {
return start();
}
if (MOVE_COMMAND_INPUT.equals(commandRequestDto.getCommandInput())) {
return move(commandRequestDto);
}
if (STATUS_COMMAND_INPUT.equals(commandRequestDto.getCommandInput())) {
return status();
}
if (END_COMMAND_INPUT.equals(commandRequestDto.getCommandInput())) {
return new GameStatus(true);
}
throw new IllegalArgumentException("유효하지 않은 명령어 입니다.");
}

private GameStatus start() {
chessGame = new ChessGame();
printGameStatus();
return new GameStatus(false);
}

private void printGameStatus() {
GameStatusResponseDto gameStatusResponseDto = new GameStatusResponseDto(chessGame);
OutputView.printGameStatus(gameStatusResponseDto);
}

private GameStatus move(CommandRequestDto commandRequestDto) {
if (chessGame == null) {
System.out.println(GAME_NOT_STARTED_ERROR_MESSAGE);
return new GameStatus(false);
}
String startPositionInput = commandRequestDto.getStartPositionInput();
String destinationInput = commandRequestDto.getDestinationInput();
GameStatusResponseDto gameStatusResponseDto = movePiece(startPositionInput, destinationInput);
printGameStatus();
return new GameStatus(gameStatusResponseDto.isKingDead());
}

private GameStatusResponseDto movePiece(String startPositionInput, String destinationInput) {
try {
chessGame.movePiece(startPositionInput, destinationInput);
} catch (Exception e) {
System.out.println(e.getMessage());
}
return new GameStatusResponseDto(chessGame);
}

private GameStatus status() {
if (chessGame == null) {
System.out.println(GAME_NOT_STARTED_ERROR_MESSAGE);
return new GameStatus(false);
}
GameStatusResponseDto gameStatusResponseDto = new GameStatusResponseDto(chessGame);
OutputView.printScores(gameStatusResponseDto);
return new GameStatus(false);
}
}
14 changes: 14 additions & 0 deletions src/main/java/chess/console/controller/GameStatus.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package chess.console.controller;

public class GameStatus {

private final boolean isGameEnd;

public GameStatus(boolean isGameEnd) {
this.isGameEnd = isGameEnd;
}

public boolean isGameEnd() {
return isGameEnd;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package chess.console.controller.dto.request;

public class CommandRequestDto {
private final String commandInput;
private final String startPositionInput;
private final String destinationInput;

public CommandRequestDto(String commandInput, String startPositionInput,
String destinationInput) {

this.commandInput = commandInput;
this.startPositionInput = startPositionInput;
this.destinationInput = destinationInput;
}

public CommandRequestDto(String commandInput) {
this(commandInput, null, null);
}

public String getCommandInput() {
return commandInput;
}

public String getStartPositionInput() {
return startPositionInput;
}

public String getDestinationInput() {
return destinationInput;
}
}
79 changes: 79 additions & 0 deletions src/main/java/chess/console/view/InputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
package chess.console.view;

import chess.console.controller.dto.request.CommandRequestDto;
import java.util.Scanner;

public class InputView {
private static final Scanner SCANNER = new Scanner(System.in);
private static final String COMMAND_DELIMITER = " ";
private static final int COMMAND_INDEX = 0;
private static final int START_POSITION_INDEX = 1;
private static final int DESTINATION_INDEX = 2;
private static final int MOVE_COMMAND_FACTORS_SIZE = 3;
private static final int COMMAND_FACTORS_SIZE_EXCEPT_MOVE = 1;
private static final String START_COMMAND = "start";
private static final String MOVE_COMMAND = "move";
private static final String STATUS_COMMAND = "status";
private static final String END_COMMAND = "end";
private static final String INVALID_COMMAND_INPUT_ERROR_MESSAGE = "명령어를 잘못 입력했습니다.";

private InputView() {
}

public static CommandRequestDto getCommandRequest() {
try {
String commandLineInput = SCANNER.nextLine();
String[] splitCommandLineInput = commandLineInput.split(COMMAND_DELIMITER);
validateCommandLineFormat(splitCommandLineInput);
return parseCommandLineInput(splitCommandLineInput);
} catch (Exception e) {
System.out.println(e.getMessage());
return getCommandRequest();
}
}

private static void validateCommandLineFormat(String[] splitCommandLineInput) {
if (splitCommandLineInput[COMMAND_INDEX].equals(MOVE_COMMAND)) {
validateMoveCommandLineFormat(splitCommandLineInput);
return;
}
validateCommandLineFormatExceptMoveCommand(splitCommandLineInput);
}

private static void validateMoveCommandLineFormat(String[] splitCommandLineInput) {
if (splitCommandLineInput.length != MOVE_COMMAND_FACTORS_SIZE) {
throw new IllegalArgumentException(INVALID_COMMAND_INPUT_ERROR_MESSAGE);
}
}

private static void validateCommandLineFormatExceptMoveCommand(String[] splitCommandLineInput) {
if (splitCommandLineInput.length != COMMAND_FACTORS_SIZE_EXCEPT_MOVE) {
throw new IllegalArgumentException(INVALID_COMMAND_INPUT_ERROR_MESSAGE);
}
}

private static CommandRequestDto parseCommandLineInput(String[] splitCommandLineInput) {
String commandInput = splitCommandLineInput[COMMAND_INDEX];
if (commandInput.equals(MOVE_COMMAND)) {
return parseMoveCommandLineInput(splitCommandLineInput);
}
if (commandInput.equals(START_COMMAND)
|| commandInput.equals(STATUS_COMMAND)
|| commandInput.equals(END_COMMAND)) {
return parseCommandLineInputExceptMoveCommand(splitCommandLineInput);
}
throw new IllegalArgumentException(INVALID_COMMAND_INPUT_ERROR_MESSAGE);
}

private static CommandRequestDto parseMoveCommandLineInput(String[] splitCommandLineInput) {
String commandInput = splitCommandLineInput[COMMAND_INDEX];
String startPositionInput = splitCommandLineInput[START_POSITION_INDEX];
String destinationInput = splitCommandLineInput[DESTINATION_INDEX];
return new CommandRequestDto(commandInput, startPositionInput, destinationInput);
}

private static CommandRequestDto parseCommandLineInputExceptMoveCommand(String[] splitCommandLineInput) {
String commandInput = splitCommandLineInput[COMMAND_INDEX];
return new CommandRequestDto(commandInput);
}
}
43 changes: 43 additions & 0 deletions src/main/java/chess/console/view/OutputView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package chess.console.view;

import chess.web.controller.dto.response.GameStatusResponseDto;

public class OutputView {

private static final int BOARD_ALL_CELLS_SIZE = 64;
private static final int BOARD_WIDTH_SIZE = 8;

private OutputView() {
}

public static void printGameStartMessage() {
System.out.println("체스 게임을 시작합니다.");
System.out.println("게임 시작은 start, 종료는 end 명령을 입력하세요.");
}

public static void printGameStatus(GameStatusResponseDto gameStatusResponseDto) {
System.out.println();
for (int cellIndex = 0; cellIndex < BOARD_ALL_CELLS_SIZE; cellIndex++) {
printCellStatus(gameStatusResponseDto.getBoardStatus(), cellIndex);
}
if (!gameStatusResponseDto.isKingDead()) {
System.out.println("현재 " + gameStatusResponseDto.getCurrentTurnTeamColorName() + " 팀의 차례입니다.");
return;
}
System.out.println(gameStatusResponseDto.getBeforeTurnTeamColorName() + " 팀이 이겼습니다.");
}

private static void printCellStatus(String boardStatus, int cellIndex) {
System.out.print(boardStatus.charAt(cellIndex));
int cellOrder = cellIndex + 1;
if (cellOrder % BOARD_WIDTH_SIZE == 0) {
System.out.println();
}
}

public static void printScores(GameStatusResponseDto gameStatusResponseDto) {
double blackTeamScore = gameStatusResponseDto.getBlackPlayerScore();
double whiteTeamScore = gameStatusResponseDto.getWhitePlayerScore();
System.out.printf("흑 팀 점수 : %.1f, 백 팀 점수 : %.1f\n", blackTeamScore, whiteTeamScore);
}
}