From 3a728ea2fdd5c669cafb316c5b32c7d5af72330a Mon Sep 17 00:00:00 2001 From: win-luck Date: Fri, 9 Aug 2024 16:59:55 +0900 Subject: [PATCH 1/5] =?UTF-8?q?[fix]=20judgeAnswer=20=EB=A9=94=EC=84=9C?= =?UTF-8?q?=EB=93=9C=20String=20=EA=B3=B5=EB=B0=B1=EC=9C=BC=EB=A1=9C=20?= =?UTF-8?q?=EC=9D=B8=ED=95=B4=20=EB=8F=99=EC=9D=BC=20=EC=A0=95=EB=8B=B5?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=ED=8C=90=EC=A0=95=ED=95=98=EC=A7=80=20?= =?UTF-8?q?=EC=95=8A=EB=8D=98=20=EB=B2=84=EA=B7=B8=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?(#44)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../softeer/orange/event/fcfs/service/FcfsAnswerService.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/hyundai/softeer/orange/event/fcfs/service/FcfsAnswerService.java b/src/main/java/hyundai/softeer/orange/event/fcfs/service/FcfsAnswerService.java index fe341a73..eeafba9d 100644 --- a/src/main/java/hyundai/softeer/orange/event/fcfs/service/FcfsAnswerService.java +++ b/src/main/java/hyundai/softeer/orange/event/fcfs/service/FcfsAnswerService.java @@ -4,11 +4,9 @@ import hyundai.softeer.orange.event.fcfs.exception.FcfsEventException; import hyundai.softeer.orange.event.fcfs.util.FcfsUtil; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; -@Slf4j @RequiredArgsConstructor @Service public class FcfsAnswerService { @@ -20,6 +18,6 @@ public boolean judgeAnswer(Long eventSequence, String answer) { if (correctAnswer == null) { throw new FcfsEventException(ErrorCode.FCFS_EVENT_NOT_FOUND); } - return correctAnswer.equals(answer); + return correctAnswer.trim().equals(answer.trim()); // 정답 비교 시 공백을 제거 } } From 8fcfb2b5f29e68ca598c308d4ea23e67c3336807 Mon Sep 17 00:00:00 2001 From: win-luck Date: Fri, 9 Aug 2024 17:01:16 +0900 Subject: [PATCH 2/5] =?UTF-8?q?[chore]=20Lua=20=EB=A1=9C=EA=B7=B8=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EB=B0=8F=20Default=20Service=EB=A1=9C=20?= =?UTF-8?q?=EB=8F=99=EC=9E=91=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20(#44)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../orange/event/fcfs/service/RedisLockFcfsService.java | 2 -- .../orange/event/fcfs/service/RedisLuaFcfsService.java | 5 ++++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/hyundai/softeer/orange/event/fcfs/service/RedisLockFcfsService.java b/src/main/java/hyundai/softeer/orange/event/fcfs/service/RedisLockFcfsService.java index d94e61ae..1089a007 100644 --- a/src/main/java/hyundai/softeer/orange/event/fcfs/service/RedisLockFcfsService.java +++ b/src/main/java/hyundai/softeer/orange/event/fcfs/service/RedisLockFcfsService.java @@ -7,7 +7,6 @@ import lombok.extern.slf4j.Slf4j; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; -import org.springframework.context.annotation.Primary; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; @@ -18,7 +17,6 @@ @Slf4j @RequiredArgsConstructor @Service -@Primary public class RedisLockFcfsService implements FcfsService { private final StringRedisTemplate stringRedisTemplate; diff --git a/src/main/java/hyundai/softeer/orange/event/fcfs/service/RedisLuaFcfsService.java b/src/main/java/hyundai/softeer/orange/event/fcfs/service/RedisLuaFcfsService.java index bec7f2e6..43b81f35 100644 --- a/src/main/java/hyundai/softeer/orange/event/fcfs/service/RedisLuaFcfsService.java +++ b/src/main/java/hyundai/softeer/orange/event/fcfs/service/RedisLuaFcfsService.java @@ -5,6 +5,7 @@ import hyundai.softeer.orange.event.fcfs.util.FcfsUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.context.annotation.Primary; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.script.RedisScript; @@ -15,6 +16,7 @@ @Slf4j @RequiredArgsConstructor +@Primary @Service public class RedisLuaFcfsService implements FcfsService { @@ -62,6 +64,7 @@ public boolean participate(Long eventSequence, String userId) { ); if(result == null || result <= 0) { + log.info("Event Finished: {},", stringRedisTemplate.opsForZSet().zCard(FcfsUtil.winnerFormatting(eventSequence.toString()))); stringRedisTemplate.opsForSet().add(FcfsUtil.participantFormatting(eventSequence.toString()), userId); endEvent(eventSequence); return false; @@ -69,7 +72,7 @@ public boolean participate(Long eventSequence, String userId) { stringRedisTemplate.opsForZSet().add(FcfsUtil.winnerFormatting(eventSequence.toString()), userId, System.currentTimeMillis()); stringRedisTemplate.opsForSet().add(FcfsUtil.participantFormatting(eventSequence.toString()), userId); - log.info("Event Sequence: {}, User ID: {}, Timestamp: {}", eventSequence, userId, timestamp); + log.info("Participating Success: {}, User ID: {}, Timestamp: {}", eventSequence, userId, timestamp); return true; } From 4d2c8dcfa1c280f33d2c0300749e298b4013e35b Mon Sep 17 00:00:00 2001 From: win-luck Date: Fri, 9 Aug 2024 17:03:16 +0900 Subject: [PATCH 3/5] =?UTF-8?q?[chore]=20=EB=AA=A8=EB=93=A0=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84=EB=B0=A9=EC=95=88=EC=97=90=20=EC=9D=BC=EA=B4=80?= =?UTF-8?q?=EB=90=9C=20=EB=A1=9C=EA=B7=B8=20=EB=A9=94=EC=8B=9C=EC=A7=80=20?= =?UTF-8?q?=EC=A0=81=EC=9A=A9=20(#44)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../softeer/orange/event/fcfs/service/DbFcfsService.java | 2 ++ .../orange/event/fcfs/service/RedisLockFcfsService.java | 2 ++ .../softeer/orange/event/fcfs/service/RedisSetFcfsService.java | 3 ++- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/hyundai/softeer/orange/event/fcfs/service/DbFcfsService.java b/src/main/java/hyundai/softeer/orange/event/fcfs/service/DbFcfsService.java index 89dbba8e..dd386e8c 100644 --- a/src/main/java/hyundai/softeer/orange/event/fcfs/service/DbFcfsService.java +++ b/src/main/java/hyundai/softeer/orange/event/fcfs/service/DbFcfsService.java @@ -53,11 +53,13 @@ public boolean participate(Long eventSequence, String userId){ // 인원 수 초과 시 종료 flag 설정 if(fcfsEvent.getInfos().size() >= fcfsEvent.getParticipantCount()){ + log.info("Event Finished: {},", fcfsEvent.getInfos().size()); endEvent(eventSequence); return false; } fcfsEventWinningInfoRepository.save(FcfsEventWinningInfo.of(fcfsEvent, eventUser)); + log.info("Participating Success: {}, User ID: {}", eventSequence, userId); return true; } diff --git a/src/main/java/hyundai/softeer/orange/event/fcfs/service/RedisLockFcfsService.java b/src/main/java/hyundai/softeer/orange/event/fcfs/service/RedisLockFcfsService.java index 1089a007..06c16173 100644 --- a/src/main/java/hyundai/softeer/orange/event/fcfs/service/RedisLockFcfsService.java +++ b/src/main/java/hyundai/softeer/orange/event/fcfs/service/RedisLockFcfsService.java @@ -57,6 +57,7 @@ public boolean participate(Long eventSequence, String userId) { int quantity = availableCoupons(FcfsUtil.keyFormatting(eventSequence.toString())); if (quantity <= 0) { + log.info("Event Finished: {},", stringRedisTemplate.opsForZSet().zCard(FcfsUtil.winnerFormatting(eventSequence.toString()))); endEvent(eventSequence); // 이벤트 종료 플래그 설정 return false; } @@ -64,6 +65,7 @@ public boolean participate(Long eventSequence, String userId) { numberRedisTemplate.opsForValue().decrement(FcfsUtil.keyFormatting(eventSequence.toString())); stringRedisTemplate.opsForZSet().add(FcfsUtil.winnerFormatting(eventSequence.toString()), userId, System.currentTimeMillis()); stringRedisTemplate.opsForSet().add(FcfsUtil.participantFormatting(eventSequence.toString()), userId); + log.info("Participating Success: {}, User ID: {}", eventSequence, userId); return true; } catch (InterruptedException e) { Thread.currentThread().interrupt(); diff --git a/src/main/java/hyundai/softeer/orange/event/fcfs/service/RedisSetFcfsService.java b/src/main/java/hyundai/softeer/orange/event/fcfs/service/RedisSetFcfsService.java index 0be120b4..d55b96b1 100644 --- a/src/main/java/hyundai/softeer/orange/event/fcfs/service/RedisSetFcfsService.java +++ b/src/main/java/hyundai/softeer/orange/event/fcfs/service/RedisSetFcfsService.java @@ -44,13 +44,14 @@ public boolean participate(Long eventSequence, String userId) { // 이벤트 인원 마감 여부 확인 if (isEventFull(eventSequence)) { + log.info("Event Finished: {},", stringRedisTemplate.opsForZSet().zCard(FcfsUtil.winnerFormatting(eventSequence.toString()))); stringRedisTemplate.opsForSet().add(FcfsUtil.participantFormatting(eventSequence.toString()), userId); return false; } stringRedisTemplate.opsForZSet().add(FcfsUtil.winnerFormatting(eventSequence.toString()), userId, System.currentTimeMillis()); stringRedisTemplate.opsForSet().add(FcfsUtil.participantFormatting(eventSequence.toString()), userId); - log.info("{} 선착순 이벤트 참여 성공", userId); + log.info("Participating Success: {}, User ID: {}", eventSequence, userId); return true; } From fa809d3813fc51fad0a6f88021057d2d4f13ac3e Mon Sep 17 00:00:00 2001 From: win-luck Date: Fri, 9 Aug 2024 17:13:17 +0900 Subject: [PATCH 4/5] =?UTF-8?q?[chore]=20FcfsService=20=EA=B5=AC=ED=98=84?= =?UTF-8?q?=EC=B2=B4=EB=A7=88=EB=8B=A4=20=EB=82=A8=EC=9A=A9=EB=90=98?= =?UTF-8?q?=EB=8D=98=20toString()=20=EC=A0=9C=EA=B1=B0=20(#44)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../event/fcfs/service/DbFcfsService.java | 13 ++++--- .../fcfs/service/RedisLockFcfsService.java | 33 +++++++++-------- .../fcfs/service/RedisLuaFcfsService.java | 35 +++++++++--------- .../fcfs/service/RedisSetFcfsService.java | 37 ++++++++++--------- .../orange/event/fcfs/util/FcfsUtil.java | 20 +++++----- 5 files changed, 71 insertions(+), 67 deletions(-) diff --git a/src/main/java/hyundai/softeer/orange/event/fcfs/service/DbFcfsService.java b/src/main/java/hyundai/softeer/orange/event/fcfs/service/DbFcfsService.java index dd386e8c..14515bbe 100644 --- a/src/main/java/hyundai/softeer/orange/event/fcfs/service/DbFcfsService.java +++ b/src/main/java/hyundai/softeer/orange/event/fcfs/service/DbFcfsService.java @@ -30,8 +30,9 @@ public class DbFcfsService implements FcfsService{ @Override @Transactional public boolean participate(Long eventSequence, String userId){ + String key = eventSequence.toString(); // 이벤트 종료 여부 확인 - if (isEventEnded(eventSequence)) { + if (isEventEnded(key)) { return false; } @@ -54,7 +55,7 @@ public boolean participate(Long eventSequence, String userId){ // 인원 수 초과 시 종료 flag 설정 if(fcfsEvent.getInfos().size() >= fcfsEvent.getParticipantCount()){ log.info("Event Finished: {},", fcfsEvent.getInfos().size()); - endEvent(eventSequence); + endEvent(key); return false; } @@ -67,11 +68,11 @@ private boolean isParticipated(Long userId, Long eventSequence){ return fcfsEventWinningInfoRepository.existsByEventUserIdAndFcfsEventId(userId, eventSequence); } - private boolean isEventEnded(Long eventSequence){ - return Boolean.TRUE.equals((booleanRedisTemplate.opsForValue().get(FcfsUtil.endFlagFormatting(eventSequence.toString())))); + private boolean isEventEnded(String key){ + return Boolean.TRUE.equals((booleanRedisTemplate.opsForValue().get(FcfsUtil.endFlagFormatting(key)))); } - private void endEvent(Long eventSequence){ - booleanRedisTemplate.opsForValue().set(FcfsUtil.endFlagFormatting(eventSequence.toString()), true); + private void endEvent(String key){ + booleanRedisTemplate.opsForValue().set(FcfsUtil.endFlagFormatting(key), true); } } diff --git a/src/main/java/hyundai/softeer/orange/event/fcfs/service/RedisLockFcfsService.java b/src/main/java/hyundai/softeer/orange/event/fcfs/service/RedisLockFcfsService.java index 06c16173..78438505 100644 --- a/src/main/java/hyundai/softeer/orange/event/fcfs/service/RedisLockFcfsService.java +++ b/src/main/java/hyundai/softeer/orange/event/fcfs/service/RedisLockFcfsService.java @@ -26,19 +26,20 @@ public class RedisLockFcfsService implements FcfsService { @Override public boolean participate(Long eventSequence, String userId) { + String key = eventSequence.toString(); // 이벤트 종료 여부 확인 - if (isEventEnded(eventSequence)) { - stringRedisTemplate.opsForSet().add(FcfsUtil.participantFormatting(eventSequence.toString()), userId); + if (isEventEnded(key)) { + stringRedisTemplate.opsForSet().add(FcfsUtil.participantFormatting(key), userId); return false; } // 이미 이 이벤트에 참여했는지 확인 - if(isParticipated(eventSequence, userId)) { + if(isParticipated(key, userId)) { throw new FcfsEventException(ErrorCode.ALREADY_PARTICIPATED); } // 잘못된 이벤트 참여 시간 - String startTime = stringRedisTemplate.opsForValue().get(FcfsUtil.startTimeFormatting(eventSequence.toString())); + String startTime = stringRedisTemplate.opsForValue().get(FcfsUtil.startTimeFormatting(key)); if(startTime == null) { throw new FcfsEventException(ErrorCode.FCFS_EVENT_NOT_FOUND); } @@ -55,16 +56,16 @@ public boolean participate(Long eventSequence, String userId) { return false; } - int quantity = availableCoupons(FcfsUtil.keyFormatting(eventSequence.toString())); + int quantity = availableCoupons(FcfsUtil.keyFormatting(key)); if (quantity <= 0) { - log.info("Event Finished: {},", stringRedisTemplate.opsForZSet().zCard(FcfsUtil.winnerFormatting(eventSequence.toString()))); - endEvent(eventSequence); // 이벤트 종료 플래그 설정 + log.info("Event Finished: {},", stringRedisTemplate.opsForZSet().zCard(FcfsUtil.winnerFormatting(key))); + endEvent(key); // 이벤트 종료 플래그 설정 return false; } - numberRedisTemplate.opsForValue().decrement(FcfsUtil.keyFormatting(eventSequence.toString())); - stringRedisTemplate.opsForZSet().add(FcfsUtil.winnerFormatting(eventSequence.toString()), userId, System.currentTimeMillis()); - stringRedisTemplate.opsForSet().add(FcfsUtil.participantFormatting(eventSequence.toString()), userId); + numberRedisTemplate.opsForValue().decrement(FcfsUtil.keyFormatting(key)); + stringRedisTemplate.opsForZSet().add(FcfsUtil.winnerFormatting(key), userId, System.currentTimeMillis()); + stringRedisTemplate.opsForSet().add(FcfsUtil.participantFormatting(key), userId); log.info("Participating Success: {}, User ID: {}", eventSequence, userId); return true; } catch (InterruptedException e) { @@ -77,8 +78,8 @@ public boolean participate(Long eventSequence, String userId) { } } - private boolean isParticipated(Long eventSequence, String userId){ - return Boolean.TRUE.equals(stringRedisTemplate.opsForSet().isMember(FcfsUtil.participantFormatting(eventSequence.toString()), userId)); + private boolean isParticipated(String key, String userId){ + return Boolean.TRUE.equals(stringRedisTemplate.opsForSet().isMember(FcfsUtil.participantFormatting(key), userId)); } private Integer availableCoupons(String key) { @@ -89,11 +90,11 @@ private Integer availableCoupons(String key) { return count; } - private boolean isEventEnded(Long eventSequence) { - return Boolean.TRUE.equals(booleanRedisTemplate.opsForValue().get(FcfsUtil.endFlagFormatting(eventSequence.toString()))); + private boolean isEventEnded(String key) { + return Boolean.TRUE.equals(booleanRedisTemplate.opsForValue().get(FcfsUtil.endFlagFormatting(key))); } - private void endEvent(Long eventSequence) { - booleanRedisTemplate.opsForValue().set(FcfsUtil.endFlagFormatting(eventSequence.toString()), true); + private void endEvent(String key) { + booleanRedisTemplate.opsForValue().set(FcfsUtil.endFlagFormatting(key), true); } } diff --git a/src/main/java/hyundai/softeer/orange/event/fcfs/service/RedisLuaFcfsService.java b/src/main/java/hyundai/softeer/orange/event/fcfs/service/RedisLuaFcfsService.java index 43b81f35..7bc45344 100644 --- a/src/main/java/hyundai/softeer/orange/event/fcfs/service/RedisLuaFcfsService.java +++ b/src/main/java/hyundai/softeer/orange/event/fcfs/service/RedisLuaFcfsService.java @@ -26,19 +26,20 @@ public class RedisLuaFcfsService implements FcfsService { @Override public boolean participate(Long eventSequence, String userId) { + String key = eventSequence.toString(); // 이벤트 종료 여부 확인 - if (isEventEnded(eventSequence)) { - stringRedisTemplate.opsForSet().add(FcfsUtil.participantFormatting(eventSequence.toString()), userId); + if (isEventEnded(key)) { + stringRedisTemplate.opsForSet().add(FcfsUtil.participantFormatting(key), userId); return false; } // 이미 이 이벤트에 참여했는지 확인 - if(isParticipated(eventSequence, userId)) { + if(isParticipated(key, userId)) { throw new FcfsEventException(ErrorCode.ALREADY_PARTICIPATED); } // 잘못된 이벤트 참여 시간 - String startTime = stringRedisTemplate.opsForValue().get(FcfsUtil.startTimeFormatting(eventSequence.toString())); + String startTime = stringRedisTemplate.opsForValue().get(FcfsUtil.startTimeFormatting(key)); if(startTime == null) { throw new FcfsEventException(ErrorCode.FCFS_EVENT_NOT_FOUND); } @@ -57,34 +58,34 @@ public boolean participate(Long eventSequence, String userId) { long timestamp = System.currentTimeMillis(); Long result = stringRedisTemplate.execute( RedisScript.of(script, Long.class), - Collections.singletonList(FcfsUtil.winnerFormatting(eventSequence.toString())), - String.valueOf(numberRedisTemplate.opsForValue().get(FcfsUtil.keyFormatting(eventSequence.toString()))), + Collections.singletonList(FcfsUtil.winnerFormatting(key)), + String.valueOf(numberRedisTemplate.opsForValue().get(FcfsUtil.keyFormatting(key))), String.valueOf(timestamp), userId ); if(result == null || result <= 0) { - log.info("Event Finished: {},", stringRedisTemplate.opsForZSet().zCard(FcfsUtil.winnerFormatting(eventSequence.toString()))); - stringRedisTemplate.opsForSet().add(FcfsUtil.participantFormatting(eventSequence.toString()), userId); - endEvent(eventSequence); + log.info("Event Finished: {},", stringRedisTemplate.opsForZSet().zCard(FcfsUtil.winnerFormatting(key))); + stringRedisTemplate.opsForSet().add(FcfsUtil.participantFormatting(key), userId); + endEvent(key); return false; } - stringRedisTemplate.opsForZSet().add(FcfsUtil.winnerFormatting(eventSequence.toString()), userId, System.currentTimeMillis()); - stringRedisTemplate.opsForSet().add(FcfsUtil.participantFormatting(eventSequence.toString()), userId); + stringRedisTemplate.opsForZSet().add(FcfsUtil.winnerFormatting(key), userId, System.currentTimeMillis()); + stringRedisTemplate.opsForSet().add(FcfsUtil.participantFormatting(key), userId); log.info("Participating Success: {}, User ID: {}, Timestamp: {}", eventSequence, userId, timestamp); return true; } - public boolean isParticipated(Long eventSequence, String userId) { - return Boolean.TRUE.equals(stringRedisTemplate.opsForSet().isMember(FcfsUtil.participantFormatting(eventSequence.toString()), userId)); + public boolean isParticipated(String key, String userId) { + return Boolean.TRUE.equals(stringRedisTemplate.opsForSet().isMember(FcfsUtil.participantFormatting(key), userId)); } - private boolean isEventEnded(Long eventSequence) { - return Boolean.TRUE.equals(booleanRedisTemplate.opsForValue().get(FcfsUtil.endFlagFormatting(eventSequence.toString()))); + private boolean isEventEnded(String key) { + return Boolean.TRUE.equals(booleanRedisTemplate.opsForValue().get(FcfsUtil.endFlagFormatting(key))); } - private void endEvent(Long eventSequence) { - booleanRedisTemplate.opsForValue().set(FcfsUtil.endFlagFormatting(eventSequence.toString()), true); + private void endEvent(String key) { + booleanRedisTemplate.opsForValue().set(FcfsUtil.endFlagFormatting(key), true); } } diff --git a/src/main/java/hyundai/softeer/orange/event/fcfs/service/RedisSetFcfsService.java b/src/main/java/hyundai/softeer/orange/event/fcfs/service/RedisSetFcfsService.java index d55b96b1..692b2185 100644 --- a/src/main/java/hyundai/softeer/orange/event/fcfs/service/RedisSetFcfsService.java +++ b/src/main/java/hyundai/softeer/orange/event/fcfs/service/RedisSetFcfsService.java @@ -22,19 +22,20 @@ public class RedisSetFcfsService implements FcfsService { @Override public boolean participate(Long eventSequence, String userId) { + String key = eventSequence.toString(); // 이벤트 종료 여부 확인 - if(isEventEnded(eventSequence)) { - stringRedisTemplate.opsForSet().add(FcfsUtil.participantFormatting(eventSequence.toString()), userId); + if(isEventEnded(key)) { + stringRedisTemplate.opsForSet().add(FcfsUtil.participantFormatting(key), userId); return false; } // 이미 이 이벤트에 참여했는지 확인 - if(isParticipated(eventSequence, userId)) { + if(isParticipated(key, userId)) { throw new FcfsEventException(ErrorCode.ALREADY_PARTICIPATED); } // 잘못된 이벤트 참여 시간 - String startTime = stringRedisTemplate.opsForValue().get(FcfsUtil.startTimeFormatting(eventSequence.toString())); + String startTime = stringRedisTemplate.opsForValue().get(FcfsUtil.startTimeFormatting(key)); if(startTime == null) { throw new FcfsEventException(ErrorCode.FCFS_EVENT_NOT_FOUND); } @@ -43,44 +44,44 @@ public boolean participate(Long eventSequence, String userId) { } // 이벤트 인원 마감 여부 확인 - if (isEventFull(eventSequence)) { - log.info("Event Finished: {},", stringRedisTemplate.opsForZSet().zCard(FcfsUtil.winnerFormatting(eventSequence.toString()))); - stringRedisTemplate.opsForSet().add(FcfsUtil.participantFormatting(eventSequence.toString()), userId); + if (isEventFull(key)) { + log.info("Event Finished: {},", stringRedisTemplate.opsForZSet().zCard(FcfsUtil.winnerFormatting(key))); + stringRedisTemplate.opsForSet().add(FcfsUtil.participantFormatting(key), userId); return false; } - stringRedisTemplate.opsForZSet().add(FcfsUtil.winnerFormatting(eventSequence.toString()), userId, System.currentTimeMillis()); - stringRedisTemplate.opsForSet().add(FcfsUtil.participantFormatting(eventSequence.toString()), userId); + stringRedisTemplate.opsForZSet().add(FcfsUtil.winnerFormatting(key), userId, System.currentTimeMillis()); + stringRedisTemplate.opsForSet().add(FcfsUtil.participantFormatting(key), userId); log.info("Participating Success: {}, User ID: {}", eventSequence, userId); return true; } - private boolean isParticipated(Long eventSequence, String userId) { - return Boolean.TRUE.equals(stringRedisTemplate.opsForSet().isMember(FcfsUtil.participantFormatting(eventSequence.toString()), userId)); + private boolean isParticipated(String key, String userId) { + return Boolean.TRUE.equals(stringRedisTemplate.opsForSet().isMember(FcfsUtil.participantFormatting(key), userId)); } // 이미 종료된 이벤트인지 확인 - private boolean isEventEnded(Long eventSequence) { - return Boolean.TRUE.equals(booleanRedisTemplate.opsForValue().get(FcfsUtil.endFlagFormatting(eventSequence.toString()))); + private boolean isEventEnded(String key) { + return Boolean.TRUE.equals(booleanRedisTemplate.opsForValue().get(FcfsUtil.endFlagFormatting(key))); } // 인원수 마감 여부를 확인하며, synchronized를 통해 동시성 제어 - private synchronized boolean isEventFull(Long eventSequence) { - if(isEventEnded(eventSequence)){ + private synchronized boolean isEventFull(String key) { + if(isEventEnded(key)){ return true; } - Long nowCount = stringRedisTemplate.opsForZSet().size(FcfsUtil.winnerFormatting(eventSequence.toString())); + Long nowCount = stringRedisTemplate.opsForZSet().size(FcfsUtil.winnerFormatting(key)); if(nowCount == null){ throw new FcfsEventException(ErrorCode.FCFS_EVENT_NOT_FOUND); } - Integer maxNumber = numberRedisTemplate.opsForValue().get(FcfsUtil.keyFormatting(eventSequence.toString())); + Integer maxNumber = numberRedisTemplate.opsForValue().get(FcfsUtil.keyFormatting(key)); if (maxNumber == null) { throw new FcfsEventException(ErrorCode.FCFS_EVENT_NOT_FOUND); } if(nowCount >= maxNumber){ - booleanRedisTemplate.opsForValue().set(FcfsUtil.endFlagFormatting(eventSequence.toString()), true); + booleanRedisTemplate.opsForValue().set(FcfsUtil.endFlagFormatting(key), true); return true; } return false; diff --git a/src/main/java/hyundai/softeer/orange/event/fcfs/util/FcfsUtil.java b/src/main/java/hyundai/softeer/orange/event/fcfs/util/FcfsUtil.java index 72a87a31..dc52e7cf 100644 --- a/src/main/java/hyundai/softeer/orange/event/fcfs/util/FcfsUtil.java +++ b/src/main/java/hyundai/softeer/orange/event/fcfs/util/FcfsUtil.java @@ -7,28 +7,28 @@ public class FcfsUtil { // 선착순 이벤트 tag - public static String keyFormatting(String fcfsId) { - return fcfsId + ":fcfs"; + public static String keyFormatting(String key) { + return key + ":fcfs"; } // 선착순 이벤트 시작 시각 tag - public static String startTimeFormatting(String fcfsId) { - return fcfsId + "_start"; + public static String startTimeFormatting(String key) { + return key + "_start"; } // 선착순 이벤트 마감 여부 tag - public static String endFlagFormatting(String fcfsId) { - return fcfsId + "_end"; + public static String endFlagFormatting(String key) { + return key + "_end"; } // 선착순 이벤트 당첨자 tag - public static String winnerFormatting(String fcfsId) { - return fcfsId + "_winner"; + public static String winnerFormatting(String key) { + return key + "_winner"; } // 선착순 이벤트 참여자 tag - public static String participantFormatting(String fcfsId) { - return fcfsId + "_participant"; + public static String participantFormatting(String key) { + return key + "_participant"; } // 선착순 이벤트 정답 tag From 91e9996b254227a56ab2e32bebd241f9b67e84b2 Mon Sep 17 00:00:00 2001 From: win-luck Date: Sun, 11 Aug 2024 19:52:35 +0900 Subject: [PATCH 5/5] =?UTF-8?q?[chore]=20FcfsManageService=20toString()=20?= =?UTF-8?q?=EB=82=A8=EC=9A=A9=20=EC=A0=9C=EA=B1=B0=20(#44)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../orange/event/fcfs/service/FcfsManageService.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/hyundai/softeer/orange/event/fcfs/service/FcfsManageService.java b/src/main/java/hyundai/softeer/orange/event/fcfs/service/FcfsManageService.java index c0e7a45d..1c1f73f7 100644 --- a/src/main/java/hyundai/softeer/orange/event/fcfs/service/FcfsManageService.java +++ b/src/main/java/hyundai/softeer/orange/event/fcfs/service/FcfsManageService.java @@ -116,14 +116,15 @@ public List getFcfsWinnersInfo(Long eventSequence) { } private void prepareEventInfo(FcfsEvent event) { - numberRedisTemplate.opsForValue().set(FcfsUtil.keyFormatting(event.getId().toString()), event.getParticipantCount().intValue()); - booleanRedisTemplate.opsForValue().set(FcfsUtil.endFlagFormatting(event.getId().toString()), false); - stringRedisTemplate.opsForValue().set(FcfsUtil.startTimeFormatting(event.getId().toString()), event.getStartTime().toString()); + String key = event.getId().toString(); + numberRedisTemplate.opsForValue().set(FcfsUtil.keyFormatting(key), event.getParticipantCount().intValue()); + booleanRedisTemplate.opsForValue().set(FcfsUtil.endFlagFormatting(key), false); + stringRedisTemplate.opsForValue().set(FcfsUtil.startTimeFormatting(key), event.getStartTime().toString()); // FIXME: 선착순 정답 생성 과정을 별도로 관리하는 것이 좋을 듯 // 현재 정책 상 1~4 중 하나의 숫자를 선정하여 현재 선착순 이벤트의 정답에 저장 int answer = new Random().nextInt(4) + 1; - stringRedisTemplate.opsForValue().set(FcfsUtil.answerFormatting(event.getId().toString()), String.valueOf(answer)); + stringRedisTemplate.opsForValue().set(FcfsUtil.answerFormatting(key), String.valueOf(answer)); } public void deleteEventInfo(String eventId) {