TRENDSHIFT #7 딥다이브 · 2026-03-28 분석

Twenty CRM 딥다이브
— 커뮤니티가 만드는 오픈소스 Salesforce 대체제

사용자당 월 $25~300을 요구하는 Salesforce 대신, 내 서버에서 직접 돌리는 현대적 CRM. TypeScript + React + NestJS + PostgreSQL 풀스택으로 커스텀 데이터 모델, 워크플로우 자동화, 다중 LLM AI까지 갖춘 엔터프라이즈급 CRM을 커뮤니티 주도로 개발 중. (저장소: twentyhq/twenty · ⭐49k · TypeScript · AGPL-3.0)
목차
  1. 프로젝트 한줄 요약
  2. 왜 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트 (기술별)
  7. 하드웨어 / 시스템 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한줄 요약

Twenty CRM이 정확히 무엇을 하는 물건인가

TwentySalesforce의 오픈소스 대안 — 커뮤니티가 만드는 현대적 CRM 플랫폼입니다. TypeScript + React + NestJS + PostgreSQL 기반의 풀스택 오픈소스 CRM으로, "비싸고 폐쇄적인 Salesforce를 대체하겠다"는 명확한 목표 아래, 커스텀 데이터 모델, 워크플로우 자동화, 이메일/캘린더 통합, AI 기능까지 갖춘 엔터프라이즈급 CRM을 커뮤니티 주도로 개발하고 있습니다.

한 컷 비유

"Salesforce를 내 땅에 짓는 것"

Salesforce는 임대 아파트입니다. 들어가려면 매달 돈을 내야 하고, 내 맘대로 인테리어를 바꿀 수 없고, 이사 가면 내 데이터는 집주인 것이 됩니다. Twenty는 내 서버라는 토지를 사서 집을 짓는 것입니다.

특히 주목할 점은 메타데이터 기반 엔진 — "고객", "거래" 같은 CRM 객체를 하드코딩하지 않고, 런타임에 사용자가 직접 만들 수 있습니다. Salesforce의 "Custom Object" 기능을 표준 웹 기술로 구현한 셈입니다.

2왜 주목받는가

트렌딩 이유와 Salesforce 대비 강점
기존 방식의 문제
Salesforce = 비용 + 종속성 + 폐쇄성

사용자당 월 $25~300, 데이터는 Salesforce 클라우드에 고정, 커스터마이징은 Apex/LWC 독자 생태계 필수. 기존 오픈소스 CRM(SugarCRM, SuiteCRM)은 UX가 2010년대 수준이라 쓰기 불편합니다.

Twenty의 해법
무료 셀프호스팅 + Notion급 UX + 내 데이터

무료로 내 서버에서 돌리고, 데이터 주권 100%, 커스터마이징은 TypeScript/React 표준 웹 기술로 가능합니다. ⭐49k+ 스타로 오픈소스 CRM 중 단연 1위.

Salesforce vs Twenty 비교

항목SalesforceTwenty
가격사용자당 월 $25~300무료 (셀프호스팅)
데이터 소유권Salesforce 클라우드내 서버에 100%
커스터마이징Apex/LWC (독자 생태계)TypeScript/React
확장성AppExchange (유료)오픈소스 + API
AIEinstein (추가 비용)내장 (Claude, GPT, Mistral 등)
학습 곡선Salesforce 전용 지식 필요웹 개발자라면 바로 기여 가능

3기술 스택 전체 지도

프론트엔드 · 백엔드 · 인프라 상세

① 프론트엔드 (twenty-front)

기술버전역할
React19UI 프레임워크
Vite + SWC@vitejs/plugin-react-swc 4.3번들러 (Babel 대비 20x+ 빠름)
Apollo Client4.0GraphQL 클라이언트 + 캐시
Jotai원자적 상태관리
BlockNote + TipTap0.51 / 3.4Notion 스타일 리치텍스트 에디터
Monaco Editor0.52코드 에디터 (VS Code 엔진)
Vercel AI SDK6.0다중 LLM 프로바이더 통합
Playwright1.56E2E 테스트
Oxlint1.51Rust 기반 린터 (ESLint 대비 50~100배 빠름)

② 백엔드 (twenty-server)

