Canva를 오픈소스로 구현한 Doory: 기능은 갖췄지만 기본 템플릿은 10개뿐인 이유

Canva를 오픈소스로 구현한 Doory: 기능은 갖췄지만 기본 템플릿은 10개뿐인 이유

오픈소스Canva프론트엔드비즈니스 모델

데이터 소스:HN + web research

단 한 줄의 배포 명령어만으로 디자인 공룡 플랫폼의 핵심 인터페이스를 자체 프라이빗 서버에서 구동할 수 있게 되었다. 오픈소스 프로젝트 Doory가 그래픽 에디터의 풀스택 구현체를 전격 공개했다. 레이아웃 배치, 모션 애니메이션부터 다중 사용자 실시간 협업까지 핵심 기능이 빠짐없이 포함되어 있다. 공식 호스팅 데모 버전은 회원가입 없이 링크만 열면 즉시 디자인 작업을 시작할 수 있다.

공식 기능 대조표는 놀라울 정도로 솔직하다. 수천만 개의 에셋을 자랑하는 상용 플랫폼 Canva와 달리, Doory가 설치 직후 기본 제공하는 템플릿은 단 10개에 불과하다. 개발자는 문서에 나머지 템플릿은 사용자가 직접 제작해 추가해야 한다고 명시해 두었다. 깃 저장소의 커밋 기록은 고작 6회뿐이다. Claude Opus 5.5의 보조를 받아 프로젝트는 최신 소프트웨어의 상호작용 뼈대를 단기간에 완성해 냈다.

오픈소스 기술 덕분에 디자인 소프트웨어의 기능 레이어는 누구나 무료로 가져다 쓸 수 있는 범용 부품이 되었다. 그러나 거대 상용 플랫폼이 수익을 창출하는 에셋 기반은 코드 복제만으로 결코 채워질 수 없다. 체계적으로 구축된 저작권 해결 템플릿과 상업용 폰트 라이선스는 코드가 넘볼 수 없는 확고한 비즈니스 경계선을 긋고 있다.

명령어 한 줄로 띄우는 콘텐츠 없는 빈 껍데기

자체 호스팅 배포 과정은 매우 간결하다. 사용자는 설정 파일을 복사하고 기본 환경변수 키를 입력한 뒤 docker compose up -d --build 명령어만 실행하면 배포가 완료된다. 전체 서비스는 기본적으로 호스트 머신의 8080 포트에 바인딩되며, 프론트엔드 인터페이스와 백엔드 API는 내장 컨테이너를 통해 일괄 전달된다.

단일 포트 기본 바인딩은 네트워크 구성을 단순화하지만, 프로덕션 환경에서는 리버스 프록시와 SSL/TLS 인증서를 자체적으로 구성해야 함을 뜻한다. 내부 web 컨테이너에는 nginx 프록시가 내장되어 있어 일반 REST API 요청과 실시간 협업용 WebSocket 트래픽을 백엔드 Django 5 서비스로 분기한다. 전체 구성 요소는 PostgreSQL, 선택적 Redis, 오브젝트 스토리지로 이루어져 있다. 단일 머신 컨테이너 오케스트레이션은 사내 테스트나 경량 환경에는 적합하지만, 분산 멀티노드 스케줄링 구조가 없어 대규모 동시 협업 워크로드를 즉시 감당하기는 어렵다.

처음 실행된 인스턴스는 말 그대로 빈 껍데기 상태다. 시스템 내부에 기본 탑재된 에셋이 전혀 없기 때문에 관리자가 커맨드라인에서 수동으로 데이터를 주입해야 한다. seed_gallery 명령을 실행해 기본 카테고리를 채워 넣고, sync_fonts --popular 100 명령을 실행해 인기 오픈소스 폰트 100종을 동기화해야 한다. 백여 종의 폰트로 기초적인 타이포그래피는 가능하지만, 실제 비즈니스 홍보물을 제작하려면 사용자가 고가의 상업용 폰트를 별도로 구매해 라이선스를 확보해야 한다.

Doory 에디터 인터페이스 그림: 브라우저에서 구동되는 풀기능 디자인 에디터, 우측 패널에 레이어 관리 및 타이포그래피 도구 모음이 통합되어 있다. 출처: Doory 저장소 README.

브라우저에 탑재된 모델과 협업 기술: 프레임워크에 숨겨진 비밀은 없다

