버그 하나를 고치러 파일을 열었다. 옆에 고칠 것이 여럿 보였다.
Table of contents
Open Table of contents
배경 — 눈에 보이는 것이 많았다
파일을 열자 이런 것이 한 화면에 있었다.
function getOrderList($memberNo) {
$sql = "select * from orders where member_no = $memberNo"; // 값이 그대로 들어간다
$rows = $this->db->query($sql)->result_array(); // 인덱스가 없다
foreach ($rows as &$r) {
$r['name'] = $this->db->query("select name from member where no = " . $r['member_no'])
->row_array()['name']; // 행마다 조회
}
return $rows;
}
getOrderList 하나에 고쳐야 할 것이 셋이었고 내가 고치러 온 것은 ORDER BY 였다. 온 김에 눈에 보이는 것을 전부 고쳐서 한 번에 올렸다.
한꺼번에 올렸다가 물러났다
그날 밤에 주문 목록이 안 나온다는 연락이 왔다. svn log 를 봐도 무엇 때문인지 알 수가 없었다. 넷을 한 번에 바꿔서 어느 것이 원인인지 가릴 수가 없었다.
결국 svn merge -c -1247 ^/trunk 로 그 리비전을 통째로 역병합했다. 이 명령은 이력에서 r1247 을 지우지 않고 반대 방향으로 적용한 새 리비전을 하나 더 쌓는다. 원래 고치려던 정렬 수정까지 함께 물러났다. 여러 변경을 한 리비전에 담은 대가가 그것이었다.
나눠서 올렸다
다시 할 때는 나눠서 올렸다.
1차 정렬 순서만 (원래 고치러 온 것)
2차 값이 그대로 들어가는 것
3차 행마다 조회하는 것
4차 인덱스
하나씩 올리고 확인하니 3차에서 문제가 났다.
$members = $this->db->where_in('no', $memberNos)->get('member')->result_array();
$memberNos 가 비어 있으면 where_in 이 조건을 안 붙여서 전체를 가져왔다. 목록이 큰 경우에 멈추는 것이었다.
if (empty($memberNos)) return $rows;
원인을 바로 찾았는데 r851 에서 하나만 바꿨기 때문이다. 그것만 물리고 앞의 둘은 그대로 남았다.
하나씩 올리면 기록도 하나씩 남는다.
r842 주문 목록 정렬을 최근순으로
r845 주문 목록 쿼리의 값 바인딩
r851 주문 목록의 회원 조회를 묶음으로 (빈 목록 처리 포함)
r852 orders.member_no 인덱스 추가
나중에 svn blame 으로 언제부터 이랬는지 볼 때 이게 갈린다. 넷을 한 번에 올렸으면 한 줄로만 남았을 것이다.
급한 것과 본 것의 기록
전부 미루는 것도 답이 아니었다. 값이 그대로 들어가는 것은 위험해서 미룰 수 없었다.
$this->db->select('*')->from('orders')->where('member_no', $memberNo);
select 와 where 를 쓰는 이 형태로 그날 바로 고쳤고 나머지는 며칠에 걸쳐 했다. 위험한 것과 아닌 것을 가른 것이다.
한꺼번에 안 고치기로 했으니 잊지 않게 적었다.
OrderModel::getOrderList
- 행마다 member 조회 (목록 20건이면 21번 조회)
- orders.member_no 인덱스 없음
2014-09-23 확인
파일 경로와 무엇을 봤는지를 적어 두지 않으면 다음에 이 파일을 열 때 또 처음부터 본다.
찾는 것은 그 자리에서 했다.
$ grep -rn 'query("select.*" \. \$' --include=*.php application/models/ | wc -l
28
application/models/ 에서 28곳이 나왔고 그중 값이 그대로 들어가는 것이 19곳이었다. 한 자리에서 발견한 것이 다른 데도 있는지 세는 것은 지금이 싸다. 고치는 것을 나눈 것이지 찾는 것을 나눈 것이 아니었다.
적어 두기 시작하니 목록이 늘어 두 달 만에 마흔 개가 넘었다. 전부 고칠 수는 없어서 세 갈래로 나눴다. 위험한 것은 그 주에 하고 느린 것은 실제로 느려졌다는 말이 나올 때 하며 나머지는 그 파일을 다음에 열 때 같이 한다.
세 번째가 가장 많았다. 어차피 그 파일을 열게 되므로 그때 하나씩 처리하면 따로 시간을 안 낸다. 목록에 파일 이름을 적어 둔 것이 그래서 필요했다.
정리
- 고치러 들어간 김에 여러 개를 한 번에 바꾸면 원인을 못 가린다
svn merge -c -REV로 물리면 고치려던 것까지 함께 간다- 그 역병합은 이력을 지우지 않고 반대 리비전을 하나 더 쌓는다
- 하나씩 올리고 확인하면 원인이 바로 갈린다
- 하나씩 올리면 기록도 하나씩 남는다. 언제부터인지 볼 때 갈린다
- 전부 미루는 것도 답이 아니다. 위험한 것과 아닌 것을 가른다
- 본 것을 파일 경로와 함께 적어 둔다. 안 적으면 다음에 또 처음부터 본다
- 고치는 것은 나누되
grep으로 찾는 것은 그 자리에서 한다 - 쌓인 목록은 위험한 것과 느린 것과 다음에 열 때 할 것으로 가른다