수료증을 출력하는 기능이 상용 리포트 뷰어를 쓰고 있었고 통합 부분은 report.php 한 페이지가 전부였다. 그 파일을 열어 보니 줄 수는 짧은데 손볼 것이 여럿 있었다.
Table of contents
Open Table of contents
증상 — 51줄짜리 통합 페이지
첫 줄부터 initReportActiveX() 처럼 이미 사라진 실행 환경의 이름이 들어간 함수를 부르고 있었다. 그 환경은 오래전에 지원이 끝났고 지금은 아무 관계가 없다.
상용 제품의 함수 이름은 제품이 지나온 역사를 그대로 담고 있어서 지금 무엇을 하는지와 안 맞는 경우가 있다. 이름이 가리키는 것이 이미 없어도 호환을 위해 이름만 남는다.
원인 — 화석이 된 이름
이름만 보고 이 함수가 무엇을 하는지 짐작하면 틀린다. 그래서 제품 문서를 찾아서 initReportActiveX() 가 지금 실제로 무엇을 하는지를 확인해야 했다. 지금은 ActiveX 와 무관하게 뷰어 객체를 초기화하는 함수였다.
이런 자리에는 왜 이 이름인지를 // 이름은 옛 ActiveX 시절 것, 지금은 뷰어 초기화 처럼 짧게 주석으로 남겼다. 다음 사람이 이름을 보고 지워도 되는 것으로 오해하지 않게 하기 위해서였다.
주의 — 같은 값을 두 곳에 넣고 있었다
setParams() 로 설정 값을 문자열로 넘기는 부분이 있었는데 같은 값을 <param> 태그와 setParams() 두 계층에 각각 넣고 있었다. 한쪽만 고치면 다른 쪽이 옛 값으로 남아서 그 값으로 동작한다.
두 곳을 같이 유지하는 것 대신 실제로 어느 쪽이 우선하는지를 확인해서 한 곳으로 줄이는 쪽을 골랐다. 이유는 같은 값이 두 자리에 있으면 그 자체가 언젠가 어긋나는 원인이라서다. 같은 값이 두 자리에 있으면 그 자체가 언젠가 어긋나는 원인이 된다.
제약 — 개수를 따로 세는 파라미터
setParams(params, paramCount) 처럼 인자를 넘기면서 그 개수를 별도로 적는 자리도 있었다. 인자를 하나 추가하면서 개수를 안 고치면 마지막 것이 조용히 무시된다.
오류가 안 나고 값만 안 들어가므로 나중에 왜 안 되는지를 찾게 된다. 개수를 따로 세는 구조는 그런 창을 만들어 둔다는 것을 알고 써야 했다.
조치 — 복사한 예제의 잔재
제품 예제를 복사해서 만든 흔적이 남아 있었는데 <!-- --> 주석 안에 제조사 내부 주소가 그대로 들어 있었다. 안 쓰는 부분을 안 지우면 그것이 그대로 배포된다.
debug=1 표시가 켜진 채로 운영에 나가 있는 것도 함께 발견했다. 마지막으로 이 라이브러리를 왜 못 올리는지를 composer.json 옆 NOTES.md 에 적어 뒀는데 낡았다는 사실보다 그 이유가 다음 판단에 쓰인다.
정리
- 상용 컴포넌트의 API 이름은 제품 역사의 화석이다
- 이름이 가리키는 것이 이미 없을 수 있다
- 이름만 보고 짐작하지 말고 문서로 확인한다
- 같은 값을 두 계층에 넣으면 한쪽만 고쳤을 때 옛 값으로 동작한다
- 개수를 별도로 세는 파라미터는 조용히 무시되는 창을 만든다
- 예제를 복사했으면 안 쓰는 부분을 지운다
- 운영 페이지의 디버그 표시를 확인한다
- 의존 버전은 낡았다가 아니라 왜 못 올리는지를 적는다