Doory의 기술 스택은 최신 웹 개발 트렌드를 충실히 반영하고 있다. 프론트엔드는 React 19와 TypeScript로 개발되었다. 캔버스 렌더링 코어는 Fabric.js가 구동하며 상태 관리는 Zustand가 담당한다. Fabric.js가 객체 선택, 변환 행렬, 벡터 드로잉을 고수준으로 캡슐화해 제공하므로, 1인 개발자라도 저수준 렌더링 파이프라인을 바닥부터 구현할 필요가 없다. 성숙한 그래픽 라이브러리가 개발 진입 장벽을 대폭 낮춘 셈이다.

실시간 협업 기능은 Yjs와 Django Channels의 조합으로 구현되었다. Yjs는 충돌 없는 복제 데이터 타입(CRDT)을 활용하여 동시 편집 및 멀티플레이어 커서 동기화를 클라이언트 로컬에서 직접 처리한다. Django Channels는 WebSocket을 통해 상태 변경 사항을 중계할 뿐이므로, 서버 측에서 발생하는 복잡한 락 경쟁을 피할 수 있다. 상태 연산을 클라이언트 단으로 분산시켜 백엔드 부하는 크게 줄어들었지만, 대규모 복잡 캔버스에서는 저사양 기기의 메모리 점유율이 가파르게 상승할 수 있다.

모션 그래픽 시스템은 27종의 등장/퇴장 프리셋, 12종의 강조 효과, 16종의 화면 전환 트랜지션을 지원한다. 전용 타임라인 패널은 다중 레이어 시퀀스 배치를 지원하여 정적 포스터 디자인을 MP4, WebM, 애니메이션 GIF 형식으로 즉시 내보낼 수 있다. 풍부한 모션 기능이 도구의 활용 범위를 넓혔지만, 밀도 높은 키프레임 연산은 브라우저 메인 스레드에 지속적인 연산 부담을 준다.

이미지 배경 제거(누끼 따기) 기능에는 클라이언트 브라우저에서 직접 구동되는 머신러닝 모델이 탑재되었다. 원본 고해상도 이미지를 외부 서버로 전송하지 않고 로컬에서 추론하므로 사용자 개인정보가 보호되고 호스팅 측의 서버 연산 비용도 들지 않는다. 그러나 이러한 설계는 연산 부하를 사용자의 로컬 PC 자원으로 고스란히 전가한다.

레이어 패널과 컨텍스트 메뉴 그림: 캔버스 내 모든 요소는 개별 레이어로 관리되며, 이름 변경, 잠금, 숨김, 드래그 앤 드롭 순서 변경을 지원한다. 출처: Doory 저장소 README.

2만 5천 개의 아이콘으로도 메울 수 없는 저작권의 간극

오디오와 시각 에셋은 디자인 소프트웨어의 생명선이다. Doory에는 24개의 배경음악 루프와 88개의 효과음 파일이 내장되어 있으며, 모두 CC0 라이선스를 따른다. 저작권 분쟁이 없는 무료 음원은 간단한 시연 영상이나 프로토타입 제작에는 유용하다. 하지만 특정 감성과 톤앤매너를 전달해야 하는 상업용 브랜드 영상에서는 유료 상용 음원 라이브러리를 찾을 수밖에 없다.

기본 번들된 그래픽 리소스에는 약 25,000개의 아이콘, 이모지, 벡터 일러스트가 포함되어 있다. 2만 개가 넘는 범용 그래픽 요소는 기초적인 다이어그램이나 설명 자료 제작을 만족시킨다. 그러나 브랜드 마케팅 실무에서는 파편화된 무료 소재만으로 통일된 비주얼 언어를 구축하기 어렵다. 스톡 사진 검색 기능은 사용자가 직접 Unsplash나 Pexels의 API 키를 입력하도록 요구한다. 키 입력 방식은 프로젝트 개발자의 라이선스 및 트래픽 위험을 회피하지만, API 호출 할당량과 구매 비용은 최종 사용자에게 그대로 전가된다.

공식 문서에는 기본 제공 템플릿이 단 10개뿐이라고 명시되어 있다. 10개의 샘플은 레이아웃 엔진의 작동 방식을 검증하기에는 충분하다. 하지만 상용 플랫폼의 진짜 가치는 업종별, 스타일별, 업무 시나리오별로 체계화된 수백만 개의 템플릿 군에서 나온다. 10개의 샘플로는 결코 채울 수 없는 영역이다. 템플릿의 본질은 파일 단위로 응축된 전문 디자인 노하우와 산업 표준이다. 코드는 단기간에 복제할 수 있지만, 산업화된 콘텐츠 라이브러리는 전문 디자인 팀이 오랜 기간 축적해야만 완성된다.

