Skip to content

Commit

Permalink
[Feat] 추첨 페이지 접속 api 구현 (#59)
Browse files Browse the repository at this point in the history
* infra: 빌드 테스트 yml 작성

* infra: DB 정보 추가

* infra: ssh-agent 버전 변경

* infra: known_hosts 추가

* infra: db port 변경

* infra: database test 설정 변경

* infra: DB 환경변수 설정 및 application.yml 생성

* infra: application.yml 동적 생성 스크립트 수정

* infra: 레디스 설정 추가

* infra: redis test 추가

* infra: redis 버전 변경

* infra: redis cli 설치

* infra: application.yml 위치 및 내용 확인

* infra: Github Actions 환경변수에 REDIS_HOST, REDIS_PORT 추가

* infra: 환경변수 확인 추가

* feat: draw_rank column 이름 수정

* infra: pull_request시 Github Actions 동작하도록 수정

* Feat: 추첨 게임 설정을 위한 DrawSetting 클래스 추가

* Feat: 추첨 게임 설정을 위한 DrawSettingRepository 추가

* Feat: 추첨 정보가 없는 경우의 에러 스테이터스 추가

* Feat: 당첨되지 않았을 경우의 반환값 추가

* Feat: 당첨되었을 경우의 반환값 추가

* Feat: 추첨 정보 api 일부 구현

- 추첨 게임 설명 정보 가져오기 구현
- 랜덤한 정수를 이용해 등수 결정하기 구현

* Feat: draw 관련 로직 처리하는 DrawUtil 클래스 생성

- 당첨 이미지 생성 메소드
- 낙첨 이미지 생성 메소드

* Feat: 추첨 이벤트 응답 dto 생성

- 당첨 응답 dto 생성
- 낙첨 응답 dto 생성
- interface implement 하도록 구현

* Feat: DrawUtil 구현

- 당첨자 수를 이용해 생성자 구현
- 난수를 이용해 등수 설정
- 난수를 이용해 당첨자의 이미지 방향 결정
- 당첨자 이미지 만들어서 반환하는 메소드 구현
- 당첨자 WinModal 반환하는 메소드 구현
- 낙첨자 LoseModal 반환하는 메소드 구현

* Feat: DrawUtil을 이용해 응답 dto 생성하도록 구현

* Feat: 공유 url에 관련된 Exception 추가

* Feat: 공유 url 테이블의 repository 추가

- userId를 이용해 공유 url 조회하는 메소드 추가

* Feat: 공유 url 테이블 Entity 추가

* Feat: 공유 url 조회하여 LoseModal에 추가해주는 로직 추가

* Feat: javadoc을 위한 주석 작성

* refactor: TODO 주석 삭제

* refactor: 메소드 이름 변경

- getParticipantCount -> getData

- setParticipantCount -> setData

* refactor: 메소드 이름 변경

- getParticipantCount -> getData

* refactor: 메소드 이름 변경

- getParticipantIds -> getAllDataAsSet

* refactor: 메소드 이름 변경

- getParticipantIds -> getAllDataAsSet

* feat: DRAW_TEMP_PREFIX 추가

* refactor: Getter 추가

- isDrawWin, ranking필드에 Getter 추가

* feat: redis를 이용해 당첨자 정보 임시 저장하는 로직 추가

* refactor: 사용하지 않는 import문 삭제

- import Random 삭제

* refactor: redis 임시 당첨자 목록에 이미 존재할 경우에 대해 refactoring

- 생성자에서 first, second, third 넣지 않도록 수정
- setRanking -> performDraw로 메소드 명 변경
- performDraw에서 당첨자를 위한 이미지 방향 결정하지 않도록 수정
- first, second, third에서 final 키워드 제거
- 이미지 생성할 때 directionForWinner를 사용하지 않고 난수를 직접 생성하여 사용하도록 수정

* refactor: redis 임시 당첨자 목록에 이미 존재할 경우에 대해 refactoring

- 임시 당첨자 목록에 이미 존재하는 경우 당첨 로직 수행하지 않고 당첨 응답 반환하도록 수정
- DrawUtil의 당첨자 수 설정 수정
- 추첨 로직 실행하는 메소드명 변경
- redis 임시 당첨자 목록에 존재하는지 조회하는 메소드 추가
- javadoc을 위한 주석 추가

* feat: id를 redis set에 추가하는 메소드 추가

* feat: 로직에 대한 주석 추가

* feat: 공유 url 가져올 때 List가 아닌 단일 값으로 가져오도록 SQL 쿼리 추가

* feat: TODO 주석 추가

* infra: 빌드 테스트 yml 작성

* infra: DB 정보 추가

* infra: ssh-agent 버전 변경

* infra: known_hosts 추가

* infra: db port 변경

* infra: database test 설정 변경

* infra: DB 환경변수 설정 및 application.yml 생성

* infra: application.yml 동적 생성 스크립트 수정

* infra: 레디스 설정 추가

* infra: redis test 추가

* infra: redis 버전 변경

* infra: redis cli 설치

* infra: application.yml 위치 및 내용 확인

* infra: Github Actions 환경변수에 REDIS_HOST, REDIS_PORT 추가

* infra: 환경변수 확인 추가

* cicd test (#54)

* config: jwt 속성을 yml에 설정

* config: git cache 초기화

* feat: Jwt 속성 관리 클래스 생성

* feat: 로그인 컨트롤러 클래스 생성

* feat: 로그인 요청 dto 클래스 생성

* feat: 로그인 service 클래스 생성

* feat: 메서드 추가

- 전화번호에 해당하는 유저가 있는지 확인하는 메서드
- 전화번호로 유저 객체를 반환하는 메서드

* feat: 필드 추가 및 전화번호 인덱싱 설정

* feat: 로그인 성공 상태 코드 추가

* feat: 로그인 실패 상태 코드 추가

* style: 엔터한 공간 줄이기

* chore: ci/cd test

* chore: ci/cd test

* chore: ci/cd test

* cicd test (#47)

* config: jwt 속성을 yml에 설정

* config: git cache 초기화

* feat: Jwt 속성 관리 클래스 생성

* feat: 로그인 컨트롤러 클래스 생성

* feat: 로그인 요청 dto 클래스 생성

* feat: 로그인 service 클래스 생성

* feat: 메서드 추가

- 전화번호에 해당하는 유저가 있는지 확인하는 메서드
- 전화번호로 유저 객체를 반환하는 메서드

* feat: 필드 추가 및 전화번호 인덱싱 설정

* feat: 로그인 성공 상태 코드 추가

* feat: 로그인 실패 상태 코드 추가

* style: 엔터한 공간 줄이기

* chore: ci/cd test

---------

Co-authored-by: hyeokson <[email protected]>

* chore: ci/cd test

* chore: ci/cd test

* chore: ci/cd test

---------

Co-authored-by: hyeokson <[email protected]>

* [Feat] 기대평 기능 구현 (#57)

* config: jwt 속성을 yml에 설정

* config: git cache 초기화

* feat: Jwt 속성 관리 클래스 생성

* feat: 로그인 컨트롤러 클래스 생성

* feat: 로그인 요청 dto 클래스 생성

* feat: 로그인 service 클래스 생성

* feat: 메서드 추가

- 전화번호에 해당하는 유저가 있는지 확인하는 메서드
- 전화번호로 유저 객체를 반환하는 메서드

* feat: 필드 추가 및 전화번호 인덱싱 설정

* feat: 로그인 성공 상태 코드 추가

* feat: 로그인 실패 상태 코드 추가

* style: 엔터한 공간 줄이기

* chore: ci/cd test

* chore: ci/cd test

* chore: ci/cd test

* cicd test (#47)

* config: jwt 속성을 yml에 설정

* config: git cache 초기화

* feat: Jwt 속성 관리 클래스 생성

* feat: 로그인 컨트롤러 클래스 생성

* feat: 로그인 요청 dto 클래스 생성

* feat: 로그인 service 클래스 생성

* feat: 메서드 추가

- 전화번호에 해당하는 유저가 있는지 확인하는 메서드
- 전화번호로 유저 객체를 반환하는 메서드

* feat: 필드 추가 및 전화번호 인덱싱 설정

* feat: 로그인 성공 상태 코드 추가

* feat: 로그인 실패 상태 코드 추가

* style: 엔터한 공간 줄이기

* chore: ci/cd test

---------

Co-authored-by: hyeokson <[email protected]>

* chore: ci/cd test

* chore: ci/cd test

* chore: ci/cd test

* config: gradle 의존성 설정

* refactor: BaseEntity 삭제

* feat: if문 추가

- 인증 및 미인증 유저가 공동으로 사용하는 api를 위해서 인증을 하지 않았다면 예외가 아니라 userId값으로 null을 갖도록 변경

* feat: 댓글 예외 상태 코드 추가

* feat: Comment 엔티티 클래스 생성

* feat: Comment 컨트롤러 생성 및 구현

- 기대평 조회 및 저장 로직 구현

* feat: Comment 예외 클래스 생성

* feat: 기대평 닉네임을 관리하는 Enum 클래스 생성

* feat: Comment repository 생성 및 구현

* feat: Comment service 생성 및 구현

- SCROLL_SIZE 만큼의 기대평을 반환하는 메서드 구현
- 기대평을 저장하는 메서드 구현

* feat: Comment 조회 응답 클래스 생성

* feat: 기대평을 관리하는 Enum 클래스 생성

* feat: 컨버터 클래스 생성

- 기대평 Enum 객체와 comment 값을 서로 변환해주는 컨버터 생성

* feat: Util 클래스 생성

- 커서 기반 스크롤 기능을 사용할 수 있는 Util 클래스 생성

* refactor: jsonformat 패턴 변경

* feat: 기대평 성공 상태 코드 추가

* refactor: enum 값 변경

* refactor: 호출하는 메서드 명 변경

* refactor: 자료형 변경

* refactor: 애노테이션 변경

* refactor: claim의 id값 자료형 변경

* feat: 변수 및 메서드 추가

- Access Token이 header에 있으면 인증하고 없으면 인증하지 않는 url 설정 및 기능 구현

* feat: 자동으로 생성 시간 저장하도록 구현

* refactor: 시간값 설정 코드 삭제

---------

Co-authored-by: hyeokson <[email protected]>

* cicd test (#58)

* config: jwt 속성을 yml에 설정

* config: git cache 초기화

* feat: Jwt 속성 관리 클래스 생성

* chore: ci/cd를 위한 커밋

---------

Co-authored-by: hyeokson <[email protected]>

* feat: 추첨 설정 정보 관리 및 스케줄러 사용을 위한 DrawSettingManager 추가

* feat: DrawSettingManager 사용하도록 수정

* feat: redis에서 임시 당첨자 목록 삭제하는 메소드 추가

* feat: 초기 설정 및 스케줄러 설정

- 빈이 생성되면 데이터베이스로부터 설정 값 가져오도록 설정
- 스케줄러를 이용해 매일 새벽 1시에 redis에서 임시 당첨자 목록 삭제하도록 설정

* feat: SchedularConfig 설정 변경

- 스레드 2개로 설정
- 스레드 명 EventScheduler로 변경

* feat: drawSetting을 DrawSettingManager로부터 가져오도록 수정

* feat: 주석 수정

* refactor: 사용하지 않는 import문 제거

- drawSettingRepository 제거

* refactor: TODO 삭제

- redis에 당첨자 목록 저장하는 TODO 삭제

---------

Co-authored-by: Son Chanhyeok <[email protected]>
Co-authored-by: hyeokson <[email protected]>
  • Loading branch information
3 people authored Aug 9, 2024
1 parent 4739f64 commit 500f869
Show file tree
Hide file tree
Showing 18 changed files with 523 additions and 42 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package com.softeer.backend.fo_domain.draw.domain;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;

import java.sql.Date;

@Entity
@Getter
@Table(name = "draw_setting")
@RequiredArgsConstructor
public class DrawSetting {
@Id
@Column(name = "draw_setting_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer draw_setting_id;

@Column(name = "start_time")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date startTime;

@Column(name = "end_time")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date endTime;

@Column(name = "winner_num_1")
private Integer winnerNum1;

@Column(name = "winner_num_2")
private Integer winnerNum2;

@Column(name = "winner_num_3")
private Integer winnerNum3;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.softeer.backend.fo_domain.draw.dto;

import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@Data
@NoArgsConstructor
public class DrawLoseResponseDto implements DrawResponseDto {
private int invitedNum; // 내가 초대한 친구 수
private int remainDrawCount; // 남은 복권 기회
private int drawParticipationCount; // 연속 참여 일수
private boolean isDrawWin; // 당첨됐는지 여부
private List<String> images; // 이미지 리스트
private LoseModal loseModal; // WinModal 정보

@Builder
public DrawLoseResponseDto(int invitedNum, int remainDrawCount, int drawParticipationCount, boolean isDrawWin, List<String> images, LoseModal loseModal) {
this.invitedNum = invitedNum;
this.remainDrawCount = remainDrawCount;
this.drawParticipationCount = drawParticipationCount;
this.isDrawWin = isDrawWin;
this.images = images;
this.loseModal = loseModal;
}
}
Original file line number Diff line number Diff line change
@@ -1,20 +1,4 @@
package com.softeer.backend.fo_domain.draw.dto;

import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
public class DrawResponseDto {
private int invitedNum; // 내가 초대한 친구 수
private int remainDrawCount; // 남은 복권 기회
private int drawParticipationCount; // 연속 참여 일수

@Builder
public DrawResponseDto(int invitedNum, int remainDrawCount, int drawParticipationCount) {
this.invitedNum = invitedNum;
this.remainDrawCount = remainDrawCount;
this.drawParticipationCount = drawParticipationCount;
}
public interface DrawResponseDto {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.softeer.backend.fo_domain.draw.dto;

import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.List;

@Data
@NoArgsConstructor
public class DrawWinResponseDto implements DrawResponseDto {
private int invitedNum; // 내가 초대한 친구 수
private int remainDrawCount; // 남은 복권 기회
private int drawParticipationCount; // 연속 참여 일수
private boolean isDrawWin; // 당첨됐는지 여부
private List<String> images;
private WinModal winModal;

@Builder
public DrawWinResponseDto(int invitedNum, int remainDrawCount, int drawParticipationCount, boolean isDrawWin, List<String> images, WinModal winModal) {
this.invitedNum = invitedNum;
this.remainDrawCount = remainDrawCount;
this.drawParticipationCount = drawParticipationCount;
this.isDrawWin = isDrawWin;
this.images = images;
this.winModal = winModal;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.softeer.backend.fo_domain.draw.dto;

import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
public class LoseModal {
private String shareUrl; // 공유 url

@Builder
public LoseModal(String shareUrl) {
this.shareUrl = shareUrl;
}
}
22 changes: 22 additions & 0 deletions src/main/java/com/softeer/backend/fo_domain/draw/dto/WinModal.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package com.softeer.backend.fo_domain.draw.dto;

import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
public class WinModal {
private String title; // 제목
private String subtitle; // 부제목
private String img; // 이미지 URL (S3 URL)
private String description; // 설명

@Builder
public WinModal(String title, String subtitle, String img, String description) {
this.title = title;
this.subtitle = subtitle;
this.img = img;
this.description = description;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.softeer.backend.fo_domain.draw.repository;

import com.softeer.backend.fo_domain.draw.domain.DrawSetting;
import jakarta.persistence.Table;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
@Table(name = "draw_setting")
public interface DrawSettingRepository extends JpaRepository<DrawSetting, Integer> {
}
Original file line number Diff line number Diff line change
@@ -1,25 +1,46 @@
package com.softeer.backend.fo_domain.draw.service;

import com.softeer.backend.fo_domain.draw.domain.DrawParticipationInfo;
import com.softeer.backend.fo_domain.draw.domain.DrawSetting;
import com.softeer.backend.fo_domain.draw.dto.DrawLoseResponseDto;
import com.softeer.backend.fo_domain.draw.dto.DrawResponseDto;
import com.softeer.backend.fo_domain.draw.dto.DrawWinResponseDto;
import com.softeer.backend.fo_domain.draw.exception.DrawException;
import com.softeer.backend.fo_domain.draw.repository.DrawParticipationInfoRepository;
import com.softeer.backend.fo_domain.draw.repository.DrawRepository;
import com.softeer.backend.fo_domain.draw.repository.DrawSettingRepository;
import com.softeer.backend.fo_domain.draw.util.DrawUtil;
import com.softeer.backend.fo_domain.share.domain.ShareInfo;
import com.softeer.backend.fo_domain.share.exception.ShareInfoException;
import com.softeer.backend.fo_domain.share.exception.ShareUrlInfoException;
import com.softeer.backend.fo_domain.share.repository.ShareInfoRepository;
import com.softeer.backend.fo_domain.share.repository.ShareUrlInfoRepository;
import com.softeer.backend.global.common.code.status.ErrorStatus;
import com.softeer.backend.global.common.constant.RedisLockPrefix;
import com.softeer.backend.global.common.response.ResponseDto;
import com.softeer.backend.global.util.EventLockRedisUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.Set;

@Service
@RequiredArgsConstructor
public class DrawService {
// private final DrawRepository drawRepository;
private final DrawRepository drawRepository;
private final DrawParticipationInfoRepository drawParticipationInfoRepository;
private final ShareInfoRepository shareInfoRepository;
private final ShareUrlInfoRepository shareUrlInfoRepository;
private final EventLockRedisUtil eventLockRedisUtil;
private final DrawSettingManager drawSettingManager;

/**
* 1. redis의 임시 당첨 목록에 존재하는지 확인
* 1-1. 있으면 해당 등수에 맞는 응답 만들어서 반환
* 1-2. 없으면 새로 등수 계산
* 2. 당첨되었다면 레디스에 저장 후 당첨 응답 반환
* 3. 낙첨되었다면 당첨 실패 응답 반환
*/
public ResponseDto<DrawResponseDto> getDrawMainPageInfo(Integer userId) {
// 참여 정보 (연속참여일수) 조회
DrawParticipationInfo drawParticipationInfo = drawParticipationInfoRepository.findDrawParticipationInfoByUserId(userId)
Expand All @@ -33,10 +54,86 @@ public ResponseDto<DrawResponseDto> getDrawMainPageInfo(Integer userId) {
int invitedNum = shareInfo.getInvitedNum();
int remainDrawCount = shareInfo.getRemainDrawCount();

return ResponseDto.onSuccess(DrawResponseDto.builder()
.invitedNum(invitedNum)
.remainDrawCount(remainDrawCount)
.drawParticipationCount(drawParticipationCount)
.build());
// 만약 임시 당첨 목록에 존재한다면 등수에 맞는 응답 만들어서 반환
int ranking = getRankingIfWinner(userId);
DrawUtil drawUtil = new DrawUtil();
if (ranking != 0) {
drawUtil.setRanking(ranking);
return ResponseDto.onSuccess(DrawWinResponseDto.builder()
.invitedNum(invitedNum)
.remainDrawCount(remainDrawCount)
.drawParticipationCount(drawParticipationCount)
.isDrawWin(true)
.images(drawUtil.generateWinImages())
.winModal(drawUtil.generateWinModal())
.build());
}

// 당첨자 수 조회
int first = drawSettingManager.getWinnerNum1(); // 1등 수
int second = drawSettingManager.getWinnerNum2(); // 2등 수
int third = drawSettingManager.getWinnerNum3(); // 3등 수

// 당첨자 수 설정
drawUtil.setFirst(first);
drawUtil.setSecond(second);
drawUtil.setThird(third);

// 추첨 로직 실행
drawUtil.performDraw();

if (drawUtil.isDrawWin()) { // 당첨자일 경우
// redis 임시 당첨자 목록에 저장
saveWinnerInfo(drawUtil.getRanking(), userId);

return ResponseDto.onSuccess(DrawWinResponseDto.builder()
.invitedNum(invitedNum)
.remainDrawCount(remainDrawCount)
.drawParticipationCount(drawParticipationCount)
.isDrawWin(true)
.images(drawUtil.generateWinImages())
.winModal(drawUtil.generateWinModal())
.build());
} else { // 낙첨자일 경우
String shareUrl = shareUrlInfoRepository.findShareUrlByUserId(userId)
.orElseThrow(() -> new ShareUrlInfoException(ErrorStatus._SHARE_URL_NOT_FOUND));

return ResponseDto.onSuccess(DrawLoseResponseDto.builder()
.invitedNum(invitedNum)
.remainDrawCount(remainDrawCount)
.drawParticipationCount(drawParticipationCount)
.isDrawWin(false)
.images(drawUtil.generateLoseImages())
.loseModal(drawUtil.generateLoseModal(shareUrl))
.build());
}
}

/**
* redis 임시 당첨자 목록에 저장
*
* @param ranking redis의 키로 사용될 등수
* @param userId 사용자 아이디
*/
private void saveWinnerInfo(int ranking, int userId) {
String drawTempKey = RedisLockPrefix.DRAW_TEMP_PREFIX.getPrefix() + ranking;
eventLockRedisUtil.addValueToSet(drawTempKey, userId);
}

/**
* userId가 임시 당첨자 목록에 있으면 등수, 없으면 0 반환
*
* @param userId
*/
private int getRankingIfWinner(int userId) {
String drawTempKey;
for (int ranking = 1; ranking < 4; ranking++) {
drawTempKey = RedisLockPrefix.DRAW_TEMP_PREFIX.getPrefix() + ranking;
Set<Integer> drawTempSet = eventLockRedisUtil.getAllDataAsSet(drawTempKey);
if (drawTempSet.contains(userId)) {
return ranking;
}
}
return 0;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package com.softeer.backend.fo_domain.draw.service;

import com.softeer.backend.fo_domain.draw.domain.DrawSetting;
import com.softeer.backend.fo_domain.draw.exception.DrawException;
import com.softeer.backend.fo_domain.draw.repository.DrawSettingRepository;
import com.softeer.backend.global.common.code.status.ErrorStatus;
import com.softeer.backend.global.common.constant.RedisLockPrefix;
import com.softeer.backend.global.util.EventLockRedisUtil;
import jakarta.annotation.PostConstruct;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;

import java.sql.Date;

@Getter
@Component
@RequiredArgsConstructor
public class DrawSettingManager {
private final DrawSettingRepository drawSettingRepository;
private final ThreadPoolTaskScheduler taskScheduler;
private final EventLockRedisUtil eventLockRedisUtil;

private Date startTime;
private Date endTime;
private int winnerNum1;
private int winnerNum2;
private int winnerNum3;

// @PostConstruct로 생성됐을 시 세팅정보 가져오기
// 스케줄러로 01:00:00에 redis 임시 목록 삭제하기

@PostConstruct
public void initializeDrawSettingManager() {
DrawSetting drawSetting = drawSettingRepository.findById(1)
.orElseThrow(() -> new DrawException(ErrorStatus._DRAW_PARTICIPATION_INFO_NOT_FOUND));

startTime = drawSetting.getStartTime();
endTime = drawSetting.getEndTime();
winnerNum1 = drawSetting.getWinnerNum1();
winnerNum2 = drawSetting.getWinnerNum2();
winnerNum3 = drawSetting.getWinnerNum3();

// 매일 01:00:00에 redis 임시 당첨자 목록 삭제하기
taskScheduler.schedule(this::deleteTempWinnerSetFromRedis, new CronTrigger("0 0 1 * * *"));
}

private void deleteTempWinnerSetFromRedis() {
String drawTempKey;
for (int ranking = 1; ranking < 4; ranking++) {
drawTempKey = RedisLockPrefix.DRAW_TEMP_PREFIX.getPrefix() + ranking;
eventLockRedisUtil.deleteTempWinnerList(drawTempKey);
}
}
}
Loading

0 comments on commit 500f869

Please sign in to comment.