Skip to content

feat: 같은 설정으로 다시 면접 (재도전) - #176

Merged
i3months merged 1 commit into
devfrom
feature/session-retry
Aug 18, 2026
Merged

feat: 같은 설정으로 다시 면접 (재도전)#176
i3months merged 1 commit into
devfrom
feature/session-retry

Conversation

@i3months

Copy link
Copy Markdown
Member

변경 사항

감사 백로그 B-2. 면접이 끝나거나 중단된 뒤 자연스러운 다음 행동은 "같은 조건으로 한 번 더"인데, 그러려면 설정 화면에서 모드·직군·질문 수·자료·JD 를 처음부터 다시 고르게 했다. 버튼 하나로 줄인다.

왜 서버 엔드포인트인가

처음엔 프론트만으로 될 줄 알았다 — SessionResponse 가 생성에 필요한 필드를 이미 전부 노출한다(mode·jobCategories·maxQuestions·generalQuestionCount·maxFollowupsPerQuestion·contextDocumentIds·targetCompanyName·targetJobDescription). 그런데 SessionService.linkContexts 를 보면:

AnalyzedDocument doc = documentRepository.findActiveByIdAndOwner(documentId, userId)
    .orElseThrow(() -> new DomainException(ApiErrorCode.DOC_NOT_FOUND));
if (doc.getAnalysisStatus() != AnalysisStatus.ANALYZED) {
    throw new DomainException(ApiErrorCode.DOC_NOT_ANALYZED);
}

원본 설정을 그대로 재전송하면 그 사이 이력서 하나 지운 사용자는 재도전이 404 로 이유 없이 실패한다. 무엇이 아직 살아있는지 아는 건 서버라서 거기서 정리하는 게 맞다.

  • POST /api/sessions/{id}/retry → 201. 설정을 복사하고 지금도 살아있으며 ANALYZED 인 자료만 다시 잇는다
  • 빠진 자료는 응답 contextDocumentIds 를 원본과 비교하면 드러난다 → 프론트가 "삭제된 자료 N개는 제외하고 시작합니다" 로 알린다. 조용히 빼면 질문 근거가 달라진 걸 사용자가 알 수 없다

retrycreate 를 그대로 호출하므로 JD 필수 검증·질문 수 정합성 검증·SessionCreatedEvent(질문 풀 생성 트리거)가 전부 동일하게 적용된다.

프론트

  • useRetrySession(sourceContextCount?) — 성공 시 새 세션으로 이동, 자료가 줄었으면 토스트로 안내
  • CTA 위치
    • 종료 패널 — 완료·중단 모두. 중단 세션에서는 primary 로 뒀다. 피드백이 없으니 재도전이 사실상 유일한 다음 행동이다
    • 피드백 화면 헤더

직전 PR(#175)에서 "중단 세션 화면에 재도전 CTA 를 붙이면 자연스러운 자리"라고 적었던 그 자리다.

테스트

  • SessionServiceTest +3 — 설정 복사(JOB_TAILORED 의 회사명·JD 포함), 삭제·재분석 중 자료 제외, 타인 세션 거부
  • SessionEndedPanel.test.tsx 신설 (5) — 완료/중단/취소별 기록·링크 노출, 재도전 호출 인자, 자료 수 전달

backend test 통과 (ArchUnit 포함), frontend vitest 86/86 · eslint 0 · tsc · build 통과.

영향 범위

  • DB 마이그레이션: 없음
  • API contract 변경: 추가만 (POST /api/sessions/{id}/retry)
  • 환경변수: 없음

리뷰어 체크포인트

  • 제목을 그대로 복사한다 — 히스토리에 같은 제목이 여러 개 쌓인다. 날짜로 구분되긴 하지만, "(재도전)" 같은 접미사가 낫다면 알려주세요 (반복하면 접미사가 겹쳐 쌓이는 문제가 있어 일단 그대로 뒀다)
  • 자료가 빠졌을 때 막지 않고 안내만 하고 진행하는 선택. 자료 없이 시작하는 게 나은지, 자료 선택 화면으로 보내는 게 나은지는 제품 판단이다

면접이 끝나거나 중단된 뒤 다음 행동이 "같은 조건으로 한 번 더"인데, 그러려면 설정 화면에서
모드·직군·질문 수·자료·JD 를 처음부터 다시 고르게 했다. 버튼 하나로 줄인다.

## 왜 서버 엔드포인트인가

`SessionResponse` 가 생성에 필요한 필드를 이미 전부 노출하고 있어서 프론트만으로도 가능해
보였지만, `linkContexts` 가 삭제된 문서에 `DOC_NOT_FOUND`(404), 분석 미완료에
`DOC_NOT_ANALYZED` 를 던진다. 원본 설정을 그대로 재전송하면 **그 사이 이력서 하나 지운
사용자는 재도전이 이유 없이 실패**한다. 무엇이 아직 살아있는지 아는 건 서버라서 거기서 정리한다.

- `POST /api/sessions/{id}/retry` → 201. 설정 복사 + 살아있고 ANALYZED 인 자료만 재연결
- 빠진 자료는 응답 `contextDocumentIds` 를 원본과 비교하면 드러난다 → 프론트가
  "삭제된 자료 N개는 제외하고 시작합니다" 로 알린다. 모르고 시작하면 질문 근거가 달라진 걸
  알 수 없다

## 프론트

- `useRetrySession(sourceContextCount?)` — 성공 시 새 세션으로 이동, 자료가 줄었으면 안내
- CTA 위치: 종료 패널(완료·중단 모두)과 피드백 화면 헤더. 중단 세션에서는 primary 로 —
  피드백이 없으니 재도전이 사실상 유일한 다음 행동이다

## 테스트

- `SessionServiceTest` +3 — 설정 복사(JOB_TAILORED 의 JD 포함), 삭제·재분석 중 자료 제외,
  타인 세션 거부
- `SessionEndedPanel.test.tsx` 신설 (5) — 완료/중단/취소별 기록·링크 노출, 재도전 호출,
  자료 수 전달

backend `test` 통과, frontend vitest 86/86 · eslint 0 · tsc · build 통과.
@i3months
i3months merged commit 2547567 into dev Aug 18, 2026
5 checks passed
@i3months
i3months deleted the feature/session-retry branch August 18, 2026 18:37
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