Sula라는 프로젝트가 공개됐어요. Scryer Prolog로 작성된 Gemini 프로토콜 서버인데요. 먼저 오해부터 풀고 갈게요. 여기서 Gemini는 구글의 AI 모델이 아니에요! 2019년에 시작된 초미니멀 인터넷 프로토콜의 이름이에요. 그러니까 이 프로젝트는 '마이너한 프로토콜의 서버를 마이너한 언어로 구현했다'는, 어떻게 보면 취향 저격 조합인데요. 뜯어보면 요즘 개발자가 배울 게 의외로 많아서 소개해보려고 해요.
Gemini 프로토콜이 뭐냐면요
Gemini는 현대 웹에 대한 피로감에서 출발했어요. 글 하나 읽으려고 들어간 페이지가 수 메가바이트의 자바스크립트를 내려받고, 추적기가 수십 개 붙어 있고, 광고가 화면을 덮는 그 경험 말이에요. Gemini는 '웹을 처음부터 다시, 아주 작게 만들면 어떨까'라는 실험이에요. 스펙 전체가 A4 몇 장 분량밖에 안 되거든요.
동작은 이래요. 클라이언트가 TLS로 암호화된 연결을 맺고 URL 한 줄을 보내요. 그게 요청의 전부예요. 서버는 상태코드 한 줄과 본문을 돌려주고 연결을 끊어요. 본문은 gemtext라는 형식인데, 마크다운보다도 단순해요. 제목, 리스트, 인용, 링크 정도만 있고, 링크는 반드시 한 줄을 통째로 차지해야 해요. 인라인 이미지도, 자바스크립트도, 쿠키도 없고, 심지어 User-Agent도 없어요. 그러니까 사용자를 추적하는 게 기술적으로 불가능한 거죠. 90년대에 웹과 경쟁하다 사라진 Gopher의 정신적 후계자라고 보면 돼요.
Prolog로 서버를 짠다는 것
이번엔 언어 쪽 얘기예요. Prolog는 1972년에 나온 논리형 프로그래밍 언어예요. 이게 뭐냐면, '어떻게 할지' 절차를 쓰는 게 아니라 '무엇이 참인지' 사실과 규칙을 선언하면 언어가 알아서 추론해주는 방식이에요. 예를 들어 '영희는 철수의 부모다'라는 사실과 '부모의 부모는 조상이다'라는 규칙을 적어두면, '철수의 조상이 누구야?'라고 질의만 하면 답이 나와요. SQL에서 '어떻게 찾을지'가 아니라 '뭘 원하는지'만 쓰는 것과 비슷한 감각이죠. Scryer Prolog는 이 오래된 언어를 Rust로 새로 구현한 현대적인 ISO 표준 처리계고요.
그런데 왜 하필 서버를 Prolog로 짤까요? 의외로 잘 어울리는 지점이 있어요. Prolog에는 DCG(한정절 문법)라는 기능이 있는데, 문법 규칙을 거의 BNF 표기 그대로 코드로 옮기면 그게 곧 파서가 돼요. 프로토콜 스펙 문서를 받아 적듯이 요청 파서를 만들 수 있다는 거죠. Gemini처럼 스펙이 작고 명확한 프로토콜과는 그야말로 찰떡궁합이에요.
'작은 인터넷'이라는 흐름
Gemini 주변에는 smolweb, 작은 인터넷이라고 불리는 커뮤니티가 있어요. 개인들이 캡슐(Gemini판 웹사이트)을 운영하고, Rust로 짠 agate를 비롯해 온갖 언어로 만든 서버 구현이 존재하죠. 여기서 오는 교훈이 하나 있는데요. 프로토콜이 단순하면 개인이 주말에 서버를 바닥부터 짤 수 있다는 거예요. 반대로 오늘날의 HTTP/2, HTTP/3, TLS, 브라우저 엔진을 개인이 처음부터 구현하는 건 사실상 불가능하잖아요. 복잡함은 성능과 기능을 주지만, 단순함은 접근성과 다양성을 줘요. 온갖 언어로 Gemini 서버가 존재하는 것 자체가 그 증거인 셈이죠.
우리에게 주는 것
Sula를 실무에 쓸 일은 없을 거예요. 그래도 이런 프로젝트가 주는 가치는 분명해요. 네트워크 프로그래밍을 배우기에 Gemini만 한 놀이터가 없거든요. 소켓, TLS, 요청 파싱, 상태코드 설계까지 전부 손으로 만져볼 수 있는데 분량은 감당 가능한 수준이에요. '스펙 문서를 읽고 바닥부터 구현해보는' 경험은 어떤 프레임워크 튜토리얼보다 실력을 많이 늘려주고요. 겸사겸사 Prolog라는 다른 패러다임을 맛보는 것도 좋아요. 선언적으로 사고하는 훈련은 SQL이나 타입 시스템을 이해하는 데도 은근히 도움이 되거든요.
한 줄로 정리하면, Sula는 '단순한 프로토콜과 선언적인 언어가 만나면 코드가 스펙을 닮아간다'는 걸 보여주는 작고 아름다운 실험이에요. 여러분이 주말에 바닥부터 구현해보고 싶은 프로토콜이 있다면 뭔가요? IRC? Gopher? 아니면 클래식하게 HTTP/1.0?
🔗 출처: Hacker News