이 엔지니어를 위한 이야기 공장 AI 기술에 인문학의 온기를

Deno를 끌어내린 것은 Node가 아니었습니다 : 런타임을 두 번 만든 사람이 런타임에서 손을 뗍니다

Deno를 끌어내린 것은 Node가 아니었습니다 : 런타임을 두 번 만든 사람이 런타임에서 손을 뗍니다

라이언 달(Ryan Dahl)은 자바스크립트 런타임을 두 번 만들었습니다. 2009년의 Node.js, 그리고 2018년에 시작한 Deno입니다. 현지시각 10월 9일, 그는 두 번째 런타임의 개발을 그만두겠다고 밝혔습니다.

발표된 내용부터 정리하는 편이 좋겠습니다. Deno 팀 전원이 클라우드플레어에 합류합니다. Deno 런타임은 앞으로 1년 동안 버그 수정과 보안 업데이트를 담은 월간 릴리스를 받고, 그 뒤로는 공식 개발이 끝납니다. 라이선스는 MIT 그대로고 코드도 열린 채 남습니다. 호스팅 서비스인 Deno Deploy는 6개월 뒤 문을 닫고, 유료 고객은 클라우드플레어 Workers로 옮기는 것을 지원받습니다. 패키지 저장소 JSR은 계속 운영되며 인프라만 클라우드플레어로 넘어갑니다. 거래 조건은 공개되지 않았어요.

클라우드플레어 사무실 입구, 샌프란시스코 101 타운센드 스트리트
클라우드플레어 사무실 입구, 샌프란시스코 101 타운센드 스트리트

Deno 팀 전원이 합류하는 회사입니다. 패키지 저장소 JSR의 인프라도 이쪽으로 넘어갑니다. 출처: Wikimedia Commons, HaeB

그런데 이번 발표에서 가장 눈여겨볼 대목은 두 회사의 공식 블로그가 아니라, 발표 당일 달이 해커뉴스 댓글에 직접 남긴 설명입니다.

"공동의 결정이고 저도 동의합니다. 제가 Deno의 성공에 가장 깊이 관여했고 가장 많은 일을 했습니다. 그런데 이제 그곳이 제가 가장 중요한 일을 할 수 있는 자리라고 생각하지 않습니다. Deno에는 좋은 아이디어들이 있고 잘 만들어졌습니다. 그렇지만 결국 큰 문제를 풀고 있지는 않습니다. Node 호환성의 중력 우물에 빨려 들어갔고, 그래서 Node와 똑같이 행동하도록 강제됩니다. 왜 Node를 다시 구현하죠? 그건 이미 잘 돌아갑니다. 조금 나은 성능이나 사용성, 보안상의 이점만으로는 충분하지 않습니다. (...)"

▸ 2018년의 후회 목록은 Deno가 전부 고쳤습니다

이 문장을 쓴 사람이 누구인지 한 번 더 짚어 두는 편이 좋겠습니다. 2018년 JSConf EU 강연 「10 Things I Regret About Node.js」에서 자기가 만든 런타임의 설계 실수를 공개적으로 열거한 사람이 바로 달입니다. 그 목록에 올라 있던 것이 패키지가 파일시스템과 네트워크에 전면 접근하는 보안 모델, node_modules, package.json, GYP 빌드 시스템 같은 것들이었어요. 그리고 Deno는 그 항목들을 하나씩 고쳤습니다. 권한을 기본 차단으로 두고, 중앙 저장소 없이 URL로 모듈을 가져오고, 타입스크립트를 그대로 실행했습니다. 그렇게 고친 항목들이 2020년 5월에 나온 Deno 1.0의 존재 이유였고요. 8년 뒤에 그것만으로는 충분하지 않았다고 적은 사람이 같은 사람입니다.

여기서 'Node 호환'이 무엇을 뜻하는지 고정하고 가는 편이 좋겠습니다. 2024년 10월에 나온 Deno 2.0은 package.json과 node_modules를 정식으로 받아들였고, npm: 지정자로 200만 개가 넘는 npm 모듈을 끌어 쓸 수 있게 했고, npm 워크스페이스까지 지원했습니다. 사용자를 모으려면 피할 수 없는 선택이었죠. 그런데 호환은 한 방향으로만 작동합니다. Node와 똑같이 행동하겠다고 약속한 순간, 2018년에 실수라고 지목했던 설계들이 이번에는 지켜야 할 명세가 됩니다. Deno를 끌어내린 것은 Node라는 경쟁자가 아니라, 그 경쟁자를 따라잡기 위해 받아들인 호환성이었습니다.

▸ "Deno가 죽었다"는 요약은 정확하지 않습니다

