20여년전 위키위키를 처음 접하고, 내주변의 모든 것들, 내가 공부하는 모든 것들을 위키에 담으로고 노력했다. 바이오해커스넷을 만들고, Ecogwiki for Biohackers 사이트를 운영하면서, 위키를 통한 지식 구조화는 어렵겠지만 언젠간 될꺼고, 그때를 위해 하나하나 최선을 다해 정리했다. 하지만 점점 노력의 성과를 못보며 동력이 줄었고, 그러다 구글 클라우드 플랫폼 (GCP) 과도한 비용 청구 문제로 현실적인 대안을 찾았다. 그러던중 팀 동료로부터 옵시디언(Obsidian)을 추천받았다. 아, 전에 X 타임라인에서 본적있어!
평소에 위키에 익숙한 나에게 Obsidian은 매우 매력적인 선택지였다. 기존에 사용하던 Ecogwiki는 웹 위키로, 온라인에서는 편리했지만 연결성과 신속한 오프라인 지식관리 측면에서 아쉬움이 있었다. 이 글에서는 내가 어떻게 Ecogwiki에 저장된 콘텐츠를 코드로 일괄 다운로드하고, 이를 Obsidian의 PARA 시스템에 녹여 정리했는지를 공유한다.
Ecogwiki 페이지 구조 파악하기
Ecogwiki의 페이지 인덱스는 다음과 같이 구성되어 있다. (전에 Ecogwiki 저자 강규영 님에게 물어봄)
- 전체 페이지 목록: https://e.biohackers.net/sp.index
- 각 페이지의 마크다운 소스: https://e.biohackers.net/페이지경로?_type=txt
즉, sp.index에서 모든 내부 링크를 추출한 다음, 각 링크에 ?_type=txt를 붙이면 마크다운 형태의 원본 텍스트를 받을 수 있다.
모든 페이지 자동 수집 및 저장 스크립트 작성
파이썬으로 전체 페이지를 마크다운으로 가져오는 스크립트를 직접 만들까, 아니다 GPT-4o에게 시켜본다. 필요한 기능은,
- sp.index에서 페이지 목록을 추출
- 각각의 페이지에 ?_type=txt를 붙여 원본 마크다운 요청
- 파일명으로는 URL 디코딩된 한글 제목을 사용
- .md 파일로 저장
이고, 다음 질문에 한방에 잘 동작하는 코드를 만들어준다.
(질문)
위키위키 사이트인 https://e.biohackers.net 의 모든 페이지를 옵시디언으로 옮기는 스크립트를 만드려고 해. https://e.biohackers.net/sp.index URL에서 모든 페이지를 볼 수 있고, 각각의 페이지 URL의 끝에 "?_type=txt" 를 붙힘으로써 페이지별 마크다운 소스를 받을 수 있어. 모든 페이지들을 옵시디언에 옮기는 스크립트를 작성해.
import requests
from bs4 import BeautifulSoup
import os
import re
from urllib.parse import unquote, urljoin
OUTPUT_DIR = "obsidian_wiki"
BASE_URL = "https://e.biohackers.net"
def sanitize_filename(name):
name = name.replace("/", "_") # 경로 방지용
return re.sub(r'[\\:*?"<>|]', '_', name)
def fetch_page_list():
index_url = f"{BASE_URL}/sp.index"
res = requests.get(index_url)
res.raise_for_status()
soup = BeautifulSoup(res.text, "html.parser")
page_links = soup.select("a")
return sorted(set([
link.get("href") for link in page_links
if link.get("href") and not link.get("href").startswith("http")
]))
def fetch_and_save_page(page_name):
page_url = urljoin(BASE_URL, page_name) + "?_type=txt"
res = requests.get(page_url)
if res.status_code == 200:
decoded_name = unquote(page_name.strip("/"))
clean_name = sanitize_filename(decoded_name)
file_path = os.path.join(OUTPUT_DIR, f"{clean_name}.md")
with open(file_path, "w", encoding="utf-8") as f:
f.write(res.text)
print(f"Saved: {file_path}")
def main():
if not os.path.exists(OUTPUT_DIR):
os.makedirs(OUTPUT_DIR)
page_list = fetch_page_list()
for page in page_list:
fetch_and_save_page(page)
if __name__ == "__main__":
main()
스크립트를 실행하면 obsidian_wiki 폴더에 모든 .md 파일이 자동으로 저장된다.
파일 이름에서 밑줄(_)을 공백으로 변환
Ecogwiki의 페이지 이름은 "AI_시대의_의료와_간호"처럼 언더바를 포함하고 있다. 하지만 Obsidian은 [[AI 시대의 의료와 간호]]와 같은 공백 기반 링크를 사용하므로, 이를 맞춰주기 위해 모든 파일 이름을 공백으로 바꿨다. 이것도 GPT-4o가 한번에 만듬.
import os
TARGET_DIR = "obsidian_wiki"
def rename_files_with_space():
for filename in os.listdir(TARGET_DIR):
if filename.endswith(".md") and "_" in filename:
new_filename = filename.replace("_", " ")
os.rename(os.path.join(TARGET_DIR, filename), os.path.join(TARGET_DIR, new_filename))
print(f"Renamed: {filename} → {new_filename}")
if __name__ == "__main__":
rename_files_with_space()
Obsidian에 PARA 개념 적용
원래 위키는 디렉토리를 나누지 않고, 단일 폴더에 모든 페이지를 정리한다. 폴더를 만들고, 페이지를 폴더 안으로 옮기면, 해당 링크가 깨지니까, 유연한 관리가 힘들다. 하지만 Obsidian은 디렉토리를 아무리 여러개 만들어 페이지를 배치해도, 페이지 이름으로 링크가 깨지지 않는다. 아하! 이거 좋은 기능이네. 그렇다면 위키와 PARA 관리법을 함께 사용할 수 있겠다.
PARA (Projects, Areas, Resources, Archives)는 Tiago Forte가 제안한 메모 관리 방법이다. "실행도" 중심으로 다음처럼 디렉토리를 나누고, 정보들을 관리한다.
- Projects: 진행 중인 업무, 예: [[AI 기반 간호 프로젝트]]
- Areas: 지속적으로 유지되는 관심 영역, 예: [[디지털 헬스]], [[지식관리]]
- Resources: 읽은 논문 요약, 기술 개념 정리 등 참고용 자료, 예: [[LLM Fine-tuning]], [[Obsidian 사용법]]
- Archives: 완료되거나 현재는 더 이상 참조하지 않는 문서들
이전한 대부분의 위키페이지들은 "Resources"에 위치시킨다. 실행도 위주로 중요한 것들을 Projects, Areas에 배치한다. 그리고, 날짜 페이지도 중요한 정보의 입구로 활용한다. 페이지마다 특별한 속성을 부여하는 "메타데이터"도 중요한 활용 수단이다. 이것은 꾸준히 써보면서 최적의 활용 방안을 정립할 생각이다.
Obsidian 지식 관리 시스템 시작
최종적으로 이 과정을 통해 얻은 결과는 다음과 같다:
- 2000개가 넘는 위키 페이지를 로컬에서 완전 소유하게 되었고
- Obsidian에서 오프라인에서도 빠르고 연결된 탐색이 가능해졌으며
- PARA 기반 구조 덕분에 문서간 관계와 실행도 우선순위를 쉽게 조망할 수 있었다
마무리하며
이번 작업은 단순한 파일 백업을 넘어서, 온라인 위키 → 오프라인 지식 기반으로의 전환이었다. 오프라인이긴 하지만, icloud를 통해 아이폰, 아이패드, 맥북이 모두 동기화되며 훨씬 빠른 페이지 관리가 가능하게 되었다. 웹에서는 뭔가 자동화한다거나, 일괄로 작업한다던가가 쉽지 않았지만, 여기는 그냥 파일시스템의 .md 파일일뿐이고, 내가 하고싶은대로 쉽게쉽게 변경하며 관리할 수 있다. 옵시디언의 플러그인은 또 얼마나 많던지 하나하나 어떤 장점이 있는지 확인해봐야겠다.
무겁고 불편했던 개인위키를 아주 빠르고 무한한 가능성의 새로운 집으로 옮긴 느낌이다. 이것을 통해 시도해 볼 것들이 많은 것 같다. 좀 더 일찍 만나지 못한것이 아쉽지만, 지금도 뭐 괜찮다. 하나하나 시도해보자.