-
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
[라빈] 체스 웹/DB 미션 제출합니다 #133
Merged
Merged
Changes from all commits
Commits
Show all changes
82 commits
Select commit
Hold shift + click to select a range
67ceea2
doc: 체스 1단계 기능 요구 사항 정리
giantim eee6977
feat: 위치 구현
giantim a49d949
feat: 가로 축 구현
giantim 16267b5
feat: 보드판 초기화
giantim 9d82c72
feat: 체스 게임을 시작하는 명령어 입력
giantim 3dcf3f9
feat: 이동 전략 구현
b0392f3
feat: 폰의 이동 전략과 팀별 이동 전략
giantim 08ab69b
feat: 말 이동 시 장애물 탐색
giantim 1d69dbf
feat: 방향 전략 구현
c6fd4f6
feat: 2단계 구현
giantim b757656
feat: 왕이 죽었을 때 승리한 팀 출력
giantim 202d590
feat: 왕이 죽었을 때 게임 종료
giantim 622ee0a
feat: status 명령어 입력 시 점수 계산
6a94761
feat: 3단계 기능 구현
giantim fdc9cfa
doc: README 업데이트
giantim fb4d0af
refactor: 세부 네이밍 수정
236e066
refactor: 방향 전략 생성 분기문 삭제
bf61f63
refactor: 테스트 코드 디렉토리 추가
giantim 9d29cfd
refactor: 테스트 코드 추가
giantim db9009f
refactor: 변경되면 안되는 매개 변수, 클래스에 final 키워드 추가
giantim fd4d688
refactor: 컨트롤러의 실행 메서드를 명령어 별로 분리
giantim 6f15464
refactor: DirectionStrategy 의 구현 클래스들의 테스트 코드 추가
giantim 31e70ae
refactor: 컨트롤러 추상화
giantim a1f1431
refactor: 컨트롤러 추상화(2)
giantim 7bd04ff
refactor: 1차 수정
giantim 8888b08
refactor: Dto 추가 / ChessRunner 에서 Dto 에 적합한 값을 넘겨주도록 메서드 수정
giantim 08cbd73
refactor: 게임 종료 경우에 따라 점수 출력 로직 구현 / 객체 null 반환을 Optional 을 이용하도록 변경 …
giantim 12de745
Merge branch 'mission1' into home
giantim a6b5b67
Merge pull request #1 from giantim/home
giantim bdf1a0a
refactor: 수정한 클래스에 맞게 테스트 코드 추가
giantim 74a6cd1
feat: index 페이지 제작
giantim 3fcd39d
feat: index 에서 start 를 누르면 game 으로 이동되도록 구현
giantim 96bfcc5
feat: 체스판에 말 띄우기
giantim 46d168e
feat: 보드 위에 말 출력
giantim 89f7a6a
feat: 웹에서 상태 출력 / 종료 기능 구현
giantim 9f2711e
refactor: 이동을 못하는 버그 수정
giantim 02de889
Merge pull request #2 from giantim/mission1
giantim 28cbe8d
refactor: 웹에서 이동 기능 구현
giantim e0628cb
refactor: 에러 로그, 이동 경로 출력 버그 수정
giantim f33689e
Merge pull request #3 from giantim/web
giantim 51b12f0
refactor: 프로그램 실행 시 재귀 로직 제거 / 테스트 메서드를 작은 단위 테스트로 분리 / 승자가 결정되지 않았을 …
giantim 48d1654
Merge branch 'mission2' into web-chess
giantim 8ccb3fc
Merge pull request #4 from giantim/web-chess
giantim dd4951d
refactor: 웹에서 점수 출력 시 black, white 둘 다 출력 되도록 변경 / 왕을 잡아서 게임이 끝날 시 종료…
giantim 80f6821
refactor: 콘솔에서 status 명령 입력 시 양 팀의 점수 모두 계산해 출력 / 컨벤션 수정 / 상수 추출
giantim fec5fe5
feat: ChessBoard 추가 테스트
giantim 130853c
feat: 가장 최근에 추가된 ChessBoard 찾는 기능 추가
giantim d435afa
feat: 가장 최근에 추가 된 ChessBoard 삭제 기능 구현
giantim 254c5ed
feat: 피스 정보 추가, 업데이트, 삭제 구현
giantim cafcd69
feat: 데이터베이스에서 피스 정보 불러오기 - (1)
giantim 4ca0307
feat: db 에서 읽은 값으로 각 피스 초기화
giantim 8990ebb
feat: 현재 팀 정보 데이터베이스에 저장 구현
giantim 72a35ba
feat: 게임 시작 또는 체스 게임 불러오기 기능 구현
giantim b1ce5b9
feat: 이동 후의 결과 데이터베이스에 업데이트 구현(포지션 이름 매핑 수정필요)
giantim 89c93db
feat: 이동 후에 정보를 저장해 서버 종료 후에도 게임 진행 가능하게 구현
giantim f4efb98
feat: end 버튼 누를 시 양 팀의 점수를 계산해서 보여주고 종료 / 한 팀이 다른 팀의 왕을 잡았을 때 데이터 베이스…
giantim fd4d78e
refactor: 웹의 체스 보드의 각 칸마다 위치 값 표시
giantim a2c8745
refactor: 불필요한 Piece 정보 수정 메서드 삭제 / 컨벤션 수정 / 테스트 코드에 맞게 데이터 형식 변경
giantim ca89964
feat: 플레이어 입력, 게임 방을 위한 뷰 구현
giantim 352729a
feat: 플레이어 정보 저장, 검색, 삭제 기능 구현
giantim f6ae741
feat: 기존의 게임 정보 불러오기 구현
giantim f46bc67
feat: 게임 목록에서 불러오기 기능 구현(1)
giantim 3fef558
feat: 게임 목록에서 불러오기 기능 구현(2) - 데이터 불러오기 기능 구현
giantim 2e747b9
feat: 종료 기능 구현
giantim 6fe417b
refactor: DAO 의 코드 수정 / 연결하는 DB 변경
giantim 23b2f34
refactor: Service Layer 추가 / DAO, DTO 패키지 이동
giantim 44888f8
refactor: DAO 에 try-with-resources 적용
giantim c21faed
refactor: service layer 추가
giantim 65e1171
refactor: controller 에 dao 를 이용하는 역할 제거
giantim a358f99
refactor: piece -> pieceOnBoard 모델로 변경
giantim d1bbe30
refactor: 신규 게임 시작 기능 수정
giantim 9530093
refactor: controller 의 기능을 Service layer 로 분리
giantim a3629ac
refactor: Optional 객체의 null 검사 로직 추가
giantim 7cdbc88
refactor: 메서드 위치 수정
giantim 4360c88
Merge pull request #5 from giantim/web-chess
giantim e145ae0
refactor: ResultSet, PreparedStatement 닫는 구문 추가
giantim 3a7ba78
refactor: 체스 게임 화면에 현재 진행중인 게임 id 출력하게 변경
giantim 5d5d8c5
refactor: 서비스 내의 상태를 갖는 객체의 생명주기를 메서드 단위로 수정
giantim df0e3ed
refactor: DAO 가 도메인 자료 구조를 사용하도록 변경
giantim f25d61b
refactor: TileDTO, BoardScoreDTO 의 setter 메서드 삭제
giantim 5170429
refactor: SQLException 에 대한 Custom RuntimeException 을 만들어서 예외 페이지 출력
giantim e5b625f
refactor: findFirst 를 Optional 로 래핑한 부분 수정
giantim File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,22 +1,13 @@ | ||
package chess; | ||
|
||
import spark.ModelAndView; | ||
import spark.template.handlebars.HandlebarsTemplateEngine; | ||
import chess.controller.WebChessController; | ||
|
||
import java.util.HashMap; | ||
import java.util.Map; | ||
|
||
import static spark.Spark.get; | ||
import static spark.Spark.staticFiles; | ||
|
||
public class WebUIChessApplication { | ||
public static void main(String[] args) { | ||
get("/", (req, res) -> { | ||
Map<String, Object> model = new HashMap<>(); | ||
return render(model, "index.html"); | ||
}); | ||
} | ||
|
||
private static String render(Map<String, Object> model, String templatePath) { | ||
return new HandlebarsTemplateEngine().render(new ModelAndView(model, templatePath)); | ||
staticFiles.location("/templates"); | ||
WebChessController webChessController = new WebChessController(); | ||
webChessController.playChess(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,19 +1,27 @@ | ||
package chess.controller; | ||
|
||
import chess.controller.dto.BoardScoreDto; | ||
import chess.controller.dto.TeamDto; | ||
import chess.domain.ChessRunner; | ||
import chess.dto.BoardScoreDTO; | ||
|
||
import java.util.List; | ||
import java.util.stream.Collectors; | ||
|
||
public class StatusController extends GameController { | ||
private static final String DELIMITER = ": "; | ||
private static final String NEW_LINE = "\n"; | ||
|
||
public StatusController() { | ||
super(); | ||
} | ||
|
||
@Override | ||
public void execute(ChessRunner chessRunner, String input) { | ||
BoardScoreDto boardScoreDto = new BoardScoreDto(chessRunner.calculateScore()); | ||
TeamDto teamDto = new TeamDto(chessRunner.getCurrentTeam()); | ||
outputView.printStatus(boardScoreDto.getBoardScore(), teamDto.getTeamName()); | ||
List<BoardScoreDTO> boardScoreDtos = chessRunner.calculateScores(); | ||
String scores = boardScoreDtos.stream() | ||
.map(dto -> dto.getTeam() + DELIMITER + dto.getBoardScore()) | ||
.collect(Collectors.joining(NEW_LINE)); | ||
|
||
outputView.printStatus(scores); | ||
printBoard(chessRunner.getBoardEntities()); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,181 @@ | ||
package chess.controller; | ||
|
||
import chess.dao.ChessBoard; | ||
import chess.dao.CustomSQLException; | ||
import chess.dao.Player; | ||
import chess.dto.MoveResultDTO; | ||
import chess.dto.TeamDTO; | ||
import chess.dto.TileDTO; | ||
import chess.service.ChessService; | ||
import spark.ModelAndView; | ||
import spark.template.handlebars.HandlebarsTemplateEngine; | ||
|
||
import java.util.HashMap; | ||
import java.util.List; | ||
import java.util.Map; | ||
|
||
import static spark.Spark.get; | ||
import static spark.Spark.post; | ||
|
||
public class WebChessController { | ||
private ChessService chessService; | ||
|
||
public void playChess() { | ||
this.chessService = new ChessService(); | ||
|
||
get("/", (req, res) -> { | ||
Map<String, Object> model = new HashMap<>(); | ||
|
||
return render(model, "index.html"); | ||
}); | ||
|
||
post("/name", (req, res) -> { | ||
Map<String, Object> model = new HashMap<>(); | ||
|
||
return render(model, "name.html"); | ||
}); | ||
|
||
post("/load", (req, res) -> { | ||
Map<String, Object> model = new HashMap<>(); | ||
|
||
try { | ||
List<Player> players = this.chessService.players(); | ||
|
||
model.put("gameData", players); | ||
|
||
return render(model, "table.html"); | ||
} catch (CustomSQLException e) { | ||
model.put("errMessage", e.getMessage()); | ||
return render(model, "error.html"); | ||
} | ||
}); | ||
|
||
post("/newGame", (req, res) -> { | ||
Map<String, Object> model = new HashMap<>(); | ||
|
||
String whitePlayer = req.queryParams("white-player"); | ||
String blackPlayer = req.queryParams("black-player"); | ||
|
||
try { | ||
Player player = new Player(whitePlayer, blackPlayer); | ||
this.chessService.newGame(player); | ||
List<TileDTO> tileDtos = this.chessService.getTiles(); | ||
TeamDTO teamDto = this.chessService.getCurrentTeam(); | ||
ChessBoard chessBoard = this.chessService.getRecentChessBoard(); | ||
|
||
model.put("tiles", tileDtos); | ||
model.put("currentTeam", teamDto); | ||
model.put("player", player); | ||
model.put("chessBoard", chessBoard); | ||
|
||
return render(model, "game.html"); | ||
} catch (CustomSQLException e) { | ||
model.put("errMessage", e.getMessage()); | ||
return render(model, "error.html"); | ||
} | ||
}); | ||
|
||
post("/continueGame", (req, res) -> { | ||
Map<String, Object> model = new HashMap<>(); | ||
|
||
int chessBoardId = Integer.parseInt(req.queryParams("chess-board-id")); | ||
|
||
try { | ||
this.chessService.continueGame(chessBoardId); | ||
List<TileDTO> tileDtos = this.chessService.getTiles(); | ||
TeamDTO teamDto = this.chessService.getCurrentTeam(); | ||
Player player = this.chessService.getPlayer(chessBoardId); | ||
ChessBoard chessBoard = new ChessBoard(chessBoardId); | ||
|
||
model.put("tiles", tileDtos); | ||
model.put("currentTeam", teamDto); | ||
model.put("player", player); | ||
model.put("chessBoard", chessBoard); | ||
|
||
return render(model, "game.html"); | ||
} catch (CustomSQLException e) { | ||
model.put("errMessage", e.getMessage()); | ||
Comment on lines
+96
to
+97
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. 그냥 모든 예외를 잡아 처리하도록 하여 |
||
return render(model, "error.html"); | ||
} | ||
}); | ||
|
||
post("/move", (req, res) -> { | ||
Map<String, Object> model = new HashMap<>(); | ||
|
||
int chessBoardId = Integer.parseInt(req.queryParams("chess-board-id")); | ||
String source = req.queryParams("source"); | ||
String target = req.queryParams("target"); | ||
|
||
try { | ||
MoveResultDTO moveResultDto = this.chessService.move(chessBoardId, source, target); | ||
List<TileDTO> tileDtos = this.chessService.getTiles(); | ||
TeamDTO teamDto = this.chessService.getCurrentTeam(); | ||
Player player = this.chessService.getPlayer(chessBoardId); | ||
ChessBoard chessBoard = new ChessBoard(chessBoardId); | ||
|
||
model.put("tiles", tileDtos); | ||
model.put("currentTeam", teamDto); | ||
model.put("message", moveResultDto.getMessage()); | ||
model.put("style", moveResultDto.getStyle()); | ||
model.put("player", player); | ||
model.put("chessBoard", chessBoard); | ||
|
||
if (this.chessService.isEndGame()) { | ||
this.chessService.deleteChessGame(chessBoardId); | ||
return render(model, "end.html"); | ||
} | ||
return render(model, "game.html"); | ||
} catch (CustomSQLException e) { | ||
model.put("errorMessage", e.getMessage()); | ||
return render(model, "error.html"); | ||
} | ||
}); | ||
|
||
post("/status", (req, res) -> { | ||
Map<String, Object> model = new HashMap<>(); | ||
|
||
int chessBoardId = Integer.parseInt(req.queryParams("chess-board-id-status")); | ||
|
||
try { | ||
List<TileDTO> tileDtos = this.chessService.getTiles(); | ||
TeamDTO teamDto = this.chessService.getCurrentTeam(); | ||
String message = this.chessService.getScores(); | ||
Player player = this.chessService.getPlayer(chessBoardId); | ||
ChessBoard chessBoard = new ChessBoard(chessBoardId); | ||
|
||
model.put("tiles", tileDtos); | ||
model.put("currentTeam", teamDto); | ||
model.put("message", message); | ||
model.put("player", player); | ||
model.put("chessBoard", chessBoard); | ||
|
||
return render(model, "game.html"); | ||
} catch (CustomSQLException e) { | ||
model.put("errorMessage", e.getMessage()); | ||
return render(model, "error.html"); | ||
} | ||
}); | ||
|
||
post("/end", (req, res) -> { | ||
Map<String, Object> model = new HashMap<>(); | ||
|
||
int chessBoardId = Integer.parseInt(req.queryParams("chess-board-id-end")); | ||
|
||
try { | ||
this.chessService.deleteChessGame(chessBoardId); | ||
String message = this.chessService.getScores(); | ||
|
||
model.put("message", message); | ||
|
||
return render(model, "end.html"); | ||
} catch (CustomSQLException e) { | ||
model.put("errorMessage", e.getMessage()); | ||
return render(model, "error.html"); | ||
} | ||
}); | ||
} | ||
|
||
private static String render(Map<String, Object> model, String templatePath) { | ||
return new HandlebarsTemplateEngine().render(new ModelAndView(model, templatePath)); | ||
} | ||
} |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
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.
Optional.get은 직접적으로 사용되지 않는게 좋아요.