Skip to content

기능 설계 요구사항 #5

Description

@JunHo-YH

목표

1. 개인 간 거래에서 반복되는 흥정의 피로감과 거래 불발의 문제를 해결하기 위해서 실시간 경매 기반의 거래 서비스 Gravy를 기획한다.

2. 기획 배경, 핵심 기능, 기능 설계 요구사항을 정리한다.

이 프로젝트를 구상하게 된 계기

불편함

최근 여러 가지 일이 생기면서 안 쓰는 물건을 판매할 것이 많았다.

급하게 처분해야 할 물건이었기 때문에 비교적 저렴하게 물품을 판매하려고 당근에 올렸다.

가격이 저렴해서인지 순식간에 연락이 빗발쳤다.

여러 물건을 올렸기 때문에, 어떤 상품에 대한 연락인지 헷갈리기도 했고,

여러 사람들이 오는 메시지는 대부분 비슷했다.

그리고 전체적인 대화의 흐름도 반복되었다.

문제점

1. 흥정되나요? : 흥정 불가로 설정해도 흥정을 하는 사람이 꼭..! 있다.

2. 서두로 인사를 하고 내가 대답을 하기까지, 본론으로 들어가기까지 시간이 지연된다.

3. 판매자인 내가 원하는 것은 판매할 물건을 적정한 가격에 거래를 약속하고, 거래 방식을 정하는 것 두 가지다.

4. 판매자는 최대한 신뢰도가 높은 구매자를 원한다.
    따라서 기존에 악의적으로 거래를 불발한 내역이 있는 사람과 거래하기 싫다.

5. 최대한 거래 피로도를 낮추고, 신뢰 있는 사람과 거래하기를 희망한다.

프로젝트 아이디어의 시작

당근은 정말 좋은 플랫폼이지만, 이러한 흥정, 협상은 높은 피로도로 다가왔다.

피로도를 소모하더라도 거래가 바로 성사되면 좋겠지만, 불발되는 경우도 있기에
시간과 감정이 낭비되는 문제점을 개선한 프로젝트를 만들고 싶었다.

Image

프로젝트의 목표

흥정 없는 실시간 경매 기반의 거래 시스템을 통해 거래의 피로도와 시간을 절약한다.

1. 거래를 하면서 발생하는 흥정, 협상의 피로도를 최소화한다.

2. 경매 개념을 도입해서 판매자의 피로도를 낮추고, 구매자끼리의 경쟁력 있는 분위기를 조성한다.

3. 신뢰있는 거래를 지향한다.

기능 설계 요구사항

회원가입, 로그인

이메일 기반 회원가입 및 로그인 기능을 제공한다.

  • 실제 유저인지 이메일에 인증번호를 발송하여 인증번호를 검증한다.

  • 회원가입이 완료되면 해당 메일로 이메일 가입이 완료됨을 알린다.

  • 추후 새로운 소식을 알리는데 활용된다.

  • 동작 조건

    • 이메일 중복 불가능
    • 비밀번호는 단방향 암호화를 해서 DB에 저장한다.
      • SHA256, 512 + Salt
      • bcrypt 방식들이 보이는데, 더 조사해 보고 적절한 것 선택하기.
    • 비밀번호는 대소문자, 특수기호가 들어가도록 강화된 비밀번호 사용 제약조건 추가
  • 필요한 정보

    • 이메일, 비밀번호, 닉네임
  • 반환값

    • JWT 토큰 또는 세션 정보

실시간 알림

경매 시작, 입찰 변화, 마감 전/후/후보자 등을 실시간으로 사용자에게 전달한다.

  • 동작 조건
    • 사용자가 찜 또는 입찰한 상품 이어야 한다.
    • 알림 설정(마감, 가격 변동, 낙찰 결과 등)은 개별 사용자의 세부적인 설정에 따라 작동한다.
  • 사용자 디바이스 푸시 알림 또는 웹 알림
    • 경매 마감 임박 3분 전
    • 3분 전 연장 발생 시 5분 연장됨을 알림
    • 낙찰 확정, 예비 후보 알림
    • 거래 실패 시 판매자 알림
  • 예외 처리
    • 알림이 정상적으로 전송되지 않았을 경우 로그를 남긴다.
  • 알림 설정 테이블 설계 필요
  • 알림 발송 로그 기록을 어떻게 할지 고민해야 한다.

마감제도

