자동화를 붙이기 전에 저장소를 먼저 쪼갰습니다
이 사이트는 원래 제 개인 위키 저장소 안에 폴더 하나로 들어 있었습니다. 지금은 별도 저장소로 나와 있습니다. 코드가 커져서가 아니라 아직 붙지도 않은 자동화 때문입니다.
계기 — 아직 일어나지 않은 일
이 사이트에 글을 자동으로 올리는 스크립트를 붙일 계획이 있었습니다. 붙이려면 그 스크립트에 저장소 쓰기 권한을 줘야 합니다.
토큰을 만들기 직전에 한 번 따져봤습니다. 이 토큰이 정확히 어디에 쓸 수 있게 되는가.
위키 저장소에 들어 있던 것
같은 저장소 안에 이런 것들이 있었습니다.
- 조사 기록 50건이 넘고, 각각 원문 발췌까지 같이 들어 있습니다
- 결정문 40편이 넘습니다. 판단이 뒤집힌 기록도 그대로 남아 있습니다
- 개인 메모
사이트 코드는 그중 폴더 하나였습니다.
토큰 하나가 이 전부에 쓰기 권한을 갖게 되는 구조였습니다.
토큰은 저장소보다 잘게 못 자릅니다
여기가 핵심이었습니다. 저는 막연히 “권한을 좁게 주면 되지"라고 생각하고 있었습니다.
좁힐 수 있는 단위가 저장소까지입니다. 어떤 저장소에 접근할지는 고를 수 있지만, 한 저장소 안에서 “이 폴더만"은 안 됩니다. 세밀한 권한 토큰이든, 배포 키든, 워크플로가 쓰는 기본 토큰이든 마찬가지입니다.
즉 사이트 폴더에만 쓰기라는 권한은 만들 수가 없었습니다.
줄 수 있는 건 이 저장소 전체에 쓰기뿐입니다.
사고가 나야 문제인 게 아닙니다. 스크립트가 얌전히 돌아도, 토큰이 유출되지 않아도, 권한 범위가 필요보다 넓다는 사실 자체가 남습니다. 그리고 그 범위 안에 사이트와 아무 상관 없는 개인 기록이 들어 있었습니다.
흔한 기준이 틀렸습니다
이 시점에 제가 처음 세운 기준은 이거였습니다.
라이브에 배포되는 것을 분리한다
말이 되는 것 같지만 적용해보니 이상한 결과가 나왔습니다.
같은 위키에는 티스토리 블로그 스킨 두 벌도 들어 있습니다. 이건 편집하면 실제 서비스가 바뀌는, 완전히 라이브인 물건입니다. 위 기준대로면 이것도 빼내야 합니다.
그런데 뺄 이유가 없었습니다. 스킨은 제가 손으로만 고칩니다. 토큰이 붙을 일이 없습니다.
기준을 고쳐 적었습니다.
자동화가 쓰기 권한을 갖는 것을 분리한다
| 라이브인가 | 자동화가 쓰는가 | 결과 | |
|---|---|---|---|
| 이 사이트 | 예 | 예 | 분리 |
| 티스토리 스킨 2벌 | 예 | 아니오 | 그대로 둠 |
「라이브 배포 여부」와 「자동화가 쓰는가」는 자주 같이 가지만 같은 기준이 아닙니다. 그리고 권한을 나눌 때 필요한 건 뒤쪽입니다.
다른 방법은 없었나
저장소를 쪼개는 건 되돌리기 번거로운 일이라, 안 쪼개고 되는 길부터 찾아봤습니다. 셋을 봤고 셋 다 같은 벽에 부딪혔습니다.
서브모듈로 두기. 사이트 폴더만 별도 저장소로 만들어 위키 안에 얹는 방식입니다. 그런데 이건 결국 저장소를 하나 더 만드는 것입니다. 분리는 이미 일어나고, 거기에 서브모듈 관리 비용만 얹힙니다. 얻는 게 없었습니다.
브랜치를 갈라서 자동화는 한 브랜치만 쓰게 하기. 토큰 권한이 브랜치 단위로도 안 잘립니다. 브랜치 보호 규칙은 누가 push할 수 있는지를 정하는 것이지 토큰이 닿는 범위를 좁히는 장치가 아닙니다. 그리고 개인 기록은 어차피 기본 브랜치에 그대로 있습니다.
민감한 것만 빼내기. 위키에서 뺄 것을 골라보려 했는데, 골라낼 대상이 대부분이었습니다. 조사 기록과 결정문이 위키의 본체지 부록이 아닙니다. 남길 것을 고르는 쪽이 훨씬 적었고, 그게 사이트 폴더 하나였습니다.
⇒ 우회로를 찾다가 원래 답으로 돌아왔습니다. 나갈 것은 사이트 쪽입니다.
나중에 하면 비싸집니다
미룰 수도 있었습니다. 자동화가 아직 안 붙었으니까요.
미루면 비싸지는 이유가 명확했습니다. 지금은 폴더를 옮기고 원격 주소만 새로 잡으면 끝입니다. 자동화가 몇 달 돌고 나면 그 저장소에는 자동 커밋 이력이 쌓입니다. 그때 분리하려면 이력까지 갈라내야 하고, 그건 전혀 다른 난이도입니다.
“나중에 정리하자"의 비용이 시간이 갈수록 오르는 종류라서 먼저 했습니다.
실제로 한 일
옮기는 것 자체는 짧았습니다. 정작 신경 쓴 건 끊어지는 링크였습니다.
위키에는 이 사이트를 왜 이렇게 만들었는지에 대한 기록이 여러 편 있습니다. 어떤 정적 생성기를 왜 골랐는지, 무엇을 올릴지 같은 것들입니다. 폴더를 들어내면 그 기록들이 가리키는 곳이 사라집니다.
그래서 원래 자리에 문서 한 장을 남겼습니다. 코드는 없고 이런 것만 적혀 있습니다.
- 저장소 주소와 로컬 경로
- 어떤 스택이고 어디에 배포되는지
- 글 하나 올리는 절차
- 왜 분리했는지 (지금 이 글의 내용)
- 설계 근거 문서들로 가는 링크
몇 달 뒤의 저는 분명히 원래 자리부터 찾아볼 겁니다. 그때 빈 자리를 만나지 않게 하는 게 이 문서의 목적입니다.
부수 이점 하나
의도한 건 아닌데 따라온 게 있습니다.
호스팅을 저장소 연동 방식으로 바꾸고 싶어지면, 저장소 루트가 곧 사이트 루트여야 설정이 단순합니다. 폴더 하나가 사이트인 구조에서는 빌드 경로를 따로 지정해야 합니다.
분리하고 나니 그 설정이 그냥 필요 없어졌습니다.
정리
- 자동화에 줄 권한을 만들기 전에 어디까지 쓸 수 있는지 따져보면 구조가 먼저 보입니다
- 토큰은 저장소보다 잘게 못 자릅니다. “폴더만"이라는 권한은 존재하지 않습니다
- 분리 기준은 **「라이브인가」가 아니라 「자동화가 쓰는가」**입니다. 둘은 자주 같이 가지만 다릅니다
- 이런 정리는 커밋 이력이 쌓이기 전에 하는 게 압도적으로 쌉니다
- 폴더를 들어냈으면 원래 자리에 포인터를 남기세요. 찾으러 오는 건 대개 자기 자신입니다