Skip to content
isdnetworks
Go back

처음 짚은 원인이 아니었다

(수정됨)

목록이 안 나온다는 말을 듣고 바로 DB를 봤다. 두 시간을 거기서 썼는데 원인은 다른 데 있었다.

Table of contents

Open Table of contents

왜 DB부터 봤나

며칠 전에 DB 연결이 끊어져서 같은 증상이 났었다. 그래서 이번에도 그럴 것이라고 생각했다.

MySQL 에 붙어 세어 보니 수천 건 있고 연결도 된다. 그런데도 계속 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가 정상이라는 것이 세 번째 줄에 이미 있었다. 그런데도 한 시간을 더 거기서 썼다. 머릿속으로만 하면 이미 아닌 것으로 판명된 곳을 계속 다시 본다.

정리


Share this post on:

Previous Post
내 코드 때문인 줄 알았다
Next Post
SQL이 어디에도 없었다