판매자는 상품 등록 시 마감기한을 설정할 수 있으며, 설정된 마감기한을 기준으로 최조 입찰자를 낙찰자로 자동 지정한다.
마감 3분 전 입찰이 발생하면 마감 시간이 5분 연장된다.

  • 동작 조건
    • 판매자는 상품 등록 시 마감 기한을 설정한다.
    • 마감 시간은 등록 시점 기준 최소 3시간, 최대 한 달로 지정이 가능하다.
    • 마감기한 전 경매를 종료할 수 있다.
      • 입찰자가 있으면 가격이 가장 높은 입찰자가 낙찰자가 된다.
    • 마감 3분 전 입찰이 발생하면 자동으로 5분 연장 (최대 3회) 옵션을 설정할 수 있다.
      • 옵션은 판매자가 상품 등록 시 설정한다. (자동 연장 여부만 설정. 최대 3회 연장은 고정)
    • 낙찰자가 거래를 포기하면 예비 후보 순위대로 자동 낙찰이 이관된다.
  • 예외 처리
    • 입찰자가 없으면 "입찰되지 않은 상품 목록" 리스트로 관리된다.
    • 낙찰자가 거래를 포기했을 때 예비 후보가 없다면
      거래 실패로 판단하고, "입찰되지 않은 상품 목록" 리스트로 관리된다.
      해당 로그를 기록하고, 판매자에게 알림을 발송한다.
    • 연장 횟수가 3회에 도달했을 때 입찰이 발생해도 더 이상 연장되지 않는다.
  • 필요한 정보
    • 마감 기한(timestamp)
    • 자동 연장 여부(boolean), 최대 연장 횟수는 3회로 고정
    • 연장된 횟수를 카운트할 데이터
    • 입찰자 리스트 (입찰 시간으로 정렬)
      • 동시간대에 같은 금액으로 입찰이 발생했을 경우 어떻게 처리할지 고민하기.
    • 후보 순위 리스트
      • 높은 금액을 순서대로 후보 순위가 매겨진다.
  • 반환값
    • 마감 완료 시
      • 낙찰자 정보, 낙찰가, 후보자 리스트
    • 마감 직전 상태 알림
      • 경매 마감 임박 (3분 전)
      • 현재 최고가
      • 입찰자 수

채팅

입찰자 간 소통을 위한 단체 채팅과, 판매자와 낙찰자 간의 거래를 위해 1:1 채팅 기능을 제공한다.

  • 동작 조건
    • 단체 채팅
      • 해당 상품에 입찰한 사용자만 채팅방에 참여 가능
      • 채팅방은 상품 경매 마감 시점까지 유지된다.
      • 경매 마감 후, 단체 채팅방은 삭제된다.(DB 데이터도 포함)
      • 판매자는 단체 채팅에 참여할 수 없다.
    • 1:1 채팅
      • 경매 종료 후 낙찰자와 판매자의 채팅방이 생성된다.
      • 채팅방은 거래 완료 후 사용자가 수동으로 "대화 종료"를 한다.
      • "대화 종료" 후에는 채팅방을 다시 확인할 수 없다.
        • "대화 종료"를 누르지 않은 사용자는 3일 동안 대화 내용을 확인할 수 있다.
        • 두 사용자 모두 "대화 종료"를 했다면, 관련 DB 데이터는 모두 삭제된다.
    • 예외 처리
      • 입찰자가 도중에 탈퇴하거나 블랙리스트로 등록된 경우, 모든 채팅방에서 퇴장된다.
      • 1:1 채팅방에서 상대방이 없는 경우, 메시지 전송에 실패해야 한다.
      • 메시지 전송 실패 시 로그를 저장한다.
    • 저장 방식
      • WebSocket 기반의 실시간 처리 + RDB에 대화 이력 저장
        (경매 마감 시 삭제 처리)
      • 1:1, 1:M 메시지 처리 방식 학습 필요
    • 필요한 정보
      • 채팅방 ID
      • 참여자 목록
      • 메시지 내용, 전송 시간, 송신자 정보
      • 채팅방 상태(진행 중/마감)

거래 후기 평가 시스템

