[portfolio](https://geonwoo.kim/ko/portfolio) › 디핏

# 운영 콘솔·고객 응대

https://geonwoo.kim/ko/portfolio/deepeet-console

기간: 2026.07 — 2026.08

주문·발주·판매가·상품 등록·고객 문의·환불·정산·자금 상태를 41개 업무 화면에서 보고 처리합니다. 화면은 금액이나 단계를 직접 계산하지 않고 백엔드 응답만 그립니다. 고객 문자는 직접 운영하는 회선 단말로 주고받습니다. 문의·반품·교환·환불은 주문별 클레임 케이스로 묶습니다.

주문·발주·가격·정산을 한곳에서 처리하고, 고객 문자와 클레임을 주문 단위로 잇는 운영 웹

팀: 1인

역할: 운영 화면 설계 · 서버 중계 계층 · 권한·사업자 경계 · 고객 문자 · 클레임 케이스

Next.js 16 · React 19 · TypeScript · Tailwind CSS 4 · Vercel · Go · PostgreSQL

- 메뉴 권한, 관리자 전용 조치, 허용한 경로만 넘기는 서버 중계 계층으로 나눈 3중 권한
- 여러 사업자를 한 콘솔에서 전환하고, 주문·계정·공급사 실행은 사업자별로 격리
- 연락처·주문번호를 화면에서 가리는 민감정보 숨김 모드와 좁은 모바일 화면용 배치
- 직접 운영하는 회선 단말로 고객 문자를 주고받고 주문에 자동으로 잇는 문자 게이트웨이
- 주문자 정보로 새 주문을 보류하는 블랙리스트
- 문자·반품·교환·환불을 주문 단위 케이스로 묶고, 개인정보를 가린 입력으로 AI 분류 제안을 받는 클레임 처리

## 해외 문자 서비스로는 안 되던 양방향 문자

문제: 해외 메시징 플랫폼은 한국 번호의 양방향 문자를 지원하지 않아, 고객 회신을 받을 수 없었습니다.

해결: 직접 운영하는 회선의 단말을 게이트웨이로 써서 문자와 이미지 문자를 주고받게 했습니다. 모든 발신 주소는 원문 그대로 보존하고, 차단한 발신자는 저장 전에 버립니다.

## 장애 종류를 지키는 중계 계층

문제: 중계 계층이 오류를 하나로 뭉치면 시간 초과와 사용자 취소, 전송 실패를 구분할 수 없습니다.

해결: 시간 초과는 504, 사용자 취소는 499, 그 밖의 전송 실패는 502로 나눴습니다. 요청 ID로 백엔드 기록과 잇되, URL·본문·헤더는 로그에 남기지 않습니다. 네트워크 오류는 로그아웃으로 처리하지 않습니다.

## 취소와 엇갈린 사진 요청 문자

문제: 사진 요청을 예약한 뒤 고객이 회신하거나 취소가 들어오면, 필요 없는 문자가 나갈 수 있었습니다.

해결: 보내기 직전에 케이스와 요청을 차례로 잠그고 회신·환불·처리 경로를 다시 확인합니다. 취소가 먼저 커밋되면 보내지 않고, 발송이 먼저 확정되면 남은 요청만 취소합니다. 두 순서를 실제 PostgreSQL 동시성 테스트로 고정했습니다.

## 금액 형식 변화로 멈춘 반품 수집

문제: 채널 반품 응답의 배송비가 숫자가 아닌 금액 객체로 와서, 목록 전체를 읽지 못하고 수집이 멈췄습니다.

해결: 객체·숫자·숫자 문자열을 모두 받게 하고, 실패는 수집 방식별로 격리했습니다. 진단에는 필드 이름과 타입만 남깁니다. 배포 뒤 수집이 다시 이어졌고, 빠진 이벤트를 채우면서 알림을 다시 보내지 않았습니다.


[개발·인프라 운영](https://geonwoo.kim/ko/portfolio/deepeet-infra) · [상품 등록](https://geonwoo.kim/ko/portfolio/deepeet-listing-pipeline)
