diff --git a/src/ai/4tune_AI/gaze_ver2/__pycache__/main.cpython-310.pyc b/src/ai/4tune_AI/gaze_ver2/__pycache__/main.cpython-310.pyc index 152cb9f..f658fd1 100644 Binary files a/src/ai/4tune_AI/gaze_ver2/__pycache__/main.cpython-310.pyc and b/src/ai/4tune_AI/gaze_ver2/__pycache__/main.cpython-310.pyc differ diff --git a/src/ai/4tune_AI/gaze_ver2/detectors.py b/src/ai/4tune_AI/gaze_ver2/detectors.py index 84d832a..f46cfd8 100644 --- a/src/ai/4tune_AI/gaze_ver2/detectors.py +++ b/src/ai/4tune_AI/gaze_ver2/detectors.py @@ -20,7 +20,7 @@ def detect_look_around(user_id, pitch, yaw, start_times, cheating_flags, cheatin if pitch <= PITCH_DOWN_THRESHOLD and abs(yaw) > YAW_FORWARD_THRESHOLD: if start_times[user_id]['look_around'] is None: start_times[user_id]['look_around'] = current_time - print(f"[DEBUG] {user_id}: 주변 응시 시작 시간 기록: {current_time}") + # print(f"[DEBUG] {user_id}: 주변 응시 시작 시간 기록: {current_time}") else: elapsed_time = current_time - start_times[user_id]['look_around'] if elapsed_time >= LOOK_AROUND_THRESHOLD and not cheating_flags[user_id]['look_around']: @@ -28,13 +28,13 @@ def detect_look_around(user_id, pitch, yaw, start_times, cheating_flags, cheatin cheating_counts[user_id]['look_around'] += 1 message = {'type': '주변 응시', 'start_time': current_time} cheating_messages[user_id].append(message) - print(f'[{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(current_time))}] ' - f'User: {user_id}, 유형: 주변 응시, 횟수: {cheating_counts[user_id]["look_around"]}') + # print(f'[{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(current_time))}] ' + # f'User: {user_id}, 유형: 주변 응시, 횟수: {cheating_counts[user_id]["look_around"]}') else: if cheating_flags[user_id]['look_around']: cheating_flags[user_id]['look_around'] = False start_times[user_id]['look_around'] = None - print(f"[DEBUG] {user_id}: 주변 응시 종료") + # print(f"[DEBUG] {user_id}: 주변 응시 종료") def detect_repeated_gaze(user_id, grid_position, gaze_history, start_times, cheating_flags, cheating_counts, cheating_messages, pitch): """ @@ -53,10 +53,10 @@ def detect_repeated_gaze(user_id, grid_position, gaze_history, start_times, chea current_time = time.time() if pitch <= PITCH_DOWN_THRESHOLD: gaze_history[user_id].append((grid_position, current_time)) - print(f"[DEBUG] {user_id}: 시선 위치 추가 - {grid_position} at {current_time}") + # print(f"[DEBUG] {user_id}: 시선 위치 추가 - {grid_position} at {current_time}") # REPEATED_GAZE_WINDOW 내의 기록만 유지 gaze_history[user_id] = [(pos, t) for pos, t in gaze_history[user_id] if current_time - t <= REPEATED_GAZE_WINDOW] - print(f"[DEBUG] {user_id}: 시선 역사 업데이트 - {gaze_history[user_id]}") + # print(f"[DEBUG] {user_id}: 시선 역사 업데이트 - {gaze_history[user_id]}") # 특정 위치에서 REPEATED_GAZE_DURATION 이상 응시한 횟수 카운트 position_times = {} @@ -72,7 +72,7 @@ def detect_repeated_gaze(user_id, grid_position, gaze_history, start_times, chea for i in range(len(times) - 1): if times[i+1] - times[i] <= REPEATED_GAZE_DURATION: repeated_gaze_count += 1 - print(f"[DEBUG] {user_id}: 반복 시선 감지 - 위치 {pos}, 간격 {times[i+1] - times[i]}") + # print(f"[DEBUG] {user_id}: 반복 시선 감지 - 위치 {pos}, 간격 {times[i+1] - times[i]}") break # 해당 위치에서 한 번만 카운트 # 반복 응시 조건 충족 시 부정행위 기록 @@ -81,13 +81,13 @@ def detect_repeated_gaze(user_id, grid_position, gaze_history, start_times, chea cheating_counts[user_id]['repeated_gaze'] += 1 message = {'type': '동일 위치 반복 응시', 'start_time': current_time} cheating_messages[user_id].append(message) - print(f'[{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(current_time))}] ' - f'User: {user_id}, 유형: 동일 위치 반복 응시, 횟수: {cheating_counts[user_id]["repeated_gaze"]}') + # print(f'[{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(current_time))}] ' + # f'User: {user_id}, 유형: 동일 위치 반복 응시, 횟수: {cheating_counts[user_id]["repeated_gaze"]}') else: if cheating_flags[user_id]['repeated_gaze']: cheating_flags[user_id]['repeated_gaze'] = False start_times[user_id]['repeated_gaze'] = None - print(f"[DEBUG] {user_id}: 동일 위치 반복 응시 종료") + # print(f"[DEBUG] {user_id}: 동일 위치 반복 응시 종료") def detect_object_presence(user_id, detections, cheating_flags, cheating_counts, cheating_messages, image_shape): """ @@ -111,12 +111,12 @@ def detect_object_presence(user_id, detections, cheating_flags, cheating_counts, objects = [d['name'] for d in cheating_objects_detected] message = {'type': '부정행위 물체 감지', 'start_time': current_time, 'objects': objects} cheating_messages[user_id].append(message) - print(f'[{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(current_time))}] ' - f'User: {user_id}, 유형: 부정행위 물체 감지 ({objects}), 횟수: {cheating_counts[user_id]["object"]}') + # print(f'[{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(current_time))}] ' + # f'User: {user_id}, 유형: 부정행위 물체 감지 ({objects}), 횟수: {cheating_counts[user_id]["object"]}') else: if cheating_flags[user_id]['object']: cheating_flags[user_id]['object'] = False - print(f"[DEBUG] {user_id}: 부정행위 물체 감지 해제") + # print(f"[DEBUG] {user_id}: 부정행위 물체 감지 해제") def detect_face_absence(user_id, face_present, start_times, cheating_flags, cheating_counts, face_absence_history, cheating_messages): """ @@ -135,7 +135,7 @@ def detect_face_absence(user_id, face_present, start_times, cheating_flags, chea if not face_present: if start_times[user_id]['face_absence'] is None: start_times[user_id]['face_absence'] = current_time - print(f"[DEBUG] {user_id}: 얼굴 이탈 시작 시간 기록: {current_time}") + # print(f"[DEBUG] {user_id}: 얼굴 이탈 시작 시간 기록: {current_time}") else: elapsed_time = current_time - start_times[user_id]['face_absence'] if elapsed_time >= FACE_ABSENCE_THRESHOLD and not cheating_flags[user_id]['face_absence_long']: @@ -143,12 +143,12 @@ def detect_face_absence(user_id, face_present, start_times, cheating_flags, chea cheating_counts[user_id]['face_absence_long'] += 1 message = {'type': '장기 화면 이탈', 'start_time': current_time} cheating_messages[user_id].append(message) - print(f'[{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(current_time))}] ' - f'User: {user_id}, 유형: 장기 화면 이탈, 횟수: {cheating_counts[user_id]["face_absence_long"]}') + # print(f'[{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(current_time))}] ' + # f'User: {user_id}, 유형: 장기 화면 이탈, 횟수: {cheating_counts[user_id]["face_absence_long"]}') elif elapsed_time >= FACE_ABSENCE_DURATION: # 3초 이상 이탈한 경우 기록 face_absence_history[user_id].append(current_time) - print(f"[DEBUG] {user_id}: 3초 이상 얼굴 이탈 기록: {current_time}") + # print(f"[DEBUG] {user_id}: 3초 이상 얼굴 이탈 기록: {current_time}") # 30초 이내의 기록만 유지 face_absence_history[user_id] = [t for t in face_absence_history[user_id] if current_time - t <= FACE_ABSENCE_WINDOW] if len(face_absence_history[user_id]) >= FACE_ABSENCE_COUNT_THRESHOLD and not cheating_flags[user_id]['face_absence_repeat']: @@ -156,14 +156,14 @@ def detect_face_absence(user_id, face_present, start_times, cheating_flags, chea cheating_counts[user_id]['face_absence_repeat'] += 1 message = {'type': '반복 화면 이탈', 'start_time': current_time} cheating_messages[user_id].append(message) - print(f'[{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(current_time))}] ' - f'User: {user_id}, 유형: 반복 화면 이탈, 횟수: {cheating_counts[user_id]["face_absence_repeat"]}') + # print(f'[{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(current_time))}] ' + # f'User: {user_id}, 유형: 반복 화면 이탈, 횟수: {cheating_counts[user_id]["face_absence_repeat"]}') else: if cheating_flags[user_id]['face_absence_long'] or cheating_flags[user_id]['face_absence_repeat']: cheating_flags[user_id]['face_absence_long'] = False cheating_flags[user_id]['face_absence_repeat'] = False start_times[user_id]['face_absence'] = None - print(f"[DEBUG] {user_id}: 얼굴 이탈 상태 플래그 초기화") + # print(f"[DEBUG] {user_id}: 얼굴 이탈 상태 플래그 초기화") def detect_hand_gestures(user_id, hand_landmarks_list, start_times, cheating_flags, cheating_counts, cheating_messages): """ @@ -182,29 +182,29 @@ def detect_hand_gestures(user_id, hand_landmarks_list, start_times, cheating_fla for hand_landmarks in hand_landmarks_list: gesture = recognize_hand_gesture(hand_landmarks) - print(f"[DEBUG] {user_id}: 인식된 손동작 - {gesture}") + # print(f"[DEBUG] {user_id}: 인식된 손동작 - {gesture}") if gesture in ['fist', 'palm']: hand_gesture_detected = True if gesture == 'fist': if start_times[user_id]['hand_gesture'] is None: start_times[user_id]['hand_gesture'] = current_time - print(f"[DEBUG] {user_id}: 손동작 'fist' 시작 시간 기록: {current_time}") + # print(f"[DEBUG] {user_id}: 손동작 'fist' 시작 시간 기록: {current_time}") elif gesture == 'palm': if cheating_flags[user_id]['hand_gesture']: cheating_flags[user_id]['hand_gesture'] = False start_times[user_id]['hand_gesture'] = None - print(f"[DEBUG] {user_id}: 손동작 'palm' 인식, 손동작 상태 플래그 초기화") + # print(f"[DEBUG] {user_id}: 손동작 'palm' 인식, 손동작 상태 플래그 초기화") else: if start_times[user_id]['hand_gesture'] is not None: elapsed_time = current_time - start_times[user_id]['hand_gesture'] - print(f"[DEBUG] {user_id}: 손동작 'other' 인식, 경과 시간: {elapsed_time}") + # print(f"[DEBUG] {user_id}: 손동작 'other' 인식, 경과 시간: {elapsed_time}") if elapsed_time >= HAND_GESTURE_THRESHOLD and not cheating_flags[user_id]['hand_gesture']: cheating_flags[user_id]['hand_gesture'] = True cheating_counts[user_id]['hand_gesture'] += 1 message = {'type': '특정 손동작 반복', 'start_time': current_time} cheating_messages[user_id].append(message) - print(f'[{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(current_time))}] ' - f'User: {user_id}, 부정행위 감지! 유형: 특정 손동작 반복, 횟수: {cheating_counts[user_id]["hand_gesture"]}') + # print(f'[{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(current_time))}] ' + # f'User: {user_id}, 부정행위 감지! 유형: 특정 손동작 반복, 횟수: {cheating_counts[user_id]["hand_gesture"]}') # 손동작이 감지되지 않으면 초기화 if not hand_gesture_detected: @@ -231,21 +231,21 @@ def detect_head_turn(user_id, pitch, yaw, start_times, cheating_flags, cheating_ if abs(yaw) > HEAD_TURN_THRESHOLD: if start_times[user_id]['head_turn'] is None: start_times[user_id]['head_turn'] = current_time - print(f"[DEBUG] {user_id}: 고개 돌림 시작 시간 기록: {current_time}") + # print(f"[DEBUG] {user_id}: 고개 돌림 시작 시간 기록: {current_time}") else: elapsed_time = current_time - start_times[user_id]['head_turn'] - print(f"[DEBUG] {user_id}: 고개 돌림 지속 시간: {elapsed_time}") + # print(f"[DEBUG] {user_id}: 고개 돌림 지속 시간: {elapsed_time}") if elapsed_time >= HEAD_TURN_DURATION and not cheating_flags[user_id]['head_turn_long']: cheating_flags[user_id]['head_turn_long'] = True cheating_counts[user_id]['head_turn_long'] += 1 message = {'type': '고개 돌림 유지', 'start_time': current_time} cheating_messages[user_id].append(message) - print(f'[{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(current_time))}] ' - f'User: {user_id}, 유형: 고개 돌림 유지, 횟수: {cheating_counts[user_id]["head_turn_long"]}') + # print(f'[{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(current_time))}] ' + # f'User: {user_id}, 유형: 고개 돌림 유지, 횟수: {cheating_counts[user_id]["head_turn_long"]}') elif elapsed_time >= HEAD_TURN_REPEAT_DURATION: # 3초 이상 고개를 돌린 경우 기록 head_turn_history[user_id].append(current_time) - print(f"[DEBUG] {user_id}: 고개 돌림 반복 기록: {current_time}") + # print(f"[DEBUG] {user_id}: 고개 돌림 반복 기록: {current_time}") # 30초 이내의 기록만 유지 head_turn_history[user_id] = [t for t in head_turn_history[user_id] if current_time - t <= HEAD_TURN_WINDOW] if len(head_turn_history[user_id]) >= HEAD_TURN_COUNT_THRESHOLD and not cheating_flags[user_id]['head_turn_repeat']: @@ -253,14 +253,14 @@ def detect_head_turn(user_id, pitch, yaw, start_times, cheating_flags, cheating_ cheating_counts[user_id]['head_turn_repeat'] += 1 message = {'type': '고개 돌림 반복', 'start_time': current_time} cheating_messages[user_id].append(message) - print(f'[{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(current_time))}] ' - f'User: {user_id}, 유형: 고개 돌림 반복, 횟수: {cheating_counts[user_id]["head_turn_repeat"]}') + # print(f'[{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(current_time))}] ' + # f'User: {user_id}, 유형: 고개 돌림 반복, 횟수: {cheating_counts[user_id]["head_turn_repeat"]}') else: if cheating_flags[user_id]['head_turn_long'] or cheating_flags[user_id]['head_turn_repeat']: cheating_flags[user_id]['head_turn_long'] = False cheating_flags[user_id]['head_turn_repeat'] = False start_times[user_id]['head_turn'] = None - print(f"[DEBUG] {user_id}: 고개 돌림 상태 플래그 초기화") + # print(f"[DEBUG] {user_id}: 고개 돌림 상태 플래그 초기화") def detect_eye_movement(user_id, eye_center, image_shape, start_times, cheating_flags, cheating_counts, cheating_messages): """ @@ -276,40 +276,40 @@ def detect_eye_movement(user_id, eye_center, image_shape, start_times, cheating_ cheating_messages (defaultdict): 부정행위 메시지를 기록하는 딕셔너리. """ if image_shape is None or len(image_shape) < 2: - print(f"[DEBUG] {user_id}: 유효하지 않은 이미지 형태") + # print(f"[DEBUG] {user_id}: 유효하지 않은 이미지 형태") return image_center = (image_shape[1] // 2, image_shape[0] // 2) - print(f"[DEBUG] {user_id}: 이미지 중심 - {image_center}") + # print(f"[DEBUG] {user_id}: 이미지 중심 - {image_center}") # 눈동자 움직임 감지 로직 구현 if eye_center: dx = eye_center[0] - image_center[0] dy = eye_center[1] - image_center[1] distance = math.sqrt(dx**2 + dy**2) - print(f"[DEBUG] {user_id}: 눈동자 이동 거리 - {distance}") + # print(f"[DEBUG] {user_id}: 눈동자 이동 거리 - {distance}") if distance > EYE_MOVEMENT_THRESHOLD: if start_times[user_id]['eye_movement'] is None: start_times[user_id]['eye_movement'] = time.time() - print(f"[DEBUG] {user_id}: 눈동자 움직임 시작 시간 기록: {start_times[user_id]['eye_movement']}") + # print(f"[DEBUG] {user_id}: 눈동자 움직임 시작 시간 기록: {start_times[user_id]['eye_movement']}") else: elapsed_time = time.time() - start_times[user_id]['eye_movement'] - print(f"[DEBUG] {user_id}: 눈동자 움직임 지속 시간: {elapsed_time}") + # print(f"[DEBUG] {user_id}: 눈동자 움직임 지속 시간: {elapsed_time}") if elapsed_time >= EYE_MOVEMENT_DURATION and not cheating_flags[user_id]['eye_movement']: cheating_flags[user_id]['eye_movement'] = True cheating_counts[user_id]['eye_movement'] += 1 message = {'type': '눈동자 움직임 감지됨', 'start_time': time.time()} cheating_messages[user_id].append(message) - print(f'[{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))}] ' - f'User: {user_id}, 유형: 눈동자 움직임 감지됨, 횟수: {cheating_counts[user_id]["eye_movement"]}') + # print(f'[{time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(time.time()))}] ' + # f'User: {user_id}, 유형: 눈동자 움직임 감지됨, 횟수: {cheating_counts[user_id]["eye_movement"]}') else: if cheating_flags[user_id]['eye_movement']: cheating_flags[user_id]['eye_movement'] = False start_times[user_id]['eye_movement'] = None - print(f"[DEBUG] {user_id}: 눈동자 움직임 상태 플래그 초기화") + # print(f"[DEBUG] {user_id}: 눈동자 움직임 상태 플래그 초기화") else: if cheating_flags[user_id]['eye_movement']: cheating_flags[user_id]['eye_movement'] = False start_times[user_id]['eye_movement'] = None - print(f"[DEBUG] {user_id}: 눈동자 중심 없음, 눈동자 움직임 상태 플래그 초기화") \ No newline at end of file + # print(f"[DEBUG] {user_id}: 눈동자 중심 없음, 눈동자 움직임 상태 플래그 초기화") \ No newline at end of file diff --git a/src/ai/4tune_AI/gaze_ver2/main.py b/src/ai/4tune_AI/gaze_ver2/main.py index 62922a3..73f4793 100644 --- a/src/ai/4tune_AI/gaze_ver2/main.py +++ b/src/ai/4tune_AI/gaze_ver2/main.py @@ -89,10 +89,10 @@ class CheatingResult(BaseModel): - user_id: str - cheating_counts: dict + userId: str + cheatingCounts: dict timestamp: str - messages: list = [] # 부정행위 메시지 추가 + # messages: list = [] # 부정행위 메시지 추가 class ConnectionManager: @@ -155,27 +155,33 @@ async def websocket_endpoint(websocket: WebSocket, user_id: str): manager.disconnect(user_id) +# 기존에 정의된 cheating_counts와 cheating_messages를 사용하는 로직 async def get_cheating_result(user_id: str): + # 유저의 부정행위 카운트가 존재하고 1개라도 > 0인 경우에만 진행 if user_id not in cheating_counts or not any(count > 0 for count in cheating_counts[user_id].values()): raise HTTPException(status_code=404, detail="User not found or no cheating detected.") + # 현재 시간을 timestamp로 설정 current_time = datetime.now().strftime('%Y-%m-%d %H:%M:%S') + + # CheatingResult 객체 생성 (messages 필드는 비워두어도 됨) cheating_result = CheatingResult( userId=user_id, cheatingCounts=cheating_counts[user_id], - timestamp=current_time - # messages=cheating_messages[user_id] + timestamp=current_time, + # messages=cheating_messages.get(user_id, []) # 메시지가 필요하면 추가 ) - response = cheating_result + + # 부정행위 결과를 JSON 형태로 백엔드 API로 전송 async with aiohttp.ClientSession() as session: try: - async with session.post(BACKEND_API_URL, json=response) as resp: + async with session.post(BACKEND_API_URL, json=cheating_result.dict()) as resp: if resp.status == 200: - logging.info(f"부정행위 결과 전송 성공: {response}") + logging.info(f"Cheating result sent successfully: {cheating_result.dict()}") else: - logging.error(f"부정행위 결과 전송 실패: {response}") - except Exception as e: # 요청 실패 시 로그 출력 - logging.error(f"부정행위 결과 전송 중 오류 발생: {e}") + logging.error(f"Failed to send cheating result: {cheating_result.dict()}") + except Exception as e: + logging.error(f"Error sending cheating result: {e}") async def process_frame(user_id, image, frame_timestamp): @@ -210,6 +216,7 @@ async def process_frame(user_id, image, frame_timestamp): "messages": cheating_messages[user_id] } try: + await get_cheating_result(user_id) await manager.send_message(user_id, cheating_result) cheating_messages[user_id].clear() logging.debug(f"{user_id}: 부정행위 메시지 전송 및 초기화 완료") diff --git a/src/backend/Eyesee/src/main/java/com/fortune/eyesee/controller/SessionController.java b/src/backend/Eyesee/src/main/java/com/fortune/eyesee/controller/SessionController.java index 4c2533b..ec44715 100644 --- a/src/backend/Eyesee/src/main/java/com/fortune/eyesee/controller/SessionController.java +++ b/src/backend/Eyesee/src/main/java/com/fortune/eyesee/controller/SessionController.java @@ -33,9 +33,10 @@ public ResponseEntity> joinExam(@RequestBody E // 학생 정보 입력 @PostMapping("/student") - public ResponseEntity> addUserInfo(@RequestBody UserInfoRequestDTO userInfoRequestDTO) { - TokenResponseDTO tokenResponseDTO = sessionService.addUserInfo(userInfoRequestDTO); - return ResponseEntity.ok(new BaseResponse<>(tokenResponseDTO, "사용자 정보 입력 성공")); + public ResponseEntity> addUserInfo(@RequestBody UserInfoRequestDTO userInfoRequestDTO) { + // 학생 정보 입력, 토큰 및 userId 반환 + TokenWithUserIdResponseDTO tokenWithUserIdResponseDTO = sessionService.addUserInfo(userInfoRequestDTO); + return ResponseEntity.ok(new BaseResponse<>(tokenWithUserIdResponseDTO, "사용자 정보 입력 성공")); } } \ No newline at end of file diff --git a/src/backend/Eyesee/src/main/java/com/fortune/eyesee/dto/TokenWithUserIdResponseDTO.java b/src/backend/Eyesee/src/main/java/com/fortune/eyesee/dto/TokenWithUserIdResponseDTO.java new file mode 100644 index 0000000..4abaa8f --- /dev/null +++ b/src/backend/Eyesee/src/main/java/com/fortune/eyesee/dto/TokenWithUserIdResponseDTO.java @@ -0,0 +1,14 @@ +package com.fortune.eyesee.dto; + +public class TokenWithUserIdResponseDTO extends TokenResponseDTO { + private Integer userId; + + public TokenWithUserIdResponseDTO(String accessToken, String refreshToken, Integer userId) { + super(accessToken, refreshToken); + this.userId = userId; + } + + public Integer getUserId() { + return userId; + } +} \ No newline at end of file diff --git a/src/backend/Eyesee/src/main/java/com/fortune/eyesee/service/SessionService.java b/src/backend/Eyesee/src/main/java/com/fortune/eyesee/service/SessionService.java index 50d2d7d..a2b1016 100644 --- a/src/backend/Eyesee/src/main/java/com/fortune/eyesee/service/SessionService.java +++ b/src/backend/Eyesee/src/main/java/com/fortune/eyesee/service/SessionService.java @@ -2,6 +2,7 @@ import com.fortune.eyesee.common.exception.BaseException; import com.fortune.eyesee.common.response.BaseResponseCode; +import com.fortune.eyesee.dto.TokenWithUserIdResponseDTO; import com.fortune.eyesee.dto.UserInfoRequestDTO; import com.fortune.eyesee.dto.TokenResponseDTO; import com.fortune.eyesee.entity.Session; @@ -28,7 +29,7 @@ public class SessionService { // 세션에 학생을 등록하고 토큰을 발급 @Transactional - public TokenResponseDTO addUserInfo(UserInfoRequestDTO requestDTO) { + public TokenWithUserIdResponseDTO addUserInfo(UserInfoRequestDTO requestDTO) { // 시험 세션 찾기 Session session = sessionRepository.findByExamExamRandomCode(requestDTO.getExamCode()) .orElseThrow(() -> new BaseException(BaseResponseCode.NOT_FOUND_SESSION)); @@ -47,7 +48,7 @@ public TokenResponseDTO addUserInfo(UserInfoRequestDTO requestDTO) { // 세션 토큰 생성 및 반환 String accessToken = jwtUtil.generateSessionToken(session.getSessionId(), user.getUserNum()); - return new TokenResponseDTO(accessToken, null); // Refresh Token은 필요 없으므로 null 설정 + return new TokenWithUserIdResponseDTO(accessToken, null, user.getUserId()); // Refresh Token은 필요 없으므로 null 설정 } } \ No newline at end of file