남의 마을에 가게를 내다
옵시디언 커뮤니티 플러그인 입점기
깨달음: "내 마을에서는 내가 법이지만, 남의 마을에서는 그 마을의 법을 읽는 것부터가 일이다."
지금까지 만든 모든 것은 내 땅 위에 있었다. 내 도메인, 내 서버, 내 데이터베이스. 버튼 색이 마음에 안 들면 바꾸면 되고, 규칙이 필요하면 내가 정하면 됐다. 혼자 만드는 일의 외로움에 대해서는 여러 번 썼지만, 그 반대편에 있는 자유에 대해서는 쓴 적이 없는 것 같다. 내 마을에서는 내가 법이다.
옵시디언이라는 노트 앱이 있다. 스택튜브 사용자 중에 이 앱으로 노트를 모으는 사람들이 있고, 그들에게 노트를 자동으로 배달해주려면 옵시디언의 "커뮤니티 플러그인 스토어"에 들어가야 한다. 남의 마을이다. 그 마을에는 심사가 있다.
준비할 것이 생각보다 많았다. 플러그인이 내 서버와 대화하려면 사용자마다 열쇠(API 키)를 발급해야 하는데, 그 열쇠를 내 데이터베이스에 그대로 저장하면 안 된다는 것을 배웠다. 열쇠 자체가 아니라 열쇠의 지문(해시)만 저장한다. 그래야 내 데이터베이스가 털려도 열쇠는 안전하다. 은행이 비밀번호를 "모르는" 것과 같은 원리라고 한다.
마을의 법도 읽어야 했다. 옵시디언의 플러그인 심사 기준은 문서로 공개돼 있다. 비밀값을 로그에 남기지 마라. 정해진 통신 방법만 써라. 사용자 동의 없이 외부로 데이터를 보내지 마라. 흥미로웠던 것은, 이 기준들이 결국 EP.12와 EP.13에서 내가 배운 것과 같은 이야기를 하고 있었다는 점이다. 남의 마을의 법은 대체로, 내 마을에서 이미 사고를 친 뒤에 배운 것들이었다.
제출 전에 시험을 했다. 자동 테스트 16개를 만들어 돌리고, 마지막으로 진짜 시험 — 내 옵시디언 보관함에 직접 설치했다. 노트 99개, 채널 23개 폴더가 들어왔다. 한 번 더 동기화를 눌렀다. "새 노트 없음." 중복이 생기지 않는다는 뜻이다. 이 두 번째 클릭이 첫 번째보다 중요하다는 것을 이제는 안다.
제출 방식이 최근에 바뀌었다는 것도 검색으로 알았다. 예전에는 깃허브에서 목록 파일을 고치는 방식이었는데, 지금은 개발자 대시보드에서 제출한다. 낡은 안내 글을 따라갔다면 며칠을 버렸을 것이다. 남의 마을은 법도 바뀐다.
제출했다. 자동 심사가 돌았다. 통과 항목들이 하나씩 초록색이 되는 것을 지켜봤다. 불합격 0건. 그리고 그날 안에, 플러그인이 공개됐다.
옵시디언 앱의 플러그인 검색창에 "stacktube"를 쳐봤다. 나왔다. 다른 사람들이 만든 수천 개의 플러그인 사이에, 내가 만든 것이 한 칸을 차지하고 있었다. 진열대 점수는 96점이라고 했다.
이상한 기분이었다. 내 사이트에 기능을 올리는 것은 집 안에 가구를 들이는 일이라 아무 감흥이 없어진 지 오래다. 그런데 남의 마을 진열대에 물건이 오르니, 처음 론칭 버튼을 누르던 날과 비슷한 감각이 돌아왔다. 심사가 있는 곳에 통과했다는 것. 내가 정하지 않은 기준을 충족했다는 것. 혼자 만드는 사람에게는 그게 드물게 받는 성적표다.
법은 내 마을 것이 편하다. 하지만 성적표는, 남의 마을 것이 더 정직하다.
🔧 이 에피소드의 기술 용어 해설
플러그인 (Plugin) 기존 앱에 끼워 넣는 확장 기능. 옵시디언은 사용자들이 만든 플러그인을 심사를 거쳐 공식 스토어에 진열한다.
API 키 / 해시 저장 외부 프로그램이 내 서버에 접근할 때 쓰는 열쇠. 서버에는 열쇠 원본 대신 해시(일방향 지문)만 저장한다. 지문으로 열쇠를 복원할 수는 없으므로, 유출돼도 피해가 없다.
E2E 테스트 (End-to-End Test) 부품 단위가 아니라 사용자의 실제 동선 전체(연결 → 동기화 → 재동기화)를 통째로 검증하는 테스트. 이번에는 가짜 서버와 가짜 보관함을 만들어 16개 시나리오를 돌렸다.
멱등성 (Idempotency) 같은 작업을 두 번 해도 결과가 한 번 한 것과 같은 성질. "두 번째 동기화에서 중복 0개"가 바로 이것이다. 자동화에서 가장 중요한 성질 중 하나.