여러 곳에서 그렇게 줄여 적고 있는데, 공식 개발이 끝나는 것과 코드가 사라지는 것은 다른 일입니다. MIT 라이선스는 유지되고 1년 동안은 릴리스가 나오며, 달 본인도 누군가 이어서 끌고 가 준다면 좋겠다고 적었습니다. 클라우드플레어가 Deno를 접었다고 묶는 것도 정확하지 않습니다. 달이 그것이 공동의 결정이고 자신도 동의한다고 먼저 밝혔으니까요. 더 정확한 표현은, 1년 뒤에 유지보수의 주체가 공석이 된다는 것입니다. 그리고 두 발표문 어디에도 웹 프레임워크 Fresh와 Deno Subhosting의 거취는 적혀 있지 않습니다.

▸ 클라우드플레어가 데려간 것은 런타임이 아니라 모델입니다

그럼 클라우드플레어는 무엇을 보고 팀을 데려갔을까요? 두 회사의 글이 공통으로 가리키는 것은 celld입니다. Deno 팀이 올해 8월에 공개한 Rust 단일 바이너리인데요. 클라우드플레어의 Durable Objects를 남의 클라우드가 아니라 자기 인프라에서 돌릴 수 있게 만든 구현입니다. Durable Object 하나마다 자체 SQLite 데이터베이스를 두고 객체 스토리지 버킷(S3 호환 등)으로 복제하며, 노드끼리의 조정은 그 버킷에 대한 조건부 쓰기(conditional write)로만 합니다. 컨트롤 플레인도, 합의 프로토콜도, 멤버십 서비스도 없습니다. 달은 이것을 두고 파일시스템이나 네트워크를 다루는 조금 다른 API가 아니라 서버 개발의 완전히 새로운 모델이라고 설명했어요. 클라우드플레어의 켄턴 바르다는 달과 버트 벨더가 celld의 코드와 아이디어를 workerd로 되가져와, workerd 자체 호스팅을 정식 지원 경로로 만드는 일을 이끌 것이라고 적었습니다.

저는 여기서 경쟁의 단위가 바뀌었다고 봅니다. Node.js가 나온 뒤 17년 동안 서버 자바스크립트에서 겨루던 자리는 런타임이었습니다. 누가 API를 구현하고, 누가 모듈 시스템을 정하고, 누가 권한 모델을 쥐느냐. 달이 2018년에 적은 후회도 전부 런타임 층위의 후회였어요. 그런데 Deno 팀이 마지막으로 내놓은 의미 있는 엔지니어링은 자기 런타임의 개선이 아니라, 남이 설계한 프로그래밍 모델을 자기 서버에서 돌리게 만든 구현체였습니다. 바르다가 이번 글에서 오픈소스를 옹호한 논거도 같은 자리를 가리킵니다. 그는 "오픈소스로 공개하고 사람들에게 탈출구를 주는 것이 좋은 사업이더군요"라고 적었고, 쇼피파이 같은 고객은 런타임이 오픈소스가 아니었다면 애초에 계약하지 않았을 것이라고 밝혔습니다. 솔직하고 상업적으로도 입증된 논거예요. 그런데 그 탈출구를 바깥에서 독립적으로 밀고 가던 팀이 이제 안으로 들어왔습니다. 코드가 닫히는 것은 아닙니다. 다만 그 코드를 바깥에서 독립적으로 밀고 갈 사람이 당분간 비게 되는 것이죠.

당장 할 일은 비교적 분명합니다. Deno Deploy를 쓰고 계시다면 옮길 시간은 6개월이고 목적지는 Workers입니다. CI나 프로덕션에서 Deno 런타임을 돌리고 계시다면 월간 릴리스가 나오는 1년의 끝 날짜를 달력에 적어 두고, 그 뒤로 보안 패치를 누가 내줄지를 미리 정해 두는 편이 좋겠습니다. 반대로 규제나 내부 정책 때문에 자체 인프라에서 돌려야 하는 조직이라면, workerd 자체 호스팅이 정식 경로가 된다는 쪽이 이번 발표에서 얻을 실질적인 소득입니다.

이번 일이 런타임을 고르는 선택이 이제 중요하지 않다는 결론이라기보다, 무엇을 고를 때 무엇까지 따라오는지를 더 길게 봐야 한다는 쪽에 가깝긴 해요. 호환성은 당장 사용자를 데려오지만, 몇 년 뒤에 설계를 바꿀 자유를 줄입니다. 그럼에도, 우린 지금 바로 쓸 수 있는 생태계와 나중까지 바꿀 수 있는 설계 사이에서 매번 갈등하게 됩니다.


커버 이미지: 라이언 달, YUIConf 2010(캘리포니아 서니베일) — Wikimedia Commons, David Calhoun

#클라우드플레어 #Deno #Node.js #오픈소스 #개발자도구 #서버리스