
Deno 팀이 Celld라는 오픈소스 프로젝트를 공개했어요. 한 줄로 소개하면 '셀프호스팅 가능한 분산 Durable Objects'인데요, Cloudflare를 써본 분이라면 이 이름이 왜 반가운지 바로 감이 올 거예요. 지금까지 Cloudflare에서만 쓸 수 있던 아주 편한 프로그래밍 모델을 내 서버에서 돌릴 수 있게 하겠다는 거거든요. Durable Objects가 뭔지부터 차근차근 풀어볼게요.
Durable Objects가 뭐냐면요
서버리스 함수는 기본적으로 무상태(stateless)예요. 요청이 오면 잠깐 실행되고 사라지고, 기억해야 할 건 전부 외부 데이터베이스에 넣어야 하죠. 대부분의 API는 이걸로 충분한데, 채팅방이나 협업 문서, 게임 세션처럼 여러 사용자가 '지금 이 순간의 상태'를 실시간으로 공유하는 기능에서는 이 모델이 갑자기 불편해져요. 매 요청마다 DB를 왕복해야 하고, 두 사람이 동시에 수정하면 충돌을 직접 풀어야 하니까요.
Durable Objects의 발상은 이래요. ID마다(예를 들면 채팅방 ID마다) 전 세계에 딱 하나만 존재하는 객체를 만들고, 그 ID로 오는 모든 요청을 같은 객체 인스턴스로 라우팅하는 거예요. 객체는 상태를 메모리에 들고 있고, 요청을 싱글스레드로 하나씩 처리해요. 그래서 락도, 트랜잭션 충돌도 고민할 필요가 없어요. '채팅방 하나 = 작은 전용 서버 하나'라고 생각하면 딱이에요. 방에 있는 모든 사람의 메시지가 같은 객체로 모이니까, 순서 보장이나 참가자 목록 관리 같은 게 그냥 평범한 자바스크립트 코드가 되는 거죠.
Celld가 새로운 점
문제는 이 편한 모델이 지금까지 사실상 Cloudflare Workers에 묶여 있었다는 거예요. 쓰려면 Cloudflare에 올려야 하고, 데이터도 코드도 그 안에 있어야 했죠. 전형적인 벤더 락인이에요. Celld는 이걸 내 인프라에서 재현해요. 여러 노드에 걸쳐 '이 ID의 객체는 반드시 하나만 존재한다'는 유일성을 보장하고, 요청을 그 객체가 살아있는 노드로 찾아 보내주는 분산 런타임인 거죠. Deno가 그동안 Deno Deploy, Deno KV, Queues처럼 클라우드의 기본 부품을 하나씩 직접 만들어온 흐름의 연장선이기도 해요. 구체적인 API와 배포 방식은 GitHub 저장소에서 확인할 수 있어요.
사실 이거, 50년 된 아이디어예요
Durable Objects가 완전히 새로운 개념은 아니에요. 1973년에 나온 액터 모델의 현대적 재포장에 가깝거든요. 액터 모델이 뭐냐면, 각자 자기 상태를 가진 작은 단위(액터)들이 메시지를 주고받으며 동작하는 방식이에요. 전화 교환기를 위해 만들어진 Erlang이 이걸로 수백만 개의 경량 프로세스를 돌렸고, JVM 진영의 Akka, 마이크로소프트의 Orleans(Halo 게임 서버를 떠받친 그 프레임워크)가 같은 계보예요. Durable Objects는 여기에 서버리스 배포 경험과 내장 스토리지를 얹은 거고요. 오픈소스 쪽에서도 Rivet, PartyKit 같은 프로젝트들이 비슷한 모델을 밀고 있어서, '상태를 가진 서버리스'가 하나의 표준 패턴으로 자리 잡아가는 흐름이 보여요. 이번에 Deno까지 합류한 셈이죠.
한국 개발자에게는요
실시간 기능을 만들 때 우리가 짜는 전형적인 스택을 떠올려보세요. WebSocket 서버 띄우고, 서버 여러 대 사이의 브로드캐스트를 위해 Redis pub/sub 붙이고, 상태는 DB에 저장하고, 스케일아웃하면 sticky session까지 고민하고... 이 복잡도를 '방 하나 = 객체 하나'라는 단순한 모델로 접을 수 있다는 게 핵심 매력이에요. 특히 셀프호스팅이 된다는 건, 데이터를 외부 클라우드에 못 두는 금융권이나 사내 인프라 요건이 있는 환경에서도 이 패턴을 검토할 수 있다는 뜻이라 의미가 커요. 물론 갓 공개된 프로젝트일 테니 프로덕션에 넣기 전에는 성숙도와 장애 시나리오를 꼼꼼히 확인해야겠죠.
정리하면, Celld는 '상태 있는 서버리스'라는 패턴이 특정 클라우드의 전유물에서 누구나 쓸 수 있는 오픈소스 부품으로 내려오는 신호예요. 여러분은 지금 실시간 상태를 어디에 두고 계세요? Redis? 서버 메모리? 이런 액터 스타일로 다시 만들어보고 싶은 기능이 있다면 뭔가요?
🔗 출처: Hacker News