@hongminhee洪 民憙 (Hong Minhee) 해커스펍 이름은 어떻게 지으셨나요? 저 나름대로 떠오른 이미지를 ChatGPT에게 만들어 달라고 부탁해보았습니다.

박준규
@curry@hackers.pub · 272 following · 132 followers
darcs hub
- hub.darcs.net/vincent
Hackage
- hackage.haskell.org/user/JoonkyuPark
@hongminhee洪 民憙 (Hong Minhee)
@curry박준규 이렇게 또 해커스펍의 특장점이 노출⋯
@hongminhee洪 民憙 (Hong Minhee)
@curry박준규 각주는 보이긴 하지만 각주의 글씨 크기라든지 링크라든지 첨자 등이 해커스펍에서는 잘 나오는데 우리인생에서는 그렇지 않습니다.
해커스펍의 콘텐츠를 해커스펍이 아닌 다른 서버 계정으로 그곳에서 부스트 하면 더 많은 연합우주 사용자에게 해커스펍 콘텐츠를 알릴 수 있지 않을까?
하스켈 패키지 검색 엔진이자 웹 서비스인 후글(Hoogle)은 서비스에 종종 문제가 생기곤 합니다. 그럴 때는 다음과 같은 대체 서비스를 이용해보세요!
한편 후글을 로컬에 설치해서 사용하는 것도 가능합니다. 잦은 서비스 문제에 질렸다면 로컬에 후글을 설치해보세요!
그리고 만약 당신이 부자라면⋯ 하스켈 재단에 기부해주세요⋯
@hongminhee洪 民憙 (Hong Minhee) 혹시 포지페드(ForgeFed)를 아시나요? 액티비티펍 확장이라고 하는데 깃(Git) 같은 것을 연합우주에서 사용할 수 있는 것 같습니다. 해커스펍의 장기 로드맵에 포지페드가 포함되면 어떨까 싶어 공유합니다.
https://forgefed.org/
@curry박준규 hey I think the author is @pere (https://micro.towards.vision/@pere) seems their instance needs to renew certs
@liaizonwakest ⁂ Thank you for letting me know.
프로그래밍 언어 하스켈 패키지 중에 연합우주와 관련 있는 것을 찾아봤더니 webfinger-client
가 있습니다. 2016년에 마지막 업로드가 되었고 너무 오래 돼서 빌드도 안 되는 상태입니다. LLM 도움을 받아 빌드 가능하게 패치하고 메인테이너에게 연락을 해봤습니다. 답장은 아직 없고 사실 메일을 보낸 지 24시간이 지나지도 않았지만 왠지 연락이 오지 않을 것만 같습니다. 급한 마음에(왜 급한지 모르겠지만) 하스켈 포럼에 패키지를 인수하고 싶다고 글을 남겼습니다. 좋은 소식이 오길 기대해봅니다.
https://discourse.haskell.org/t/taking-over-the-webfinger-client-package-maintenance/11628
https://news.hada.io/topic?id=19738 를 읽고 최근 생성형AI 활용 관련한 짧은 감상.
- 매우 개인적인 의견이며 날 것의 생각입니다.
- 샘플이 적어 편향성이 있을 수 있습니다.
- 이미 철 지난 생각도 포함되어 있습니다.
- 레퍼런스는 없습니다.
- 생성형 AI를 기대하는 사람들 중 상당수는 이를 적극적으로 의존하려는 경향이 있어 보임.
- 생성형 AI에 대한 기대 심리가 너무 커짐. 단순한 도구가 아니라 은탄환처럼 만능 해결책이 되기를 바라는 경우가 많음.
- 생성형 AI 기반 소프트웨어의 출시 속도가 기존 소프트웨어보다 훨씬 빠르게 느껴짐. 대학원 시절 자주 하던 농담이 떠오름. "딥러닝 관련 아이디어가 있으면 2주 내로 논문을 쓰지 않으면 누군가가 먼저 쓴다." 이제는 AI Agent 기반 도구 덕분에 AI 관련 SW에도 같은 법칙이 적용되는 듯함. 예를 들어, 지난주 MANUS 코드가 공개되었으니 2주 내로 유사한 AI Agent SW가 쏟아질 가능성이 큼.
- 이러한 빠른 변화 속에서 생성형 AI 사용과 관련한 윤리 및 에티켓에 대한 집단 논의는 아직 시작조차 되지 못한 듯함. 그래도 개발팀 내부에서는 관련 논의가 점차 이루어지는 것 같음. 개인적으로는 생성형 AI를 페어 프로그래밍 개념으로 접근하는 것이 적절하지 않을까 생각했지만, MANUS의 동작 방식을 보고 생각이 바뀌려 하고 있음.
- 생성형 AI의 활용 범위는 이미 빠르게 확장되고 있음. 기존에 사용되는 작업이 문서 작성, 요약, 검색 정도였다면 이제는 다양한 메이저 창작 분야로 확대되는 중. 적용이 빠른 이유는 결국 속도와 비용 때문이라고 생각함. 다만, 기계가 만든 참기름 바른 듯한 미끄러운 결과물에 대한 반발감은 여전히 존재하며, 이를 줄이기 위해 생성형 AI 결과물에 전문가의 수정과 품질 검수(QC)가 결합되고 있음.
- 여전히 생성형 AI 및 LLM을 사용하지 않거나 거부하는 사람들도 많음. 이들에게 자연스러운 사용 경험을 제공할 방법을 고민해야 할 듯함. 생성형 AI는 한 번 익숙해지면 벗어나기 어려운 락인 효과가 크다고 생각함.
- 항상 생성형 AI에 뇌를 의탁해서는 안 된다고 생각함. 지금 이 글도 먼저 초안을 작성한 후 ChatGPT에 교정을 부탁한 것임. 검수를 거치기는 하지만, 이러한 과정이 나의 사고 능력을 점차 약화시키는 것은 아닐지 고민해야 함. 그래서 hackers.pub에 뭐라도 계속 남기고자 함.
연합우주에서 부스트(공유하기)의 구체적인 효과는 무엇인가요?
궁금해 하실 분들이 계실지 모르겠지만, Hackers' Pub은 아래의 기술로 만들어지고 있습니다.
- 백엔드 JavaScript 런타임으로 Deno (Node.js를 안 씁니다)
- 데이터베이스로 PostgreSQL
- 웹 프레임워크로 Fresh 2.0[1]
- ORM으로 Drizzle ORM
- 캐시 저장소로 Redis
- ActivityPub 연합을 위해 Fedify
- 로깅 라이브러리로 LogTape
- 웹 프런트엔드 프레임워크로 Preact
- 스타일링에 Tailwind CSS
- 국제화에 i18next
2025년 3월 현재 Fresh 2.0은 정식 버전이 릴리스되지 않은 상태인데, 무시하고 불안정 버전을 그대로 쓰고 있습니다. Fresh 1.0 → 2.0에서 많은 게 바뀌기 때문에 굳이 Fresh 1.0을 쓰고 싶지 않았습니다. ↩︎
@hongminhee洪 民憙 (Hong Minhee) 마크다운으로 각주는 어떻게 쓰나요?
내 당근 첫화면은 항상 책 판매 글이 반 이상이다. 뭐 살거 없나 하고 매번 기웃기웃 하긴 하는데 영 불편하단 말이지. 책 전용 당근을 만들면 쓰는 사람이 있으려나?
@smartbosslee이현석 안녕하세요. 저도 책을 좋아하고 책 관련 서비스도 좋아합니다. 책 전용 당근이 나오면 일단 저는 씁니다! 말 나온 김에 제가 알고 있는 책 관련 서비스 적어 봅니다.
페디버스 흥미롭네. 치킨 페디버스를 만들면 쓸 사람이 있을까?
@smartbosslee이현석 안녕하세요! 치킨 페디버스가 뭔가요? 모두들 모여서 치킨 이야기를 하는 공간이려나요?
노트 작성 폼을 개선했습니다. 이제 줄바꿈을 많이 하면 노트 입력창의 높이가 알아서 길어집니다. 그리고 댓글 달 때 원(原) 노트 내에 멘션된 계정들을 기본적으로 함께 멘션하도록 했습니다. 마지막으로, 자기 자신의 노트에 댓글을 달 때는 자기 자신에 대한 멘션이 포함되지 않게 했습니다.
노트 작성 폼을 개선했습니다. 이제 줄바꿈을 많이 하면 노트 입력창의 높이가 알아서 길어집니다. 그리고 댓글 달 때 원(原) 노트 내에 멘션된 계정들을 기본적으로 함께 멘션하도록 했습니다. 마지막으로, 자기 자신의 노트에 댓글을 달 때는 자기 자신에 대한 멘션이 포함되지 않게 했습니다.
눈에 띄는 변경은 아니지만, Hackers' Pub 이외 서버의 계정을 멘션하는 링크를 누르면 Hackers' Pub 안에서 해당 계정을 보여주도록 했습니다.
@curry박준규 저도 그렇습니다… 제 메인 계정은
@hongminhee洪 民憙 (Hong Minhee) 쪽인데, 이쪽은 Hollo라는 제가 만든 ActivityPub 소프트웨어의 개밥먹기를 위해 써야 하고, 댓글 달고 있는 이 계정은 Hackers' Pub의 개밥먹기를 위해 써야 해서요… 개인적으로는 Hackers' Pub 계정을 좀 더 메인으로 사용해 주시길 기대하고 있습니다. 😄
@hongminhee洪 民憙 (Hong Minhee) 저도 하스켈 이야기 떠들기 좋아하는 제 정체성(?)과 해커스펍이 맞아서 애용하려고 합니다. 다만 아직 ‘좋아요’ 같은 기능이 없어서 해커스펍은 쓰기 전용으로, 우리인생은 읽기 전용(및 ‘좋아요’ 전용)으로 쓰려고 합니다.
웹핑거(WebFinger)는 사용자 정보뿐만 아니라 저작권이나 언어 정보도 다루는군요! https://www.rfc-editor.org/rfc/rfc7033.html
Hackers' Pub 쓰고 계신 분들 중에서, 자신의 Hackers' Pub 계정을 연합우주(fediverse)뿐만 아니라 Bluesky에도 노출하고 그쪽 사람들과 교류하고 싶으신 분이 있다면, 상단 검색창에 @bsky.brid.gy@bsky.brid.gy
을 검색하셔서 나오는 프로필을 팔로해 보세요. 그리고 1분 정도 뒤에 Bluesky에서 본인ID.hackers.pub.ap.brid.gy
로 검색하면 본인의 Hackers' Pub 계정이 Bluesky에서도 보이는 걸 확인하실 수 있을 겁니다.
트위터와 스레드의 개인 프로필에 hackers.pub/@arkjunJuntai Park 링크를 추가했습니다.
hackers.pub 조용히 홍보중(?) 😂 (팔로워가 적어서 별 도움은 안되지만..😊)
다음과 같은 블루스카이 브릿지(?)는 어떻게 연동하는 건가요? 블루스카이의 모든 계정을 다음과 같이 연합우주에서 팔로우 할 수 있는 게 아니고 블루스카이 사용자가 특별히 뭔가 조치를 해야 하나요?
NJZ(舊 NewJeans)가 말아주는 〈I FEEL COKE〉. 이 曲의 原曲은 元來 80年代 日本의 Coca-Cola 廣告에 처음 쓰였고, 그 뒤에 韓國의 Coca-Cola 廣告에서도 90年代 初에 歌詞만 飜案하여 再使用되었다. 어떻게 이렇게 昭和 末期의 느낌을 살리면서도 現代的으로 解釋해낼 수 있는지… 참으로 卓越하다.
@arkjunJuntai Park 이번 기회에 Nix를 써보시는 건 어떨까요?
@arkjunJuntai Park 정말로 누워있다 왔습니다… 😂
박준규 replied to the below article:
우분투에서 snap 으로 docker 를 설치했다가 후회한 얘기

Juntai Park @arkjun@hackers.pub
우분투에서 snap으로 설치한 Docker가 OpenTelemetry(OTel) 스키마 버전 충돌로 인해 갑자기 작동을 멈춘 문제에 대한 경험을 공유합니다. Docker 데몬이 실행되지 않고 모든 컨테이너가 사라지는 상황이 발생했으며, ChatGPT를 통해 snap 자동 업데이트 중 OTel 설정이 손상되어 스키마 버전 불일치(1.21.0 vs. 1.26.0)가 원인임을 확인했습니다. snap 대신 apt를 이용한 Docker 설치가 더 안정적이라는 판단하에, snap Docker를 제거하고 apt를 통해 Docker를 재설치하는 과정을 상세히 설명합니다. 이 경험을 통해 테스트 서버의 중요성을 깨닫고, 모니터링, 빌드, 도커 설정 등 백업의 필요성을 강조합니다.
Read more →@arkjunJuntai Park 이번 기회에 Nix를 써보시는 건 어떨까요?
Hackers' Pub currently supports three languages: English, Japanese, and Korean. Do you speak any other language? Please contribute!
@curry박준규 특정 사용자가 쓴 게시물 말고 모든 사람이 쓴 게시물 말씀이시죠?
@hongminhee洪 民憙 (Hong Minhee) 네, 맞아요. 특정 사용자가 쓴 것은 해당 사용자 페이지(?)에 가면 모아서 볼 수 있더라고요.
@hongminhee洪 民憙 (Hong Minhee) 해커스펍에서 노트말고 모든 게시물을 따로 모아서 보려면 어떻게 해야 하나요? 만약 아직 없다면 다음과 같은 방법이 있을 것 같습니다.
- 검색할 때 키워드를 제공한다.(타입이 게시물인 것이라든지)
- 타임라인에 노트뿐만 아니라 게시물도 따로 노출한다.
해커스펍! 흥한다!
@hongminhee洪 民憙 (Hong Minhee) 해커스펍의 타임라인은 어떻게 결정되나요? 특별히 해커스펍 안에서 다른 분을 팔로우 하는 기능은 없는 것 같아서요.
@curry박준규 다시 보니 팔로잉 기능은 있네요. 그런데 타임라인에 인스턴스가 해커스펍이 아닌 분들의 글은 어떻게 노출이 되는 것인지 잘 모르겠습니다.(연합우주가 아직 익숙치 않아서 그런 것 같네요.)
“여우야, 재미있는 농담 해줘”
“Hackers’ Pub에 해커 세 명이 들어가는데..”
@smartbosslee이현석 네, 맞습니다! 이른바 연합우주(fediverse)라고 하는 건데, 그 안에 Hackers' Pub도 있고 Mastodon도 있고 Meta의 Threads도 있고… 그렇습니다. 그들 사이에 서로 팔로도 되고 댓글도 달리고… 상호작용이 가능해요. 자세한 것은 제가 쓴 연합우주(fediverse)와 ActivityPub 프로토콜 이해하기: 개발자를 위한 가이드를 한 번 읽어보시기 바랍니다!
@hongminhee洪 民憙 (Hong Minhee) 해커스펍의 타임라인은 어떻게 결정되나요? 특별히 해커스펍 안에서 다른 분을 팔로우 하는 기능은 없는 것 같아서요.
Hackers' Pub의 상단 네비게이션 디자인을 바꿨습니다. 글쓰기 버튼이 최상위로 나오게 되었어요.
@curry박준규 용도상으로는 말씀하신 것처럼 노트는 X처럼 짧은 글을 공유하라고 만든 기능이고, 게시물은 velog처럼 긴 글을 공유하라고 만든 기능입니다. 읽을 때 UI도 좀 달라요. 각 용도에 좀 더 최적화된 UI입니다. 그리고 게시물은 기억하기 쉬운 퍼머링크(고유 URL)를 가진다는 차이도 있고요. 그렇지만 노트에 긴 글을 써도 되고 게시물로 짧은 글을 써도 되긴 합니다.
@hongminhee洪 民憙 (Hong Minhee) 노트를 쓰는 방법은 알겠는데 게시물은 어떻게 쓰는 건가요? 저는 노트를 특정 길이 이상 쓰면 게시물이 된다고 생각했는데 설명해주신 것을 보니 그건 아닌 것 같네요.
@curry박준규 그러게요. ActivityPub 구현을 Haskell로 해 본다거나…?
@hongminhee洪 民憙 (Hong Minhee) 2018년에 해키지에 업로드된 activitypub이라는 패키지가 있긴 합니다. 사실 activitypub을 바로 도전하기는 무서워서(?) webfinger 같은 걸 먼저 작게 구현하면 어떨까 생각만 해봤습니다.
해커스펍에서 노트와 게시물은 어떻게 다른가요? 작성한 글의 길이에 따라 구분되는 걸까요?
박준규 replied to the below article:
연합우주(fediverse)와 ActivityPub 프로토콜 이해하기: 개발자를 위한 가이드

洪 民憙 (Hong Minhee) @hongminhee@hackers.pub
연합우주란 무엇일까?
X(구 Twitter)나 Instagram 같은 중앙화된 소셜 미디어에 지치셨나요? 데이터 프라이버시, 알고리즘 추천, 그리고 끊임없는 광고가 걱정되시나요? 여기 대안이 있습니다. 바로 연합우주(fediverse)입니다.
페디버스(fediverse)는 “federated”(연합된)와 “universe”(우주)를 합친 말로, 한국어권에서는 주로 “연합우주”라고 불립니다. 연합우주는 하나의 거대한 플랫폼이 아닌, 서로 대화할 수 있는 독립적인 서버(인스턴스)들의 네트워크입니다.
이게 어떻게 가능할까요? 바로 ActivityPub이라는 프로토콜 덕분입니다. 이 프로토콜은 서로 다른 소셜 미디어 플랫폼이 정보를 교환할 수 있게 해주는 공통 언어 같은 것입니다.
연합우주는 어떻게 작동하나요?
연합우주를 이해하는 가장 쉬운 방법은 이메일 시스템과 비교하는 것입니다.
Gmail 사용자가 네이버 메일 사용자에게 이메일을 보낼 수 있는 것처럼, Mastodon 사용자는 Misskey나 PeerTube 사용자와 소통할 수 있습니다. (Mastodon, Misskey, PeerTube가 무엇인지는 아래에서 설명하겠습니다. Gmail과 네이버처럼 서로 다른 서비스라고 보시면 됩니다.) 이것이 가능한 이유는 이 서비스들이 모두 같은 언어인 ActivityPub 프로토콜로 대화하기 때문입니다.
연합우주에서 사용자 ID는 @사용자명@인스턴스.도메인
형식으로 되어 있습니다. 이메일 주소와 매우 비슷하죠? 예를 들면:
@honggildong@mastodon.social
: mastodon.social 인스턴스 사용자@kimcheolsu@pixelfed.social
: pixelfed.social 인스턴스 사용자@leeyeonghui@misskey.io
: misskey.io 인스턴스 사용자
연합우주의 다양한 플랫폼 둘러보기
연합우주는 마치 여러 행성으로 이루어진 태양계 같습니다. 각 행성(플랫폼)은 고유한 특성을 가지고 있지만, 모두 같은 우주(연합우주)에 속해 있죠. 아래 표에서 주요 플랫폼들을 살펴봅시다:
플랫폼 | 설명 | 주요 인스턴스 | 특징 |
---|---|---|---|
Mastodon | X(구 Twitter)와 유사한 마이크로블로깅 플랫폼 | • mastodon.social (공식 인스턴스) • 우리.인생 (한국 중심) |
500자 제한의 짧은 게시물, 해시태그, 컨텐츠 경고 기능 |
Misskey | 일본에서 개발된 고도로 커스터마이징 가능한 마이크로블로깅 플랫폼 | • misskey.io (가장 인기 있는 일본 인스턴스) • 스텔라 (한국 중심) |
리액션, 게임, 채팅 등 다양한 기능, 높은 커스터마이징 가능성 |
Pixelfed | Instagram과 유사한 이미지 공유 플랫폼 | • pixelfed.social (공식 인스턴스) • 추억:사진 (한국 중심) |
스토리, 필터, 발견 기능 |
PeerTube | YouTube와 유사한 비디오 호스팅 플랫폼 | • PeerTube.TV | P2P 기술로 비디오 스트리밍, 채널, 재생목록 |
WriteFreely | 미니멀한 블로그 플랫폼 | • write.as | Markdown 지원, 심플한 디자인 |
Lemmy | Reddit과 유사한 링크 애그리게이터 및 토론 플랫폼 | • lemmy.ml • YuruLemmy (한국 중심) |
커뮤니티(서브레딧과 유사), 투표, 토론 |
플랫폼 vs 인스턴스: 무슨 차이가 있을까?
연합우주를 이해할 때 흔히 혼동되는 개념이 있습니다. 바로 플랫폼(소프트웨어)과 인스턴스(서버)의 차이인데요.
플랫폼은 Mastodon, Misskey, Pixelfed와 같은 소프트웨어 자체를 의미합니다. 이들은 오픈 소스 소프트웨어로, 누구나 다운로드받아 설치할 수 있습니다.
인스턴스는 그 소프트웨어를 실행하는 개별 서버를 말합니다. mastodon.social과 우리.인생은 모두 Mastodon 플랫폼을 실행하는 별도의 인스턴스입니다.
Meta의 Threads 같은 일부 서비스는 플랫폼과 인스턴스가 동일합니다. 하지만 대부분의 연합우주 서비스는 여러 인스턴스로 구성되어 있습니다.
연합우주의 매력 포인트
연합우주가 갖는 몇 가지 매력적인 특징이 있습니다:
- 탈중앙화: 특정 기업이 모든 데이터와 규칙을 통제하지 않습니다. 각 인스턴스는 자체 규칙을 가질 수 있습니다.
- 데이터 주권: 자신의 데이터에 대한 더 많은 통제권을 가질 수 있습니다.
- 검열 저항성: 한 인스턴스가 차단되더라도 다른 인스턴스로 쉽게 이동할 수 있습니다.
- 커뮤니티 중심: 각 인스턴스는 특정 관심사나 지역 커뮤니티를 중심으로 형성됩니다.
- 다양성: 다양한 플랫폼과 인스턴스가 존재하여 선택의 폭이 넓습니다.
연합우주 시작하기
연합우주에 참여하는 것은 생각보다 쉽습니다:
- 자신의 관심사나 지역과 관련된 인스턴스를 선택합니다.
- 해당 인스턴스에 계정을 만듭니다.
- 다른 인스턴스의 사용자들을 팔로우하고 소통을 시작합니다!
한국 사용자라면 Mastodon 인스턴스인 우리.인생, Misskey 인스턴스인 스텔라 같은 한국어 중심 인스턴스를 추천합니다. 한국어 환경을 지원하고 한국 사용자들이 활발하게 활동하고 있어 시작하기 좋습니다.
아니면 이 글이 올라온 Hackers' Pub도 괜찮습니다. 소프트웨어 엔지니어들을 위한 소셜 미디어랍니다. 아직 개발중이라 공개적으로 가입을 받고 있지는 않습니다만, 홍민희에게 연락 주시면 계정을 생성해 드릴 수 있습니다.
ActivityPub: 연합우주의 심장
이제 개발자 관점에서 ActivityPub이 어떻게 작동하는지 자세히 살펴보겠습니다.
ActivityPub은 W3C에서 권장하는 표준 프로토콜로, 분산 소셜 네트워킹의 기반이 됩니다. ActivityStreams 2.0 데이터 형식을 기반으로 하며, 서로 다른 서버 간에 정보를 교환하는 방법을 정의합니다.
ActivityPub의 핵심 개념
ActivityPub은 몇 가지 핵심 개념으로 구성됩니다:
- 액터(actor): 사용자, 그룹 등 행동을 수행할 수 있는 주체입니다. 각 액터는 고유한 URL을 가지며, 수신함(inbox)과 발신함(outbox)을 가집니다.
- 액티비티(activity): 액터가 수행하는 행동으로, 게시물 작성, 댓글 좋아요, 다른 사용자 팔로우 등이 있습니다.
- 객체(object): 텍스트 게시물, 이미지, 비디오와 같이 생성되고 공유되는 콘텐츠입니다.
실제 작동 방식
홍길동(@honggildong@mastodon.social
)이 게시물을 작성하고, 이영희(@leeyeonghui@misskey.io
)가 이에 반응하는 과정을 살펴봅시다:
-
게시물 작성: 홍길동이 Mastodon에서 게시물을 작성합니다. Mastodon 서버는 이 게시물을 ActivityStreams 2.0 형식의
Create(Note)
액티비티로 변환합니다. 이 액티비티는 홍길동의 팔로워(이영희 포함)에게 전달됩니다. -
게시물 수신: 이영희의 Misskey 서버는 이 액티비티를 받고 처리하여 이영희의 타임라인에 홍길동의 게시물을 표시합니다.
-
상호작용: 이영희가 게시물에 좋아요를 누르면, Misskey 서버는
Like(Note)
액티비티를 생성하여 홍길동의 Mastodon 서버로 보냅니다. 홍길동은 이영희가 자신의 게시물을 좋아했다는 알림을 받게 됩니다.
마치 다른 언어를 사용하는 사람들이 통역사를 통해 대화하는 것과 비슷하죠? ActivityPub이 바로 그 통역사 역할을 합니다.
ActivityPub의 실제 메시지 들여다보기
개발자로서 실제 ActivityPub 메시지가 어떻게 생겼는지 궁금하실 텐데요. 몇 가지 예시를 살펴봅시다:
1. 사용자 프로필(액터) 정보
{
"@context": [
"https://www.w3.org/ns/activitystreams",
"https://w3id.org/security/v1"
],
"id": "https://mastodon.social/users/honggildong",
"type": "Person",
"preferredUsername": "honggildong",
"name": "홍길동",
"summary": "연합우주의 개척자",
"inbox": "https://mastodon.social/users/honggildong/inbox",
"outbox": "https://mastodon.social/users/honggildong/outbox",
"followers": "https://mastodon.social/users/honggildong/followers",
"following": "https://mastodon.social/users/honggildong/following",
"publicKey": {
"id": "https://mastodon.social/users/honggildong#main-key",
"owner": "https://mastodon.social/users/honggildong",
"publicKeyPem": "-----BEGIN PUBLIC KEY-----\n...\n-----END PUBLIC KEY-----"
},
"icon": {
"type": "Image",
"mediaType": "image/jpeg",
"url": "https://mastodon.social/system/accounts/avatars/000/000/001/original/avatar.jpg"
}
}
이 JSON 데이터는 홍길동의 프로필 정보를 담고 있습니다. 사용자 이름, 소개, 프로필 사진 URL, 그리고 중요한 inbox
와 outbox
URL이 포함되어 있죠.
2. 게시물 작성 액티비티
{
"@context": "https://www.w3.org/ns/activitystreams",
"id": "https://mastodon.social/users/honggildong/statuses/123456/activity",
"type": "Create",
"actor": "https://mastodon.social/users/honggildong",
"published": "2025-02-21T14:30:00Z",
"to": [
"https://www.w3.org/ns/activitystreams#Public"
],
"cc": [
"https://mastodon.social/users/honggildong/followers"
],
"object": {
"id": "https://mastodon.social/users/honggildong/statuses/123456",
"type": "Note",
"content": "<p>연합우주에 오신 것을 환영합니다! #fediverse #연합우주</p>",
"published": "2025-02-21T14:30:00Z",
"attributedTo": "https://mastodon.social/users/honggildong",
"to": [
"https://www.w3.org/ns/activitystreams#Public"
],
"cc": [
"https://mastodon.social/users/honggildong/followers"
],
"tag": [
{
"type": "Hashtag",
"href": "https://mastodon.social/tags/fediverse",
"name": "#fediverse"
},
{
"type": "Hashtag",
"href": "https://mastodon.social/tags/연합우주",
"name": "#연합우주"
}
]
}
}
이것은 홍길동이 게시물을 작성했을 때 생성되는 Create(Note)
액티비티입니다. 게시물 내용, 해시태그, 공개 범위 등이 포함되어 있습니다.
3. 팔로우 액티비티
{
"@context": "https://www.w3.org/ns/activitystreams",
"id": "https://misskey.io/users/leeyeonghui/follow/1234",
"type": "Follow",
"actor": "https://misskey.io/users/leeyeonghui",
"object": "https://mastodon.social/users/honggildong"
}
이영희가 홍길동을 팔로우할 때 생성되는 Follow
액티비티입니다. 단순하죠?
ActivityPub 서버 구현하기: 개발자를 위한 팁
직접 ActivityPub 서버를 구현하고 싶다면 다음 단계를 따라야 합니다:
- 액터 구현: 사용자 프로필 정보를 ActivityStreams 형식으로 제공합니다.
- 수신함과 발신함 설정: HTTP 엔드포인트를 만들어 액티비티를 받고 전송합니다.
- 서명 및 인증: HTTP Signatures를 사용하여 요청을 서명하고 검증합니다.
- 액티비티 처리: 다양한 액티비티 유형(
Create
,Follow
,Like
등)을 처리하는 로직을 구현합니다. - 데이터 저장: 사용자, 게시물, 액티비티 등의 정보를 데이터베이스에 저장합니다.
- 연합 정책 구현: 어떤 인스턴스와 연합할지, 어떤 컨텐츠를 허용할지 등을 설정합니다.
개발을 시작하기 전에 Mastodon, Misskey 같은 기존 구현체의 코드를 살펴보는 것이 도움이 됩니다. 처음부터 모든 것을 구현하는 것보다 Fedify 같은 프레임워크를 활용하는 것도 좋은 방법입니다.
WebFinger: 사용자를 찾는 방법
연합우주에서 @leeyeonghui@misskey.io
같은 사용자 ID를 어떻게 실제 ActivityPub 액터 URL로 변환할까요? 그 비밀은 WebFinger 프로토콜에 있습니다:
GET https://misskey.io/.well-known/webfinger?resource=acct:leeyeonghui@misskey.io
이 요청을 보내면 서버는 다음과 같은 응답을 반환합니다:
{
"subject": "acct:leeyeonghui@misskey.io",
"links": [
{
"rel": "self",
"type": "application/activity+json",
"href": "https://misskey.io/users/leeyeonghui"
}
]
}
이제 https://misskey.io/users/leeyeonghui
URL을 통해 사용자의 전체 프로필 정보를 얻을 수 있습니다. 마치 전화번호부에서 이름으로 전화번호를 찾는 것과 비슷하죠!
연합우주의 도전 과제와 미래
연합우주는 계속 성장하고 있지만, 몇 가지 도전 과제도 있습니다:
- 확장성: 수많은 서버 간의 통신을 효율적으로 처리하는 것은 쉽지 않습니다.
- 모더레이션: 각 인스턴스가 자체 규칙을 가지므로 콘텐츠 조정에 일관성이 부족할 수 있습니다.
- 발견성: 중앙화된 플랫폼에 비해 새로운 사용자나 콘텐츠를 찾기 어려울 수 있습니다.
- 사용자 경험: 일부 플랫폼은 아직 UI/UX 측면에서 개선이 필요합니다.
그러나 Threads와 같은 주요 서비스들이 ActivityPub을 채택하기 시작하면서, 연합우주의 미래는 밝아 보입니다. 개발자로서, 이런 성장하는 생태계에 참여할 수 있는 기회가 많이 있습니다.
마무리
연합우주와 ActivityPub은 중앙화된 소셜 미디어의 대안으로서 점점 더 주목받고 있습니다. 사용자에게 더 많은 통제권을 부여하고, 다양하고 풍부한 온라인 경험을 제공하는 연합우주의 세계는 계속해서 확장되고 있습니다.
개발자로서, 여러분은 이 새로운 탈중앙화된 웹의 생태계에 기여할 수 있습니다. 기존 애플리케이션에 ActivityPub 지원을 추가하거나, 완전히 새로운 서비스를 만들거나, 현재의 도전 과제를 해결하는 솔루션을 개발할 수 있습니다.
한국 개발자들의 참여가 늘어나면 한국 사용자들을 위한 더 다양하고 풍부한 서비스가 생길 것이고, 이는 더 건강하고 다양한 인터넷 문화를 만드는 데 기여할 것입니다.
그럼, 연합우주로의 여행을 시작해 보시는 건 어떨까요?
@hongminhee洪 民憙 (Hong Minhee) 좋은 글을 써주셔서 감사합니다!
@curry박준규 반갑습니다! 어서오세요〜!
@hongminhee洪 民憙 (Hong Minhee) 감사합니다! 해커스펍에서는 다른 사람의 글에 ‘좋아요’를 누를 수 있나요? ‘조용히 공개’는 뭔가요?
저도 뭔가 연합우주 생태계에 코드로(이왕이면 하스켈로) 기여하고 싶은데 무엇을 하면 좋을까요?
해커스펍 가입 기념으로 하스켈 코드 하나 적습니다!
main = putStrLn "Hello, Hackers' Pub!"