서비스
sitePing — 설치형 실시간 상담 서비스
웹사이트에 설치 코드를 추가하면 방문자 상담창을 제공하고, 관리자 상담함에서 문의와 답변을 실시간으로 주고받는 서비스입니다.

- 운영 상태
- 운영 중
- 역할
- 서비스 기획·관리자 UI·설치형 위젯·Firebase 서버·권한·테스트·배포
- 문제
- 사이트별 상담 데이터와 권한을 분리하면서도 상담원의 작업 흐름을 유지해야 했습니다.
- 해결
- 서버·보안 규칙에서 권한을 검증하고, 선택한 상담·초안·재시도 요청을 목록 상태와 분리했습니다.
- 결과
- 외부 사이트의 문의부터 관리자 답변·첨부·상담 이력까지 하나의 서비스로 연결했습니다.
문제
웹사이트마다 상담 화면을 반복 제작하는 대신 공통 위젯을 설치하고, 상담원은 여러 문의를 오가며 답변·배정·고객 이력을 처리할 수 있어야 했습니다. 이 과정에서 사이트별 데이터 접근과 UI 상태 유지를 함께 설계했습니다.
제약
- 외부 웹사이트의 스타일과 상담 UI가 서로 영향을 주는 범위를 줄여야 함
- 로그인 계정과 운영 사이트를 구분하고 멤버의 소속·역할·활성 상태를 확인해야 함
- 전송 실패와 계정 전환 뒤에도 상담 내용의 중복 저장이나 다른 계정의 상태 반영을 막아야 함
주요 사용자
- 상담창을 설치할 웹사이트 운영자
- 여러 사이트의 문의를 처리하는 관리자와 상담원
핵심 결정
- 관리자·방문자 위젯·Vanilla TypeScript loader·서버·공통 스키마를 npm workspaces로 분리하고, loader가 버튼과 iframe을 생성하도록 구성
- Firebase UID와 siteId·멤버십을 구분하고 Cloud Functions 및 Firestore·Storage Rules에서 사이트 소속·역할·상담방 소유권을 확인
- 외부 페이지와 iframe 통신에서 정확한 origin·메시지를 보낸 window·nonce를 검증
- 대기 상담을 시작할 때 목록에서 빠져도 대화가 사라지지 않도록 선택한 상담 ID를 URL에 유지하고 목록 조회와 선택 상담 구독을 분리
- 상담별 초안을 현재 탭 메모리에 보관하고 계정 전환 시 분리·초기화하며, 재전송에는 같은 메시지 ID를 사용해 트랜잭션에서 중복 저장·사용량 중복 차감을 방지
- 첨부 업로드 권한과 용량을 서버에서 예약하고, 메시지 저장 시 실제 Storage 객체의 크기·형식·소유권을 다시 검증
구현
- 사이트 등록·허용 도메인·버튼 색상·위치·크기·여백·설명·아이콘 설정과 설치 코드 제공
- 실시간 상담 검색·상태·읽음·담당자 배정과 고객 메모·태그·상담 이력 구성
- 메뉴 이동과 전송 실패에도 답변·첨부를 유지하고 재시도할 수 있는 상담별 작성 흐름 구현
- 이미지·PDF·텍스트 첨부와 다운로드를 제공하고 작은 이미지는 원본보다 확대하지 않도록 표시
- 대화 기록만 스크롤해 입력창을 유지하고, 모바일에서는 목록과 대화를 전환하며 관리 화면에서는 상담용 빈 사이드바를 접는 레이아웃 구성
- 기간별 상담 상태·평균 최초 응답 시간·만족도·상담원별 배정 및 종료 건수와 문서 버전·활성 상태·키워드 근거 검색 구현
검증 방법
- 원 프로젝트의 테스트와 운영 기록에서 상담 상태 전환·초안 유지·첨부 취소 및 재선택의 회귀 검증을 확인했습니다.
- Firebase Emulator의 사이트 간 접근·권한 규칙 검증과 Playwright의 양방향 상담·반응형 화면 검증 기록을 남겼습니다.
- 운영 Chrome에서 관리자·방문자 첨부를 전송하고 다운로드한 파일의 크기·SHA-256을 원본과 대조한 기록이 있습니다.
- 2026-10-21 포트폴리오 등록 시 운영 관리자 상담함과 위젯 설정을 직접 캡처했습니다. 방문자 위젯은 같은 날의 운영 검증 캡처이며, 모든 화면은 테스트 상담 데이터를 사용합니다.
결과
- 설치 코드 추가부터 방문자 문의·상담원 답변·첨부 다운로드·상담 이력 확인까지 연결한 서비스를 배포
- 기획·구현·수정에 Codex를 활용하고, 생성된 결과의 기존 구조·권한 경계를 검토한 뒤 재현 테스트와 운영 확인으로 보완
현재 개발 상태
맞춤 도메인에서 관리자·방문자 위젯·설치용 loader를 제공하며 기능을 보완하고 있습니다. 관리자 이용에는 회원가입과 로그인이 필요합니다.
한계와 다음 개선
- 상담 요약·분류·답변 추천·고객 질문 응답을 위한 UI와 서버 인터페이스·API 어댑터는 준비했으며, 외부 AI 제공자를 연결한 운영 검증은 남아 있습니다.
- 현재 문서 검색은 키워드 기반입니다. 임베딩·벡터 검색은 구현 범위에 포함하지 않습니다.
- 답변 초안은 현재 탭의 메뉴 이동·전송 재시도 범위에서 유지하며, 새로고침 이후의 영구 보존은 제공하지 않습니다.
기술 기록과 근거
사용 기술
- React
- TypeScript
- Vite
- TanStack Query
- React Hook Form
- Zod
- Vanilla TypeScript
- Firebase Authentication
- Cloud Firestore
- Cloud Functions
- Cloud Storage
- Firebase Hosting
- Vitest
- Testing Library
- Playwright
- Firebase Emulator
- npm workspaces
주요 화면


