00. 관계 판정
1. 기능명
관계 판정 (Relationship Resolution)
개별 기능이 아니라, 모든 기능의 노출·허용 여부를 결정하는 공통 기반이다.
2. 기능 목적
사용자 유형(role)을 대신해, 사용자와 경매 1건 사이의 관계로 권한을 판단한다.
- 사용자가 자신의 유형을 미리 선언하지 않아도 되게 한다
- 관계는 화면 진입 시 데이터로 자동 결정되므로 모드 전환 개념이 사라진다
- 모든 기능 스펙이 이 판정 결과 하나만 참조하게 하여 권한 규칙을 일원화한다
3. 동작 방식
3.1 입력
| 항목 | 설명 |
|---|---|
| 로그인 사용자 ID | 없으면 비회원 |
| 경매 데이터 | auction.user_id 포함 |
| 해당 경매의 내 사연 존재 여부 | 조회 결과 |
3.2 판정 순서
위에서부터 순서대로 평가하며, 처음 일치하는 관계로 확정한다.
| 순서 | 조건 | 결과 |
|---|---|---|
| 1 | 로그인 사용자 없음 | 비회원 |
| 2 | auction.user_id === 사용자 ID | 주최자 |
| 3 | 해당 경매에 사용자의 사연이 존재 | 참여자 |
| 4 | 위 어디에도 해당하지 않음 | 방문자 |
- 네 관계는 상호배타다. 한 경매에 대해 사용자는 정확히 하나의 관계만 갖는다
- 주최자는 자기 경매에 사연을 쓸 수 없으므로(F3), 2번과 3번이 동시에 참이 되는 경우는 없다
3.3 판정 시점과 범위
- 판정 시점 — 경매 상세 화면 진입 시 서버에서 1회 판정한다
- 판정 범위 — 관계는 경매 1건에 대해서만 유효하다. 다른 경매로 이동하면 다시 판정한다
- 저장하지 않는다 — 관계는 계정에 기록되는 값이 아니라, 매 요청 시 데이터로부터 도출되는 값이다
3.4 관계 전이
| 전이 | 발생 시점 |
|---|---|
| 방문자 → 참여자 | 해당 경매에 사연을 작성했을 때 |
| 참여자 → 방문자 | 자신의 사연을 삭제했을 때 |
전이 직후 화면은 갱신되어 새 관계에 맞는 버튼이 노출되어야 한다. (예: 사연 작성 완료 시 '사연 작성하기' → '사연 작성 완료' 비활성 상태)
3.4.1 경매 상세 화면 구성
관계 판정 결과가 반영되는 화면이다. 영역은 세 개뿐이다.
┌────────────────────────────┐
│ 이미지 │
├────────────────────────────┤
│ 제목 │
│ 주최자 닉네임 · 남은 시간 │
│ 사연 요청 설명 │
│ [찜] [사연 작성하기] │ ← 관계에 따라 달라지는 유일한 자리
├────────────────────────────┤
│ 사연 5 │
│ 1위 · 닉네임 · 1,250P ♥3 │
│ 2위 · ... │
└────────────────────────────┘
별도 섹션으로 두지 않는 것
| 항목 | 처리 |
|---|---|
| 주최자 정보 카드 | 제목 아래 한 줄로 흡수 |
| 입찰 랭킹 카드 | 삭제 — 사연 목록을 점수순으로 정렬하면 목록이 곧 랭킹이다 |
| 문의 드로어 | 삭제 — 채팅은 낙찰 이후에만 열린다 (F6) |
랭킹을 따로 그리지 않아도 F5 3.2.1의 "마감 전 랭킹 노출" 요건이 충족된다. 사연 목록 자체가 순위를 보여주기 때문이다.
3.5 기능 접근 규칙
이 표가 모든 기능 스펙의 권한 기준이다.
| 기능 | 비회원 | 주최자 | 참여자 | 방문자 |
|---|---|---|---|---|
| 경매·사연 열람 | O | O | O | O |
| 경매 수정·삭제 | - | O | - | - |
| 사연 작성 | - | - | - | O |
| 사연 입찰(포인트) | - | - | O | - |
| 공감(좋아요) | - | O +50p | O +10p | O +10p |
| 찜하기 | - | - | O | O |
| 1:1 채팅 | - | △ | △ | - |
△ 낙찰 확정 이후, 주최자와 낙찰자에게만 허용한다 (F6). 미낙찰 참여자와 방문자는 채팅에 참여할 수 없다.
이 표에 '사용자 유형' 열은 없다. 판정에
users.role을 조회하지 않는다.
4. 예외 처리
| 상황 | 처리 |
|---|---|
| 경매 데이터 조회 실패 | 관계를 판정할 수 없으므로 에러 화면을 노출하고 재시도 버튼을 제공한다. 어떤 액션 버튼도 노출하지 않는다 |
| 사연 존재 여부 조회 실패 | 관계를 방문자로 확정하지 않는다. 사연 작성 버튼을 비활성 상태로 두고 "잠시 후 다시 시도해주세요" 안내를 표시한다 |
| 로그인 세션 만료 | 비회원으로 처리한다. 액션 시도 시 로그인 화면으로 유도하고, 로그인 후 원래 경매로 복귀시킨다 |
| 판정 중 액션 시도 (판정 완료 전 클릭) | 판정이 끝날 때까지 액션 버튼은 스켈레톤 또는 비활성 상태로 둔다. 클릭을 받지 않는다 |
| 클라이언트 판정과 서버 판정 불일치 | 서버 판정을 최종으로 한다. 클라이언트에서 버튼이 보였더라도 서버가 거부하면 실패 안내 후 화면을 갱신한다 |
| 마감된 경매 | 관계 판정은 정상 수행하되, 경매 결과에 영향을 주는 액션(사연 작성·입찰·공감)을 차단한다. 열람과 찜하기는 허용한다 (찜은 개인 북마크이므로 경매 상태와 무관하다). 채팅은 이때 비로소 열린다 — 주최자와 낙찰자에 한한다 (F6) |
원칙 — 불확실하면 열지 않는다. 관계를 확정할 수 없는 상황에서는 권한을 넓히는 방향(방문자 처리)이 아니라, 액션을 막고 재시도를 안내한다.
5. 완료 조건
| # | 조건 | 검증 방법 |
|---|---|---|
| 1 | users.role을 조회하는 코드가 0건 | 전체 검색으로 확인 |
| 2 | 네 관계가 위 판정 순서대로 결정된다 | 관계별 계정으로 경매 상세 진입 |
| 3 | 같은 계정이 경매마다 다른 관계로 판정된다 | 한 계정으로 내 경매 / 참여한 경매 / 미참여 경매를 차례로 방문 |
| 4 | 사연 작성 직후 방문자 → 참여자 전이가 화면에 반영된다 | 작성 완료 후 경매 상세 복귀 시 버튼 상태 확인 |
| 5 | 3.5 접근 표와 실제 화면의 버튼 노출이 완전히 일치한다 | 관계 4종 × 기능 7종 전수 확인 |
| 6 | 서버에서 거부된 액션이 클라이언트에서 성공 처리되지 않는다 | 버튼 강제 노출 후 액션 시도 |