@@ -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 * 대기열에 사용자가 있는지 확인
0 commit comments