기술버전역할
NestJS11모듈식 Node.js 서버 프레임워크
GraphQL Yoga4.0.5GraphQL API 레이어
TypeORM0.3.20PostgreSQL ORM
PostgreSQL16메인 DB (멀티 테넌트 스키마 격리)
ClickHouse분석 DB (집계 쿼리 특화)
Redis + BullMQ5.40캐시 + 이메일/캘린더 동기화 큐
Anthropic + OpenAI + Mistral다중 AI 프로바이더
PassportJWT, Google, MS, SAML 인증
Stripe20.4결제

③ 인프라

기술역할
Nx 22.7 + Yarn 4.0 Workspaces모노레포 빌드 시스템 (22개 패키지)
Docker + Docker Compose컨테이너화 + 셀프호스팅
GitHub ActionsCI/CD
Sentry + OpenTelemetry에러 추적 + 분산 추적

4아키텍처 심화 분석

시스템 구조도 + 4가지 핵심 설계 패턴

전체 시스템 구조도

사용자 브라우저 │ HTTPS ▼ twenty-front (React + Vite) │ GraphQL (Apollo Client) ▼ twenty-server (NestJS 11) ├── GraphQL API (Yoga/Apollo) ├── Engine (메타데이터 기반 엔진) ← 핵심 비즈니스 로직 └── Modules (19개 도메인) │ ├─── PostgreSQL 16 (메인 DB) ├─── Redis (캐시/세션/큐) ├─── ClickHouse (분석 DB) └─── 외부 서비스 - Google OAuth / MS Graph API - Stripe / AWS S3 - LLM 프로바이더 (Claude, GPT, Mistral...) Worker (BullMQ) - 이메일/캘린더 동기화 - 워크플로우 비동기 실행

핵심 설계 패턴 4가지

1. 메타데이터 기반 엔진 (Metadata-Driven Engine)

Twenty에서 가장 주목할 만한 설계입니다. CRM의 객체(Contact, Company, Deal 등)를 하드코딩하지 않고, Engine 모듈이 메타데이터를 기반으로 동적으로 객체를 생성합니다.

사용자가 "프로젝트"라는 커스텀 객체를 만들면: 1. Engine이 메타데이터 저장 → PostgreSQL 테이블 동적 생성 2. GraphQL 스키마 자동 생성 → API 엔드포인트 즉시 사용 가능 3. 프론트엔드가 메타데이터 읽어 → UI 자동 렌더링 일반적인 CRM: Contact 테이블 → Contact API → Contact UI (각각 하드코딩) 새 객체 추가 = 개발자만 가능 (코드 수정 필요) Twenty의 메타데이터 방식: 메타데이터 정의 → 테이블/API/UI 자동 생성 새 객체 추가 = 설정 화면에서 누구나 클릭
용어 설명
메타데이터 기반 엔진
데이터 모델을 코드가 아닌 메타데이터로 정의하는 패턴. 런타임에 동적으로 PostgreSQL 테이블, GraphQL 스키마, 프론트엔드 UI를 자동 생성합니다. Salesforce의 "Custom Object" 기능과 동일한 개념이지만 표준 웹 기술로 구현되었습니다.

2. 멀티 테넌트 워크스페이스 격리

각 워크스페이스(=회사)의 데이터가 PostgreSQL 스키마 분리를 활용하여 완전히 격리됩니다. 같은 DB 인스턴스에서도 워크스페이스 간 데이터 접근이 불가능합니다.

3. 이벤트 기반 워크플로우

트리거 이벤트 발생 → BullMQ 작업 큐에 등록 → Worker가 비동기 실행 예시: - "연락처 생성됨" 이벤트 → 자동으로 환영 이메일 발송 - "거래 상태 변경" 이벤트 → Slack 알림 전송

4. 다중 LLM 프로바이더 추상화

// 추상화된 AI 호출 — 프로바이더를 설정에서 교체 가능
const result = await aiService.generate({
  provider: workspace.aiProvider,  // 'anthropic' | 'openai' | 'mistral'
  model: workspace.aiModel,
  prompt: "이 연락처를 분석해줘..."
});

5디렉토리 구조 해부

