products 의 이미지를 channel_products 에서 대신 쓰는 기능이 필요해서 찾아보니 이미 있었는데 주석 처리돼 있었다. $fallbackImage 정의는 살아 있고 if 조건도 그대로인데 본문만 // 라 풀면 될 것처럼 보였다.
Table of contents
Open Table of contents
원인 — 이력이 말한 이유
풀기 전에 언제 그렇게 됐는지를 git log -L 로 봤다. 커밋 메시지가 정보 반영 버그를 고쳤다는 내용이었고 버그를 고치면서 끈 것이었다.
git show 로 차이와 관련 변경을 같이 보니 이유가 나왔다. 이 대체 로직이 편집 화면 edit.blade.php 에 있어서 하위에 이미지가 없을 때 상위 것을 대신 보여 준다. 사용자는 이미지가 있다고 보고 저장하고 저장 로직은 하위에 이미지가 없다고 안다. 보이는 것과 실제 있는 것이 어긋나는 상태였고 그래서 껐다.
판단 기준 — 자리가 다른 같은 로직
내가 필요한 것은 ChannelSender 전송 경로에서의 대체였다. 마켓으로 보낼 때 하위에 이미지가 없으면 상위 것을 보내려는 것이다.
같은 로직인데 자리가 달랐다. 편집 화면은 사용자가 그 값을 보고 저장을 결정하므로 표시와 실제가 같아야 한다. 전송 경로는 읽어서 보내기만 하며 저장으로 돌아오지 않는다. 그래서 상위 대체는 ChannelSender 에만 적용하고 편집 화면은 하위 자신의 값만 표시하기로 범위를 한정했다. 대신 같은 대체 규칙이 두 자리에서 다르게 동작하므로 왜 다른지를 DECISIONS.md 에 적어야 하는 것을 감수했다. 이력을 안 봤으면 주석을 풀었을 것이고 같은 버그가 다시 났을 것이다.
주의 — 한 커밋에 섞인 두 변경
이력을 보다가 같은 커밋이 다른 것도 고치고 있는 것을 발견했다. dispatch() 가 if 와 foreach 안에 들어 있어서 취소할 기존 작업이 없으면 발행이 아예 안 되는 상태였다.
그 커밋이 dispatch() 를 루프와 조건 밖으로 꺼내서 고쳤다. 이 커밋은 성격이 다른 두 변경을 담고 있었는데 메시지는 하나였다. 편집 화면의 대체 로직 비활성화와 작업 발행 재구조화다. 어느 쪽이 그 버그였는지 메시지로는 알 수 없고 차이를 다 읽어야 갈린다. 커밋 하나가 한 가지를 하면 메시지가 곧 설명이 된다.
주석 처리의 함정
이번 건에서 다시 확인한 것이 있다. 주석 처리된 코드는 왜 껐는지를 알려 주지 않는다.
지웠으면 git log 를 봐야 하고 거기에는 커밋 메시지가 있다. 주석으로 남기면 파일 안에 있으니 이력을 안 보고 풀면 되겠다고 넘어가게 된다. 역설적으로 지우는 쪽이 더 안전하다. 굳이 주석으로 남기려면 왜 껐는지를 같이 적어야 한다.
정리
- 주석 처리된 로직을 되살리기 전에 왜 껐는지
git log -L로 본다 - 편집 화면에서 대체 표시를 하면 보이는 것과 실제가 어긋난다
- 읽기만 하는 경로와 저장으로 돌아오는 경로는 다르다
- 같은 로직이라도 자리가 다르면 판단이 달라진다
- 한 커밋이 성격이 다른 두 변경을 담고 있으면 메시지로는 못 가른다
dispatch()가 조건문과 루프 안에 있으면 그 조건이 안 맞을 때 통째로 안 돈다- 주석 처리는 왜 껐는지를 알려 주지 않는다
- 지우고 이력에 맡기는 쪽이 더 안전하다