목록이 안 나온다는 말을 듣고 바로 DB를 봤다. 두 시간을 거기서 썼는데 원인은 다른 데 있었다.
Table of contents
Open Table of contents
왜 DB부터 봤나
며칠 전에 DB 연결이 끊어져서 같은 증상이 났었다. 그래서 이번에도 그럴 것이라고 생각했다.
MySQL 에 붙어 세어 보니 3,412건 있고 연결도 된다. 그런데도 계속 DB 쪽만 봤다. DBCP 설정을 보고 쿼리를 직접 돌려 보고 로그를 뒤졌다.
한 번 맞았던 원인이 다음에도 맞을 것이라고 생각한 것이 문제였다. 앞의 경험이 이번 증상과 무슨 관계인지는 확인하지 않은 채로 그 방향만 팠다.
앞에서 뒤로 나눠 봤다
두 시간을 쓰고 나서 방식을 바꿨다. 짚지 않고 처음부터 순서대로 어디까지 정상인지 확인했다.
1. 화면이 뜨나 → 뜬다
2. 요청이 서버에 오나 → 로그에 있다
3. 컨트롤러가 불리나 → 불린다
4. 서비스와 DAO가 불리나 → 불린다
5. 쿼리가 나가나 → 나간다
6. 결과가 몇 건인가 → 20건
7. 화면에 몇 건 그리나 → 0건
6번과 7번 사이였다. DB가 아니었다.
JSP 를 열어 보니 꺼내는 이름과 컨트롤러가 넣은 이름이 달랐다. 컨트롤러는 boardList 로 넣었는데 <c:forEach items="${list}"> 로 꺼내고 있었다.
조용히 넘어가는 자리
EL 은 없는 이름을 꺼내면 null 로 두고 오류를 내지 않는다. <c:forEach> 는 items 가 null 이면 한 번도 안 돌고 그냥 끝난다.
오류가 났으면 바로 알았을 것이다. 아무 말 없이 빈 화면이 나오니 화면 쪽을 의심할 이유가 없었고 DB로 갔다. 조용히 넘어가는 자리가 있으면 그 앞뒤를 의심하게 된다는 것이 이 건에서 남았다.
개발 환경에서만 ${empty list} 일 때 HTML 주석으로 표시가 나게 뒀다. 운영에서는 안 보이고 개발할 때는 눈에 띈다.
적으면서 하니 보였다
다음에 또 이런 말을 들으면 어디부터 볼지 순서를 적어 뒀다. 재현되는지와 언제부터인지를 먼저 보고, 로그에 예외가 있는지 보고, 요청이 서버까지 오는지 보고, 어느 단계까지 값이 살아 있는지를 앞에서 뒤로 본다.
떠오르는 것부터 보지 않고 순서대로 보면 오래 걸릴 것 같은데, 짚어 보고 아니면 다시 짚는 것보다 빨랐다.
확인한 것을 적으면서 하는 것도 같이 넣었다. 이번에 적어 둔 것을 나중에 다시 읽어 보니 DB가 정상이라는 것이 세 번째 줄에 이미 있었다. 그런데도 한 시간을 더 거기서 썼다. 머릿속으로만 하면 이미 아닌 것으로 판명된 곳을 계속 다시 본다.
정리
- 처음 떠오른 원인부터 파면 시간을 더 쓴다
- 한 번 맞았던 원인이 다음에도 맞지는 않는다
- 짚지 말고 앞에서 뒤로 어디까지 정상인지 나눈다
- JSP는 없는 이름을 꺼내도 오류가 안 나고 빈 화면으로 나온다
- 조용히 넘어가는 자리가 있으면 엉뚱한 데를 의심하게 된다
- 개발 환경에서라도 그 자리가 보이게 둔다
- 볼 순서를 적어 둔다. 순서대로 보는 편이 짚어 보는 것보다 빨랐다
- 확인한 것을 적으면서 한다. 안 적으면 이미 아닌 곳을 또 본다