diff --git a/src/main/java/softeer/team_pineapple_be/domain/draw/controller/DrawController.java b/src/main/java/softeer/team_pineapple_be/domain/draw/controller/DrawController.java index a3863ec..307ca5c 100644 --- a/src/main/java/softeer/team_pineapple_be/domain/draw/controller/DrawController.java +++ b/src/main/java/softeer/team_pineapple_be/domain/draw/controller/DrawController.java @@ -16,7 +16,7 @@ import softeer.team_pineapple_be.domain.draw.request.SendPrizeRequest; import softeer.team_pineapple_be.domain.draw.response.DrawDailyMessageResponse; import softeer.team_pineapple_be.domain.draw.response.DrawResponse; -import softeer.team_pineapple_be.domain.draw.response.DrawRewardImageResponse; +import softeer.team_pineapple_be.domain.draw.response.DrawRewardInfoResponse; import softeer.team_pineapple_be.domain.draw.response.SendPrizeResponse; import softeer.team_pineapple_be.domain.draw.service.DrawPrizeService; import softeer.team_pineapple_be.domain.draw.service.DrawService; @@ -40,10 +40,16 @@ public ResponseEntity enterDraw() { return ResponseEntity.ok(drawService.enterDraw()); } - @Operation(summary = "메인 페이지에서 사용할 경품 이미지 받기") - @GetMapping("/prize-images") - public ResponseEntity> getDrawPrizeImages() { - List drawRewardImages = drawPrizeService.getDrawRewardImages(); + @Operation(summary = "해당 날짜와 응모 시나리오 조회") + @GetMapping("/scenario") + public ResponseEntity getDrawDailyScenario() { + return ResponseEntity.ok(drawService.getDrawDailyScenario()); + } + + @Operation(summary = "메인 페이지에서 사용할 경품 정보 받기") + @GetMapping("/prize-infos") + public ResponseEntity> getDrawPrizeImages() { + List drawRewardImages = drawPrizeService.getDrawRewardImages(); return ResponseEntity.ok(drawRewardImages); } @@ -54,10 +60,4 @@ public ResponseEntity sendPrize(@Valid @RequestBody SendPrize SendPrizeResponse sendPrizeResponse = drawPrizeService.sendPrizeMessage(request.getPrizeId()); return ResponseEntity.ok(sendPrizeResponse); } - - @Operation(summary = "해당 날짜와 응모 시나리오 조회") - @GetMapping("/scenario") - public ResponseEntity getDrawDailyScenario(){ - return ResponseEntity.ok(drawService.getDrawDailyScenario()); - } } diff --git a/src/main/java/softeer/team_pineapple_be/domain/draw/exception/DrawErrorCode.java b/src/main/java/softeer/team_pineapple_be/domain/draw/exception/DrawErrorCode.java index 54c0221..90dc393 100644 --- a/src/main/java/softeer/team_pineapple_be/domain/draw/exception/DrawErrorCode.java +++ b/src/main/java/softeer/team_pineapple_be/domain/draw/exception/DrawErrorCode.java @@ -17,7 +17,8 @@ public enum DrawErrorCode implements ErrorCode { NOT_VALID_DATE(HttpStatus.BAD_REQUEST, "상품 추첨이 가능하지 않은 날짜입니다."), NO_DAILY_INFO(HttpStatus.BAD_REQUEST, "일자별 응모 정보가 존재하지 않습니다"), DAILY_INFO_WIN_IMAGE_UPLOAD_FAILED(HttpStatus.BAD_REQUEST, "응모 성공 이미지 업로드에 실패했습니다."), - DAILY_INFO_LOSE_IMAGE_UPLOAD_FAILED(HttpStatus.BAD_REQUEST, "응모 실패 이미지 업로드에 실패했습니다."); + DAILY_INFO_LOSE_IMAGE_UPLOAD_FAILED(HttpStatus.BAD_REQUEST, "응모 실패 이미지 업로드에 실패했습니다."), + NO_PRIZE_PROBABILITY(HttpStatus.BAD_REQUEST, "확률 정보가 존재하지 않습니다."); private final HttpStatus httpStatus; private final String message; diff --git a/src/main/java/softeer/team_pineapple_be/domain/draw/response/DrawRewardImageResponse.java b/src/main/java/softeer/team_pineapple_be/domain/draw/response/DrawRewardImageResponse.java deleted file mode 100644 index 9bde32c..0000000 --- a/src/main/java/softeer/team_pineapple_be/domain/draw/response/DrawRewardImageResponse.java +++ /dev/null @@ -1,21 +0,0 @@ -package softeer.team_pineapple_be.domain.draw.response; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; -import softeer.team_pineapple_be.domain.draw.domain.DrawRewardInfo; - -/** - * 경품 이미지 응답 - */ -@Getter -@Setter -@AllArgsConstructor -public class DrawRewardImageResponse { - private Byte rank; - private String imageUrl; - - public static DrawRewardImageResponse of(DrawRewardInfo drawRewardInfo) { - return new DrawRewardImageResponse(drawRewardInfo.getRanking(), drawRewardInfo.getImage()); - } -} diff --git a/src/main/java/softeer/team_pineapple_be/domain/draw/response/DrawRewardInfoResponse.java b/src/main/java/softeer/team_pineapple_be/domain/draw/response/DrawRewardInfoResponse.java new file mode 100644 index 0000000..0790b58 --- /dev/null +++ b/src/main/java/softeer/team_pineapple_be/domain/draw/response/DrawRewardInfoResponse.java @@ -0,0 +1,26 @@ +package softeer.team_pineapple_be.domain.draw.response; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.Setter; +import softeer.team_pineapple_be.domain.draw.domain.DrawRewardInfo; +import softeer.team_pineapple_be.domain.draw.service.DrawProbabilityService; + +/** + * 경품 이미지 응답 + */ +@Getter +@Setter +@AllArgsConstructor +public class DrawRewardInfoResponse { + private Byte rank; + private String rewardName; + private Integer rewardCount; + private String imageUrl; + + public static DrawRewardInfoResponse of(DrawRewardInfo drawRewardInfo, + DrawProbabilityService drawProbabilityService) { + return new DrawRewardInfoResponse(drawRewardInfo.getRanking(), drawRewardInfo.getName(), + drawProbabilityService.getDrawProbabilityByRanking(drawRewardInfo.getRanking()), drawRewardInfo.getImage()); + } +} diff --git a/src/main/java/softeer/team_pineapple_be/domain/draw/service/DrawPrizeService.java b/src/main/java/softeer/team_pineapple_be/domain/draw/service/DrawPrizeService.java index 37269a5..ba5fa25 100644 --- a/src/main/java/softeer/team_pineapple_be/domain/draw/service/DrawPrizeService.java +++ b/src/main/java/softeer/team_pineapple_be/domain/draw/service/DrawPrizeService.java @@ -13,7 +13,7 @@ import softeer.team_pineapple_be.domain.draw.exception.DrawErrorCode; import softeer.team_pineapple_be.domain.draw.repository.DrawPrizeRepository; import softeer.team_pineapple_be.domain.draw.repository.DrawRewardInfoRepository; -import softeer.team_pineapple_be.domain.draw.response.DrawRewardImageResponse; +import softeer.team_pineapple_be.domain.draw.response.DrawRewardInfoResponse; import softeer.team_pineapple_be.domain.draw.response.SendPrizeResponse; import softeer.team_pineapple_be.global.auth.service.AuthMemberService; import softeer.team_pineapple_be.global.cloud.service.S3DeleteService; @@ -33,14 +33,15 @@ public class DrawPrizeService { private final S3UploadService s3UploadService; private final S3DeleteService s3DeleteService; private final DrawRewardInfoRepository drawRewardInfoRepository; + private final DrawProbabilityService drawProbabilityService; /** * 응모 경품 이미지를 반환하는 메서드 */ @Transactional(readOnly = true) - public List getDrawRewardImages() { + public List getDrawRewardImages() { List all = drawRewardInfoRepository.findAll(); - return all.stream().map(DrawRewardImageResponse::of).toList(); + return all.stream().map(info -> DrawRewardInfoResponse.of(info, drawProbabilityService)).toList(); } /** diff --git a/src/main/java/softeer/team_pineapple_be/domain/draw/service/DrawProbabilityService.java b/src/main/java/softeer/team_pineapple_be/domain/draw/service/DrawProbabilityService.java index b2ecde9..ba00e99 100644 --- a/src/main/java/softeer/team_pineapple_be/domain/draw/service/DrawProbabilityService.java +++ b/src/main/java/softeer/team_pineapple_be/domain/draw/service/DrawProbabilityService.java @@ -1,17 +1,21 @@ package softeer.team_pineapple_be.domain.draw.service; -import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import softeer.team_pineapple_be.domain.draw.domain.DrawProbability; -import softeer.team_pineapple_be.domain.draw.repository.DrawProbabilityRepository; -import softeer.team_pineapple_be.domain.draw.request.DrawProbabilityRequest; -import softeer.team_pineapple_be.domain.draw.response.DrawProbabilityResponse; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; +import softeer.team_pineapple_be.domain.draw.domain.DrawProbability; +import softeer.team_pineapple_be.domain.draw.exception.DrawErrorCode; +import softeer.team_pineapple_be.domain.draw.repository.DrawProbabilityRepository; +import softeer.team_pineapple_be.domain.draw.request.DrawProbabilityRequest; +import softeer.team_pineapple_be.domain.draw.response.DrawProbabilityResponse; +import softeer.team_pineapple_be.global.exception.RestApiException; + /** * 경품 확률 서비스 */ @@ -19,33 +23,52 @@ @RequiredArgsConstructor public class DrawProbabilityService { - private final DrawProbabilityRepository drawProbabilityRepository; + private static final ConcurrentHashMap probabilityCache = new ConcurrentHashMap<>(); + private final DrawProbabilityRepository drawProbabilityRepository; - /** - * 경품 확률을 조회하는 메서드 - * @return 경품 확률 리스트 - */ - @Transactional(readOnly = true) - public DrawProbabilityResponse getDrawProbability(){ - List probabilities = drawProbabilityRepository.findAll(); - Map probabilitiesMap = probabilities.stream() - .collect(Collectors.toMap(DrawProbability::getRanking, DrawProbability::getProbability)); + /** + * 경품 확률을 조회하는 메서드 + * + * @return 경품 확률 리스트 + */ + @Transactional(readOnly = true) + public DrawProbabilityResponse getDrawProbability() { + List probabilities = drawProbabilityRepository.findAll(); + Map probabilitiesMap = + probabilities.stream().collect(Collectors.toMap(DrawProbability::getRanking, DrawProbability::getProbability)); - return new DrawProbabilityResponse(probabilitiesMap); + return new DrawProbabilityResponse(probabilitiesMap); + } + + @Transactional(readOnly = true) + public Integer getDrawProbabilityByRanking(Byte ranking) { + if (probabilityCache.containsKey(ranking)) { + return probabilityCache.get(ranking); } - /** - * 경품 확률을 수정하는 메서드 - * @param request 수정하고자 하는 경품 확률 - */ - @Transactional - public void setDrawProbability(DrawProbabilityRequest request) { - Map probabilities = request.getProbabilities(); + Integer probability = drawProbabilityRepository.findById(ranking) + .orElseThrow( + () -> new RestApiException(DrawErrorCode.NO_PRIZE_PROBABILITY)) + .getProbability(); + probabilityCache.put(ranking, probability); + return probability; + } - List drawProbabilities = probabilities.entrySet().stream() - .map(entry -> new DrawProbability(entry.getKey(), entry.getValue())) - .collect(Collectors.toList()); + /** + * 경품 확률을 수정하는 메서드 + * + * @param request 수정하고자 하는 경품 확률 + */ + @Transactional + public void setDrawProbability(DrawProbabilityRequest request) { + Map probabilities = request.getProbabilities(); - drawProbabilityRepository.saveAll(drawProbabilities); - } + List drawProbabilities = probabilities.entrySet() + .stream() + .map(entry -> new DrawProbability(entry.getKey(), + entry.getValue())) + .collect(Collectors.toList()); + + drawProbabilityRepository.saveAll(drawProbabilities); + } }