Repository navigation
Frontend Candidate Profile Guide
상태: 배포 완료 (#173 · 이슈 #172 / #174 · 이슈 #171). 인증 헤더·응답 래핑 등 공통 규약은 Frontend-Chat-Guide를 볼 것. 그룹 후보 조회·수락·거절 자체는 Frontend-Group-Matching-Guide에 있다.
성사 전 후보에게도 소개노트가 열렸다. BE-Request — 매칭 후보 소개노트 열람 권한 (P0) 처리 결과다.
-
GET /api/v1/users/{id}/intro-notes— 후보 단계에서 미리보기 3문항이 내려온다. 경로·스키마 변경 없음. - 1:1 후보와 그룹 후보 모두 같은 규칙이다.
-
프로필 상세 API(
/users/{id}/profile·/ratings·/answers)는 여전히 성사 후 전용이다. 후보 카드에 필요한 정보는 후보 목록 응답에 이미 다 들어 있으니 그대로 쓰면 된다.
| 관계 | 소개노트 | 프로필 상세 · 받은 평가 · 답변 일치 |
|---|---|---|
| 본인 | 전체 10문항 | — (/users/me 계열) |
| 매칭 성사 · 같은 그룹 채팅 참여 | 전체 10문항 | 열림 |
| 이번 주 매칭 후보 (성사 전) | 미리보기 3문항 | 403 / 0003 |
| 그 외 · 차단 관계 | 403 / 0003 |
403 / 0003 |
서버가 "조회자가 최근 완료(COMPLETED)한 퀴즈셋"을 기준으로 판정한다. 퀴즈셋을 FE가 넘길 필요는 없다.
| 타입 | 기준 | 후보로 보는 조건 |
|---|---|---|
| 1:1 | 내가 최근 완료한 1:1 퀴즈셋 | 그 퀴즈셋의 후보 페어에 둘이 함께 있음 (GET /api/v1/matches/1on1의 candidates[].userId) |
| 그룹 | 내가 최근 완료한 그룹 퀴즈셋 | 같은 후보 그룹에 둘 다 거절하지 않은 채 남아 있음 (GET /api/v1/matches/group의 groups[].members[].userId) |
둘 중 하나라도 맞으면 열린다. 실무적으로는 후보 목록 응답에 있는 userId면 소개노트가 열린다고 보면 된다.
-
지난 주 후보는 닫힌다. 다음 주 퀴즈셋을 완주하는 순간 기준이 옮겨가 이전 주 후보는
403이 된다. 매칭 주가 지난 뒤 열어 둔 화면에서 재조회하면 빈 카드가 아니라 403이 날 수 있으니, 목록을 다시 받아 화면을 맞추는 편이 안전하다. -
차단하면 후보여도 막힌다. 내가 차단했든 상대가 나를 차단했든
403이다(피그마 6.2.2). - 그룹에서 내가 거절했거나 자동 거절된 그룹의 구성원은 후보가 아니다 — 후보 목록에서 사라지는 것과 같은 타이밍에 소개노트도 닫힌다.
GET /api/v1/users/{id}/intro-notes
미리보기 구성은 무작위 2문항 + one-word 고정이다. 요청서 §2-1의 (b)안을 골랐다.
-
one-word는 항상 마지막에 온다. 상대가 안 썼어도answer: ""로 포함된다 — 화면 마지막 칸 계약을 지키기 위해서다. -
무작위 2문항은 상대가 실제로 작성한 답변 중에서만 뽑는다. 빈 카드로 슬롯을 낭비하지 않는다. 따라서 상대가
one-word외에 아무것도 안 썼으면answers는 1개짜리로 온다.answers.length === 3을 가정하지 말 것. -
answers는 항상 고정 질문 순서(문항 정의 순)로 정렬돼 온다. 무작위로 섞여 오지 않는다. - 같은 상대는 매번 같은 3문항이 온다. (조회자, 대상자) 쌍으로 결정적이라 새로고침해도 화면이 바뀌지 않는다. 사람마다 조합은 다르다. 단 상대가 새 답변을 작성하면 뽑기 대상이 늘어 조합이 바뀔 수 있다.
- FE가 다시 3개로 자르지 말 것. 서버가 이미 잘라서 내려준다. 성사 후에는 10문항이 그대로 오므로, 개수로 성사 여부를 판단하지 말고 화면 상태(후보/성사)로 분기하는 게 맞다.
-
completedCount는 이 응답에 담긴 것 중 작성된 수다. 성사 전에는 최대 3이라 "10문항 중 N개 작성" 같은 표시에 쓰면 안 된다.
성사 후에는 같은 경로로 10문항 전량이 온다. 아래 "대화가 시작되면 더 많은 질문과 답변을 볼 수 있어요" 문구는 성사 전에만 붙이면 된다.
후보 단계에서 구성원 프로필 상세 API를 호출하지 말 것. 403이다. 프로필 선택 화면에 필요한 값은 GET /api/v1/matches/group 응답의 groups[].members[]에 전부 들어 있다.
| 화면 요소 | 필드 |
|---|---|
| 닉네임 | members[].nickname |
| 성별 · 나이 |
members[].gender · age (둘 다 null 가능) |
| 한 줄 소개 |
members[].introduction (소개노트 one-word 답변, null 가능) |
| 지역 | members[].location |
| 캐리커쳐 | members[].profileImageUrl |
| "12개중 8개 일치" |
members[].scoreBreakdown.matchedQuestions / totalQuestions
|
응답 전문과 점수 두 종류(그룹 평균 vs 개인별)의 차이는 Frontend-Group-Matching-Guide를 볼 것. 1:1 후보(GET /api/v1/matches/1on1의 candidates[])도 같은 카드 스키마를 쓴다.
즉 후보 단계 프로필 화면 = 후보 목록의 카드 + 소개노트 3문항이고, 서버 호출은 소개노트 하나만 추가로 하면 된다.
| API | 내려주는 것 |
|---|---|
GET /api/v1/users/{id}/profile |
닉네임·성별·나이·한 줄 소개·캐리커쳐·지역·직업·관심사·평점 |
GET /api/v1/users/{id}/ratings |
상대가 받은 평가 (공개 기준 3건 미달이면 비공개) |
GET /api/v1/users/{id}/answers |
나와의 퀴즈 답변 일치 요약 |
셋 다 판정 지점이 같아서 한꺼번에 열리고 한꺼번에 닫힌다. 성사 전에는 셋 다 403이다.
후보 카드에 없는 값은 직업·관심사·평점 셋뿐이다. 지금 FE가 후보 목록으로 폴백해 이 셋을 비워 두는 동작(useUserProfile)은 그대로 유지하면 된다. 요청서 §2-2에서 우선순위를 낮게 두신 항목이라 이번 범위에 넣지 않았다 — 필요하면 별도 요청서로 주시면 받는다. ratings는 요청대로 성사 전 계속 닫아 뒀다.
후보 단계 (성사 전)
카드 정보 ← GET /api/v1/matches/group 또는 /matches/1on1 (이미 받은 응답 재사용)
소개노트 ← GET /api/v1/users/{id}/intro-notes → 3문항 + 안내 문구
프로필 상세 API 호출 없음
성사 후
프로필 ← GET /api/v1/users/{id}/profile
평가·일치 ← GET /api/v1/users/{id}/ratings · /answers
소개노트 ← GET /api/v1/users/{id}/intro-notes → 10문항, 안내 문구 없음
| code | HTTP | 언제 | FE 처리 |
|---|---|---|---|
0003 |
403 | 후보도 성사 상대도 아님 / 차단 관계 / 지난 주 후보 | 빈 카드 대신 목록 재조회. 그래도 없으면 안내 문구 |
0004 |
404 | 없는 회원 | 목록 재조회 |
지금 FE는 403을 조용히 삼켜(IntroNoteContainer) 빈 카드를 띄우고 있다. 후보 구간이 열렸으니 정상 경로에서는 403이 나오지 않지만, 매칭 주가 지나 기준 퀴즈셋이 옮겨간 경우에는 여전히 403이 날 수 있다. 이 경우만 안내 문구로 처리하면 된다.
-
성사 후 소개노트에는 차단 검사가 없다. 차단 관계면 프로필 상세는
403인데 소개노트는 200으로 열린다(성사 전 구간만 이번에 차단을 반영했고, 성사 후는 기존 동작을 유지했다). 화면에서 차단 상대를 가려야 한다면 지금은 FE 쪽 판단이 필요하다. 서버에서 맞출지는 별도로 정한다. -
미리보기 문항은 사람마다 다르다. A가 보는 C의 3문항과 B가 보는 C의 3문항은 다를 수 있다. 캐시 키를 상대
userId만으로 잡아도 되지만, 서로 다른 계정으로 로그인해 확인할 때 같은 결과를 기대하지 말 것. - 1:1과 그룹의 기준 퀴즈셋이 따로 논다. 각각 "최근 완료한 해당 타입 퀴즈셋"이라, 1:1 후보와 그룹 후보가 동시에 열려 있을 수 있다.
- 매칭 후보에게
intro-notes를 열어 줄 수 있나 → 예 - (a) 전량 / (b) 3문항 → (b) (
one-word항상 포함, 화면 마지막 칸 고정) - "후보" 판정 기준 → 조회자가 최근 완료한 퀴즈셋의 후보. 다음 주 퀴즈셋을 완주하면 지난 주 후보는 닫힘
- 그룹 매칭 대상자도 같은 규칙인가 → 예 (#171에서 그룹 후보 생성이 붙으며 같이 맞췄다)
-
GET /users/{id}/profile도 함께? → 이번 범위 아님. 필요하면 별도 요청서로.ratings는 요청대로 성사 전 계속 닫음 - 예상 일정 → 완료 (#173 · #174 머지됨)
{ "success": true, "data": { "answers": [ // 성사 전이면 최대 3개, 성사 후면 10개 { "questionCode": "stress-relief", "question": "스트레스 받을 때 나만의 해소법은?", "answer": "무조건 걷습니다" }, { "questionCode": "most-used-apps", "question": "요즘 내가 가장 많이 쓰는 앱 3개는?", "answer": "지도, 캘린더, 메모" }, { "questionCode": "one-word", // 항상 마지막 칸 "question": "나를 한 줄로 표현한다면?", "answer": "느긋한 편이에요" } ], "completedCount": 3 // 이 응답에 담긴 답변 중 작성된 수 } }