Skip to content

추첨 및 포인트

TodayIsYolo edited this page May 20, 2022 · 6 revisions

📌추첨 및 포인트 CRUD

✔️포인트 지급 및 하루에 포인트, 추첨 관련 횟수 제한

게시글, 댓글 작성 수에는 제한이 없음

  • 게시글 작성 500p : 하루 1회만 획득 가능
  • 댓글 작성 100p : 하루 5회만 획득 가능
  • 추첨 -1000p : 하루 1회 제한

포인트 지급 및 카운트 감소는 하나의 메서드에 모아 state에 따라 분리함

   @Transactional
    public int pointChange(Point point, String state){

        int myPoint = point.getMyPoint();
        int postCount = point.getPostCount();
        int commentCount = point.getCommentCount();
        int lottoCount = point.getLottoCount();

        if(state=="POST_POINT"){
            myPoint+=500;
            postCount--;
        } else if(state=="COMMENT_POINT"){
            myPoint+=100;
            commentCount--;
        } else if(state=="LOTTO_POINT"){
            myPoint-=1000;
            lottoCount--;
        }

        point.update(myPoint, postCount,commentCount,lottoCount);

        return myPoint;
    }

✔️추첨 확률 조정

하루에 5개씩 약 10%의 확률로 당첨 되도록 구현 랜덤한 수를 100까지 나오도록 설정하고 그 중 10%의 범위인 0~9의 숫자가 나오면 당첨 되도록 함

    public boolean getLotResult(User user) {
        System.out.println(bananaCount);
        if(bananaCount>0){
            Random r = new Random();
            boolean result = false;
            int temp = 0;

            temp = r.nextInt(100);
            System.out.println(temp);

            //당첨 시:당첨 확률 10%
            if (temp >= 0 && temp < 10) {
                result = true;
                bananaCount--;
                Lot lot = new Lot(user);
                lotRepository.save(lot);
            }

            return result;
        } else {
            System.out.println("바나나 없음");
            return false;
        }
    }

✔️스케쥴러를 활용하여 하루마다 포인트 얻을 수 있는 횟수 및 추첨 횟수 초기화

스케쥴러를 이용해 매일 저녁 12시에 추첨 카운트 및 포인트 획득할 수 있는 횟수를 초기화

// 초, 분, 시, 일, 월, 주 순서
    @Scheduled(cron = "0 0 0 * * *")
    public void updateCount(){
        System.out.println("횟수 리셋");
        //TimeUnit.SECONDS.sleep(1);
        // 저장된 모든 유저 포인트 조회
        LotService.bananaCount =5;
        pointService.countReset();

    }

✔️추천인 기능

추천인 입력시 추천인에게는 1000p, 회원가입자에게는 500p 지급

    //추천인 입력
    @Transactional
    public NicknameSignupResponseDto getEventPoint(NicknameSignupRequestDto nicknameSignupRequestDto, User user) {
        //추천인을 적었다면
        if (nicknameSignupRequestDto.getRecommender() != null && !Objects.equals(nicknameSignupRequestDto.getRecommender().trim(), "")) {
            User recommender = userRepository.findByNickname(nicknameSignupRequestDto.getRecommender()).orElseThrow(
                    () -> new CustomException(NOT_FOUND_RECOMMENDER)
            );

            if(nicknameSignupRequestDto.getRecommender().equals(user.getNickname())){
                throw new CustomException(CANNOT_RECOMMEND_YOURSELF);
            }

            Point userPoint = user.getPoint();
            Point recommenderPoint = recommender.getPoint();

            userPoint.eventPoint(userPoint.getMyPoint() + 500);
            recommenderPoint.eventPoint(recommenderPoint.getMyPoint() + 1000);
        }
        return new NicknameSignupResponseDto(user.getPoint());
    }

💥 트러블 슈팅

🔍 문제:

닉네임과 추천인을 입력하는 부분에서 로컬에서는 닉네임 입력시 추천인을 넣지 않아도 잘 되던 것이 프론트와 연동하니 추천인을 넣지 않으면 닉네임 등록이 되지 않는 문제 발생.

* 문제 원인:

회원가입 후 닉네임을 입력하다보니 닉네임 입력 전에는 유저가 모두 ""라는 동일한 닉네임을 가지고 있음. 이로인해 추천인 입력부분에서 ""라는 추천인을 찾게 되어 에러 발생.

* 해결 방법:

아래의 코드를 추가하여 ""인 경우 추천인을 찾지 않도록 변경함.

 if (nicknameSignupRequestDto.getRecommender() != null && !Objects.equals(nicknameSignupRequestDto.getRecommender().trim(), "")) {
            User recommender = userRepository.findByNickname(nicknameSignupRequestDto.getRecommender()).orElseThrow(
                    () -> new CustomException(NOT_FOUND_RECOMMENDER)
            );