템플릿 갤러리 그림: 기본 번들 템플릿은 단 10개에 불과하며, 방대하게 구축된 산업화 에셋 라이브러리는 여전히 상용 플랫폼만의 배타적 진입장벽이다. 출처: Doory 저장소 README.

투박한 디테일이 드러내는 기능 복제와 완성형 제품의 격차

기능 목록만 보면 오픈소스 프로젝트는 완벽해 보인다. 그러나 실제 세부 사용 경험을 들여다보면 다듬어지지 않은 개발 기간의 한계가 고스란히 드러난다. 특정 창 비율에서는 도형 선택 메뉴의 텍스트가 부자연스럽게 줄바꿈되어 영역을 벗어난다. 상단 내비게이션 바의 버튼 간격은 지나치게 좁고, 일부 도구 패널은 포커스를 잃어도 자동으로 닫히지 않는다. 인터랙션 예외 상황에 대한 마감이 부족해 장시간 편집 시 작업 피로도가 빠르게 누적된다.

사용자 인터페이스의 상태 피드백에도 논리적 모순이 존재한다. 캔버스 상단에 ‘저장 완료’와 ‘브라우저에 로컬 저장됨’이라는 두 개의 상반된 안내가 동시에 표시된다. 상태 표시가 일원화되지 않아 사용자는 데이터가 안전하게 보관되고 있는지 혼란을 겪게 된다. 내보내기 및 공유 진입점은 서로 다른 사이드바에 흩어져 있고, 편집 도중 수시로 나타나는 계정 등록 안내 문구도 몰입을 방해한다.

깃 저장소 커밋은 단 6회에 불과하며, 커밋 기록 곳곳에 Claude Opus 5.5와 함께 개발을 진행한 흔적이 남아 있다. 거대 언어 모델을 활용하면 소프트웨어의 기본 골격은 눈깜짝할 사이에 완성할 수 있다. 그러나 플랫폼 전반의 견고한 사용성과 마감 완성도는 숙련된 엔지니어의 지속적인 디버깅을 거쳐야만 확보된다. 게다가 이 프로젝트는 Attribution Assurance License를 채택하여 상업적 배포 시 명확한 출처 표기를 강제하고 있다. 이 조항은 무단 화이트라벨 상용화를 방지하고 무분별한 2차 배포 장벽을 높이는 역할을 한다.

오픈소스는 도구의 부품을 만들 수 있지만 생태계 자산은 살 수 없다

Doory를 둘러싼 논의는 디자인 도구의 진화 방향을 시사한다. 기능 구현 측면에서 보면 브라우저 기반 그래픽 편집기를 제작하는 데 더 이상 극복하기 어려운 기술적 장벽은 존재하지 않는다. Fabric.js가 캔버스 렌더링을 표준화했고, Yjs가 동시성 충돌을 해결했으며, React가 컴포넌트 아키텍처를 완성했다. 그래픽 편집기라는 소프트웨어 본체는 점차 오픈소스 생태계의 범용 부품으로 자리 잡아가고 있다.

하지만 상용 디자인 플랫폼의 진짜 진입장벽은 결코 소프트웨어 코드 자체에 국한된 적이 없다. Canva의 기업 가치는 창작자 생태계의 선순환 비즈니스 모델에 기반한다. 디자이너는 템플릿 판매로 수익을 얻고, 기업 고객은 라이선스가 완벽히 보장된 정품 소재와 면책 권리를 구매한다. 셀프 호스팅 프로그램은 깔끔한 편집 캔버스를 제공할 수 있지만, 전 세계적으로 얽혀 있는 상업 계약망과 법적 보증은 Docker 컨테이너에 함께 담아낼 수 없다.

AI 코딩 어시스턴트가 널리 보급됨에 따라 다양한 소프트웨어 분야에서 이와 유사한 오픈소스 레퍼런스가 계속해서 등장할 것이다. 데이터 주권을 최우선시하는 기업에게 Doory는 훌륭한 자체 호스팅 인프라 대안이다. 반면 방대한 템플릿과 검증된 소재를 즉시 활용해야 하는 일반 사용자에게는 여전히 성숙한 상용 플랫폼이 압도적인 경쟁력을 발휘한다. 오픈소스는 도구의 민주화라는 첫 단추를 채웠을 뿐이며, 생태계 자산의 축적은 이제 막 시작되었을 따름이다.

참고 링크:

  • Doory 공식 코드 저장소 및 프로젝트 설명
  • Hacker News 커뮤니티 토론
  • Doory 온라인 라이브 데모 서비스