거래가 완료된 후, 판매자와 낙찰자는 서로에 대한 후기를 작성할 수 있다.
추후 블랙리스트 기준에도 반영될 수 있다.

  • 동작 조건
    • 거래 상태가 "완료"인 경우에만 후기를 작성할 수 있다.
    • 후기는 1회만 작성 가능하며, 작성 후 수정/삭제는 불가능하다.
    • 후기를 작성하지 않고 3일이 지나면, 자동으로 "후기 미작성" 상태로 전환된다.
    • 평점은 1 ~ 5점으로 정수 입력만 가능하다.
    • 사용자 정보 페이지에서 본인이 작성한 후기와 받은 후기를 조회할 수 있다.
    • 평점 기준은 "후기 미작성"을 제외한, 작성된 평점을 기준으로 평균을 산출한다.
  • 예외 처리
    • 후기를 작성하려 했을 때, 상대방이 탈퇴했을 경우 후기는 작성할 수 없다.
    • 후기가 정상적으로 저장되지 않을 경우 오류 로그를 저장한다.
  • 필요한 정보
    • 거래 ID
    • 작성자 ID
    • 대상자 ID
    • 평점 (1 ~ 5 양의 정수)
    • 작성 일자
  • 반환값
    • 후기 작성 성공 여부

블랙리스트

신뢰를 기반으로 운영하기 위해, 악성 사용자로부터 피해를 방지한다.
반복적으로 낙찰을 취소하거나, 악의적으로 낙찰을 방해한 사용자를 블랙리스트에 등록할 수 있다.
블랙리스트 직접 등록은 관리자 권한이다.

  • 동작 조건
    • 낙찰 이후 24시간 이내 연락이 없거나, 명확한 이유 없이 거래 거부 시 블랙리스트 경고 1회 부여
      • 2회 이상 경고가 누적되면 블랙리스트로 자동 등록
    • 블랙리스트로 등록된 사용자는 서비스를 이용할 수 없다.
    • 사용자가 블랙리스트 등록을 하면, 관리자가 사유를 보고 신고 대상자를 블랙리스트로 등록할지 판단한다.
  • 예외 처리
    • 경고 1회마다 사용자에게 이메일 및 알림 발송
    • 블랙리스트 경고 누적 시 로그 저장
  • 필요한 정보
    • 사용자 ID
  • 반환값
    • 블랙리스트 사용자 목록
    • 경고 횟수
    • 마지막 경고 일자

찜 목록

사용자가 관심 있는 상품을 찜하여 모아볼 수 있다.
찜한 상품의 경매 상태나 가격 변화에 대한 알림을 받을 수 있다.

  • 동작 조건
    • 로그인된 사용자만 찜 기능을 사용할 수 있다.
    • 동일 상품에 대해 중복으로 찜을 할 수 없다.
    • 찜을 취소할 수 있다.
    • 찜한 상품은 "찜 목록"에서 확인할 수 있다.
      • 정렬 기준: 등록순, 마감 임박순, 가격순서로 필터 정렬 기준을 적용할 수 있다.
    • 찜한 상품의 상태 변화(입찰 시작, 가격 변화, 마감 임박 등)에 대한 알림을 (설정 여부에 따라) 받을 수 있다.
  • 예외 처리
    • 상품이 삭제되거나 경매가 종료된 경우 사용자에게 알림을 보내고 찜 목록에서 자동으로 삭제된다.
    • 찜 실패 시 로그 저장
  • 필요한 정보
    • 사용자 ID
    • 상품 ID
    • 찜 등록 일자
    • 알림 설정 여부
  • 반환값
    • 찜 추가, 삭제 성공 여부
    • 사용자 찜 목록 리스트

거래 이력 관리

사용자가 참여한 거래(구매 / 판매)에 대한 전체 이력을 확인한다.

  • 동작 조건
    • 거래 완료 이후 상태(성공, 실패, 낙찰 거절 등)로 관리된다.
    • 사용자는 마이페이지에서 "판매 내역"과 "구매 내역"을 구분해서 확인할 수 있다.
    • 거래 상태에 따라 후기 작성, 블랙리스트 신고, 재등록이 다르게 노출된다.
    • 최근 거래 순으로 정렬한다. (페이징 처리 필요 예상)
    • 거래 이력을 사용자가 직접 삭제할 수 없다.
  • 예외 처리
    • 거래 정보가 정상적으로 조회되지 않으면 사용자에게 알림 전송
    • 실패 로그 관리
  • 필요한 정보
    • 사용자 ID
    • 거래 ID
    • 거래 유형 (판매 or 구매)
    • 상품 ID
    • 거래 상태(진행 중 / 완료 / 실패)
    • 거래 일자
    • 후기 작성 여부
  • 반환값
    • 사용자의 거래 이력 리스트
    • 거래별 상태 및 후기 작성 여부

References

당근
번개장터
코베이옥션
eBay

Metadata

Metadata

Assignees

Labels

documentationImprovements or additions to documentation

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions