Skip to content

fix(core): 답변 0개 세션을 수동 종료하면 완료로 남아 피드백을 만들던 문제 - #273

Merged
i3months merged 1 commit into
devfrom
fix/session-end-without-answer
Sep 29, 2026
Merged

i3months merged 1 commit into
devfrom
fix/session-end-without-answer

Conversation

@i3months

Copy link
Copy Markdown
Member

문제

시간초과 스위퍼는 처음부터 답변 유무로 갈랐다 — 있으면 COMPLETED(→피드백), 없으면 INTERRUPTED.

// SessionTimeoutService.endTimedOut
boolean hasAnswer = messageRepository.existsBySession_IdAndRole(sessionId, MessageRole.INTERVIEWEE);
SessionStatus target = hasAnswer ? SessionStatus.COMPLETED : SessionStatus.INTERRUPTED;

수동 종료(SessionService.end)만 그 규칙에서 빠져 있었다 — 무조건 COMPLETED + SessionEndedEvent.

그래서 자기소개 질문만 받고 '종료' 를 누른 세션이 완료로 남아 피드백 생성까지 탔다. 운영 10건(세션 98·89·76·55·38·30·26·25·24·8, 최근 2026-09-21) 모두 질문 1개 / 답변 0개인데 피드백 행이 있다.

  • 세션당 LLM 을 7회 가까이 쓴다 — 평가위원 패널 + 종합 + 첫인상 + 코칭 + 임베딩.
  • 채점할 답변이 없으니 점수가 전부 null 인 피드백 페이지가 만들어진다.

수정

end 도 같은 기준으로 분기한다. 답변이 없으면 INTERRUPTED + 이벤트 미발행.

COMPLETED 로 두고 이벤트만 막지 않은 이유

그게 더 작은 변경이지만 더 나쁘다 — 피드백 없는 COMPLETED 는 조회가 FEEDBACK_NOT_READY(404)라 화면이 "생성 중"에서 영구히 멈춘다. INTERRUPTED 는 피드백을 기대하지 않고 PATCH /resume 로 이어서 할 수 있어, 도중에 그만둔 사용자에게 오히려 맞다.

콜백 종료에 같은 가드를 두지 않은 이유

QuestionsCallbackService.endSession 의 세 진입점(POOL_GENERATION_FAILED·MAX_QUESTIONS_REACHED·POOL_EXHAUSTED)은 전부 자기소개 답변 이후에만 도달한다 — 질문 풀 요청 자체가 SelfIntroAnsweredEvent 로 발행되기 때문. 데이터도 일치한다(10건 모두 질문 1개).

프론트

SessionEndedPanel 은 이미 INTERRUPTED 를 '이어서 진행하기' 로 다루고 피드백 버튼을 숨겨 그대로 맞아떨어진다. 다만 종료 확인 문구가 "피드백 단계로 넘어갑니다. 이 작업은 되돌릴 수 없습니다" 라 답변이 없을 때 둘 다 거짓이 되므로 답변 유무로 갈랐다.

테스트

  • SessionServiceTest — 기존 완료 전이 테스트에 답변 존재·이벤트 발행을 명시 + 답변 0개 전이 2건(정상 / 전이 경합 상실).
  • InterviewStage.endCopy.test.tsx — 답변 유무별 확인 문구.
  • ./gradlew test 전체 통과, npm run type-check · npm run lint 통과.

기존 10건

상태를 되돌리지 않는다 — 이미 만들어진 피드백을 지우면 사용자가 보던 기록이 사라지고, 빈 피드백은 그 자체로 오동작하지 않는다(읽기만 하면 null 표시). 재발만 막는다.

🤖 Generated with Claude Code

시간초과 스위퍼(SessionTimeoutService.endTimedOut)는 처음부터 답변 유무로
갈랐다 — 있으면 COMPLETED(→피드백), 없으면 INTERRUPTED. 수동 종료
(SessionService.end)만 그 규칙에서 빠져 무조건 COMPLETED +
SessionEndedEvent 였다.

그래서 자기소개 질문만 받고 '종료' 를 누른 세션이 완료로 남아 피드백
생성까지 탔다. 운영 10건(최근 session 98) — 세션당 LLM 을 7회 가까이
쓰고(평가위원 패널·종합·첫인상·코칭·임베딩) 채점할 답변이 없으니 점수가
전부 null 인 피드백 페이지가 만들어진다.

COMPLETED 로 두고 이벤트만 막는 쪽이 더 작은 변경이지만 더 나쁘다 —
피드백 없는 COMPLETED 는 조회가 FEEDBACK_NOT_READY(404)라 화면이
"생성 중"에서 영구히 멈춘다. INTERRUPTED 는 피드백을 기대하지 않고
PATCH /resume 로 이어서 할 수 있어, 도중에 그만둔 사용자에게 오히려 맞다.

콜백 종료(QuestionsCallbackService.endSession)에는 같은 가드를 두지
않았다 — POOL 요청이 자기소개 답변 이후에만 발행되므로 그 경로에 답변
0개 세션이 도달하지 않는다(데이터도 일치: 10건 모두 질문 1개·답변 0개).

프론트는 이미 INTERRUPTED 를 '이어서 진행하기' 로 다루고 피드백 버튼을
숨겨 그대로 맞아떨어진다. 다만 종료 확인 문구가 "피드백 단계로 넘어갑니다.
되돌릴 수 없습니다" 라 답변이 없을 때 둘 다 거짓이 되므로 답변 유무로
갈랐다.
@i3months
i3months merged commit 0ce287b into dev Sep 29, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant