Skip to content

Spring MVC, Spring JDBC, Cookie, 이벤트소싱

Notifications You must be signed in to change notification settings

bugoverdose/jwp-chess

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Spring Web Chess

  • Spring MVC, Spring JDBC
  • Cookie 기반 인증 (ft. hashing)
  • 이벤트 소싱 기반 데이터 관리

개발환경 셋업

  1. 도커 데스크탑 실행
  2. 해당 프로젝트의 /docker 경로에서 docker-compose -p 컨테이너명 up -d 실행
  3. 컨테이너가 정상적으로 생성되어 실행되고 있을 때 애플리케이션 실행
  4. 애플리케이션 종료 후 /docker 경로에서 docker-compose -p 컨테이너명 down 실행

디버깅

  • application.propertiesspring.datasource.url에 사용되는 포트정보(XXXX)에 별도의 프로그램이 실행되는 중인지 확인
  • 이러한 경우 XXXX의 값을 수정하고, docker-compose.ymlports 정보도 "XXXX:3306" 형식으로 수정 후 컨테이너 재생성

기능 요구사항

  • 기본 미션 : 체스 게임을 진행할 수 있는 방을 만들어서 동시에 여러 게임이 가능하도록 한다.
  • 추가 미션 : 멀티 게임 기능. 두 명의 플레이어가 함께 체스 게임을 참여하도록 한다.
    • 화면이 자동으로 갱신될 필요는 없다. (실시간 X)

홈 화면 "/"

  • 새로운 게임 버튼과 기존 게임들의 목록을 조회하는 버튼이 제공된다.
    • "새로운 게임 시작" 버튼을 누르면 "/game" 경로로 이동한다.
    • "기존 게임 재개" 버튼을 누르면 "/games" 경로로 이동한다.
  • 기본적으로 현재 생성된 게임의 개수와 현재 진행 중인 게임의 개수가 조회된다.

게임 생성 화면 "/game"

  • 체스방 이름과 비밀번호를 입력하면 새로운 체스 게임이 생성된다.
    • 입력된 비밀번호는 플레이어1(백색 진영)의 비밀번호가 된다.
    • 개별 체스 게임에는 고유 식별값 id가 부여된다.
    • 데이터베이스에는 비밀번호의 해쉬 값이 저장된다.
  • 체스방 생성 성공시, 해당 경로로 이동하며 계정에 해당하는 쿠키가 브라우저에 설정된다.
  • 생성하려는 방 이름과 중복되는 게임이 이미 존재하는 경우, 예외가 발생하며 알람이 뜬다.
  • 생성하려는 방의 비밀번호가 5글자 미만인 경우, 예외가 발생하며 알람이 뜬다.

체스방 목록 조회 화면 "/games"

  • 체스방 제목들로 구성된 목록이 제시된다.
  • 해당 게임에 참여하기 위해 비밀번호를 입력 받는다.
    • 플레이어1 혹은 플레이어2의 비밀번호가 입력된 경우, 브라우저에 인증을 위한 정보가 저장되며, 해당 체스방으로 이동한다.
    • 아직 플레이어2(흑색 진영)가 등록되지 않은 경우, 해당 비밀번호가 플레이어2의 비밀번호로 저장된다.
  • id를 검색하여 해당되는 게임으로 이동하는 폼도 제공된다.
    • id에 해당되는 게임이 존재하지 않는 경우 알람이 뜬다.
  • 기본적으로 현재 생성된 게임의 개수와 현재 진행 중인 게임의 개수가 조회된다.

게임 플레이 화면 "/game/:id"

  • 기본적으로 누구나 체스방에 접근할 수는 있다.
    • id에 대응되는 체스게임의 현재 상태가 화면에 제공된다.
    • 비밀번호를 입력하여 다시 로그인할 수 있는 폼이 화면에 별도로 제공된다.
  • 체스말을 클릭하고, 특정 체스칸을 클릭하면 해당 위치로 이동시키고자 시도한다.
    • 말을 움직일 때마다 클라이언트에 저장된 각 플레이어의 비밀번호도 함께 서버에 전달한다.
    • HTTP request header에 유효한 비밀번호 정보가 포함되지 않은 경우, 예외가 발생한다.
    • 현재 움직일 수 없는 진영의 플레이어의 비밀번호가 전달된 경우, 예외가 발생한다.
    • 선택된 체스말을 다시 클릭하면 선택이 해제된다.
    • 해당 체스말이 이동할 수 없는 위치거나, 현재 움직일 수 없는 상태인 경우 예외가 발생한다.
    • 이동에 실패하는 경우 알람에 그 이유가 제시된다.
  • 체스방 목록에서 체스방 제목을 클릭하면 체스 게임을 이어서 진행할 수 있다.
  • 게임이 종료된 경우 결과 조회 화면으로 이동하는 버튼이 제공된다.

결과 조회 화면 "/result/:id"

  • id에 대응되는 체스게임의 마지막 보드 상태와 점수 및 승자 정보가 화면에 제공된다.
  • 폼을 통해 체스방의 비밀번호를 입력받아 종료된 게임을 삭제할 수 있다.
    • 체스방의 비밀번호는 게임 생성시 설정한 비밀번호로 플레이어1의 비밀번호와 동일하다.
    • 입력된 비밀번호의 해쉬값은 DB에 저장된 해쉬값과 대조되어 삭제 가능 여부가 판단된다.
  • 진행중인 게임의 삭제는 불가능하다.
    • 서버에서도 종료된 게임에 대해서만 제거를 시도하며, 실패한 경우 예외를 발생시킨다.

프로그래밍 요구사항

  • 예외가 발생했을 때 사용자가 이해할 수 있는 명시적인 메시지를 응답한다.
  • 예상치 못한 예외가 발생한 경우 생성되는 디폴트 예외 메시지를 전송한다.

Releases

No releases published

Packages

No packages published

Languages

  • Java 92.2%
  • Handlebars 3.0%
  • JavaScript 2.7%
  • CSS 2.1%