F1. 경매 등록
1. 기능명
경매 등록 · 수정 · 삭제
2. 기능 목적
사용자가 나눌 물건을 등록하고, 어떤 사연을 듣고 싶은지 밝혀 경매를 연다.
- 물건의 값을 매기지 않는다. 정하는 것은 무엇을 나누는가와 언제까지인가 둘뿐이다
- 로그인한 모든 사용자가 경매를 열 수 있다. 별도의 자격이나 유형 선언을 요구하지 않는다
변경점 — 기존에는 '경매진행자' 모드에서만 등록 버튼이 보였고, 모드가 맞지 않으면 자기 경매도 수정할 수 없었다.
3. 동작 방식
3.1 진입
| 항목 | 내용 |
|---|---|
| 진입점 | 홈·경매 목록 화면 우측 하단 + 버튼 |
| 노출 대상 | 로그인한 사용자 전원 |
| 경로 | /auctions/write |
3.2 선행 조건 — 없다
경매 등록에 배송지를 요구하지 않는다. 로그인만 하면 연다.
기존에는 배송지를 선행 조건으로 두고 없으면 등록 화면으로 보냈다. 세 가지가 어긋나 있었다.
| 어긋난 점 | 실제 |
|---|---|
| 받아둔 주소를 아무도 읽지 않았다 | auctions.address_id 는 생성 때 한 번 쓰고 끝이었다. 어떤 화면도 보여주지 않았고, 유일한 소비자가 "이 배송지는 지울 수 없다"고 막는 FK 였다 |
| 필요한 사람의 주소가 아니었다 | 받아둔 것은 주최자 본인의 주소다. 택배로 보내려면 정작 낙찰자의 주소가 필요한데 어디에서도 받지 않는다 |
| 전달 방법이 아직 정해지지 않았다 | 택배일지 직거래일지는 낙찰 뒤 채팅에서 정한다 (F6 2). 직거래면 주소 자체가 필요 없다 |
즉 아직 정해지지도 않은 전달 방법을 위해, 엉뚱한 사람의 주소를, 아무도 읽지 않는 채로 받으려고 핵심 행동을 막고 있었다.
배송지는 선택으로 남긴다. 이미 등록해 둔 주최자에게는 발송지 스냅샷으로 붙여 두되(auctions.address_id, nullable), 없어도 경매는 열린다. 등록·수정 경로는 마이페이지에 그대로 있다 (F12).
3.3 입력 항목
입력은 4개뿐이다.
| 항목 | 필수 | 방식 |
|---|---|---|
| 이미지 | O | 1 ~ 3장 |
| 제목 | O | 직접 입력 (공백만 불가) |
| 사연 요청 설명 | O | 직접 입력 |
| 기간 | O | 버튼 선택 — 1일 · 3일 · 7일 |
포인트 입력이 없다. 입찰 단계는 전 서비스 공통 고정이다 (F3 3.3). 주최자가 정할 것은 무엇을 나누는가와 언제까지인가 둘뿐이다.
기간은 날짜·시간을 고르지 않는다
날짜 피커와 시간 피커 대신 버튼 3개에서 고른다.
[ 1일 ] [ 3일 ] [ 7일 ]
- 마감 시각은 등록 시점 + 선택한 기간으로 자동 계산된다
- 과거 날짜·너무 짧은 기간 같은 검증이 필요 없다. 선택지가 곧 검증이다
- 입찰(F3)과 같은 방식이라 조작이 일관된다
3.4 등록
- 입력값 검증 통과 → 경매 생성
- 상태를 진행중으로 설정
- 등록한 경매 상세 화면으로 이동
- 이 시점부터 등록자는 해당 경매의 주최자가 된다 (
00-관계-판정)
3.5 수정
| 항목 | 내용 |
|---|---|
| 권한 | 주최자만 (auction.user_id === 사용자 ID) |
| 진입 | 경매 상세 상단 수정 버튼 → /auctions/[id]/edit |
| 판정 | 소유 여부만으로 판단한다. 다른 조건을 추가하지 않는다 |
3.6 삭제
| 항목 | 내용 |
|---|---|
| 권한 | 주최자만 |
| 절차 | 삭제 버튼 → 확인 다이얼로그 → 삭제 → 홈으로 이동 |
삭제 조건 — 확정
사연이 1건이라도 등록된 경매는 삭제할 수 없다.
| 사연 수 | 삭제 |
|---|---|
| 0건 | 가능 |
| 1건 이상 | 불가 — 삭제 버튼을 비활성화하고 사유를 표시한다 |
참여자의 글과 포인트를 보호하기 위한 규칙이다. 경매를 삭제하면 참여자가 쓴 사연과 다른 사용자가 누른 공감이 함께 사라진다. 주최자 한 사람의 조작으로 제3자의 기록이 소멸하는 것을 허용하지 않는다.
안내 문구
참여자가 있어 삭제할 수 없어요. 문의가 필요하면 채팅으로 안내해주세요.
알려진 한계
주최자에게 사정이 생겨 물건을 전달할 수 없게 되어도 경매를 내릴 수 없다. 이 경우 주최자는 1:1 채팅(F6)으로 참여자에게 상황을 안내한다. 경매 취소 기능은 이번 범위에 포함하지 않는다 (PRD 7.3 E1).
4. 예외 처리
4.1 진입·권한
| 상황 | 처리 |
|---|---|
| 비회원이 등록 화면 진입 | 홈으로 이동시키고 로그인을 유도한다 |
| 배송지 미등록 | 막지 않는다. 그대로 등록을 진행한다 (3.2) |
타인 경매의 auction_id로 수정 진입 | 홈으로 이동시킨다. 주소창 직접 입력도 동일하게 차단한다 |
존재하지 않는 auction_id | 홈으로 이동시킨다 |
| 마감된 경매 수정 시도 | 수정 버튼을 노출하지 않는다. 직접 진입 시 경매 상세로 되돌린다 |
4.2 입력 검증
검증 실패 시 제출을 차단하고, 해당 입력 항목 아래 인라인으로 사유를 표시한다.
| 상황 | 안내 |
|---|---|
| 필수 항목 누락 | "필수 입력 항목입니다" |
| 제목·설명 길이 초과 | 남은 글자 수를 실시간 표시하고, 한도 도달 시 경고색으로 전환 |
| 기간 미선택 | 제출을 차단한다. 기본값을 1일로 미리 선택해 둔다 |
| 이미지 미첨부 | "이미지를 1장 이상 등록해주세요" |
| 이미지 3장 초과 | 추가 버튼을 비활성화한다 |
기간을 버튼으로 고르므로 마감 시각 관련 검증이 없다.
4.3 처리 실패
| 상황 | 처리 |
|---|---|
| 이미지 업로드 실패 | 실패한 이미지만 표시하고 재시도를 제공한다. 입력한 나머지 값은 유지한다 |
| 등록·수정 요청 실패 | 실패 안내를 띄우고 입력값을 유지한 채 화면에 머무른다. 절대 초기화하지 않는다 |
| 사연이 있는 경매의 삭제 시도 | 삭제 버튼을 비활성화한다. 요청이 도달해도 서버에서 거부한다 |
| 삭제 확인 직전에 사연이 등록됨 | 서버가 삭제 시점에 사연 수를 재확인해 거부하고, "참여자가 생겨 삭제할 수 없어요"를 안내한다 |
| 삭제 요청 실패 | 실패 안내 후 경매 상세에 머무른다 |
| 요청 처리 중 중복 제출 | 처리 중에는 제출 버튼을 비활성화한다 |
5. 완료 조건
| # | 조건 |
|---|---|
| 1 | 로그인한 모든 사용자에게 + 버튼이 노출된다. 유형 조건이 없다 |
| 2 | 배송지가 없어도 경매를 등록할 수 있다. 등록 도중 다른 화면으로 끌려가지 않는다 |
| 3 | 주최자는 어떤 사전 설정도 없이 자기 경매를 수정·삭제할 수 있다 |
| 4 | 타인 경매의 수정 진입이 주소창 직접 입력을 포함해 차단된다 |
| 5 | 4.2의 모든 검증 실패가 제출을 차단하고 사유를 표시한다 |
| 6 | 등록·수정 실패 시 입력값이 유지된다 |
| 7 | 등록 직후 등록자가 해당 경매의 주최자로 판정된다 |
| 8 | 입력 항목이 4개다. 포인트 입력과 날짜·시간 피커가 없다 |
| 9 | 기간이 버튼 3개(1일·3일·7일) 로만 선택된다 |