Skip to content
isdnetworks
Go back

온 김에 더 고칠지 정했다

버그 하나를 고치러 파일을 열었다. 옆에 고칠 것이 여럿 보였다.

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);

selectwhere 를 쓰는 이 형태로 그날 바로 고쳤고 나머지는 며칠에 걸쳐 했다. 위험한 것과 아닌 것을 가른 것이다.

한꺼번에 안 고치기로 했으니 잊지 않게 적었다.

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곳이었다. 한 자리에서 발견한 것이 다른 데도 있는지 세는 것은 지금이 싸다. 고치는 것을 나눈 것이지 찾는 것을 나눈 것이 아니었다.

적어 두기 시작하니 목록이 늘어 두 달 만에 마흔 개가 넘었다. 전부 고칠 수는 없어서 세 갈래로 나눴다. 위험한 것은 그 주에 하고 느린 것은 실제로 느려졌다는 말이 나올 때 하며 나머지는 그 파일을 다음에 열 때 같이 한다.

세 번째가 가장 많았다. 어차피 그 파일을 열게 되므로 그때 하나씩 처리하면 따로 시간을 안 낸다. 목록에 파일 이름을 적어 둔 것이 그래서 필요했다.

정리


Share this post on:

Previous Post
응답 헤더에 남은 횟수가 있었다
Next Post
옵션 조합이 폭발했다