이번에 알아볼 내용은 에러처리이다. 우리가 가장 싫어하는 에러!
흔히 우리가 웹 사이트를 이용하다가 주소를 잘못 입력하거나 값을 잘못 넘기면 에러페이지를 만나게 되는데, 그 페이지들을 구성하고 에러에 따라 분류하는 방법을 알아보려 한다.
에러 페이지 지정하기
JSP 공부를 하면서 예외가 발생할 경우 톰캣 서버는 다음과 비슷한 형식의 에러 페이지를 출력한다.
아..끔찍하다..
이거보다는 좀더 보기좋고 친숙한 에러화면을 보여주는 것이 좋을 듯 하다. 그러한 이유로 에러페이지를 따로 만드는 것이다.
JSP에서는 예외가 발생한 경우 에러 화면 대신 지정한 JSP 페이지를 보여줄 수 있는 기능을 제공한다.
page 디렉티브의 errorPage 속성을 이용하여 지정해주면 된다. 기본 문법은 다음과 같다.
▶ <%@ page errorPage = "이동할 에러페이지" %>
예제를 하나 만들어서 확인해보자.
toUpperCase()는 파라미터 값을 대문자로 변환하여 출력하는데, name 파라미터가 존재하지 않을 경우 예외가 발생한다. page 디렉티브에서 지정한 경로에 에러페이지를 만들어주고 실행하면 예외발생시 지정한 에러페이지가 출력된다.
에러페이지 작성하기
에러페이지에 해당하는 JSP 페이지는 page 디렉티브의 isErrorPage 속성값을 'true'로 지정해 주어야 한다. 이렇게 하면 지정한 JSP 페이지는 에러페이지가 되고 exception 기본 객체(에러페이지에서만 사용가능)를 사용할 수 있다.
앞서 살펴본 예제의 에러페이지에 exception 기본 객체를 사용하여 출력해보면
아젠장..또오류다..
IE에서만 이러한 오류가 나타나는데 원인은 다음과 같다.
▶ 응답의 상태 코드가 404 나 500 과 같은 에러코드일 경우
▶ 전체 응답 결과 데이터의 길이가 513 바이트보다 작을 때
* 에러페이지의 데이터 길이가 513 바이트를 약간 넘게하여 테스트해본 결과 IE 에서의 출력 결과가 나타났다. 크게 할거면 확실히 크게 해줘야 지정한 에러페이지가 출력된다.
다음과 같이 에러페이지를 수정해줘서 하면 잘 출력된다. 이미지를 첨부해도 좋고 어떠한 방법이든 513 바이트를 넘기면 된다.
응답 상태 코드별로 에러페이지 지정하기
톰캣 서버에서 제공하는 에러페이지를 보면 404나 500 처럼 에러코드를 명시해준다. 이렇나 에러코드를 web.xml 에 에러페이지와 함께 지정해 줄 수 있다.
다음과 같이 태그를 추가해주면 된다.
<error-page>
<error-code>에러코드</error-code>
<location>에러페이지의 URI</location>
</error-page>
404 에러코드를 지정해보자.
위와같이 web.xml 에 지정해주고 잘못된 URL을 입력하면 다음과 같이 지정한 에러페이지가 출력된다.
추가로 주요 응답 상태 코드를 알아보자.
200 |
요청이 정상적으로 처리됨. |
307 |
임시로 페이지가 리다이렉트됨. |
400 |
클라이언트의 요청이 잘못된 구문으로 구성됨. |
401 |
접근이 허용되지 않음. |
404 |
지정된 URL을 처리하기 위한 자원이 존재하지 않음. (페이지가 없음) |
405 |
요청된 메서드가 허용되지 않음 |
500 |
서버 내부 에러. (JSP에서 예외가 발생하는 경우) |
503 |
서버가 일시적으로 서비스를 제공할 수 없음. (서버 과부하이거나 보수중인 경우) |
예외 타입별로 에러 페이지 지정하기
예외 종류에 따라서 에러 페이지를 지정하는 것도 에러 코드별 에러 페이지를 지정했던 것과 거의 동일한 방법이다. 우선 기본 문법을 보자.
<error-page>
<exception-type>예외타입</exception-type>
<location>예외페이지의 URI</location>
</error-page>
아래와 같이 web.xml 파일을 설정해주고 다음 두개의 페이지를 만들어서 실행해보자.
다음과 같은 결과가 출력되면 정상적으로 실행된 것이다.
에러 페이지의 우선순위 및 에러페이지 지정 형태
다음과 같은 우선순위에따라 사용할 에러페이지를 선택하면 된다.
① page 디렉티브의 errorPage 속성에서 지정한 에러페이지를 보여준다.
② JSP 페이지에서 발생한 예외 타입이 web.xml 에서 지정한 예외 타입과 동일한 경우 지정한 페이지를 출력한다.
③ JSP 페이지에서 발생한 에러 코드가 web.xml 에서 지정한 에러 코드와 동일한 경우 지정한 페이지를 출력한다.
④ 아무것도 해당되지 않을 경우 웹 컨테이너가 제공하는 기본 에러페이지를 출력한다.
출력 버퍼와 에러 페이지의 관계
최초로 버퍼가 플러시 될 때 응답 헤더가 전송된다고 했는데, 응답 헤더에서 응답 상태 코드가 가장 먼저 전송된다.
따라서, 버퍼가 최초로 플러시 될 때까지 에러가 발생하지 않을 경우 200 응답 상태 코드가 전송된다.
이러한 이유로 응답 코드 및 에러 페이지의 내용이 잘 전송되기 위해서는 버퍼가 플러시되면 안된다. 다음 그림을 통해 이해해보자.
버퍼의 크기를 줄이고 테스트해보면 일부 내용이 플러시 되어 웹 브라우저에 전송된 뒤 예외가 발생하는 것을 확인할 수 있다. 따라서, 버퍼의 크기를 늘려주어 에러가 발생하기 전에 버퍼가 플러시되지 않도록 해주어야 한다.
여기까지 에러와 그에 따른 처리방법에 대해 알아보았으며 계속 이어서 포스팅 해나가도록 하겠다.