Skip to content

BE Request Intro Notes

NHN edited this page Sep 10, 2026 · 1 revision

BE 개발 요청서 — 매칭 후보 소개노트 열람 권한

작성: 2026-09-10 · FE 담당: @junseo2323 대상: ditto-develop/ditto-server 관련: BE 개발 요청서 §5 (타인 프로필 보조) · FE 브랜치 feat/s3-migration 요청 1건 · [확장] · P0 — 매칭 주 플로우가 막혀 있습니다.


요약

# 항목 태그 우선 지금 상태
1 GET /api/v1/users/{id}/intro-notes 를 이번 주 매칭 후보에게도 열어 주세요 확장 P0 성사 전 403(0003) → 소개노트 카드가 빈 채로 뜸

경로·스키마 변경은 없습니다. 열람 조건 한 줄만 넓혀 주시면 됩니다.


1. 무엇이 막혀 있나

화면: Figma 3.1 매칭 & 프로필 → 3.2 소개노트 (node-id 673-12674) FE 경로: /profile/{id}?quizSetId={n}&state=before_request (매칭 결과 → 후보 카드 탭)

이 화면은 대화 신청 여부를 정하는 화면입니다. 이번 주 후보의 소개노트 3문항 (무작위 2문항 + Q10. 나를 한 줄로 표현한다면?)을 보여 주고, 그 아래에 "대화가 시작되면 더 많은 질문과 답변을 볼 수 있어요"를 붙인 뒤 [대화 신청하기] 를 받습니다.

그런데 현재 계약은 이렇습니다.

GET /api/v1/users/{id}/intro-notes
→ "매칭 성사 또는 같은 그룹 채팅에 참여한 사용자의 소개 노트를 조회합니다."

이 화면은 정의상 성사 전입니다. 그래서 후보 전원이 403 / 0003이고, 지금 계약대로면 이 화면은 영원히 빈 카드입니다. 소개노트를 보고 신청을 결정하는 것이 제품의 핵심인데, 그 판단 근거가 내려오지 않습니다.

성사 후(state=chat_started, 그룹 멤버) 전체 공개는 지금 계약 그대로면 됩니다. 문제는 성사 전 구간뿐입니다.


2. 요청

GET /api/v1/users/{id}/intro-notes 의 열람 조건에 아래를 추가해 주세요.

이번 주 매칭 후보로 서로에게 노출된 상대 (= GET /api/v1/matches/1on1 응답 candidates[].userId, 그룹은 그룹 매칭 대상자)

응답 스키마는 그대로입니다.

// GET /api/v1/users/42/intro-notes → 200
{
  "success": true,
  "data": {
    "answers": [
      { "questionCode": "one-word", "question": "Q10. 나를 한 줄로 표현한다면?", "answer": "느긋한 편이에요" }
    ]
  }
}

2-1. 노출량을 서버가 제한하고 싶다면

FE는 성사 전에 3문항만 그립니다(나머지는 화면에서 가립니다). 그래서 둘 중 아무 쪽이나 괜찮습니다.

안 내용 BE 작업 FE 작업
(a) 전량 내려주기 권한 조건만 수정 없음 (현재 구현 그대로)
(b) 성사 전에는 3문항만 내려주기 권한 + 응답 축소 없음

(b)로 가실 경우 questionCode: "one-word"(Q10)는 반드시 포함해 주세요. 화면 마지막 칸이 Q10 고정이고, 나머지 2개는 무엇이 오든 상관없습니다.

프라이버시 관점에서 (b)가 안전하다고 보시면 (b)로 가셔도 됩니다. 어느 쪽인지만 알려 주세요.

2-2. 함께 봐 주실 것 (이번 요청 아님)

  • GET /api/v1/users/{id}/profile 도 같은 이유로 성사 전 403입니다. FE는 매칭 후보 목록으로 폴백해 화면을 채우고 있어서(useUserProfile) 직업·관심사·평점이 빈 채로 뜹니다. 같이 열어 주시면 이 폴백을 지울 수 있습니다. 다만 우선순위는 소개노트가 훨씬 높습니다.
  • GET /api/v1/users/{id}/ratings 가 성사 전 403인 것은 FE도 의도된 동작으로 보고 있습니다. 이건 열어 달라는 요청이 아닙니다.

3. 그때까지 FE는

지금은 403을 조용히 삼켜서(IntroNoteContainer) 아무 설명 없이 빈 카드가 뜹니다. BE 작업이 어렵거나 뒤로 밀리면, FE에서 "대화가 시작되면 소개노트를 볼 수 있어요" 같은 빈 상태 문구로 바꾸겠습니다.

다만 그 경우 사용자는 소개노트를 못 본 채로 대화를 신청하게 됩니다. 남는 판단 근거가 닉네임·나이·지역·퀴즈 일치율뿐이라, 매칭 품질이 그만큼 떨어집니다.


4. 회신 체크리스트

  • 매칭 후보에게 intro-notes 를 열어 줄 수 있습니까? (예 / 아니오)
  • 연다면 (a) 전량 / (b) 3문항(Q10 포함) 중 어느 쪽입니까?
  • "후보" 판정 기준은 무엇입니까? (이번 주 quizSetId 기준인지, 매칭 기간이 지나면 다시 닫히는지)
  • 그룹 매칭 대상자도 같은 규칙으로 열립니까?
  • GET /users/{id}/profile 도 함께 여실 수 있습니까? (선택)
  • 예상 일정

부록. FE 쪽 위치 (참고용)

무엇 파일
호출부 src/features/profile/api/profileApi.ts → getUserIntroNotes()
클라이언트 src/shared/lib/api/externalApi.ts → getExternalUserIntroNotes()
화면 컨테이너 src/features/profile/containers/IntroNoteContainer.tsx (403을 삼키는 지점)
3문항 선택 로직 src/features/profile/ui/ProfileIntroView.tsx → selectIntroNotePreview()
문항 정의(10개) src/features/profile/model/introNotes.ts
E2E cypress/e2e/matching-profile/02-intro-note.cy.ts (현재 200으로 목업 중이라 통과합니다)