0에서 시스템 구축까지 3주: 금융 중개인을 위한 AI 에이전트 기반 CRM 구축 사례
요약
금융 중개인을 위해 3주 만에 구축한 AI 에이전트 기반 CRM 시스템 사례를 소개합니다. Nuxt, NestJS, LangChain.js 등을 활용하여 리드 유치부터 자격 검증, 일정 예약까지 자동화하는 아키텍처를 다룹니다.
핵심 포인트
- Nuxt 4와 NestJS를 활용한 풀스택 아키텍처 설계
- LangChain.js 기반의 리드 자격 검증(Qualification) 에이전트 구현
- Cal.com API와 Webhook을 이용한 일정 예약 자동화
- BullMQ와 Redis를 활용한 비동기 작업 큐 관리
- 모노레포 템플릿을 통한 빠른 시스템 구축 및 배포
Sando Capital은 마요르카(Mallorca)에 위치한 금융 중개인입니다. 설립자인 Javier는 웹사이트도, 고객 유치 시스템도, 고객 데이터베이스도 없었습니다. 리드(Leads)는 WhatsApp을 통해 들어왔으며, 미팅 일정을 잡는 것이 의미가 있는지 확인하기 위해 투자자의 프로필을 파악하는 데 매번 30분간의 수동 전화 통화가 필요했습니다.
우리는 3주 만에 완전한 시스템을 구축해 주었습니다: 맞춤형 웹사이트, Cal.com을 이용한 일정 예약, 통화 전 리드를 자격 검증(Qualify)하는 AI 에이전트, 그리고 중앙 집중식 데이터베이스를 갖춘 CRM입니다.
이 글에서는 해당 시스템의 아키텍처(Architecture)와 기술적 결정 사항에 대해 설명합니다.
문제점
고객에 대한 정보는 WhatsApp에 머물러 있었습니다. 각 리드는 흩어진 채팅 속에 사라지는 일시적인 대화였습니다. 다음과 같은 작업이 불가능했습니다:
- 한 달에 얼마나 많은 리드가 들어오는지 파악하는 것
- 투자자에게 다시 묻지 않고도 그들의 프로필을 기억하는 것
- 30분간의 통화에 시간을 쓰기 전에 자동으로 자격을 검증하는 것
문제는 제품이 아니라 아키텍처의 부재였습니다.
시스템 아키텍처
기술 스택(Stack):
- Nuxt 4: 공개 웹사이트용 (SEO를 위한 SSG, CRM 패널을 위한 SPA)
- NestJS 11: 백엔드 API (REST + webhooks)
- PostgreSQL 17: 리드 및 투자자 데이터베이스용
- Redis + BullMQ: AI 에이전트의 작업 큐(Task Queue)용
- LangChain.js: 자격 검증(Qualification) 에이전트용
- Cal.com: 일정 예약용 (API + webhook 활용)
- Prisma ORM: 데이터 액세스용
모든 것은 내부 모노레포(Monorepo) 템플릿(Nuxt + NestJS + Postgres + Redis + BullMQ + Stripe + LangChain이 사전 구성됨)을 기반으로 구축되었습니다. 처음부터 시작하지 않는 것이 3주 만에 결과물을 전달할 수 있게 해준 핵심입니다.
컴포넌트 1: 맞춤형 웹 + 리드 유치
공개 웹사이트는 Nuxt 4를 사용하여 SSG(Static Site Generation) 모드로 구축되었습니다. 단일 페이지로 구성되며 유일한 CTA(Call to Action)는 '미팅 예약'입니다. 복잡한 메뉴도, 블로그도, 불필요한 요소도 없습니다.
문의 양식(Contact Form)은 NestJS 백엔드로 POST 요청을 보냅니다:
// nestjs/src/modules/leads/leads.controller.ts
@Controller('api/leads')
export class LeadsController {
...
각 리드(Lead)는 nuevo(신규) 상태로 PostgreSQL에 저장되며, AI 에이전트가 이를 자격 검증(Qualify)할 수 있도록 BullMQ에 작업이 큐(Queue)에 추가됩니다.
구성 요소 2: Cal.com을 이용한 일정 예약
캘린더 시스템을 처음부터 구축하는 대신, API를 통해 Cal.com을 통합했습니다. 웹사이트에 접속한 투자자는 Javier의 예약 가능한 시간대를 확인하고 하나를 선택합니다.
Cal.com의 웹훅(Webhook)은 예약이 완료되면 백엔드에 알림을 보냅니다:
// nestjs/src/modules/calendly/calendly.controller.ts
@Controller('api/webhooks/cal')
export class CalWebhookController {
...
리드의 상태는 cualificado(자격 검증됨)에서 citado(예약됨)로 자동으로 변경됩니다. Javier는 아무것도 건드릴 필요가 없습니다.
구성 요소 3: LangChain을 이용한 자격 검증 AI 에이전트
이것은 Javier의 시간을 70% 절약해 주는 핵심 구성 요소입니다. 예약이 잡히기 전, 투자자는 AI 에이전트와 대화하며 다음 사항에 대해 답변합니다:
- 가용 자본
- 투자 기간 (단기, 중기, 장기)
- 이전 투자 경험
- 위험 감수 성향 (Risk Tolerance)
- 재무 목표
에이전트는 답변을 분석하여 가장 적합한 투자 상품을 제안하며, 만약 프로필이 조건에 맞지 않는 경우 예약을 잡지 않고 리드를 탈락(Discard)시킵니다.
// nestjs/src/modules/ai/qualification.agent.ts
import { ChatOpenAI } from '@langchain/openai';
import { AgentExecutor, createToolCallingAgent } from 'langchain/agents';
...
에이전트는 API를 차단하지 않도록 BullMQ 워커(Worker)에서 실행됩니다. Javier는 통화 전에 이미 분석이 완료된 투자자 프로필을 전달받습니다.
구성 요소 4: CRM + 중앙 집중식 데이터베이스
CRM 대시보드는 Nuxt 4를 사용하여 SPA(Single Page Application) 모드로 구축되었습니다. 다음 내용을 보여줍니다:
- 상태별(신규, 자격 검증됨, 예약됨, 종료됨, 탈락됨) 리드 목록
- 자격 검증 정보가 포함된 각 투자자의 프로필
- 상호작용 이력 (Interaction History)
- AI 에이전트가 제안한 상품
모든 데이터는 동일한 PostgreSQL을 기반으로 합니다. 단일 진실 공급원(Single Source of Truth)을 구축함으로써, WhatsApp이나 Excel에 흩어져 있던 데이터가 사라졌습니다.
// prisma/schema.prisma
model Lead {
id String @id @default(cuid())
...
왜 3개월이 아닌 3주인가
단순히 속도만을 위한 것이 아닙니다. 이미 만들어진 작업을 반복하지 않는 것입니다. 인증 (Authentication), 작업 큐 (Task Queue), ORM, Cal.com 웹훅 (Webhooks), AI 레이어 (AI Layer) 등은 모두 모노레포 템플릿 (Monorepo Template) 내의 모듈로 존재합니다. 이를 조립하고 맞춤화할 뿐입니다.
전체 아키텍처 (Architecture)에 대한 더 자세한 내용을 보고 싶다면, 가격 책정 결정 사항과 유지보수 구조화 방법을 다룬 SOM-OS 블로그의 더 긴 포스트를 작성해 두었습니다.
핵심 교훈
AI 에이전트 (AI Agent)가 작동하는 이유는 그 아래에 아키텍처가 있기 때문입니다. 데이터베이스 (Database), Cal.com, 웹 (Web)이 없다면 에이전트는 읽거나 쓸 곳이 없을 것입니다. 혼돈 위에 AI를 바로 연결할 수는 없습니다. 먼저 질서를 잡고, 그다음 디지털화하며, 그 후에 지능을 배포해야 합니다.
유사한 시스템을 구축 중이며 접근 방식을 비교하고 싶다면, 시작점으로 활용할 수 있는 프로세스 및 도구 지도가 준비되어 있습니다.
우리가 이를 실제 시스템에 어떻게 적용하는지 보고 싶다면 SOM-OS를 살펴보세요. 우리는 마요르카에서 AI를 활용한 비즈니스 운영 체제를 구축합니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기