연합우주와 함께 한 일년
2024년은 정말로 연합우주에 푹 빠져서 지낸 한 해였다. 연합우주와 ActivityPub과 관련된 크고 작은 여러 프로젝트를 진행했으며, 그 중 몇은 꽤 많은 사람들에게 좋은 반응도 받았다. 좋은 기억을 남겨두자는 의미에서 글로 써 본다.
연합우주란?
먼저 연합우주(fediverse)가 무엇인지 짧게 설명하자면, 서로 다른 종류의 소셜 미디어들이 소통할 수 있는 네트워크를 뜻한다. 즉, 서로 아예 다른 소셜 미디어 상의 두 계정이 서로 팔로도 하고 댓글도 달고 좋아요도 찍을 수 있다는 뜻이다. 기술적으로는, 서로 다른 소셜 미디어 사이의 상호운용성(interoparability)을 구현하기 위해 W3C의 기술 표준인 ActivityPub 프로토콜이 사용된다.
현재 연합우주에 동참하고 있는 대표적인 소셜 미디어들로는 Mastodon, Pixelfed, Akkoma, Misskey, WordPress 등이 있으며, 그 밖에도 일일이 열거하기 힘들 만큼 많은 프로젝트가 있다. 그들 대부분은 오픈 소스 프로젝트이기도 하다. 또한 오픈 소스는 아니지만 Meta의 Threads가 올 여름부터 조금씩 ActivityPub을 구현하여 이미 어느 정도 연합우주에 들어와 있다고 볼 수 있다.
서로 다른 소셜 미디어들이 소통하는 방식이니 만큼, 연합우주 내의 계정 주소는
사용자명 뿐만 아니라 서버 이름도 포함하게 된다. 흔히 연합우주 핸들
이라
부르는 이 주소 형식은 @username@host와 같이 마치 이메일 주소와 닮아 있다.
이를 통해 서로 다른 서버 및 플랫폼에 속한 계정이 서로 팔로하고 소통할 수 있다.
물론 나 자신도 연합우주 계정이 있으며, @hongminhee@hollo.social을 팔로하면 된다.
Fedify
Fedify는 올 해 나의 가장 큰 성취라고 할 수 있을 것이다. Fedify는 TypeScript로 작성된 ActivityPub 서버 프레임워크인데, ActivityPub 서버를 구현할 때 쓸만한 적절한 추상화 수준을 찾을 수 없어서 만들게 되었다. 맨 처음에는 바닥부터 ActivityPub 서버 앱을 만들어 보려고 몇 번인가 시도하고, 또 어느 정도 동작하는 것도 만들어 보았지만, 그 결과 코드는 마음에 썩 차지 않았다. 그래서 제대로 추상화를 하며 작성을 해 보니 결국 프레임워크 비슷한 걸 만들고 있다는 것을 깨닫고, Fedify 같은 ActivityPub 서버 프레임워크의 필요성을 절감하게 되었다.
Fedify는 총 4회의 재작성이 있었는데, 맨 처음에는 TypeScript로 작성했다가, 그 뒤에는 Python, 그리고 C#, 그리고 다시 TypeScript로 돌아오게 되었다. 언어 선택에는 여러 고려사항이 있었다. 첫째로는 ActivityPub의 데이터 교환 형식인 JSON-LD 구현이 있는 언어여야 했고, 또 JSON-LD를 쉽고 편하게 다루기 위해 어느 정도는 동적이어야 했다. 둘째로는 동적 언어라도 정적 타입을, 그러니까 소위 gradual typing을 잘 지원해야 했다. 마지막으로는 이용자가 많고 생태계가 풍부해야 했다. 왜냐하면 Fedify가 널리 쓰이길 바랐기 때문이다. 모든 것을 고려한 끝에 TypeScript를 쓰게 되었다.
모든 재작성 과정까지 포함한다면 작년 12월 초부터 착수했고, 마지막 재작성부터 따진다면 2월 말부터 만들기 시작하여 3월 초에 첫 0.1.0 버전을 릴리스했다. 릴리스하기 전에 생각했던 코드네임은 Fedikit이었지만, 릴리스하기에 앞서 검색을 해 보니 이미 같은 이름의 프로젝트가 있다는 사실을 알게 되어 급하게 Fedify로 이름을 바꾸게 되었다. Fedikit이라는 코드네임으로 작업했던 Python 버전은 GitHub에 올려두기도 했다.
Fedify는 현재 ActivityPub 서버를 만들 때 필요한 기능을 가장 폭넓게 제공하는 프레임워크라고 자부하고 있다. 연합우주는 ActivityPub만 구현하면 끝나는 게 아니라 JSON-LD, Activity Vocabulary, WebFinger, NodeInfo, HTTP Signatures, Linked Data Signatures, Object Integrity Proofs 등등 많은 사양을 다뤄야 한다. Fedify는 그 모든 것들을 망라한다. 심지어 ActivityPub의 주요 구현체라 할 수 있는 Mastodon이나 Misskey에서는 미구현된 것들도 Fedify에서는 구현된 게 많다. ActivityPub 스펙만 훑고서 ActivityPub 서버 구현이 간단하다고 착각하고 아무런 ActivityPub 프레임워크 없이 착수했다가 결국 그 복잡성에 당황하는 경우도 종종 본다. 앞으로 ActivityPub 서버를 하나쯤 만들어 볼 생각이 있는 분들께는 꼭 Fedify를 쓰길 권한다.
그리고, Fedify를 만들면서 힘쓴 다른 하나는 바로 문서화이다. 참조 문서는 물론이고, Fedify의 모든 기능을 망라하는 풍부한 매뉴얼이 존재해야 한다고 생각했다. 새 기능을 추가할 때도 매뉴얼 문서부터 작성하고 구현을 나중에 할 정도였다. 덕분에 문서의 양이 꽤나 많아져서, 이제는 영어 이외의 언어로 어떻게 번역해야 할 지가 고민이다.
끝으로, 내가 Fedify를 통해 스스로 만족할 만한 성취를 냈다고 느끼게 된 가장 큰 사건은 Ghost의 Fedify 자금 지원이다. 이를 통해 인생 처음으로 전업 오픈 소스를 할 수 있게 되었기 때문이다.1 무엇보다 Ghost는 Fedify의 가장 큰 사용자이기도 하다. Ghost의 ActivityPub 구현은 한창이며, 프라이빗 베타 단계에 있다. 아마도 내년에는 공개가 될 것으로 보인다.
Hollo
Hollo는 일인용 ActivityPub 서버이다. 보통은 Mastodon이나 Misskey 서버 중에 마음에 드는 곳에 가입하는 식으로 연합우주 계정을 만들게 되지만, 가끔 소프트웨어 엔지니어들 중에서는 직접 자신만의 도메인명에 직접 운영하는 서버를 연결하여 연합우주 계정을 마련하기도 하는데, Mastodon이나 Misskey 같은 소프트웨어는 기본적으로 많은 사람들이 계정을 만들어서 함께 사용하는 것을 전제로 설계되어 있어 혼자서 쓰기에는 필요 없는 기능도 많고 무거운데다 설치도 번거롭다. 그런 사람들을 위해 만든 게 바로 Hollo이다. Hollo는 PostgreSQL만 있으면 동작하기 때문에 설치도 비교적 간편한 편이고, 기능도 혼자 쓸 때 필요한 것들로만 갖추고 있어서 간단한 것이 장점이다.
Hollo를 만들 게 된 경위는 조금 복잡하다. 실은 Fedify를 만들게 된 계기가 바로 Hollo라고 할 수 있는데, Hollo 같은 나만의 ActivityPub 서버를 만들기 시작했다가 ActivityPub 서버 프레임워크의 필요성을 실감하게 되었기 때문이다. 다만, 그 때 처음으로 만드려고 했던 프로젝트의 코드는 Hollo에 재사용되지도 않았고 그 때의 프로젝트 이름도 Hollo가 아니었으므로, 엄밀히 말하면 Hollo가 Fedify를 만들 게 된 계기라고는 할 수 없다. 그러나 Fedify를 만들고 나면 이를 이용해 궁극적으로 만들고 싶었던 게 Hollo와 같은 것이었다는 것은 사실이다.
하지만 막상 Fedify를 만들고 나니 내가 만들고 싶은 것은 Fedify 자체가 되어버렸고, 원래의 동기는 다소 퇴색한 뒤였다. 그래서 Hollo를 정말로 만들기 시작할 때 즈음에는 Fedify의 데모를 만드는 게 Hollo의 가장 큰 목적이 되어 있었다. 실제로 Hollo를 만들면서 Fedify에 필요한 기능을 더 추가하거나 버그를 찾아서 고치기도 했다. 다만, 어디까지나 Fedify 프로젝트의 일환이었기 때문에 Hollo 자체의 코드 품질은 Fedify에 비하면 많이 떨어진다. 이 문제는 Hollo를 Fedify 프로젝트의 일환으로 보지 않게 된 시점부터 고쳐 나가기 시작했지만, 여전히 코드 품질에 있어선 개선할 부분이 아직 많다.
Hollo는 예상외로 일본에서 사용자층이 생겨서, 공식 문서를 일본어로 번역하거나, 일본에서 개최한 오픈 소스 컨퍼런스 2024 Tokyo/Fall이라는 행사에 나가 부스를 차리기도 했다. 이 때, 현지의 Hollo 사용자이신 Esurio 님께서 부스를 함께 지켜주셔서 무척 큰 도움을 받았다.
최근에는 개밥 먹기를 위해 내가 가지고 있던 Mastodon 계정을 버리고 Hollo로 이주했다.
한국 연합우주 개발자 모임
어느날 문득 한국에는 연합우주 소프트웨어를 만드는 개발자들의 교류가 없다는 생각이 들었다. 그래서 Neovim용 Mastodon 클라이언트를 만들기도 하셨던 이재열 님을 꼬셔서 함께 한국 연합우주 개발자 모임(FediDev KR)을 발족하였다. 먼저 Discord 서버를 마련하여 꽤 많은 개발자분들이 모였다.
그리고 정기적인 스프린트 모임을 기획하여, 그 첫 모임을 8월 31일에 returnzero 사무실에서 개최하였는데, 의외로 많은 사람들이 참가해 주셨다. 이 때 만난 분들과는 여전히 연합우주에서 교류하며 지내고 있다.
최근에는 연말이라 그런지 오프라인 교류가 뜸했는데, 내년이 되면 또 다시 활발한 활동을 재개할 예정이다.
첫 동인지 판매
올 가을부터 일본어권 연합우주에서 활동을 본격적으로 하기 시작했는데, 그러면서 일본의 Hollo 사용자들과 교류하게 되었다. 그 중에서 Esurio 님이 일본에서 개최하는 오픈 소스 컨퍼런스에 부스를 내 보는 게 어떻냐는 제의를 주셔서, 고민 끝에 출전(出展)하게 되었다. 일본 행사에 출전(出展)하는 것은 물론이고 부스를 차리는 것 자체가 처음이어서 Esurio 님께 여러모로 도움을 받아야 했다. 이 자리를 빌려 감사하다는 말을 꼭 드리고 싶다.
아무튼, 부스를 내기로 했으니 뭐라도 전시품이 필요했는데, 그 일환으로 Fedify의 튜토리얼인 〈나만의 연합우주 마이크로블로그 만들기〉(Creating your own federated microblog)의 일본어판인 〈自分だけのフェディバースのマイクロブログを作ろう!〉을 종이 책으로 인쇄하여 팔기로 했다. 다행스럽게도 만들어 가져 간 책은 대부분 팔려서 돌아올 때는 꽤 가볍게 올 수 있었다. 이 때 책을 사 가신 분들 중 한 분인 모나코 광고(モナコ広告) 님께서 튜토리얼을 따라해 본 과정을 FediLUG 勉強会라는 모임에서 〈Fedify로 ActivityPub 서버를 만들어 봤다〉(FedifyでActivityPubサーバを作ってみた)라는 제목으로 발표하시기도 했다.
꼭 책을 사 가지 않으신 분들과도, 부족한 일본어로나마 더듬더듬 교류할 수 있어서 좋았다.
전업 연합우주 개발
어쩌다 보니 연초에는 전혀 예상하지 못했던 방향으로 흘러,
일종의 전업 연합우주 개발자
가 된 상황인데,
내년에는 연합우주 자체의 저변을 넓히는 데에 애를 써 볼 예정이다.
그 일환으로, 소프트웨어 엔지니어들을 위한 ActivityPub 기반 소셜 플랫폼을 만들어
보고 있는데, 조만간 공개할 수 있도록 하겠다.
엄밀하게는 전에 다녔던 직장에서도 오픈 소스 제품을 전업으로 만들긴 했지만, 내가 시작한 프로젝트가 아니었다. ↩︎