후기 관리 플로우
어드민 15번 메뉴 · show(9) · bongi_reviews 테이블 · 봉이모바일 자체 후기 전용
핵심 — 봉이모바일 자체 후기
봉이모바일 자체 후기만 사용한다. 렌트리 리뷰는 사용하지 않는다.
렌트리 플랫폼 자체에 대한 리뷰일 가능성이 높아 상품 품질 리뷰로 보기 어렵기 때문.
봉이모바일 자체 후기 (사용)
계약 완료 고객만 작성 가능
사진 첨부 필수
별점 (1~5) + 내용 (최소 10자)
작성 시 15,000P 적립
AI 채팅에서 관련 후기 자동 노출
렌트리 리뷰 (사용 안 함)
렌트리 플랫폼 자체 리뷰
봉이모바일 상품 품질과 무관
렌트리 플랫폼에 대한 평가일 가능성
사용하지 않음
후기 전체 흐름
고객
계약 완료
->
PASS
본인인증 완료
->
마이페이지
후기 작성
->
POST /api/reviews
이미지 업로드
->
bongi_reviews
INSERT
->
어드민
승인/관리
->
|
STEP 1 -- 후기 작성 조건
후기를 작성하려면 3가지 조건을 모두 충족해야 한다
1
계약 완료
봉이모바일을 통해
인터넷+TV / 렌탈 / 중고폰
계약이 완료된 고객
2
PASS 본인인증
모든 보상(포인트 적립)은
PASS 본인인증 완료 필수
미인증 시 포인트 미적립
3
사진 첨부 필수
사진 없이는 제출 불가
base64 이미지 업로드
최대 3MB, Supabase Storage
포인트 적립 조건: 후기 작성 시 15,000P 적립. 단, PASS 본인인증이 완료된 회원에게만 적립.
비회원도 후기 작성은 가능(optionalAuth)하지만, 포인트 적립은 인증 회원에게만 제공.
|
STEP 2 -- 후기 작성 흐름 (고객 앱)
마이페이지 > 후기 (Reviews.jsx)
카테고리 선택
전체/인터넷+TV/렌탈/중고폰
->
상품 선택
계약완료 상품 드롭다운
->
별점 선택
1~5점 (필수)
->
후기 내용 작성
최소 10자 이상
->
사진 첨부
필수, 3MB 이하
->
제출
POST /api/reviews
API 상세
| API | 메서드 | 역할 | 파라미터 |
| POST /api/reviews/upload-image |
POST |
사진 업로드 |
image (base64) |
| POST /api/reviews |
POST |
후기 등록 |
category, product_name, rating, content, author_name, image_url |
| GET /api/reviews |
GET |
후기 목록 조회 |
category, page, limit (기본 20) |
이미지 업로드 상세
사진 선택
카메라/갤러리
->
base64 인코딩
data:image/xxx;base64,...
->
POST upload-image
3MB 제한 체크
->
Supabase Storage
review-images 버킷
->
publicUrl 반환
image_url로 사용
파일명 규칙: review_{timestamp}_{random6}.{ext} - 예: review_1712345678901_a3k8x2.jpg
인증: optionalAuth - 로그인 사용자는 user_id + displayName 자동 기록, 비로그인은 author_name 수동 입력
서버 유효성 검증 (reviews.js)
| 검증 항목 | 조건 | 에러 메시지 |
| 상품명 | 필수 | 상품명, 별점, 내용은 필수입니다. |
| 별점 | 1~5 사이 정수 | 별점은 1~5 사이여야 합니다. |
| 내용 | 최소 10자 | 후기는 최소 10자 이상 작성해주세요. |
| 이미지 | base64 형식, 3MB 이하 | 올바른 base64 이미지 형식이 아닙니다. / 이미지 크기는 3MB 이하여야 합니다. |
|
STEP 3 -- 어드민 후기 관리 화면
어드민 15번 메뉴 > show(9) > loadReviewsAdmin()
필터
| 필터 종류 | 옵션 | 동작 |
| 상품 필터 | 전체 / 인터넷+TV / 렌탈 / 중고폰 | 테이블 행 텍스트 매칭 필터링 |
| 노출 필터 | 전체 / ON / OFF | AI 노출 상태로 필터링 |
| 검색 | 이름 / 상품 검색 | 텍스트 입력 검색 |
후기 목록 테이블 컬럼
| 컬럼 | 설명 | 상호작용 |
| 등록일 | 후기 작성일 | - |
| 이름 | 작성자명 (마스킹 없음) | 클릭 -> findAndOpenMember() -> 회원 상세 모달 |
| 티켓번호 | 계약 상품의 티켓번호 | 모노스페이스 표시 |
| 상품 | 계약 상품명 | - |
| 별점 | 1~5 별표 | - |
| 내용 | 후기 텍스트 (줄임 표시) | title 속성으로 전문 확인 |
| 사진 | 첨부 사진 수 | - |
| AI노출 | ON/OFF 뱃지 | 클릭 시 즉시 토글 |
| 상세 | 상세 보기 버튼 | openReviewDetail() 모달 |
후기 상세 모달 (openReviewDetail)
모달 구성
1. 작성자명 (클릭 -> 회원 상세) + 별점 + 등록일
2. 상품 정보: 티켓번호 / 상품명 / AI 노출 토글
3. 후기 내용 전문
4. 첨부 사진 (썸네일 표시)
5. 관리 메모 (textarea + 저장 버튼)
어드민 API
| GET /admin/platform/reviews | 목록 조회 (최대 100건) |
| ?status=pending | 미승인 후기만 |
| ?status=approved | 승인된 후기만 |
| PATCH /admin/platform/reviews/:id | 승인 상태 변경 (is_approved) |
| DELETE /admin/platform/reviews/:id | 후기 삭제 |
AI 노출 ON/OFF: 테이블에서 ON/OFF 뱃지 클릭 시 프론트에서 즉시 토글 (CSS class green <-> gray). 현재 프론트 전용 토글이며, is_approved 필드와 별개로 동작.
|
STEP 4 -- 후기가 노출되는 곳
1. 웹 메인 후기 섹션 (Home.jsx)
위치: 메인 페이지 하단 "실제 고객 후기" 섹션
데이터: api.reviews.list({ limit: 4 }) 호출
표시: 최근 후기 4건 가로 스크롤
카드 구성: 별점 + 카테고리 뱃지 + 사진 + 내용(60자 줄임) + 작성자(마스킹) + 날짜
작성자 마스킹: maskName() 함수 - 예: 홍**
조건: recentReviews.length > 0 일 때만 섹션 표시
2. AI 채팅 자동 노출 (chat-tools.js)
Tool 이름: search_reviews
트리거: "후기", "리뷰", "평가", "만족도" 키워드
파라미터: category (선택), limit (기본 3)
정렬: rating DESC, created_at DESC
반환: 작성자 / 별점 / 상품 / 내용 / 이미지 / 작성일
예시: "KT 인터넷 후기 보여줘" -> AI가 자동 호출
AI 채팅 후기 노출 흐름
고객: "인터넷
후기 보여줘"
->
Claude AI
search_reviews 호출
->
bongi_reviews
category 필터
->
별점순 정렬
상위 3건 반환
->
채팅 안에서
후기 카드 표시
마이페이지 후기 탭 (Reviews.jsx)
| 요소 | 구현 |
| 카테고리 필터 | 전체 / 인터넷+TV / 렌탈 / 중고폰 (탭 버튼) |
| 후기 작성 버튼 | "후기 작성" 버튼 클릭 -> 작성 폼 토글 |
| 작성 폼 | 상품 선택(select) -> 별점 -> 내용(textarea) -> 사진 첨부(필수) -> 등록 |
| 후기 목록 | 상품명 + 별점 + 내용 + 사진 썸네일 + 작성자(마스킹) + 날짜 |
| 적립 안내 | "후기 작성 시 15,000P 적립!" 텍스트 |
렌탈 상품 카드 (flow-rental.html)
렌탈 상품 카드에 bongi_reviews 기반 고객만족도(평점)가 표시된다. 해당 상품의 후기 별점 평균이 카드에 노출.
|
STEP 5 -- 포인트 적립
후기 작성 보상
| 적립 포인트 | 15,000P |
| 대상 | 본인 (후기 작성자) |
| 조건 | 계약 완료 후 후기 작성 시 (상품 무관) |
| 필수 | PASS 본인인증 완료 |
전체 포인트 적립 단가표
| 회원가입 | 본인 | 5,000P |
| 친구초대 가입 | 추천인 | 3,000P |
| 친구 계약완료 | 추천인 | 최대 20,000P |
| 친구 계약완료 | 친구 | 최대 15,000P |
| 후기 작성 | 본인 | 15,000P |
PASS 본인인증 미완료 시: 후기 작성 자체는 가능하지만 포인트 적립이 되지 않는다.
모든 보상(가입, 초대, 계약, 후기)에 PASS 인증은 공통 필수 조건이다.
|
DB -- bongi_reviews 테이블
| 컬럼 | 타입 | 설명 | 비고 |
| id | uuid | PK | 자동 생성 |
| user_id | uuid (nullable) | 작성자 ID | 로그인 사용자 = req.user.id, 비로그인 = null |
| category | text | 카테고리 | 기본값 'general'. water-purifier, air-purifier, tv, internet 등 |
| product_name | text | 상품명 | 필수 |
| rating | integer | 별점 | 1~5, 필수 |
| content | text | 후기 내용 | 필수, 최소 10자 |
| author_name | text | 작성자 이름 | 로그인 시 displayName, 비로그인 시 직접 입력 또는 '익명' |
| image_url | text (nullable) | 사진 URL | Supabase Storage review-images 버킷의 publicUrl |
| is_approved | boolean | 승인 여부 | 어드민에서 PATCH로 변경 |
| created_at | timestamp | 작성일 | 자동 |
Storage
| 버킷 | 용도 | 파일명 규칙 | 제한 |
| review-images |
후기 첨부 사진 |
review_{timestamp}_{random6}.{ext} |
3MB 이하, base64 이미지 |
데이터 현황 (data-flow-diagram 기준)
bongi_reviews: 99건 등록됨. 어드민 API는 최대 100건 조회, 고객 API는 page/limit 페이징 지원 (기본 20건).
|
소스코드 맵
| 파일 | 역할 | 주요 함수/컴포넌트 |
| server/routes/reviews.js |
고객용 후기 API |
GET / (목록) / POST / (작성) / POST /upload-image (이미지) |
| server/routes/admin-platform.js |
어드민 후기 API |
GET /reviews / PATCH /reviews/:id / DELETE /reviews/:id |
| server/services/chat-tools.js |
AI 채팅 후기 조회 Tool |
search_reviews -> searchReviews({ category, limit }) |
| client/src/pages/my/Reviews.jsx |
마이페이지 후기 탭 |
카테고리 필터 + 작성 폼 + 목록 |
| client/src/pages/Home.jsx |
메인 페이지 후기 섹션 |
recentReviews (최근 4건 가로 스크롤) |
| server/public/admin/index.html |
어드민 15번 메뉴 |
show(9) / loadReviewsAdmin() / openReviewDetail() |
|
예외 케이스
| 상황 | 현재 동작 | 비고 |
| 비로그인 사용자 후기 작성 |
optionalAuth이므로 작성 가능. user_id = null, author_name = 직접 입력 또는 '익명' |
포인트 적립 불가 (user 없음) |
| PASS 미인증 회원 |
후기 작성 가능, 포인트 적립 불가 |
모든 보상에 PASS 인증 필수 |
| 사진 미첨부 |
서버에서 image_url = null 허용 (현재). 프론트에서 "사진 첨부 (필수)" UI 표시 |
서버 강제 검증은 미구현, 프론트 가이드 수준 |
| 이미지 3MB 초과 |
upload-image API에서 400 에러 반환 |
"이미지 크기는 3MB 이하여야 합니다." |
| 내용 10자 미만 |
서버에서 400 에러 반환 |
"후기는 최소 10자 이상 작성해주세요." |
| 별점 범위 초과 |
서버에서 400 에러 반환 |
"별점은 1~5 사이여야 합니다." |
| Supabase 미연결 |
GET -> { data: [], total: 0 }, POST -> 503 'DB 연결 필요' |
supabase null 체크 |
| 잘못된 base64 형식 |
정규식 매칭 실패 -> 400 에러 |
data:image/{ext};base64,... 형식 필수 |
| 계약 미완료 고객 |
프론트 UI에서 "계약 완료한 상품만 작성 가능합니다" 안내 |
서버에서 계약 완료 여부 검증은 미구현 (프론트 가이드) |
| 동일 상품 중복 후기 |
현재 중복 제한 없음 |
동일 상품에 여러 후기 작성 가능 |
현재 미구현 사항:
1. 서버에서 계약 완료 여부 검증 (프론트 가이드만 존재)
2. 서버에서 사진 필수 강제 검증 (image_url null 허용 중)
3. AI 노출 ON/OFF DB 반영 (현재 프론트 토글만, 별도 필드 미존재)
4. 후기 작성 시 자동 포인트 적립 로직 (별도 적립 API 연동 필요)
봉이모바일 · 후기 관리 플로우 · 2026-04-09
어드민 15번 메뉴 · show(9) · bongi_reviews 99건