22개 패키지를 담은 모노레포 해부
twentyhq/twenty/ # 루트 ├── packages/ │ ├── twenty-front/ ← 메인 프론트엔드 (React SPA) │ ├── twenty-server/ ← 메인 백엔드 (NestJS API) │ ├── twenty-ui/ ← 공유 UI 컴포넌트 라이브러리 │ ├── twenty-shared/ ← 프/백 공유 유틸리티 │ ├── twenty-emails/ ← 이메일 템플릿 (React Email) │ ├── twenty-docker/ ← Docker 설정 파일 │ ├── twenty-cli/ ← CLI 도구 │ ├── twenty-sdk/ ← JavaScript SDK │ ├── twenty-e2e-testing/ ← E2E 테스트 (Playwright) │ ├── twenty-zapier/ ← Zapier 연동 │ ├── twenty-companion/ ← 브라우저 확장 │ └── create-twenty-app/ ← 프로젝트 스캐폴딩 도구 ├── package.json ← 루트 워크스페이스 설정 ├── nx.json ← Nx 모노레포 설정 └── .github/ ← CI/CD 워크플로우 twenty-server/src/ ├── engine/ ← 핵심: 메타데이터 기반 엔진 │ ├── metadata/ ← 객체 메타데이터 관리 │ └── workspace-manager/ ├── modules/ ← 19개 도메인 모듈 │ ├── company/ person/ opportunity/ │ ├── messaging/ calendar/ workflow/ │ └── dashboard/ task/ note/ ... └── queue-worker/ ← BullMQ 워커 프로세스

6학습 포인트 (기술별)

이 레포에서 무엇을 배울 수 있는가

6-1. NestJS 실전 아키텍처

19개 도메인 모듈이 독립적으로 동작하면서도 app.module.ts에서 통합되는 모듈식 설계를 배웁니다. GraphQL 스키마 자동 생성(코드 퍼스트 방식), 커스텀 데코레이터와 가드를 활용한 인증/인가, BullMQ 작업 큐 패턴도 익힐 수 있습니다.

6-2. React + Jotai 상태관리

Jotai의 원자적(Atomic) 상태관리 — Redux보다 단순하면서 강력합니다. Apollo Client와 Jotai를 조합한 서버/클라이언트 상태 분리, 56개 모듈을 가진 대규모 React 앱의 구조 설계를 배울 수 있습니다.

전통적 상태관리(Redux): 하나의 거대한 스토어 → 보일러플레이트 많음 → 복잡 Jotai (원자적 상태): 각 상태가 독립적인 "원자(atom)" → 필요한 컴포넌트만 구독 const countAtom = atom(0) const doubledAtom = atom(get => get(countAtom) * 2) // 파생 원자

6-3. 메타데이터 기반 동적 시스템 설계

하드코딩 없이 데이터 모델을 런타임에 정의하는 패턴입니다. PostgreSQL 동적 테이블/스키마 생성, GraphQL 스키마 동적 생성, Salesforce 같은 플랫폼의 내부 동작 원리를 이해하게 됩니다.

6-4. 멀티 테넌트 아키텍처

PostgreSQL 스키마 기반 테넌트 격리, 테넌트별 마이그레이션 관리, 멀티 테넌트 환경에서의 인증 플로우를 배웁니다.

6-5. 모노레포 관리 (Nx + Yarn Workspaces)

22개 패키지를 하나의 레포에서 관리하는 방법, Nx의 빌드 캐싱과 의존성 그래프, 패키지 간 공유 코드 관리(twenty-shared, twenty-utils)를 배웁니다.

7하드웨어 / 시스템 요구사항

개발 환경 + 셀프호스팅 환경

개발 환경

항목최소권장
Node.jsv24.5.0+v24.x LTS
패키지매니저Yarn 4.0.2+Yarn 4.x
RAM8GB16GB (모노레포 빌드 시)
디스크10GB20GB
OSLinux/macOS/WSL2Linux/macOS

셀프호스팅 (Docker Compose)

항목최소권장
CPU2코어4코어+
RAM4GB8GB+
디스크20GB50GB+ (첨부파일 포함)
Docker20.10+최신

8직접 해볼 수 있는 실습 과제

난이도별 5개 구체적 실습
MISSION 01

Docker로 Twenty 띄우기 ★☆☆☆☆

Docker Compose 멀티 서비스 오케스트레이션을 체험합니다.

curl -o docker-compose.yml \
  https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/docker-compose.yml
cat > .env << 'EOF'
TAG=latest
PG_DATABASE_PASSWORD=my-secret-password
APP_SECRET=my-app-secret-change-me
SERVER_URL=http://localhost:3000
EOF
docker compose up -d
# http://localhost:3000 접속
MISSION 02

커스텀 객체 만들기 ★★☆☆☆

