- 다수의 사용자가 이용하는 게임과 관련된 서비스이기 때문에 추후 다른 기능들이 추가될 수 있음을 고려하면서 설계하려고 했습니다.
- 예를 들어, 회원이나 카드를 삭제할 때 DB에서의 완전히 삭제하지 않고 삭제여부를 관리하는 컬럼을 추가하였습니다.
- 이는 추후에 탈퇴한 회원 복구, 실수로 삭제한 카드 복구 등에 사용될 수 있습니다.
-
코드 스멜이나 버그 등을 최대한 줄이고 없애기 위해 sonarlint와 sonarqube를 사용하여 코드 품질을 높이려고 노력했습니다.
-
현재 서비스에서 가장 핵심이 되는 로직인 '레벨 갱신'을 위주로 테스트 코드를 작성하였습니다.
-
레벨 상승, 강등, 유지 등 다양한 경우의 수를 파악한 다음 이들에 테스트 코드를 작성하였습니다.
-
레밸 갱신 로직에서 '유효카드 개수'와 '서로 다른 게임 수'를 구하기 위해 매번 회원이 가진 모든 카드를 조회해야 합니다.
-
컬럼을 추가하여 두 변수를 따로 관리하면서 모든 카드를 조회하기 보다 해당 변수와 새로 추가한 카드만 확인하여 레벨 갱신 로직을 바꿀 것인지와 고민하다
-
'회원이 가지는 정보'에 두 변수에 대한 내용은 없어 추가하지 않았습니다.
-
외부 API(슬랙 알림)을 사용하기 위해 다양한 HTTP Client들을 두고 비교해보았습니다.
- RestTemplate
- Spring 5에서는 RestTemplate 대신 WebClient를 사용하는 것을 권장하기도 하고, 추후 업데이트 지원이 중단될 가능성이 있어 배제하였습니다.
- RestClient
- Spring 6.1, Spring Boot 3.2부터 도입된 새로운 동기식 HTTP 호출 도구입니다.
- 코드를 더 읽기 쉽고 자연스러운 방식으로 작성할 수 있어서 선택하였습니다.
- RestTemplate
요구사항 정리
-
게임 토너먼트를 참여하려면 회원이어야 한다.
-
메인 페이지는 현재 가입된 모든 회원의 정보를 테이블 형태로 조회할 수 있다.
-
메인 페이지는 새로운 회원을 등록하는 화면으로 이동하는 버튼이 있다.
-
메인 페이지는 등록된 회원을 조회하는 화면으로 이동하는 버튼이 있다.
-
회원 정보 화면에서는 보유한 게임 카드 목록을 확인할 수 있다.
-
더 이상 보유하지 않은 카드는 목록에서 제거할 수 있다.
-
회원은 보유하고 있는 카드 정보를 등록(추가)할 수 있다.
-
회원은 보유하고 있는 카드 정보에 따라 레벨을 부여 받는다.
-
회원은 레벨 별로 참여할 수 있는 토너먼트가 결정된다.
-
회원은 고유한 ID를 가진다.
-
회원은 이름, 이메일 가입일 등 필수 정보를 이용하여 등록한다.
-
회원의 이름은 2자리 이상 100자리 이하의 문자이다
-
회원의 이름은 공백을 포함할 수 있다.
-
회원의 이름은 전체가 공백일 수는 없다.
-
회원의 이메일은 바른 이메일 형식이다.
-
회원의 이메일은 중복될 수 없다.
-
회원의 가입일자는 시스템 등록일부터 이전 1년 이내의 날짜만 허용한다.
-
회원은 게임 카드 숫자, 게임 카드 금액, 레벨 정보를 가진다.
-
회원의 게임 카드 숫자는 등록한 카드의 총 개수이다.
-
회원의 게임 카드 개수는 0 또는 그 이상의 정수이다.
-
회원의 게임 카드 금액은 등록된 카드 가격의 총 합계이다.
-
회원의 게임 카드 금액은 달러 단위이다.
-
회원의 게임 카드 금액은 센트 단위로 등록할 수 있다.
-
회원의 게임 카드 금액은 소숫점 이하 2자리까지 사용하고 나머지는 반올림한다.
-
회원의 게임 카드 금액은 0 또는 그 이상의 소숫점 2자리까지 존재하는 실수이다.
-
회원의 레벨은 Bronze, Silver, Gold 세 가지 중 하나이다.
-
회원의 레벨은 최초 회원 등록, 카드 등록, 카드 삭제 시에 변경될 수 있다.(임의 변경 불가)
-
회원은 최초 레벨 부여, 레벨 변경(Up, Down) 시 API를 통해 변경 통보를 받는다.
-
카드는 고유한 ID를 가진다.
-
카드는 생성과 삭제만 가능하다.
-
카드는 게임 종류, 타이틀, 일련번호, 가격 정보를 이용해 등록한다.
-
카드의 게임 종류는 매직 더 게더링, 유희왕, 포켓몬 세 가지 중 하나이다.
-
카드의 타이틀은 1글자 이상 100글자 이하의 문자이다.
-
카드의 타이틀은 전체가 공백일 수는 없다.
-
카드의 일련번호는 1 또는 그 이상의 숫자이다.
-
카드의 일련번호는 같은 게임 내에서만 고유하다.(카드의 일련번호는 다른 게임과는 중복일 수 있다.)
-
카드의 가격은 0 또는 100,000 이하의 소숫점 2자리까지 존재하는 실수이다.
-
카드의 가격은 입력 시 소숫점 제한이 없다.
-
카드의 가격은 등록 시 3번째 자리에서 반올림하여 저장/표시 한다.
-
게임은 고유한 ID를 가진다.
-
게임은 게임명 정보를 가진다.
-
게임은 매직 더 게더링, 유희왕, 포켓몬 세 가지가 등록되어 있다.
-
게임의 게임명은 사전 등록되어있는 것만 사용한다.
-
게임의 게임명은 클럽 관리자가 수정할 수 없다.
-
가격이 0보다 큰 카드를 유효 카드라고 한다.
-
가격이 0인 카드를 무료 카드라고 한다.
-
Gold 레벨은 0보다 큰 가격의 카드가 4개 이상이거나, 2-3개 카드의 가격의 합계가 $100달러를 초과하는 경우 부여한다.
-
Gold 레벨은 2가지 이상의 다른 게임 카드로 구성되어 있다.(한 가지 게임 카드만 존재하면 Gold 불가)
-
Silver 레벨은 Gold 레벨이 아니면서 1장 이상의 0보다 큰 가격의 카드를 지닌 경우 부여한다.
-
Bronze 레벨은 최초 가입 시점에 부여하고, Silver 이상이 아닌 모든 회원에게 부여한다.