Dub의 코드베이스를 스캔해 보았습니다. 단순한 링크 단축기가 아닙니다.
요약
오픈 소스 프로젝트 Dub의 코드베이스를 분석하여, 단순한 링크 단축기를 넘어선 복잡한 부정 행위 탐지 엔진과 Anthropic 모델을 활용한 AI 자동화 기능을 소개합니다.
핵심 포인트
- Prisma 모델 80개를 활용한 정교한 부정 행위 탐지 시스템 구축
- Anthropic Claude를 이용한 CSV 컬럼 자동 매핑 기능
- 자연어 기반의 AI 분석 필터링 기능 구현
- Firecrawl과 Anthropic을 결합한 맞춤형 랜딩 페이지 자동 생성
저는 매일 인기 있는 오픈 소스 저장소(repo) 하나를 스캔하며 그 이면에 무엇이 있는지 파헤치고 있습니다. CLI 스캐너가 몇 초 만에 코드베이스를 읽어내면, 저는 그 출력값을 사용하여 아키텍처(architecturally)상 실제로 어떤 일이 일어나고 있는지 조사합니다.
첫 번째 대상은 Dub입니다. YC의 지원을 받는 링크 관리 서비스로, 2만 개 이상의 스타(stars)를 보유하고 있습니다.
스캔 결과
$ npx anatomia-cli scan .
dub-monorepo web-app
...
6초가 걸렸습니다. 실타래를 풀기 시작했을 때 제가 발견한 것들은 다음과 같습니다.
Dub은 완전한 부정 행위 탐지 엔진을 갖추고 있습니다
스캔 결과 80개의 Prisma 모델이 나타났습니다. 링크 단축기 치고는 매우 많은 양입니다. 그래서 저는 이 모델들이 실제로 무엇인지 살펴보았습니다. fraud.prisma 스키마에는 14개의 @relation 참조가 있는데, 이는 전체 코드베이스에서 가장 연결이 많은 모델인 program.prisma와 공동 1위입니다.
스키마에는 6가지 유형의 부정 행위 규칙(fraud rule types)이 내장되어 있습니다:
- 고객 이메일 매칭 (Customer email matching)
- 의심스러운 이메일 도메인 탐지 (Suspicious email domain detection)
- 차단된 추천 소스 추적 (Banned referral source tracking)
- 유료 트래픽 탐지 (Paid traffic detection)
- 프로그램 간 파트너 차단 (Cross-program partner bans)
- 중복 파트너 계정 탐지 (Duplicate partner account detection)
UI 측면에서는 리뷰 시트, 심각도 표시기, 규칙 유형별 부정 행위 이벤트 테이블, 프로그램 간 요약 등 18개의 전용 부정 행위 컴포넌트(fraud components)가 있습니다. 이것은 단순히 체크박스 하나로 해결되는 기능이 아닙니다. 하나의 시스템입니다.
만약 Dub을 단순한 링크 단축기로 생각한다면 이 모든 것은 이해되지 않을 것입니다. 하지만 Dub은 추천에 대해 수수료를 지급하는 제휴/파트너 프로그램(Dub Partners)을 운영하고 있습니다. 부정 행위 계층(fraud layer)은 파트너들이 수수료 시스템을 악용하는 것을 방지하기 위해 존재합니다. "링크 단축기"에서 가장 복잡한 엔지니어링은 속임수를 쓰는 사람들을 잡아내는 것입니다.
Dub은 파트너 랜딩 페이지 생성을 위해 Anthropic을 사용합니다
스캔 결과 AI: Vercel AI가 포착되었습니다. 링크 관리 도구에서 예상치 못한 결과였습니다. 저는 임포트(imports)를 추적했습니다. 세 개의 파일이 @ai-sdk/anthropic을 사용하고 있었습니다:
-
generate-csv-mapping.ts— 링크를 대량으로 가져올(bulk-importing) 때 CSV 컬럼을 자동으로 매핑하기 위해 Claude Sonnet 4.6을 사용합니다. 스프레드시트를 업로드하면 Claude가 어떤 컬럼이 URL, 제목, 태그인지 파악합니다. -
generate-filters.ts— AI 기반 분석 필터링(analytics filtering) 기능입니다. 드롭다운 메뉴를 일일이 클릭하는 대신, 보고 싶은 내용을 설명하면 됩니다. -
generate-lander.ts— 이 부분이 흥미롭습니다. Anthropic과 Firecrawl을 사용하여 파트너의 웹사이트를 스크래핑(scrape)한 다음, 해당 파트너의 제휴 프로그램(affiliate program)을 위한 맞춤형 랜딩 페이지(landing page)를 생성합니다. 자동화된 파트너 온보딩(onboarding) 기능입니다.
이 중 그 어떤 것도 Dub의 README나 기능 목록에는 언급되어 있지 않습니다. 스캔을 통해 의존성 트리(dependency tree)에서 이를 찾아냈고, 임포트(imports)를 통해 실제 사용을 확인했습니다.
85개의 환경 변수 (environment variables)
.env.example 파일에는 85개의 변수가 있습니다. 이는 Dub을 직접 운영(self-hosting)할 때의 운영 복잡성을 나타냅니다. Stripe 키(운영, connect, app, sandbox, webhooks 등 7개의 서로 다른 Stripe 관련 변수), Redis 및 속도 제한(rate limiting)을 위한 Upstash, QStash, 벡터 검색(vector search), 그리고 워크플로(workflows). 분석을 위한 Tinybird. 이메일을 위한 Resend와 SMTP. Google 및 GitHub OAuth. Vercel API 키. 암호화 키(Encryption keys). 서명 비밀값(Signing secrets).
만약 Dub의 오픈 소스 저장소(repo)를 셀프 호스팅하기 위해 검토 중이라면, 이 환경 변수 파일이 실제 아키텍처 문서라고 볼 수 있습니다. 85개의 변수는 설정해야 할 85개의 외부 의존성(external dependencies)을 의미합니다.
공유 패키지 내 447개의 UI 컴포넌트
@dub/ui 패키지에는 447개의 .tsx 파일이 있습니다. 이것은 단순한 컴포넌트 라이브러리가 아니라, 내부적으로 구축된 완전한 디자인 시스템(design system)입니다. 참고로, shadcn/ui는 약 50개의 프리미티브(primitives)를 제공합니다. Dub은 자사 제품을 위해 그보다 약 9배 더 많은 컴포넌트를 직접 구축했습니다.
요약 (What I took away)
외부에서 본 Dub: 링크 단축기(link shortener).
스캔을 통해 본 Dub: 부정 행위 탐지(fraud detection), AI 생성 파트너 랜딩 페이지, 수수료 추적(commission tracking), 바운티 시스템(bounty systems)을 갖춘 제휴 관리 플랫폼(affiliate management platform)이며, 링크 단축기는 그 진입점(entry point)일 뿐입니다. Prisma 스키마(schema)가 그 이야기를 들려줍니다. 가장 많이 연결된 모델들은 링크에 관한 것이 아닙니다. 그것들은 프로그램, 부정 행위, 그리고 돈에 관한 것입니다.
"오픈 소스 스캔 (Scanning Open Source)" 시리즈의 첫 번째 게시물 — 하루에 하나의 저장소(repo)씩. 내일: Inbox Zero.
npx anatomia-cli scan . — GitHub
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기