-
코인 획득 로직 구현에 대한 고민스파르타코딩클럽/최종프로젝트 - DevQuiz 2024. 1. 10. 23:23
Dev Quiz에서
문제를 풀었을때 얻는 리워드들을 구현하는 역할을 맡게 되어 로직에 대한 고민이 많았다.그동안은 간단한 CRUD에서 파생된 기능들만을 구현했으나 이번엔 전혀 다른 느낌이라 생각보다
첫 시도가 어려웠다.
Quiz를 풀면 랭킹에 적용되는 score와 재화를 구매(미구현)할 수 있는 coin을 지급받게 된다.
문제를 풀 때마다 둘 다 같은 양을 지급받게 되도록 설계하였다.
그래서 enum으로 관리하기로 하였으며
FIRST : 매일 첫문제를 풀면 20
CORRECT : 그 후 문제를 풀어 정답일 경우 10
FAIL : 문제를 풀어 틀렸을 경우 5
PASS : 문제에 정답을 체크하지 않고 그냥 넘겼을 경우 0
으로 계산하였다.
구현방식은 처음엔 2가지(Switch, Map) 만 고려하였으나,
Map에 관해 검색 중 람다 Supplier에 대해 알게 되어 이 또한 추가해보았다.
각 코드의 특징은 다음과 같다
1. Switch
가장 쉬운 방법이지만
가독성이 떨어지고 유지보수가 어려울 수 있다.
만약 문제에 대한 새로운 상태가 생긴다면 수정할 곳이 많다.
Coin coin: switch (saveCoinRequest.getCoinContent()){ case FIRST: coin = coin.builder().coin(CoinContent.FIRST.getCoins()).build(); break; case CORRECT: coin = coin.builder().coin(CoinContent.CORRECT.getCoins()).build(); break; case FAIL: coin = coin.builder().coin(CoinContent.FAIL.getCoins()).build(); break; case PASS: coin = coin.builder().coin(CoinContent.PASS.getCoins()).build(); break; default: throw new CoinCustomException(에러 던지기) } coinRepository.save(coin);
2. Map
switch문보다 가독성이 좋아지고,
각 상태에 대한 로직을 직접 연결할 수 있다.
또한 새로운 상태 추가시에 Map에서만 항목을 추가하면 돌아가기 때문에 확장이 쉽다.
Map<CoinContent, Long> coinContentToCoinMap = new HashMap<>(); coinContentToCoinMap.put(Status.FIRST, CoinContent.FIRST.getCoins()); coinContentToCoinMap.put(Status.CORRECT, CoinContent.CORRECT.getCoins()); coinContentToCoinMap.put(Status.FAIL, CoinContent.FAIL.getCoins()); coinContentToCoinMap.put(Status.PASS, CoinContent.PASS.getCoins()); Long getCoin = coinContentToCoinMap.get(saveCoinRequest.getCoin()); if (getCoin == null) { throw new 에러던지기; } Coin coin = Coin.builder().coin(getCoin).build(); coinRepository.save(coin);
3. 람다 Fuction의 Supplier
Map과 같은 장점에 람다를 쓸 수 있다는 장점이 추가되었다.
책에서만 보고. 처음 써보는 것이기에 한번 써보기로 하였다.
제목을 지을때만 해도 람다에 대한 어떤 의미를 담아서 반전을 주려하였으나
쓰다보니 결국 어그로가 되어버렸다.
'스파르타코딩클럽 > 최종프로젝트 - DevQuiz' 카테고리의 다른 글
리로이 젠킨스 CI/CD 구현 1 (0) 2024.01.25 도커파일부터 도커컴포즈까지 (1) 2024.01.21 코인 저장 로직 리팩토링 - 퀴즈와 연결 (0) 2024.01.19 도커 컴포즈와 CI/CD 구현 계획 (0) 2024.01.17 최종프로젝트 Dev.zip (0) 2024.01.08