1. 프로젝트 소개와 설계 — 회원·판매자·관리자가 함께 쓰는 쇼핑몰 운영 플랫폼
ALLPICK은 회원이 상품을 둘러보고 주문하고, 판매자가 상품을 등록·관리하며, 관리자가 승인·환불·문의 같은 운영 업무를 처리하는 쇼핑몰 플랫폼입니다. 같은 주문이나 상품 데이터라도 회원, 판매자, 관리자에게 허용되는 행동이 다르기 때문에 버튼 하나가 잘못 열리면 환불 처리나 판매자 승인 흐름이 어긋날 수 있습니다. 저는 관리자 페이지와 마이페이지를 중심으로 역할별 권한, 환불 상태, 판매자 상태에 맞는 동작만 가능하도록 정리했습니다.
담당 범위
관리자/마이페이지의 환불 상태, 판매자 상태 액션, 요청 토큰, 백엔드 가드를 다뤘습니다.
판단
화면 버튼과 백엔드 상태 전이는 같은 처리 가능 상태 규칙을 공유해야 한다고 보았습니다.
검증
프론트 가드, 토큰 선택, 백엔드 invalid transition 방어를 코드 증거로 보여줍니다.
한계
현재 페이지는 구현 증거 중심이며, 성능 수치나 운영 트래픽 결과는 과장해 적지 않았습니다.
기술 사례 1. 환불 상태를 버튼이 아니라 서버 전이 규칙으로 통제
- 위험한 상태
- 관리자가 처리 불가능한 환불 상태에서도 완료 버튼을 누르거나, API를 직접 호출해 중간 단계를 건너뛰는 상태
- 결정
- 프론트는 현재 상태에 맞는 액션만 노출하고, 백엔드는
ALLOWED_TRANSITIONS로 상태 전이를 다시 검증했습니다. 화면 가드는 편의 기능이고 최종 무결성은 서비스 계층이 지키도록 했습니다. - 실제 코드
- Frontend
AdminRefundPage.jsx의 승인/거절 조건, BackendClaimServiceImpl.java의updateStatus와 허용 전이 맵 - 검증 근거
ClaimServiceImplTest.java에서 허용되지 않은 상태 전이와 처리 완료 상태의 재변경을 검증했습니다.- 남은 한계
- 운영 트래픽에서의 처리량을 측정한 사례는 아닙니다. 이 사례의 결과는 성능 향상이 아니라 잘못된 환불 상태 전이를 차단한 것입니다.
기술 사례 2. 관리자·판매자·구매자의 권한과 토큰 경계
- 위험한 상태
- 화면 역할과 요청 토큰이 어긋나면 관리자 API에 일반 사용자 토큰을 보내거나, 다른 역할의 액션이 노출될 수 있습니다.
- 결정
- 프론트 요청 계층에서 역할별 토큰을 선택하고, Spring Security URL 규칙과 서비스 검증을 함께 적용했습니다. UI 노출 여부만으로 권한을 신뢰하지 않았습니다.
- 실제 코드
- Frontend
api/index.js, BackendSecurityConfig.java, 전역BusinessException/ErrorCode/GlobalExceptionHandler - 검증 근거
- 역할별 화면 흐름과 API 오류 응답을 함께 확인해, 실패가 임의 문자열이 아니라 일관된 에러 코드로 돌아오게 했습니다.
- 결론
- 프론트와 백엔드의 책임을 겹쳐 두되, 최종 권한 판단은 서버가 소유하도록 정리했습니다.
기술 사례 3. 판매자 승인 상태와 관리자 액션의 정합성
- 위험한 상태
- 이미 승인·거절된 판매자에게 승인 버튼이 다시 열리거나 API가 중복 처리를 허용하는 상태
- 결정
- 관리자 화면은 판매자 상태별 버튼을 분리하고, 백엔드는
PENDING상태에서만 승인·거절을 허용했습니다. - 실제 코드
- Frontend
AdminMemberPage.jsx, BackendAdminSellerApprovalServiceImpl.java - 검증 근거
AdminSellerApprovalServiceImplTest.java에서 PENDING 목록, 비대기 상태 승인·거절 실패, 상태 토글 제한을 확인했습니다.- 결론
- ALLPICK을 단순 CRUD가 아니라 여러 역할이 같은 데이터를 다룰 때 상태와 권한을 일치시키는 백엔드 문제로 다뤘습니다.
사용자 요청, 판매자 확인, 관리자 최종 승인/거절 단계를 분리했습니다.
관리자, 판매자, 구매자 요청이 서로 다른 토큰으로 백엔드 권한 검사를 통과합니다.
PENDING, APPROVED, SUSPENDED, REJECTED 상태에 따라 가능한 액션을 제한했습니다.