Skip to content

Commit 9d8880c

Browse files
committed
Merge branch 'develop'
# Conflicts: # backend/src/test/java/com/WEB4_5_GPT_BE/unihub/domain/enrollment/controller/EnrollmentControllerTest.java # backend/src/test/java/com/WEB4_5_GPT_BE/unihub/domain/enrollment/service/EnrollmentQueueServiceTest.java
2 parents 5054bd6 + 2ccca33 commit 9d8880c

7 files changed

Lines changed: 81 additions & 361 deletions

File tree

backend/src/main/java/com/WEB4_5_GPT_BE/unihub/domain/enrollment/controller/EnrollmentEventController.java

Lines changed: 6 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
package com.WEB4_5_GPT_BE.unihub.domain.enrollment.controller;
22

3+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
4+
import org.springframework.web.bind.annotation.GetMapping;
5+
import org.springframework.web.bind.annotation.PostMapping;
6+
import org.springframework.web.bind.annotation.RequestMapping;
7+
import org.springframework.web.bind.annotation.RestController;
38
import com.WEB4_5_GPT_BE.unihub.domain.enrollment.dto.QueueStatusDto;
49
import com.WEB4_5_GPT_BE.unihub.domain.enrollment.service.EnrollmentQueueService;
5-
import com.WEB4_5_GPT_BE.unihub.domain.enrollment.service.SseEmitterService;
610
import com.WEB4_5_GPT_BE.unihub.global.exception.UnihubException;
711
import com.WEB4_5_GPT_BE.unihub.global.response.Empty;
812
import com.WEB4_5_GPT_BE.unihub.global.response.RsData;
@@ -13,13 +17,6 @@
1317
import io.swagger.v3.oas.annotations.tags.Tag;
1418
import lombok.RequiredArgsConstructor;
1519
import lombok.extern.slf4j.Slf4j;
16-
import org.springframework.http.MediaType;
17-
import org.springframework.security.core.annotation.AuthenticationPrincipal;
18-
import org.springframework.web.bind.annotation.GetMapping;
19-
import org.springframework.web.bind.annotation.PostMapping;
20-
import org.springframework.web.bind.annotation.RequestMapping;
21-
import org.springframework.web.bind.annotation.RestController;
22-
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
2320

