460GB가 어디로 갔지
어느 날 디스크 공간이 부족하다는 경고가 떴다. 사진이나 영상을 모으는 것도 아닌데 460GB가 어디로 갔나 싶어서 Finder로 큰 폴더를 하나씩 열어봤다. 범인은 Xcode였다.
derived data가 수십 GB, 옛날에 연결했던 아이폰들의 기기 지원 파일이 또 수십 GB. 여기에 손 뗀 지 한참 된 프로젝트의 node_modules, CocoaPods 저장소, 이런저런 패키지 캐시까지. 다 지워도 다시 만들어지는 것들인데, 지울 일이 없으니 몇 년치가 고스란히 쌓여 있더라.
생각해보면 개발자 맥은 원래 이렇게 될 수밖에 없다. 빌드할 때마다 캐시는 쌓이는데 딱히 치울 방법이 없다. Xcode는 한 번이라도 연결한 기기의 지원 파일을 iOS 버전별로 다 갖고 있고, 프로젝트 폴더를 지워도 여기저기 흩어진 캐시는 그대로 남는다.
이걸 매번 손으로 뒤질 수는 없어서 그냥 앱을 하나 만들었다. Attic이라는 메뉴바 앱이다.

이런 앱 이미 있지 않나
물론 많다. 유명한 유료 앱도 있고 앱스토어에 클리너만 수십 개다. 근데 막상 쓰려니 좀 꺼림칙했다.
디스크 정리 앱은 결국 내 파일을 지우는 앱이다. 뭘 어떻게 지우는지가 제일 중요한데, 대부분 소스가 공개돼 있지 않아서 알 수가 없다. 정크 파일 수십 GB를 발견했다고 해도 그 숫자가 어떻게 나온 건지, 지우면 정확히 뭐가 없어지는지 확인할 방법이 없다. 내 디스크를 통째로 맡기는데 안에서 뭘 하는지는 모르는 셈이다.
어차피 개발자 맥에 뭐가 어디에 쌓이는지는 다 아는 내용이라 이럴 바엔 그냥 만들자 싶었다.
만들다 보니 겁이 났다
막상 만들어 보니 알겠더라. 이런 앱은 파일을 찾는 것보다 지우는 쪽이 훨씬 어렵다.
UI 버그는 고치면 그만이다. 근데 파일을 잘못 지우는 버그는 고쳐도 소용이 없다. 파일은 이미 없으니까. 그래서 기능보다 하지 말아야 할 것들부터 정했다.
일단 지우지 않는다. 휴지통으로 옮기기만 한다. 잘못 옮겼으면 꺼내면 되고, 진짜 삭제는 사용자가 Finder에서 한다. 옮겨도 되는 경로는 허용 목록으로 정해 두고 그 밖은 다 거부한다. 스캔 쪽에 버그가 있을지도 모르니 옮기기 직전에 한 번 더 검사한다.
용량 표시도 어림값을 쓰지 않는다. 크기를 못 잰 항목은 0GB로 적는 대신 목록에서 빼고 못 쟀다고 알린다. 폴더를 끝까지 못 읽었으면 정리할 게 없다고 하지 않는다. 화면에 보이는 "비울 수 있는 용량"도 스캔 때 잰 값이 아니라 옮기는 순간 다시 잰 값이다. 스캔 결과는 8시간 전 것일 수도 있으니까.
되돌릴 수 있는 것과 없는 것도 섞지 않는다. 캐시는 지워도 다시 생기지만 다운로드 폴더의 사진은 안 그렇다. 그래서 "캐시 모두 선택"에는 되돌릴 수 없는 파일이 절대 포함되지 않고, 그런 파일은 어느 폴더에 있는지까지 따로 보여준다.
적고 보니 다 당연한 얘기다. 근데 이 당연한 것들 때문에 코드가 두 배로 불었다.
휴지통에 버렸는데 용량이 계속 늘었다
공개하고 며칠 안 돼서 이상한 걸 발견했다. 캐시를 휴지통으로 옮겼는데, 휴지통을 비우려고 하니 파일이 사용 중이라고 비워지지 않는다. 더 이상한 건 휴지통 안에 있는 캐시 폴더 용량이 계속 늘고 있더라는 거다.
원인을 찾아보니 이랬다. 실행 중인 Electron 앱의 캐시를 옮겼는데, 그 앱은 캐시 폴더를 파일 핸들로 연 상태였다. macOS에서 열린 핸들은 파일이 어디로 가든 유지된다. 그러니까 앱 입장에서는 아무 일도 없었던 거고, 휴지통 안에 있는 그 폴더에 캐시를 계속 쓰고 있었던 거다. 알고 나니 좀 아찔했다.
방법은 하나뿐이었다. 실행 중인 프로세스가 쓰는 항목은 아예 후보에서 뺀다. 프로세스의 실행 경로랑 작업 디렉터리를 대조해서 가려낸다. 대신 조용히 빼면 어제 보이던 항목이 오늘 왜 없는지 알 수 없으니까 뺐다는 것도 알려준다. "쓰는 중이라 뺌: shop (node), 끄고 다시 찾아보면 나와요."
처음엔 "실행 중인 앱이 쓰고 있어요"라고만 띄웠는데, 이것만 봐서는 뭘 꺼야 하는지 알 수 없다. 지금은 어떤 프로세스가 쓰고 있는지 이름까지 보여준다. 끌지 말지는 이름 보고 사용자가 정하면 된다.
그래서 공개
MIT 라이선스로 GitHub에 올렸다. 노터라이즈까지 받아놔서 다운로드하면 게이트키퍼 경고 없이 바로 열리고 Homebrew로도 설치된다.
brew install rayforvideos/tap/attic삭제 로직은 전부 AtticCore 패키지에 분리돼 있어서 테스트로 검증된다. 앱 빌드나 서명 없이 swift test만 통과하면 PR을 받는다. 파일을 지우는 앱이라 기여 규칙이 좀 깐깐한데, 자세한 건 CONTRIBUTING.md에 있다.
오래 쓴 맥이라면 한번 돌려볼 만하다. 내 맥에서는 111GB가 나왔다.