From 21eab85e99be48dd2ccf76beb67e71362838fa82 Mon Sep 17 00:00:00 2001 From: kimeunkyoungg <127072393+kimeunkyoungg@users.noreply.github.com> Date: Wed, 7 Jan 2026 10:02:59 +0900 Subject: [PATCH 1/3] =?UTF-8?q?refactor:=20=EC=82=AC=EC=9A=A9=ED=95=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20=EC=BD=94=EB=93=9C=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../event/QueueEntryWebSocketPublisher.java | 1 + .../queue/service/QueueEntryReadService.java | 1 - .../api/ticket/controller/QrController.java | 1 - .../back/api/ticket/service/QrService.java | 1 - .../notification/entity/Notification.java | 1 - .../repository/QueueEntryRedisRepository.java | 2 +- .../com/back/domain/seat/entity/Seat.java | 2 +- .../back/global/init/QueueEntryDataInit.java | 137 ------------------ .../properties/QueueSchedulerProperties.java | 8 - .../main/resources/application-example.yml | 11 -- .../src/main/resources/application-prod.yml | 8 +- backend/src/main/resources/application.yml | 12 -- 12 files changed, 4 insertions(+), 181 deletions(-) delete mode 100644 backend/src/main/java/com/back/global/init/QueueEntryDataInit.java diff --git a/backend/src/main/java/com/back/api/queue/event/QueueEntryWebSocketPublisher.java b/backend/src/main/java/com/back/api/queue/event/QueueEntryWebSocketPublisher.java index 503b6b94..fa5db31b 100644 --- a/backend/src/main/java/com/back/api/queue/event/QueueEntryWebSocketPublisher.java +++ b/backend/src/main/java/com/back/api/queue/event/QueueEntryWebSocketPublisher.java @@ -24,6 +24,7 @@ public void publisherToUser(QueueEntryStatusResponse response) { } + //TODO 프로젝트 종료 후 상위 인원에게만 broadcast하는 방식으로 수정 고려. 아직은 테스트 인원이 적기 때문에 보류 //broadcast - 대기 상태 public void publishBatchUpdate(WaitingQueueBatchEventResponse event) { diff --git a/backend/src/main/java/com/back/api/queue/service/QueueEntryReadService.java b/backend/src/main/java/com/back/api/queue/service/QueueEntryReadService.java index 9eca9825..a657cc65 100644 --- a/backend/src/main/java/com/back/api/queue/service/QueueEntryReadService.java +++ b/backend/src/main/java/com/back/api/queue/service/QueueEntryReadService.java @@ -30,7 +30,6 @@ /* * 대기열 조회 로직 * Redis 우선 조회 -> DB 조회 - * TODO 시간 계산 로직 수정 */ @Service @RequiredArgsConstructor diff --git a/backend/src/main/java/com/back/api/ticket/controller/QrController.java b/backend/src/main/java/com/back/api/ticket/controller/QrController.java index f5b5b576..cb985423 100644 --- a/backend/src/main/java/com/back/api/ticket/controller/QrController.java +++ b/backend/src/main/java/com/back/api/ticket/controller/QrController.java @@ -33,7 +33,6 @@ public ApiResponse generateQrToken( return ApiResponse.ok("QR 토큰 발급 성공", response); } - //TODO 관리자 전용 API로 변경 고려 @Override @PostMapping("/entry/verify") public ApiResponse validateQrCode( diff --git a/backend/src/main/java/com/back/api/ticket/service/QrService.java b/backend/src/main/java/com/back/api/ticket/service/QrService.java index 9b3a6376..5495dad0 100644 --- a/backend/src/main/java/com/back/api/ticket/service/QrService.java +++ b/backend/src/main/java/com/back/api/ticket/service/QrService.java @@ -146,7 +146,6 @@ private QrTokenClaims validateAndParseQrToken(String qrToken) { Long userId = getLongValue(payload, CLAIM_USER_ID); Long issuedAt = getLongValue(payload, CLAIM_IAT); - // TODO -> 2중 체크 로직 제거 고려 // 토큰 기간 확인 -> 60초 이상이면 만료 long now = Instant.now().getEpochSecond(); if(now - issuedAt > QR_TOKEN_VALIDATE_SECEONDS) { diff --git a/backend/src/main/java/com/back/domain/notification/entity/Notification.java b/backend/src/main/java/com/back/domain/notification/entity/Notification.java index 3b4e3ce3..1204edb0 100644 --- a/backend/src/main/java/com/back/domain/notification/entity/Notification.java +++ b/backend/src/main/java/com/back/domain/notification/entity/Notification.java @@ -25,7 +25,6 @@ import lombok.Getter; import lombok.NoArgsConstructor; -//TODO: User 엔티티쪽에 Cascade 설정 해줘야 함 @Entity @Builder @Getter diff --git a/backend/src/main/java/com/back/domain/queue/repository/QueueEntryRedisRepository.java b/backend/src/main/java/com/back/domain/queue/repository/QueueEntryRedisRepository.java index 847b9d50..fa034e3e 100644 --- a/backend/src/main/java/com/back/domain/queue/repository/QueueEntryRedisRepository.java +++ b/backend/src/main/java/com/back/domain/queue/repository/QueueEntryRedisRepository.java @@ -82,7 +82,7 @@ public void moveToEnteredQueue(Long eventId, Long userId) { String key = String.format(ENTERED_KEY, eventId); redisTemplate.opsForSet().add(key, userId.toString()); - //redisTemplate.expire(key, java.time.Duration.ofMinutes(15)); //TTL 15분 TODO 주석 해제 + //redisTemplate.expire(key, java.time.Duration.ofMinutes(15)); //TTL 15분 TODO 주석 해제. 테스트를 위해 임시 주석 처리 log.info("Moved user to entered queue - eventId: {}, userId: {}", eventId, userId); } diff --git a/backend/src/main/java/com/back/domain/seat/entity/Seat.java b/backend/src/main/java/com/back/domain/seat/entity/Seat.java index 3d4cf67f..29999279 100644 --- a/backend/src/main/java/com/back/domain/seat/entity/Seat.java +++ b/backend/src/main/java/com/back/domain/seat/entity/Seat.java @@ -48,7 +48,7 @@ public class Seat extends BaseEntity { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "event_id", nullable = false) - private Event event; // TODO: 실제 Event 엔티티로 변경 필요 + private Event event; @Column(nullable = false, name = "seat_code") private String seatCode; // 예시) "A1", "B2" diff --git a/backend/src/main/java/com/back/global/init/QueueEntryDataInit.java b/backend/src/main/java/com/back/global/init/QueueEntryDataInit.java deleted file mode 100644 index ce3348a4..00000000 --- a/backend/src/main/java/com/back/global/init/QueueEntryDataInit.java +++ /dev/null @@ -1,137 +0,0 @@ -package com.back.global.init; - -// 해당 클래스 임시 보류 -> preRegister를 통해 생성되는 방식으로 테스트 중 -// @Component -// @RequiredArgsConstructor -// @Slf4j -// @Profile("local") -// @Order(3) -// public class QueueEntryDataInit implements ApplicationRunner { -// -// private final QueueEntryRepository queueEntryRepository; -// private final QueueEntryRedisRepository queueEntryRedisRepository; -// private final UserRepository userRepository; -// private final EventRepository eventRepository; -// -// @Override -// public void run(ApplicationArguments args) throws Exception { -// if(queueEntryRepository.count() > 0) { -// log.info("QueueEntry 데이터가 이미 존재합니다. 초기화를 건너뜁니다."); -// return; -// } -// -// log.info("QueueEntry 초기 데이터를 생성합니다."); -// -// List users = userRepository.findAll(); -// if (users.isEmpty()) { -// log.warn("User 데이터가 없습니다. UserDataInit을 먼저 실행해주세요."); -// return; -// } -// -// -// Event event = eventRepository.findAll().stream() -// .findFirst() -// .orElse(null); -// -// if (event == null) { -// log.warn("Event 데이터가 없습니다. EventDataInit을 먼저 실행해주세요."); -// return; -// } -// -// // Long targetEventId = 3L; -// // -// // Event event = eventRepository.findById(targetEventId) -// // .orElse(null); -// // -// // if (event == null) { -// // log.warn("ID {}에 해당하는 Event가 없습니다. Event를 먼저 생성해주세요.", targetEventId); -// // return; -// // } -// -// // Event 상태를 QUEUE_READY로 변경 -// event.changeStatus(EventStatus.QUEUE_READY); -// eventRepository.save(event); -// -// // QueueEntry 생성 -// createTestQueueEntries(event, users); -// log.info("QueueEntry 생성 완료"); -// -// // Redis 데이터 생성 -// createTestRedisData(event.getId(), users); -// } -// -// /** -// * 테스트 대기열 생성 -// * - WAITING: 50명 (1~50번) -// * - ENTERED: 30명 (51~80번, 5분 전 입장) -// * - EXPIRED: 20명 (81~100번, 20분 전 입장) -// */ -// private void createTestQueueEntries(Event event, List users) { -// List entries = new ArrayList<>(); -// -// // 1. WAITING 상태 50명 (1~50번) -// for (int i = 0; i < 100; i++) { -// QueueEntry entry = new QueueEntry(users.get(i), event, i + 1); -// entries.add(entry); -// } -// -// // // 2. ENTERED 상태 30명 (51~80번) -// // for (int i = 50; i < 80; i++) { -// // QueueEntry entry = new QueueEntry(users.get(i), event, i + 1); -// // entry.enterQueue(); // WAITING → ENTERED -// // entries.add(entry); -// // } -// // -// // // 3. EXPIRED 상태 20명 (81~100번) -// // for (int i = 80; i < 100; i++) { -// // QueueEntry entry = new QueueEntry(users.get(i), event, i + 1); -// // entry.enterQueue(); -// // entry.expire(); // ENTERED → EXPIRED -// // entries.add(entry); -// // } -// -// queueEntryRepository.saveAll(entries); -// log.info("QueueEntry DB 저장 완료: {}개", entries.size()); -// } -// -// /** -// * 테스트 Redis 데이터 생성 (Repository 메서드 사용) -// */ -// private void createTestRedisData(Long eventId, List users) { -// try { -// for (int i = 0; i < users.size(); i++) { -// queueEntryRedisRepository.addToWaitingQueue( -// eventId, -// users.get(i).getId(), -// i + 1 -// ); -// } -// // // 1. WAITING 큐에 50명 추가 (1~50번) -// // for (int i = 0; i < 50; i++) { -// // queueEntryRedisRepository.addToWaitingQueue( -// // eventId, -// // users.get(i).getId(), -// // i + 1 -// // ); -// // } -// // log.info("Redis WAITING 큐 저장: 50명"); -// // -// // // 2. ENTERED 큐에 30명 추가 (51~80번) - 직접 추가 메서드 사용 -// // for (int i = 50; i < 80; i++) { -// // queueEntryRedisRepository.addToEnteredQueueDirectly( -// // eventId, -// // users.get(i).getId() -// // ); -// // } -// // log.info("Redis ENTERED 큐 저장: 30명 (TTL: 15분)"); -// -// // 3. ENTERED 카운트 설정 -// queueEntryRedisRepository.setEnteredCount(eventId, 30); -// log.info("Redis ENTERED 카운트 저장: 30"); -// -// log.info("Redis 데이터 생성 완료 - eventId: {}", eventId); -// } catch (Exception e) { -// log.error("Redis 데이터 생성 실패: {}", e.getMessage(), e); -// } -// } -// } diff --git a/backend/src/main/java/com/back/global/properties/QueueSchedulerProperties.java b/backend/src/main/java/com/back/global/properties/QueueSchedulerProperties.java index 7dd6798a..2fdd1dbd 100644 --- a/backend/src/main/java/com/back/global/properties/QueueSchedulerProperties.java +++ b/backend/src/main/java/com/back/global/properties/QueueSchedulerProperties.java @@ -13,7 +13,6 @@ public class QueueSchedulerProperties { private Entry entry = new Entry(); - private Shuffle shuffle = new Shuffle(); @Getter @Setter @@ -23,11 +22,4 @@ public static class Entry { private int maxEnteredLimit; } - @Getter - @Setter - public static class Shuffle { - private String cron; - private int timeRangeMinutes; - } - } diff --git a/backend/src/main/resources/application-example.yml b/backend/src/main/resources/application-example.yml index 91272d93..9e8dd0ec 100644 --- a/backend/src/main/resources/application-example.yml +++ b/backend/src/main/resources/application-example.yml @@ -82,20 +82,9 @@ queue: batch-size: 100 # 한 번에 입장시킬 인원 max-entered-limit: 100 # 최대 수용 인원 - #셔플 처리 스케줄러 - shuffle: - cron: "*/30 * * * * *" # 테스트를 위해 30초마다 실행 - #cron: "0 */10 * * * *" # 10분마다 실행 - time-range-minutes: 1 # 시간 범위 - expire: cron: "0 * * * * *" -event: - scheduler: - open: - cron: "0 * * * * *" - # Actuator/micrometer/prometheus 설정 management: endpoints: diff --git a/backend/src/main/resources/application-prod.yml b/backend/src/main/resources/application-prod.yml index cfa1c4fc..bee6f8ce 100644 --- a/backend/src/main/resources/application-prod.yml +++ b/backend/src/main/resources/application-prod.yml @@ -73,16 +73,10 @@ management: health: show-details: never -# TODO: 프론트 완료 후 아래 주석처리 한 걸로 교체 cookie: secure: true same-site: None - domain: "" - -#cookie: -# secure: true -# same-site: None -# domain: ".waitfair.shop" + domain: ".waitfair.shop" # coolSMS sms: diff --git a/backend/src/main/resources/application.yml b/backend/src/main/resources/application.yml index 8fe8e4fd..e48624c2 100644 --- a/backend/src/main/resources/application.yml +++ b/backend/src/main/resources/application.yml @@ -3,7 +3,6 @@ spring: import: optional:file:.env.properties profiles: active: dev - include: secret jackson: time-zone: Asia/Seoul output: @@ -144,20 +143,9 @@ queue: batch-size: 50 # 한 번에 입장시킬 인원 100 max-entered-limit: 100 # 최대 수용 인원 - #셔플 처리 스케줄러 - shuffle: - cron: "*/30 * * * * *" # 테스트를 위해 30초마다 실행 - #cron: "0 */10 * * * *" # 10분마다 실행 - time-range-minutes: 1 # 시간 범위 - expire: cron: "0 * * * * *" -event: - scheduler: - open: - cron: "0 * * * * *" - # Actuator/micrometer/prometheus 설정 management: endpoints: From 080a7a998117f6a0e116326cf9db2a5f74e4c593 Mon Sep 17 00:00:00 2001 From: kimeunkyoungg <127072393+kimeunkyoungg@users.noreply.github.com> Date: Wed, 7 Jan 2026 11:03:18 +0900 Subject: [PATCH 2/3] =?UTF-8?q?refactor:=20queueEntryScheduler=20=EB=B9=84?= =?UTF-8?q?=ED=99=9C=EC=84=B1=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/back/api/queue/scheduler/QueueEntryScheduler.java | 3 ++- .../com/back/domain/preregister/entity/PreRegisterStatus.java | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/com/back/api/queue/scheduler/QueueEntryScheduler.java b/backend/src/main/java/com/back/api/queue/scheduler/QueueEntryScheduler.java index 0e28f3b6..66a8961c 100644 --- a/backend/src/main/java/com/back/api/queue/scheduler/QueueEntryScheduler.java +++ b/backend/src/main/java/com/back/api/queue/scheduler/QueueEntryScheduler.java @@ -23,11 +23,12 @@ * 대기열 입장 처리 스케줄러 * WAITING -> ENTERED * WAITING 상태 사용자에게 실시간 순위 업데이트 (WebSocket) + * 해당 스케줄러는 10초마다 동작하기 때문에 서버 부담을 줄이기 위해 임시로 prod 환경에서 비활성화 */ @Component @RequiredArgsConstructor @Slf4j -@Profile({"perf", "prod"}) +@Profile({"perf"}) public class QueueEntryScheduler { private static final String JOB_NAME = "QueueEntry"; diff --git a/backend/src/main/java/com/back/domain/preregister/entity/PreRegisterStatus.java b/backend/src/main/java/com/back/domain/preregister/entity/PreRegisterStatus.java index 7489730b..4ece6abd 100644 --- a/backend/src/main/java/com/back/domain/preregister/entity/PreRegisterStatus.java +++ b/backend/src/main/java/com/back/domain/preregister/entity/PreRegisterStatus.java @@ -11,5 +11,4 @@ public enum PreRegisterStatus { @Schema(description = "사전등록 취소") CANCELED - //큐로 넘어가는 상태값 } From 38912dad90db8c9d239a9d005237962365e1b714 Mon Sep 17 00:00:00 2001 From: kimeunkyoungg <127072393+kimeunkyoungg@users.noreply.github.com> Date: Wed, 7 Jan 2026 12:28:28 +0900 Subject: [PATCH 3/3] =?UTF-8?q?refactor:=20=EC=8A=A4=EC=BC=80=EC=A4=84?= =?UTF-8?q?=EB=9F=AC=20=EB=B9=84=ED=99=9C=EC=84=B1=ED=99=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/back/api/queue/scheduler/QueueExpireScheduler.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/backend/src/main/java/com/back/api/queue/scheduler/QueueExpireScheduler.java b/backend/src/main/java/com/back/api/queue/scheduler/QueueExpireScheduler.java index 2323bfff..ff1d0bd8 100644 --- a/backend/src/main/java/com/back/api/queue/scheduler/QueueExpireScheduler.java +++ b/backend/src/main/java/com/back/api/queue/scheduler/QueueExpireScheduler.java @@ -19,11 +19,13 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; - +/* + * 테스트 환경을 위해 임시로 prod 환경에서 비활성화 + */ @Component @RequiredArgsConstructor @Slf4j -@Profile({"perf", "prod"}) +@Profile({"perf"}) public class QueueExpireScheduler { private static final String JOB_NAME = "QueueExpire";