관계 판정

00. 관계 판정

1. 기능명

관계 판정 (Relationship Resolution)

개별 기능이 아니라, 모든 기능의 노출·허용 여부를 결정하는 공통 기반이다.

2. 기능 목적

사용자 유형(role)을 대신해, 사용자와 경매 1건 사이의 관계로 권한을 판단한다.

  • 사용자가 자신의 유형을 미리 선언하지 않아도 되게 한다
  • 관계는 화면 진입 시 데이터로 자동 결정되므로 모드 전환 개념이 사라진다
  • 모든 기능 스펙이 이 판정 결과 하나만 참조하게 하여 권한 규칙을 일원화한다

3. 동작 방식

3.1 입력

항목설명
로그인 사용자 ID없으면 비회원
경매 데이터auction.user_id 포함
해당 경매의 내 사연 존재 여부조회 결과

3.2 판정 순서

위에서부터 순서대로 평가하며, 처음 일치하는 관계로 확정한다.

순서조건결과
1로그인 사용자 없음비회원
2auction.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 기능 접근 규칙

이 표가 모든 기능 스펙의 권한 기준이다.

기능비회원주최자참여자방문자
경매·사연 열람OOOO
경매 수정·삭제-O--
사연 작성---O
사연 입찰(포인트)--O-
공감(좋아요)-O +50pO +10pO +10p
찜하기--OO
1:1 채팅--

낙찰 확정 이후, 주최자와 낙찰자에게만 허용한다 (F6). 미낙찰 참여자와 방문자는 채팅에 참여할 수 없다.

이 표에 '사용자 유형' 열은 없다. 판정에 users.role을 조회하지 않는다.

4. 예외 처리

상황처리
경매 데이터 조회 실패관계를 판정할 수 없으므로 에러 화면을 노출하고 재시도 버튼을 제공한다. 어떤 액션 버튼도 노출하지 않는다
사연 존재 여부 조회 실패관계를 방문자로 확정하지 않는다. 사연 작성 버튼을 비활성 상태로 두고 "잠시 후 다시 시도해주세요" 안내를 표시한다
로그인 세션 만료비회원으로 처리한다. 액션 시도 시 로그인 화면으로 유도하고, 로그인 후 원래 경매로 복귀시킨다
판정 중 액션 시도 (판정 완료 전 클릭)판정이 끝날 때까지 액션 버튼은 스켈레톤 또는 비활성 상태로 둔다. 클릭을 받지 않는다
클라이언트 판정과 서버 판정 불일치서버 판정을 최종으로 한다. 클라이언트에서 버튼이 보였더라도 서버가 거부하면 실패 안내 후 화면을 갱신한다
마감된 경매관계 판정은 정상 수행하되, 경매 결과에 영향을 주는 액션(사연 작성·입찰·공감)을 차단한다. 열람과 찜하기는 허용한다 (찜은 개인 북마크이므로 경매 상태와 무관하다). 채팅은 이때 비로소 열린다 — 주최자와 낙찰자에 한한다 (F6)

원칙 — 불확실하면 열지 않는다. 관계를 확정할 수 없는 상황에서는 권한을 넓히는 방향(방문자 처리)이 아니라, 액션을 막고 재시도를 안내한다.

5. 완료 조건

#조건검증 방법
1users.role을 조회하는 코드가 0건전체 검색으로 확인
2네 관계가 위 판정 순서대로 결정된다관계별 계정으로 경매 상세 진입
3같은 계정이 경매마다 다른 관계로 판정된다한 계정으로 내 경매 / 참여한 경매 / 미참여 경매를 차례로 방문
4사연 작성 직후 방문자 → 참여자 전이가 화면에 반영된다작성 완료 후 경매 상세 복귀 시 버튼 상태 확인
53.5 접근 표와 실제 화면의 버튼 노출이 완전히 일치한다관계 4종 × 기능 7종 전수 확인
6서버에서 거부된 액션이 클라이언트에서 성공 처리되지 않는다버튼 강제 노출 후 액션 시도