옛 화면을 새 화면으로 바꾸고 옛것을 닫았다. 며칠 뒤 그거 어디 갔냐는 문의가 왔다.
Table of contents
Open Table of contents
증상 — 어디 갔냐는 문의
새 화면을 만들 때는 옛 화면을 열어 놓고 보이는 것을 전부 옮겼다.
옛 화면
목록에서 여러 개 선택 → 일괄 상태 변경 (버튼이 아래쪽에 작게 있었다)
주소창에 ?export=1 을 붙이면 엑셀로 받아진다 ← 이건 아예 몰랐다
첫째는 버튼이 작아서 못 봤고 둘째는 화면에 아예 없었다.
?export=1 은 아는 사람만 쓰던 것이었다. 화면에 단추도 없고 다른 화면에서 이어지는 길도 없어서 눈으로 옮기는 방식으로는 잡힐 수가 없었다.
legacy/order/list.php 를 열어 두고 만들었는데도 그랬다. 화면에 그려지는 부분만 읽고 $_GET 을 보는 분기는 지나친 것이다.
옮기면서 빠진 것이 있었다
화면을 보는 대신 옛 코드를 읽었다.
$ grep -n "if (\$_GET\|if (\$_POST\|isset(\$_GET" legacy/order/list.php
주소나 값에 따라 갈리는 자리가 넷 나왔다.
?export=1 엑셀 내려받기
?print=1 인쇄용 화면
?debug=1 쿼리 출력 (개발용)
&mode=simple 간략 보기
넷 중 새 화면에 있는 것은 하나도 없었다.
문의가 온 것은 ?export=1 하나였고 나머지 셋은 아무도 말하지 않았다. 말이 안 나왔다고 안 쓰는 것은 아니라서 그것부터 갈라야 했다.
?debug=1 처럼 개발용으로 만든 것이 섞여 있을 수도 있다. 넷을 같은 무게로 옮기면 안 쓰는 기능을 새 화면에 그대로 들여오게 된다.
검증 — 접속 로그로 실제 사용을 셌다
전부 옮길 필요는 없으니 실제로 불리는지를 셌다.
$ awk '{print $7}' /var/log/nginx/access.log.* | grep "order/list" | grep -o "?.*" | sort | uniq -c | sort -rn
41022 ?page=1
8204 ?export=1
112 &mode=simple
3 ?print=1
export 는 석 달에 8천 번이고 print 는 세 번이다.
debug 는 로그에 아예 없었다. 개발 환경에서만 쓰던 것이라 운영 로그에 남을 일이 없었다.
숫자가 있으니 무엇을 옮길지가 그 자리에서 갈렸다. 로그가 없었으면 넷을 다 옮기거나 다 버리는 쪽으로 갔을 것이다.
access.log 가 석 달치 남아 있던 것이 이번에 컸다. 로그 보관 기간이 짧았으면 &mode=simple 의 112회 같은 수는 안 나왔을 것이다.
대응 — 닫기 전의 리다이렉트
순서를 이렇게 잡았어야 했다.
1. 옛 화면의 진입점을 전부 찾는다 (주소 인자 포함)
2. 접속 로그로 실제 사용을 센다
3. 쓰이는 것을 새 화면에 옮긴다
4. 옛 화면을 바로 닫지 말고 새 화면으로 보낸다
5. 한 달간 지켜보고 닫는다
4번을 건너뛰고 바로 404가 나게 한 것이 이번의 실수였다.
// 옛 주소로 오면 새 주소로 보내면서 로그에 남긴다
log_message('info', '옛 주소 접근: ' . $_SERVER['REQUEST_URI']);
redirect('/order/list' . ($_GET ? '?' . http_build_query($_GET) : ''));
REQUEST_URI 를 통째로 남기니 어떤 인자를 붙여 들어오는지까지 보인다.
쓰는 사람은 화면이 안 열려야 말을 하고 그때는 이미 며칠이 지난 뒤다. redirect 로 보내면서 남기면 아무도 불편하지 않은 상태로 같은 정보가 모인다.
한 달쯤 두면 달마다 한 번 쓰는 기능까지 걸린다. 분기나 연말에만 쓰는 것이 있으면 그보다 더 길게 둬야 한다는 뜻이기도 하다.
안 옮긴 것과 물어본 것
안 옮긴 것은 이유와 함께 적어 뒀다.
옮기지 않은 기능
?print=1 인쇄용 화면. 3개월간 3회 사용. 필요하면 브라우저 인쇄로 대체
?debug=1 개발용. 새 화면은 별도 도구 사용
&mode=simple 간략 보기. 112회 사용. 새 화면의 컬럼 숨기기로 대체 가능
나중에 왜 없느냐는 물음이 오면 이 표로 답할 수 있다.
mode=simple 은 새 화면의 컬럼 숨기기로 같은 일을 할 수 있어서 그 방법을 안내에 적었다. 없앤 것과 다른 방법으로 옮긴 것은 받는 쪽에서 다르게 들린다.
코드와 로그를 다 봤는데도 못 찾은 것이 있었다. 만들고 나서 쓰던 사람들에게 물었더니 셋이 나왔고 그중 하나가 이것이었다.
목록에서 마우스 오른쪽 → 새 탭에서 열기가 안 된다
새 화면이 자바스크립트로 이동하게 돼 있어서 <a> 가 아니었다. 링크로 바꾸니 해결됐는데 이런 것은 코드에도 access.log 에도 안 남는다.
제약 — 옛 코드에 적어 둔 날짜
새 화면이 자리 잡을 때까지 옛 코드를 지우지 않았다.
legacy/order/list.php 남김 (2018-03 이후 삭제 예정)
지울 날짜를 같이 적어 두지 않으면 그 파일은 영영 남는다.
석 달 뒤에 access.log 를 다시 보니 옛 주소 접근이 0이었고 그때 지웠다. 날짜가 없으면 지울지 말지를 볼 때마다 다시 고민하게 된다.
정리
- 화면을 보는 것으로는 안 보이는 기능을 못 찾는다
- 주소에 인자를 붙여야 열리는 기능이 있다
- 옛 코드에서
$_GET으로 갈리는 자리를 전부 찾는다 - 접속 로그로 실제 사용을 센다
- 8천 번과 세 번을 같은 무게로 다루지 않는다
- 전부 옮길 필요는 없고 쓰이는 것만 옮긴다
- 옛 주소를 바로 닫지 말고 새 주소로 보내면서 로그에 남긴다
- 보내면서 남기면 아무도 불편하지 않은 채로 같은 정보가 모인다
- 안 옮긴 것과 이유와 대체 방법을 적는다
- 코드와 로그로도 못 찾는 것은 쓰는 사람에게 물어야 나온다
- 옛 코드에 지울 날짜를 적어 두고 그날 확인하고 지운다