위키 엔진을 만들자!
✏️ 기획 배경 및 동기
기록의 중요성, 최근에 정말 많이 듣고 있는 말이다. 개발자는 개발문서나 자신이 공부하는 내용들을 정리한다. 개발자가 아니더라도 사람들은 저마다의 업무를 위해, 아니면 일상생활이나 취미생활 또는 자신의 공부를 위해 기록을 한다.
이러한 기록의 양이 적고, 내용이 짧고 단순할 때에는 로컬 폴더에 텍스트파일로 관리하는 정도로도 충분했을 수 있다. 하지만 기록이 쌓여갈수록, 내용이 길고 복잡해질수록 기록을 더욱더 체계적으로 관리할 필요성이 커진다. 때문에 사람들은 에버노트, 노션, 컨플루언스, 베어, 업노트, 심플노트, 원노트, 데본씽크 등등 다양한 노트 앱을 사용해서 자신만의 기록을 더 세심하게 관리하려 한다. 여기서 한 발자국 더 나아가 이런 툴을 자신만의 개인 위키처럼 꾸미거나, 도쿠위키나 미디어위키같은 개인(또는 소규모)용 위키를 도입하려는 사람들도 있다.
그런데 나의 기록을 정리하기 위해 이런 툴들 중 하나를 선택하자니 마음에 꼭 드는 툴을 찾기가 어렵다. 어떤 툴들은 보안이슈, 동기화 문제, 유지 비용(구독 비용), 업로드 용량 제한, 사생활 침해(데이터 유출), 사용 가능한 포맷 제한 등 사용하기 꺼려지는 문제가 있다. 또 어떤 툴들은 디자인이나 지원 기능 측면에서 내가 좋아하거나 필요로 하는 기능이 빠져있다.
내 마음에 쏙 드는 기능과 디자인들만 쏙쏙 골라 나만의 위키를 만들수는 없을까? 보안이슈, 용량제한, 비용문제에서 자유로운 나만의 위키를 만들수는 없을까?
🗒️ 스토리 보드 (시나리오)
평소에 독서를 굉장히 즐기는 A씨. 읽은 책이 늘어갈수록 예전에 읽었던 책이 가물가물하고 잘 기억나지 않는다. 그동안에는 읽은 책을 다이어리에 펜으로 써서 정리하거나, 블로그, 메모 앱, 온라인 커뮤니티 게시글로 여기저기에 작성해 두어서 내용을 찾기도 어렵고, 몇몇 앱이나 커뮤니티는 서비스를 종료해버려서 더이상 그 때 작성했던 글을 찾을 수 조차 없게 되었다. 그래서 이제부터 독서 후에 내용과 감상을 한곳에 깔끔하고 체계적으로 정리해 두려고 한다. A씨는 자신에게 필요한 정보들을 정리 해 보았다.
- 기록을 많이 하는 기간도 있고, 거의 하지 못하는 기간도 있다. 그래서 별도로 구독까지 해야하는 앱은 사용하고 싶지 않다.
- A씨는 여행을 좋아한다. 기차, 배, 비행기, 버스를 타고다니며 책을 읽고 정리하는 경우도 많다. 그래서 인터넷이 연결되어야만 동작하는 앱은 사용할 수 없다.
- 갑자기 가격정책을 변경해버려서, 그동안 쌓인 데이터를 외부로 전부 옮길 때 까지는 울며 겨자먹기로 비용을 지불해야하는 상황도 피하고 싶다.
- 여행지에서 정리할 때에는 그곳에서 찍은 사진이나 동영상도 용량 제한 없이 첨부하고 싶다.
- 복잡한 문법 없이 마크다운처럼 간단한 문법으로 이쁘게 글을 작성하고 싶다. 디자인도 투박하지 않고 미니멀하고 이쁜 앱을 사용하고 싶다.
- 외부에 유출, 노출될 걱정 없이 글을 쓰고 싶다. 하지만 가끔씩은 다른 사람과 공유도 하고 같이 편집도 하고싶다.
그래서 A씨는 OO위키를 사용하기로 했다. 그 이유는…
- Docker Image로 배포되었기 때문에 다운로드 받아서 실행만 시키면 로컬에서 직접 돌릴 수 있다. 그래서 별도의 비용도 들지 않고, 인터넷이 연결되지 않아도 사용이 가능하다.
- A씨가 본인의 컴퓨터로 직접 돌리고 직접 이용하는 것이기 때문에 운영정책이나 가격정책 변동의 영향을 받지 않는다.
- 한 문서에 첨부할 수 있는 용량 제한을 직접 설정할 수 있다.
- 포트포워딩을 통해 외부에 포트를 열어놓지만 않는다면면 데이터 유출, 노출의 위험을 없앨 수 있다. 하지만 A씨가 원할 때에는 언제든 접근권한 설정과 포트포워딩을 통해 외부에서 접근할 방법을 열어줌으로써 공유, 편집을 같이 할 수도 있다.
A씨는 OO위키를 사용해본 뒤, 이번에는 private한 개인 기록이 아니라 public한 블로그처럼 사용해 보기로 했다. 그래서 A씨는 새로 구성한 NAS에 OO위키 컨테이너를 띄우고 외부에서 접속이 가능하도록 설정을 마쳤다. 이제 원하는 주제별로 대분류를 나누고 글을 작성하기만 하면 된다. 독서, 여행, 게임, 공부, 수집, 취미… 작성하고 싶은 글들이 너무나도 많다. 만약 마음이 잘 맞는 사람이 있다면 접근권한을 조정해서 커뮤니티나 소규모 위키처럼 쓸 수도 있을 것이다. 만일 접속자가 많아진다면 AWS에 옮겨서 돌릴 생각이다.
📚 기능 구현 (요구 리스트)
- 최초 실행시 Admin 등록을 한다. Admin이 등록된 이후부터 새로운 유저들의 가입 신청이 가능하다. 가입 신청 처리는 Admin이 직접 하거나, Admin으로부터 해당 권한을 받은 사람만이 가능하다. 회원가입은 ID와 비밀번호만을 요구한다. 필요하다면 이메일을 등록 해 놓고 특정 문서에 변경사항이 생길 때 마다 알림을 받을 수도 있다.
- 회원가입, 로그인, 로그아웃, 회원 탈퇴, 비밀번호 찾기 기능
- 이메일 인증, 이메일 알림 기능
- (Admin) 회원 가입 요청 수락, 회원 권한 조정, 회원 강퇴 기능
- Admin을 비롯한 게시글 작성 권한을 가진 회원들은 분류(디렉토리) 및 문서를 생성, 작성, 수정, 삭제할 수 있다.
- 디렉토리와 문서 생성, 수정, 삭제 기능
- 늘어나는 디렉토리와 문서를 관리할 수 있는 형태로 DB 설계
- 문서에 첨부할 수 있는 총 용량 제한을 설정할 수 있다.
- 각 문서 크기 제한 기능
- 각 문서는 편집 기록(날짜와 편집자)가 모두 남는다.
- 모든 변경 요청에 대해 logging
- (각 문서간에 걸린 링크를 통한 연결관계는 Obsidian의 graph view 처럼 볼 수 있다.)
- (graph view 기능)
- 링크/역링크 보기 기능
- 각 문서에는 코드, 이미지, 동영상, 링크 등을 첨부할 수 있다.
- 코드 하이라이팅
- 이미지, 동영상 업로드 기능
- 어떤 문서에 대한 의견을 주고받을 수 있다.
- 특정 문서에 대한 토론장 Open/Close 기능
- 특정 문서에 변화가 있을 때 마다 알림을 받을 수 있다.
- 문서 주시 On/Off 기능
- (필요할 경우 문서를 export 할 수 있다)
- (Html, markdown 형식으로 export 하기 기능)
- 제목이나 태그로 원하는 문서를 검색할 수 있다.
- 문서 검색기능
- 문서에 태그 추가하기
- 문서의 외부 공개 여부를 변경할 수 있다.
- 문서의 외부 공개 On/Off 기능
- 특정 권한을 가진 사람에게만 문서를 보여주는 기능