고객 접점 요청의 안정적 처리
조회, 클릭, 스크롤 이벤트 증가로 인한 DB 직접 쓰기 부하
웹사이트 예약 신청의 영업 보드 즉시 전달 필요
접수 내용 저장과 담당자 Slack 알림 동시 처리 필요
동시 업로드와 영상 변환 과정의 메모리 사용량 급증
중고·신형 굴삭기 판매 영업을 위한 서비스 운영 플랫폼과 영업 자동화 플랫폼을 하나의 Backend Platform으로 통합한 프로젝트.
프로젝트 방향
운영에 필요한 데이터는 웹사이트, 광고 플랫폼, Android 애플리케이션, 외부 커뮤니티 등 다양한 채널에서 발생. 채널별 생성 방식과 처리 방식이 달라, 영업 담당자가 바로 사용할 수 있는 형태로 표준화하는 것이 핵심 과제.
조회, 클릭, 스크롤 이벤트 증가로 인한 DB 직접 쓰기 부하
웹사이트 예약 신청의 영업 보드 즉시 전달 필요
접수 내용 저장과 담당자 Slack 알림 동시 처리 필요
동시 업로드와 영상 변환 과정의 메모리 사용량 급증
광고 문의, CRM 단계, 구매 전환 데이터의 연결
업무용 번호 상담 이력의 고객 Timeline 자동 기록
커뮤니티 질문글과 정보글 사이에서 실제 구매 의도 선별
구매 완료 데이터를 Meta로 재전송해 실제 구매 고객 기반 타겟 조정
조회 · 클릭 · 스크롤
고객 정보 · 관심 장비
고장 내용 · 파일 업로드
CRM · Dashboard · Queue · Redis · MySQL
Lead Webhook · CAPI
상담 Timeline
Intent · Entity JSON
전체 아키텍처
서버 구조 최적화
웹 요청과 영업 보드, Redis 이벤트 처리를 한 프로세스에 몰아넣지 않고 역할별 컨테이너로 나누어 장애 범위와 처리 책임을 분리한 구조.
고객 접점과 서비스 요청을 처리하는 웹 컨테이너
영업 데이터와 외부 연동을 처리하는 보드 컨테이너
짧고 빈번한 이벤트와 비동기 작업을 받는 버퍼 컨테이너
Core Features
문제 → 데이터 흐름 → 구현 → 실제 예시 → 설계 이유 구조.
서비스 운영 플랫폼
고객 접점 요청을 영업 보드와 운영 관리 화면으로 즉시 연결할 필요.
POST
{
"name": "홍길동",
"phone": "010-0000-0000",
"machine": "he-017",
"region": "서울/경기",
"desired_date": "2026-03-31"
}
POST
{
"receipt_no": "AS-20260703143022-A1B2C3",
"customer_name": "홍길동",
"phone": "010-1234-5678",
"machine": "he-017",
"region": "서울/경기",
"description": "작업 중 유압이 약하고 붐 상승 속도가 느립니다.",
"status": "received"
}
웹사이트는 고객 요청 접점, board는 운영 처리 공간. 역할 분리 필요.
예약과 A/S의 운영 보드 즉시 확인 흐름 구축.
영업 자동화 플랫폼
Lead부터 구매까지 이어지는 단계의 보드 기반 관리 필요.
광고 리드의 매출 전환 여부 확인을 위한 상태 변화 데이터화.
담당자별 상담 진행과 구매 전환을 한 화면에서 확인하는 구조.
AI 기반 수요 분석
구매 의도 선판별 후 가능성이 높은 글만 영업 대상으로 추출.
농사용 1.7톤 굴삭기 찾습니다.
예산은 1800 정도 생각하고 있습니다.
전남에서 구합니다.
{
"equipment_type": "굴삭기",
"tonnage": "1.7톤",
"budget_min": 1800,
"region": "전라남도",
"purpose": "농업",
"intent": "구매",
"confidence_score": 0.98,
"board_status": "registered"
}
지역, 예산, 톤수 기준으로 수요 Dashboard에 표시
농사용 1.7톤 굴삭기 사용 중 질문 있습니다.
작업 중 관리 방법이 궁금합니다.
{
"equipment_type": "굴삭기",
"purpose": "질문",
"intent": "정보 문의",
"confidence_score": 0.24,
"board_status": "discarded"
}
구매 의도가 낮아 영업 대상에서 제외
Entity 추출 전 구매 의도가 낮은 글을 제외해 불필요한 영업 대상 감소.
정보성 게시글을 걸러내고 실제 구매 가능성이 높은 글만 보드에 등록.
Meta Closed-loop CRM
실제 구매 고객 데이터를 Meta에 다시 전달해 광고 학습 기준으로 활용.
{
"event_name": "Purchase",
"action_source": "system_generated",
"customer_phone": "hashed_phone",
"value": 18000000
}
광고 리드를 폴링하지 않고 발생 즉시 CRM으로 수집.
문의가 아닌 구매 고객 기준의 광고 타겟 최적화.
Android CRM
업무용 번호의 전화와 문자를 고객 데이터와 자동 매칭할 필요.
Android 이벤트를 Django 서버로 단순하고 안정적으로 전달.
전화, 문자, 미팅 이력의 고객 단위 누적.
Backend Platform
흩어진 스크립트가 아닌 공통 백엔드 중심 처리 필요.
Lead
- customer_phone
- source
- status
- assigned_to
- timeline_events
- purchase_event_sent
관리자 페이지, ORM, 서버 검증, 대시보드 구성이 운영 플랫폼에 적합.
광고, 웹, Android에서 들어오는 서로 다른 데이터 형식의 백엔드 정규화.
Infrastructure
운영 책임을 컨테이너 단위로 나누는 구조 필요.
실행 환경 고정과 웹, 보드, Redis 역할 분리.
짧고 빈번한 이벤트를 MySQL에 직접 쓰지 않는 버퍼 구조.
Troubleshooting
사용자 응답과 무거운 영상 처리의 분리 필요.
요청 중 영상 변환 → 메모리 급증 → 응답 지연
접수 완료 응답 → Queue 적재 → Worker 처리
무거운 영상 변환을 요청/응답 흐름에서 분리해 서비스 안정성 확보.
사용자는 빠르게 접수 완료 응답, 서버는 작업을 순차 처리.
Lessons Learned
이 프로젝트에서 중요한 것은 기능을 많이 붙이는 것이 아니라, 어떤 데이터가 서비스 운영에 속하고 어떤 데이터가 영업 자동화에 속하는지 구분한 뒤, 두 흐름을 안정적인 백엔드 플랫폼에서 만나게 하는 구조.