Skip to content

Commit 230cd8d

Browse files
committed
[Fix] 광고 노출 집계와 게재 기간 판단을 KST로 고정
진입점에서 TimeZone.setDefault(Asia/Seoul)을 하고 있어 런타임 동작은 문제없었지만, 기본 시간대 설정에 기대면 일별 노출 버킷이 엉뚱한 시각에 갈릴 수 있다. BattleVoteServiceImpl과 같은 방식으로 KST를 명시한다.
1 parent 1fc11bc commit 230cd8d

2 files changed

Lines changed: 12 additions & 4 deletions

File tree

‎src/main/java/com/swyp/picke/domain/ad/service/AdClickService.java‎

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import java.security.MessageDigest;
1010
import java.security.NoSuchAlgorithmException;
1111
import java.time.LocalDateTime;
12+
import java.time.ZoneId;
1213
import java.util.HexFormat;
1314
import java.util.Optional;
1415
import lombok.RequiredArgsConstructor;
@@ -24,6 +25,9 @@ public class AdClickService {
2425

2526
private static final int USER_AGENT_MAX_LENGTH = 500;
2627

28+
/** 게재 기간 판단은 KST 기준이다. 진입점의 기본 시간대 설정에 기대지 않는다. */
29+
private static final ZoneId KST = ZoneId.of("Asia/Seoul");
30+
2731
private final AdCreativeRepository adCreativeRepository;
2832
private final AdClickLogRepository adClickLogRepository;
2933
private final AffiliateLinkResolver affiliateLinkResolver;
@@ -34,7 +38,7 @@ public class AdClickService {
3438
@Transactional(readOnly = true)
3539
public Optional<AdClickTarget> resolveTarget(String code) {
3640
return adCreativeRepository.findByCode(code)
37-
.filter(creative -> creative.isServable(LocalDateTime.now()))
41+
.filter(creative -> creative.isServable(LocalDateTime.now(KST)))
3842
.map(creative -> new AdClickTarget(
3943
creative.getId(),
4044
creative.getSlot(),

‎src/main/java/com/swyp/picke/domain/ad/service/AdQueryService.java‎

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.swyp.picke.domain.ad.repository.AdImpressionDailyRepository;
1010
import java.time.LocalDate;
1111
import java.time.LocalDateTime;
12+
import java.time.ZoneId;
1213
import java.util.ArrayList;
1314
import java.util.Iterator;
1415
import java.util.List;
@@ -25,6 +26,9 @@
2526
@RequiredArgsConstructor
2627
public class AdQueryService {
2728

29+
/** 노출 집계 버킷과 게재 기간은 KST 기준이다. 진입점의 기본 시간대 설정에 기대지 않는다. */
30+
private static final ZoneId KST = ZoneId.of("Asia/Seoul");
31+
2832
private final AdCreativeRepository adCreativeRepository;
2933
private final AdImpressionDailyRepository adImpressionDailyRepository;
3034

@@ -37,7 +41,7 @@ public class AdQueryService {
3741
*/
3842
@Transactional(readOnly = true)
3943
public List<AdResponse> findServableAds(AdSlotCode slot, int size) {
40-
LocalDateTime now = LocalDateTime.now();
44+
LocalDateTime now = LocalDateTime.now(KST);
4145

4246
List<AdCreative> candidates = adCreativeRepository.findAllBySlotAndStatus(slot, AdStatus.ACTIVE).stream()
4347
.filter(creative -> creative.isServable(now))
@@ -54,7 +58,7 @@ public List<AdResponse> findServableAds(AdSlotCode slot, int size) {
5458
*/
5559
@Transactional(readOnly = true)
5660
public List<AdResponse> findLandingAds() {
57-
LocalDateTime now = LocalDateTime.now();
61+
LocalDateTime now = LocalDateTime.now(KST);
5862

5963
return adCreativeRepository.findAllByStatusOrderByIdDesc(AdStatus.ACTIVE).stream()
6064
.filter(creative -> creative.isServable(now))
@@ -68,7 +72,7 @@ public List<AdResponse> findLandingAds() {
6872
*/
6973
@Transactional
7074
public void recordImpressions(List<String> codes) {
71-
LocalDate today = LocalDate.now();
75+
LocalDate today = LocalDate.now(KST);
7276

7377
List<ImpressionTarget> targets = adCreativeRepository.findAllByCodeIn(codes).stream()
7478
.map(creative -> new ImpressionTarget(creative.getId(), creative.getSlot()))

0 commit comments

Comments
 (0)