메타데이터 기반 동적 시스템이 실제로 어떻게 동작하는지 체감합니다. 설정 → 데이터 모델 → "새 객체 만들기"에서 "프로젝트" 객체를 생성하고, GraphQL Playground에서 해당 객체의 CRUD API가 자동 생성되었는지 확인합니다.

MISSION 03

소스코드 로컬 개발 환경 세팅 ★★★☆☆

Nx 모노레포 구조 이해 + NestJS/React 동시 개발 환경을 체험합니다.

git clone https://github.com/twentyhq/twenty.git
cd twenty
yarn install
docker run -d --name twenty-postgres -p 5432:5432 \
  -e POSTGRES_PASSWORD=postgres postgres:16
docker run -d --name twenty-redis -p 6379:6379 redis
# 환경변수 설정 후
yarn start
MISSION 04

간단한 워크플로우 만들기 ★★★☆☆

이벤트 기반 아키텍처 + BullMQ 작업 큐를 이해합니다. Twenty UI에서 워크플로우 빌더를 열고, 트리거 "연락처 생성 시" → 액션 "이메일 발송"을 연결합니다. 서버 코드에서 modules/workflow/ 디렉토리를 분석합니다.

MISSION 05

커스텀 NestJS 모듈 추가 ★★★★☆

NestJS 모듈 아키텍처 + GraphQL 코드 퍼스트 방식 실전 적용. packages/twenty-server/src/modules/에 새 모듈을 생성하고, GraphQL resolver + TypeORM entity를 정의한 후 app.module.ts에 등록합니다.

9관련 기술 심화 학습 로드맵

주차별 학습 순서
주차주제학습 내용
1주차TypeScript + NestJS 기초제네릭/데코레이터, 모듈/컨트롤러/서비스, GraphQL 코드 퍼스트, TypeORM + PostgreSQL
2주차프론트엔드 심화Apollo Client 캐시 전략, Jotai 원자/파생 원자, React Hook Form + Zod, Vite + SWC 빌드 최적화
3주차인프라 + 모노레포Docker Compose 멀티 서비스, Nx 워크스페이스 설정, BullMQ 작업 큐, OpenTelemetry + Sentry
4주차고급 주제메타데이터 기반 설계, 멀티 테넌트 아키텍처, Vercel AI SDK 다중 LLM 연동, engine/ 소스코드 분석

10핵심 키워드 사전

처음 보는 단어 한눈에 정리
키워드설명
CRMCustomer Relationship Management. 연락처, 거래, 활동 등 고객 관계를 체계적으로 관리하는 시스템
NestJSAngular에서 영감받은 모듈식 Node.js 프레임워크. 데코레이터 기반 DI(의존성 주입) 지원
GraphQLREST 대안 API 쿼리 언어. 클라이언트가 필요한 데이터만 정확히 요청 가능. Over-fetching 해결
Jotai원자(atom) 단위로 상태를 관리하는 React 상태관리 라이브러리. Redux보다 보일러플레이트 90% 감소
Apollo ClientGraphQL 클라이언트. 캐싱, 상태 관리, 실시간 구독 지원
BullMQRedis 기반 Node.js 작업 큐. 이메일 동기화 등 무거운 작업을 백그라운드에서 처리
Nx모노레포 빌드 시스템. 빌드 캐싱과 의존성 그래프로 대규모 패키지를 효율적으로 관리
멀티 테넌트하나의 인프라에서 여러 고객(테넌트)이 독립적으로 사용하는 아키텍처. 데이터 격리가 핵심
ClickHouse열 지향 분석 DB. 대량 데이터 집계 쿼리에서 PostgreSQL보다 수십 배 빠름
Vercel AI SDKOpenAI, Anthropic, Mistral 등 다중 AI 프로바이더를 동일한 인터페이스로 호출하는 라이브러리
OxlintRust로 작성된 초고속 JavaScript 린터. ESLint보다 50~100배 빠름
SWCRust로 작성된 TypeScript/JavaScript 컴파일러. Babel보다 20배+ 빠른 변환 속도
AGPL-3.0소스코드 공개 의무가 있으며, 네트워크 서비스도 해당되는 오픈소스 라이선스 (SaaS 루프홀 차단)
Code-First GraphQLGraphQL 스키마를 SDL 파일이 아닌 TypeScript 코드(데코레이터)로 정의하는 방식

11참고 링크

더 깊이 파고들 자료