Gopher: Redis를 위한 선물
10년 전 Redis가 Hacker News에 처음 발표되었다. 나는 이 날을 프로젝트의 가상 생일로 삼고 있다. 프로젝트의 첫 코드가 작성된 날보다 세상에 공개된 날이 더 중요하다고 생각하기 때문이다. (동물의 수정과 실제 출생을 생각해 보라.) Redis의 10주년을 핑계로 지난 며칠간 만지작거리던 것을 하나 공개하려 한다. 원래는 만우절 장난으로 쓰려 했지만, 그날은 아직 멀었고 지금 당장 이 프로젝트에 대해 이야기하고 싶었다… 그러니, 생일 축하해, Redis! 여기 네 선물이야. Gopher 프로토콜 구현이다.
[… 여기서 Redis는 눈물을 참으려 하지만 감정이 너무 벅차 바닥에 비트(그러니까 0과 1)가 흩어진다 …]
‘도대체 무슨 소리야?!’가 여러분의 즉각적인 반응이어야 정상이다. 2019년에 Gopher라니 좀 이상하게 들린다. 하지만 이건 *단순한* 농담은 아니다. 물론 상당 부분 농담이긴 하지만 말이다. 구현 자체는 페이지를 Redis 키로 렌더링하는 외부 도구를 제외하면 고작 100줄짜리 코드에 불과하다. 그런데… 실제로 Gopher 주변에는 여전히 활동하는 커뮤니티가 존재한다. 아주 작지만 최근 몇 년, 몇 달 사이 점점 커지고 있는 커뮤니티다. 인터넷이 더 이상 예전 같지 않다고 느끼는 사람들이 있다. 과도한 통제, 기업의 추적, 댓글과 좋아요, 리트윗이 난무해 콘텐츠가 더 이상 왕이 아닌 세상이 되었다. 뭔가 새로 쓰면 5시간 정도 인기를 끌다 사라진다. 모든 참가자가 온갖 감정과 거슬리는 단어, 신념을 자기검열하지 않는 한, 몇 분 이상 불꽃 튀지 않고 유지되는 토론은 더 이상 존재하지 않는다. 그렇게 되면 토론 자체가 무의미해질 정도다. 결국 텍스트 1KB짜리 멍청한 페이지 하나를 로드하는 데 자바스크립트 파일 50개를 로드해야 하고, 클라이언트 사이드 렌더링이 멋지다는 이유로 화면이 깜빡이는 걸 봐야 한다. 뭐 그런 식이다.
반면 Gopher는 텍스트 전용 프로토콜로, 오로지 텍스트 문서만을 전달하며 무엇을 썼는가에 모든 중점을 둔다. 하지만 그게 전부라면 그저 페티시즘에 불과하겠다. 나에게 Gopher의 결정적 매력은 그것이 UNCOOL하다는 점이다. 쿨하지 않기 때문에, 내가 아는 한 영원히 특정 부류의 사람들이 나머지로부터 분리되어 다른 방식으로 무언가를 경험하기로 선택할 수 있는 대안적 현실로 남을 것이다. BBS 시절이나 인터넷 초창기와 더 비슷한 방식 말이다. 80컬럼 고정폭 폰트로 괴짜 같은 글들을 읽으러 굳이 찾아가고 싶어 하는 사람이 대부분은 아닐 그런 곳이다.
Gopher에서는 자신의 Gopher hole을 만든다. 즉, 인터넷에서의 웹사이트처럼 Gopher 세계 안에 자신만의 공간을 만드는 셈이다. 이미 이를 위한 도구는 차고 넘쳤지만, Redis는 몇 가지 이유에서 꽤 괜찮다. Redis 키를 바꾸는 것만으로 사이트 내용을 실시간으로 바꿀 수 있어 편리하다. 리플리케이션을 이용해 사이트를 복제할 수도 있고, RDB 파일을 저장하는 것만으로 전체 Gopher hole의 정확한 복사본을 만들어 백업이나 기록 보존용으로 보관할 수도 있다.
이 Redis Gopher 아이디어는 카타니아에 있는 역사적인 해킹 실험실인 FreakNet과의 협업으로 만들어졌다. https://it.wikipedia.org/wiki/FreakNet. 이들은 팔라촐로아크레이데에 있는 레트로컴퓨팅 하드웨어 박물관 프로젝트를 비롯해 여러 흥미로운 활동을 하고 있다: https://museo.freaknet.org/en/.
어떻게 동작할까?
원리는 아주 단순하다. 나는 인라인 프로토콜을 가로챘고, 그중에서도 어차피 비정상인 두 종류의 인라인 요청을 활용했다. 빈 요청이나 “/”로 시작하는 모든 요청이 그것인데, “/”로 시작하는 Redis 명령어는 존재하지 않기 때문이다. 일반적인 RESP2/RESP3 요청은 Gopher 프로토콜 구현 경로와는 전혀 관계없이 평소처럼 처리된다. Gopher가 활성화된 Redis에 연결해 “/foo” 같은 문자열을 보내면, “/foo”라는 키가 존재할 경우 Gopher 프로토콜을 통해 서빙된다. 전체 구현은 100줄에 불과하다. 처음에는 자료구조를 활용해 Gopher 타입으로 의미론적 변환을 하려고 했지만, 그건 그냥 복잡하고 쓸모없는 일이었다.
대신 나는 Redis 위에서 Gopher를 작성할 수 있는 도구를 제공했다. 여기서 찾을 수 있다:
https://github.com/antirez/gopher2redis
Redis 인스턴스에서 실행 중인 예제 Gopher hole을 보려면 gopher://gopher.antirez.com 으로 접속하면 된다. 참고로 며칠 안에 내 Gopher hole을 만들면 그 주소가 될 예정이다. P.S. Gopher에 접속할 때는 텍스트 전용 웹/Gopher 브라우저인 Lynx를 사용하길 추천한다.
Gopher 지원은 기본적으로 비활성화되어 있다. 활성화하려면 Redis unstable 브랜치를 사용하고 “gopher-enabled” 옵션을 yes로 설정하면 된다. 단, 반드시 Redis에 비밀번호를 설정해야 한다. Gopher 프로토콜은 콘텐츠를 계속 서빙하지만, 동시에 일반 Redis 명령어에는 접근할 수 없게 된다. 이렇게 하면 (인스턴스에 Gopher 키 외에 노출할 데이터가 없다는 가정 하에) 해당 인스턴스를 진정한 Gopher 서버처럼 공개할 수 있다.
자, Gopher와 함께 즐거운 시간 보내길 바란다! 이 Gopher 프로젝트가 계속 이어지길 바란다. 현대 인터넷의 혼란 바깥에 커뮤니티를 만들어야 할 사람들이 우리 중 분명 몇은 있다고 믿는다. 물론 상호작용을 완전히 끊을 수는 없다. 예를 들어 나는 블로깅이나 인터넷 사용을 그만둘 생각은 없다. 하지만 더 느리고 더 질 높은 소통이 번성할 수 있는 장소가 필요하다.
글을 무작위로 읽기