몇 해 전에 보관해 둔 교육 사이트 프로젝트를 다시 열어야 할 일이 생겼다. 파일은 그대로 다 있는데 무엇을 하는 것인지도 어떻게 돌리는지도 알 수 없었다.
Table of contents
Open Table of contents
증상 — 코드만 남아 있던 보관물
README.md 가 없었고 config.php 의 값도 전부 비어 있었다. 돌려 보려니 composer.json 에 PHP 판이 안 적혀 있어 필요한 런타임을 모르겠고, 알아도 지금 환경에서 구하기 어려웠다.
봐야 했던 것은 옛 데이터의 계산 방식이었으므로 읽기만 하면 되는 일이었다. 어디를 봐야 할지 몰라서 전체를 훑느라 이틀이 걸렸다.
판단 기준 — 보관하는 이유가 곧 볼 자리다
전체 구조를 처음부터 끝까지 다 적을 필요는 없었다. 무엇을 보러 다시 올지를 예상해서 그 자리만 짚어 적으면 됐다.
수료 기록 확인 때문에 보관하는 것이면 lib/grade.php 의 점수 계산과 lib/completion.php 의 수료 판정이 볼 자리다. 보관하는 이유를 ARCHIVE.md 에 적으면 볼 자리가 함께 정해지므로 그 두 줄이 이틀을 삼십 분으로 만든다.
조치 — 코드와 데이터를 함께
코드만 있으면 반쪽인데 계산 방식을 알아도 대조할 값이 없으면 확인이 안 된다. 그래서 DB 도 코드와 함께 보관하기로 했는데 두 가지 방법이 있었다. mysqldump 한 번으로 스키마와 자료를 한 파일에 담는 것과, --no-data 로 schema.sql 을, --no-create-info 로 data.sql.gz 를 따로 뜨는 것이다. 뒤쪽을 골랐다. 이유는 구조만 볼 때 자료 압축을 풀지 않아도 돼서다. 두 옵션이 각각 CREATE TABLE 만, 행만 쓴다는 것은 MySQL 5.7 매뉴얼의 mysqldump 절에 있다.
자료는 gzip 으로 압축해 두고 gzip -l 이 보여 주는 압축 전 크기도 ARCHIVE.md 에 적어서 풀 자리가 있는지 미리 알 수 있게 했다.
보관 기한과 재판단
보관 기한이 없으면 보관물은 지워지지 않고 영영 쌓이기만 한다. 운영 종료 시점에서 몇 해를 더한 날짜를 retention_until 로 적어 두고 그때 폐기 여부를 다시 판단하게 했다.
기한이 되면 자동으로 지우지 않고 다시 판단하게 한 것은 그 사이에 사정이 바뀔 수 있기 때문이다. 법정 보관 기간이 있는 것은 그것을 따랐다.
모르는 것을 모른다고 적기
보관 폴더에 있는 다른 항목도 열어 보니 그중 셋에는 ARCHIVE.md 가 없었다. 하나씩 알아내서 설명을 붙였는데 그중 하나는 아무도 모르는 것이었다.
들어 있는 파일 이름으로 짐작만 되어서 확실하지 않다는 것과 아는 사람이 없다는 것과 언제까지 두고 문의가 없으면 폐기한다는 것을 적었다. 모른다고 적어 두지 않으면 다음 사람이 같은 조사에 같은 시간을 다시 쓴다.
정리
- 코드만 남기면 나중에 못 읽는다
- 무엇인지와 왜 남겼는지를
ARCHIVE.md에 함께 적는다 - 보관하는 이유가 곧 다시 볼 자리다
- 전체 구조가 아니라 볼 자리를 예상해서 적는다
- 코드와 데이터를 함께 보관하고
schema.sql과data.sql.gz를 나눈다 gzip -l로 본 압축 전 크기를 적어 둔다- 보관 기한을
retention_until로 정하고 그때 자동 폐기가 아니라 재판단한다 - 모르는 것은 모른다고 적어야 반복 조사가 안 생긴다