ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 코인 획득 로직 구현에 대한 고민
    스파르타코딩클럽/최종프로젝트 - 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과 같은 장점에  람다를 쓸 수 있다는 장점이 추가되었다.

    책에서만 보고.  처음 써보는 것이기에  한번 써보기로 하였다. 

     

     


     

     

    제목을 지을때만 해도 람다에 대한 어떤 의미를 담아서 반전을 주려하였으나

     

    쓰다보니 결국 어그로가 되어버렸다.

Designed by Tistory.