-
코인 저장 로직 리팩토링 - 퀴즈와 연결스파르타코딩클럽/최종프로젝트 - DevQuiz 2024. 1. 19. 19:12
기존의 코인 저장 로직은 사실상 Mock과 다를게 없었다.
퀴즈를 풀었다가 선행되어야 코인 저장이 작동해야했는데 퀴즈보다 먼저 구현되었기 때문에
퀴즈와 연동하는 리팩토링이 필요했다.
먼저 기존에 서플라이어로 구현했던 로직을 switch문으로 변경하였다.
@Getter @NoArgsConstructor @AllArgsConstructor public enum CoinContent { // 문제 FIRST("SAVE", "FIRST", 20), CORRECT("SAVE","CORRECT", 10), FAIL("SAVE","FAIL", 5), PASS("SAVE","PASS", 0), USE("USE","USE", 0), // 아이템 ITEM_CAT("USE", "CAT", 25), ITEM_DOG("USE", "DOG", 45); private String status; private String content; private Integer coin; public static CoinContent matchingQuizStatus(UserQuizStatus status) { return switch (status) { case PASS -> PASS; case CORRECT -> CORRECT; case FAIL -> FAIL; default -> throw new CoinCustomException(CoinExceptionCode.BAD_REQUEST_INVALID_QUIZ_STATUS); }; } }
이번에도 switch문과 map 둘 중 어떤것을 택할지 고민했었는데
문제를 맞췄다 풀었다에 대한 status enum은 추후 기능이 확장되더라도 절대 변하지 않을 것이기 때문에
map보다 switch문을 사용하는것이 맞다고 생각하여 이대로 구현하였다.
또한 퀴즈 스테이터스를 받아오는 형식이기 때문에 서비스에서 따로 에러처리하던 것을 이 쪽으로 불러와서
서비스 쪽 코드를 훨씬 더 간결하게 만들 수 있었다.
@Getter @NoArgsConstructor @AllArgsConstructor @Schema(description = "코인 저장 요청 dto") public class CoinSaveRequest { @Schema(description = "저장 코인 용도", defaultValue = "CORRECT") private UserQuizStatus QuizStatus; }
리퀘스트Dto 또한 기존에 스스로 입력하던 status를 퀴즈쪽에서 바로 받아올 수 있도록 변경하였다.
@Transactional public void saveCoin(Long userId, CoinSaveRequest coinSaveRequest, User authUser) { userService.validateUser(authUser, userId); CoinContent coinContent = CoinContent.matchingQuizStatus(coinSaveRequest.getQuizStatus()); Coin coin = Coin.saveCoins(authUser, coinContent); // 사용시 유저 코인리스트 실시간 반영. 사용하지 않으면 유저가 직접 DB에서 불러와서 업데이트 authUser.getCoinList().add(coin); coinRepository.save(coin); }
그리고 퀴즈 서비스에도 로직을 연결해주면서 리팩토링을 어느정도 마무리 지을 수 있었다.
아래는 해당 로직 관련 트러블슈팅을 작성해보고자 한다.
'스파르타코딩클럽 > 최종프로젝트 - DevQuiz' 카테고리의 다른 글
리로이 젠킨스 CI/CD 구현 1 (0) 2024.01.25 도커파일부터 도커컴포즈까지 (1) 2024.01.21 도커 컴포즈와 CI/CD 구현 계획 (0) 2024.01.17 코인 획득 로직 구현에 대한 고민 (0) 2024.01.10 최종프로젝트 Dev.zip (0) 2024.01.08