2421
@Tag(name = "Enrollment", description = "수강신청 관련 API (대기열 관리, 이벤트 스트림 등)")
2522
@Slf4j
@@ -28,31 +25,9 @@
2825
@RequiredArgsConstructor
2926
public class EnrollmentEventController {
3027

31-
private final SseEmitterService sseEmitterService;
3228
private final EnrollmentQueueService enrollmentQueueService;
3329

34-
@Operation(summary = "SSE 연결", description = "수강신청 과정에서 실시간 이벤트를 받기 위한 SSE 연결을 설정합니다.")
35-
@ApiResponses(value = {
36-
@ApiResponse(responseCode = "200", description = "SSE 연결 성공"),
37-
@ApiResponse(responseCode = "401", description = "인증되지 않은 사용자")
38-
})
39-
@GetMapping(value = "/events", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
40-
public SseEmitter subscribeToEvents(@AuthenticationPrincipal SecurityUser securityUser) {
41-
// 인증된 사용자 정보가 없는 경우 예외 처리
42-
if (securityUser == null) {
43-
log.warn("인증되지 않은 SSE 연결 시도");
44-
throw new UnihubException("401", "인증되지 않은 요청입니다.");
45-
}
46-
47-
String memberId = String.valueOf(securityUser.getId());
48-
log.info("SSE 연결 요청: {}", memberId);
49-
50-
// 초기 상태 가져오기
51-
QueueStatusDto initialStatus = enrollmentQueueService.getQueueStatus(memberId);
52-
53-
// 초기 상태와 함께 SSE 이미터 생성
54-
return sseEmitterService.createEmitterWithInitialStatus(memberId, initialStatus);
55-
}
30+
// SSE 관련 코드 제거
5631

5732
@Operation(summary = "대기열 참여", description = "수강신청 대기열에 사용자를 추가합니다.")
5833
@ApiResponses(value = {

backend/src/main/java/com/WEB4_5_GPT_BE/unihub/domain/enrollment/scheduler/SseHeartbeatScheduler.java

Lines changed: 0 additions & 27 deletions
This file was deleted.

backend/src/main/java/com/WEB4_5_GPT_BE/unihub/domain/enrollment/service/EnrollmentQueueService.java

Lines changed: 12 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,8 @@ public class EnrollmentQueueService {
2121
private static final int MAX_CONCURRENT_USERS = 3;
2222
private static final Duration SESSION_TIMEOUT = Duration.ofMinutes(10);
2323
private final StringRedisTemplate redisTemplate;
24-
private final SseEmitterService sseEmitterService;
25-
// 대기열 상태 메시지 전송 주기 (5초)
26-
private static final long QUEUE_MESSAGE_INTERVAL = 5000;
27-
// 업데이트 오프셋 (일정 수 이상 변경이 있을 때 업데이트)
28-
private static final int QUEUE_MESSAGE_BATCH_SIZE = 5;
29-
// 마지막으로 대기열 상태 메시지를 전송한 시간
30-
private long lastQueueMessageTime = 0;
31-
// 최근 처리된 사용자 수 (배치 처리용)
32-
private int processedUserCount = 0;
24+
25+
// 구현 제거: SSE 관련 필드 및 메시지 배치 전송 코드 제거
3326

3427
/**
3528
* 대기열에 사용자 추가
@@ -38,18 +31,14 @@ public QueueStatusDto addToQueue(String memberId) {
3831
// 이미 활성 세션이 있는지 확인
3932
Boolean hasSession = redisTemplate.hasKey(SESSION_PREFIX + memberId);
4033
if (Boolean.TRUE.equals(hasSession)) {
41-
QueueStatusDto status = new QueueStatusDto(true, 0, 0);
42-
sseEmitterService.sendQueueStatus(memberId, status);
43-
return status;
34+
return new QueueStatusDto(true, 0, 0);
4435
}
4536

4637
// 이미 대기열에 있는지 확인
4738
if (isUserInQueue(memberId)) {
4839
int position = getPositionInQueue(memberId);
4940
int waitTime = position * 60 * 5; // 사용자당 5분 소요 가정
50-
QueueStatusDto status = new QueueStatusDto(false, position, waitTime);
51-
sseEmitterService.sendQueueStatus(memberId, status);
52-
return status;
41+
return new QueueStatusDto(false, position, waitTime);
5342
}
5443

5544
// 현재 활성 사용자 수 확인
@@ -59,10 +48,7 @@ public QueueStatusDto addToQueue(String memberId) {
5948
if (activeUsers < MAX_CONCURRENT_USERS) {
6049
redisTemplate.opsForValue().set(SESSION_PREFIX + memberId, "active", SESSION_TIMEOUT);
6150
log.info("사용자 {} 즉시 접속 허용", memberId);
62-
63-
QueueStatusDto status = new QueueStatusDto(true, 0, 0);
64-
sseEmitterService.sendQueueStatus(memberId, status);
65-
return status;
51+
return new QueueStatusDto(true, 0, 0);
6652
}
6753

6854
// 대기열에 추가
@@ -71,9 +57,7 @@ public QueueStatusDto addToQueue(String memberId) {
7157
int waitTime = position * 60 * 5; // 사용자당 5분 소요 가정
7258

7359
log.info("사용자 {} 대기열 추가, 위치: {}, 예상 대기시간: {}초", memberId, position, waitTime);
74-
QueueStatusDto status = new QueueStatusDto(false, position, waitTime);
75-
sseEmitterService.sendQueueStatus(memberId, status);
76-
return status;
60+
return new QueueStatusDto(false, position, waitTime);
7761
}
7862

7963
/**
@@ -124,49 +108,19 @@ public void processNextInQueue() {
124108
// 대기열에서 다음 사용자 가져오기 (leftPop 사용) - Redis 대기열 실시간 업데이트
125109
String nextMemberId = redisTemplate.opsForList().leftPop(WAITING_QUEUE_KEY);
126110

111+
// 대기열이 비어있는 경우 처리
112+
if (nextMemberId == null) {
113+
log.info("대기열에 사용자가 없습니다.");
114+
return;
115+
}
116+
127117
// 세션 활성화
128118
redisTemplate.opsForValue().set(SESSION_PREFIX + nextMemberId, "active", SESSION_TIMEOUT);
129-
130-
// 사용자에게 접속 허용 알림 (SSE 이벤트 전송)
131-
QueueStatusDto status = new QueueStatusDto(true, 0, 0);
132-
sseEmitterService.sendQueueStatus(nextMemberId, status);
133119
log.info("사용자 {} 대기열에서 접속 허용", nextMemberId);
134-
135-
// 처리된 사용자 카운트 증가
136-
processedUserCount++;
137-
138-
// 대기열 상태 메시지 배치 전송 조건 확인
139-
long currentTime = System.currentTimeMillis();
140-
boolean timeBasedUpdate = (currentTime - lastQueueMessageTime) > QUEUE_MESSAGE_INTERVAL;
141-
boolean countBasedUpdate = processedUserCount >= QUEUE_MESSAGE_BATCH_SIZE;
142-
143-
if (timeBasedUpdate || countBasedUpdate) {
144-
// 대기열 상태 메시지만 배치로 전송 (Redis 대기열 업데이트는 이미 위에서 실시간으로 이루어짐)
145-
sendQueueStatusMessages();
146-
lastQueueMessageTime = currentTime;
147-
processedUserCount = 0;
148-
log.info("대기열 사용자에게 상태 메시지 전송 - {} 기준", timeBasedUpdate ? "시간" : "처리량");
149-
}
150120
}
151121
}
152122

153-
/**
154-
* 대기열에 있는 모든 사용자에게 상태 메시지만 전송 (Redis 데이터 업데이트 없이 메시지만 전송)
155-
*/
156-
private void sendQueueStatusMessages() {
157-
// 현재 대기열 상태 조회 (Redis 대기열은 변경하지 않고 읽기만 함)
158-
List<String> queueMembers = redisTemplate.opsForList().range(WAITING_QUEUE_KEY, 0, -1);
159123

160-
// 대기열에 있는 모든 사용자에게 상태 메시지 전송
161-
for (int i = 0; i < queueMembers.size(); i++) {
162-
String memberId = queueMembers.get(i);
163-
int position = i + 1; // 1부터 시작하는 위치
164-
int waitTime = position * 30; // 사용자당 30초 소요 가정
165-
166-
QueueStatusDto status = new QueueStatusDto(false, position, waitTime);
167-
sseEmitterService.sendQueueStatus(memberId, status);
168-
}
169-
}
170124

171125
/**
172126
* 대기열에 사용자가 있는지 확인

backend/src/main/java/com/WEB4_5_GPT_BE/unihub/domain/enrollment/service/SseEmitterService.java

Lines changed: 0 additions & 135 deletions
This file was deleted.

0 commit comments

Comments
 (0)