예외 처리는 프로그램이 처리되는 동안 특정한 문제가 발생했을 때 처리를 중단하고 다른 처리를 하는 것으로 오류 처리라고도 한다. 웹 사이트를 이용하다가 주소를 잘못 입력하면 오류 페이지를 보게 된다. 이 페이지는 웹 서버가 제공하는 오류 페이지로 해당 페이지에 발생한 오류, 디렉터리 구조, 톰캣 버전 등의 정보가 나타나 있기 때문에 웹 보안이 취약하여 쉽게 해킹당 할 수 있다.
이와 같이 웹 애플리케이션 실행 도중에 발생할 수 있는 오류에 대비한 예외 처리 코드를 작성하여 비정상적인 종류를 막을 수 있다. 웹 애플리케이션에서 오류가 발생하더라도 정상적인 실행 상태를 유지하는 예외 처리 방법은 다음과 같다.
| 예외 처리 방법 | 설명 |
|---|---|
| page 디렉티브 태그를 이용한 예외 처리 | errorPage와 isErrorPage 속성을 이용한다. |
| web.xml 파일을 이용한 예외 처리 | <error-code> 또는 <exception-type> 요소를 이용한다. |
| try/catch/finally를 이용한 예외 처리 | 자바 언어의 예외 처리 구문을 이용한다. |
page 디렉티브 태그를 이용한 예외 처리는 page 디렉티브 태그에 errorPage 와 isErrorPage속성을 사용하여 오류 페이지를 호출하는 방법이다.
errorPage 속성은 오류 페이지를 호출하는 page 디렉티브 태그의 속성이다. JSP 페이지가 실행되는 도중에 오류가 발생하면 웹 서버의 기본 오류 페이지를 대신하여 errorPage 속성에 설정한 페이지가 오류 페이지로 호출된다.
<%@page errorPage="오류 페이지 URL" %>
<%@page contentType="text/html; charset=utf-8"%>
<%@page errorPage="error.jsp"%>
<html>
<head>
<title>Exception</title>
</head>
<body>
<%
String value=session.getAttrubute("id").toString();
%>
</body>
</html>
isErrorPage 속성은 현재 JSP 페이지를 오류 페이지로 호출하는 page 디렉티브 태그의 속성이다. 이때 오류 페이지에서 exception 내장 객체를 사용할 수 있다.
| 메소드 | 형식 | 설명 |
|---|---|---|
| getMessage() | String | 오류 이벤트와 함께 들어오는 메시지를 출력한다. |
| toString() | String | 오류 이벤트의 toString()을 호출하여 간단한 오류 메시지를 확인한다. |
| printStackTrace() | String | 오류 메시지의 발생 근원지를 찾아 단계별로 오류를 출력한다. |
다음은 현재 JSP 페이지가 오류 페이지가 되도록 page 디렉티브 태그에 isErrorPage 속성을 사용하는 예이다. 앞의 예에서 NullPointerException 오류가 발생하여 현재 JSP 페이지가 오류 페이지로 출력된다.
//error.jsp
<%@page contentType="text/html; charset=utf-8"%>
<%@page isErrorPage="true"%>
<html>
<head>
<title>Exception</title>
</head>
<body>
<p>오류가 발생하였습니다.
<p>예외 유형 : <%=exception.toString()%>
</body>
</html>
web.xml 파일을 이용한 예외 처리는 web.xml 파일을 통해 오류 상태와 오류 페이지를 보여주는 방법으로, <error-page>...</error-page>요소 내에 처리할 오류 코드나 오류 유형 및 오류 페이지를 호출한다. web.xml 파일은 웹 애플리케이션의 /WEB-INF/폴더에 있어야 한다.
<error-page>를 구성하는 하위 요소]| 요소 | 설명 |
|---|---|
<error-code> | 오류 코드를 설정하는 데 사용한다. |
<exception-type> | 자바 예외 유형의 정규화된 클래스 이름을 설정하는 데 사용한다. |
<location> | 오류 페이지의 URL을 설정하는 데 사용한다. |
오류 코드는 웹 서버가 제공하는 기본 오류 페이지에 나타나는 404, 500과 같이 사용자의 요청이 올바르지 않을 때 출력되는 코드로 응답 상태 코드라고도 한다. JSP 페이지에서 발생하는 오류가 web.xml 파일에 설정된 오류 코드와 일치하는 경우 오류 코드와 오류 페이지를 보여준다.
| 코드 | 설명 |
|---|---|
| 200 | 요청이 정상적으로 처린된다. |
| 307 | 임시로 페이지가 리다이렉트된다. |
| 400 | 클라이언트의 요청이 잘못된 구문으로 구성된다. |
| 401 | 접근이 허용되지 않는다. |
| 404 | 지정된 URL을 처리하기 위한 자원이 존재하지 않는다. |
| 405 | 요청된 메소드가 허용되지 않는다. |
| 500 | 서버 내부의 에러이다. |
| 503 | 서버가 일시적으로 서비스를 제공할 수 없다. |
다음은 오류 코드와 오류 페이지를 호출하는 예이다. 만약 사용자가 요청한 페이지가 없으면 404 오류가 발생하여 오류 페이지 errorCode_404.jsp를 출력한다. 또한 웹 페이지에서 10/0과 같이 잘못된 코드를 실행하는 경우 500오류가 발생하여 오류 페이지 errorCode_500.jsp를 출력한다.
<error-code> 사용 예]<web-app>
<error-page>
<error-code>404</error-code>
<location>/errorCode_404.jsp</location>
</error-page>
<error-page>
<error-code>500</error-code>
<location>/errorCode_500.jsp</location>
</error-page>
</web-app>
예외 유형에 따른 오류 페이지 호출 방법은 JSP 페이지가 발생시키는 오류가 web.xml 파일에 설정된 예외 유형과 일치하는 경우 예외 유형과 오류 페이지를 보여준다.
| 예외 유형 | 설명 |
|---|---|
| ClassNotFoundException | 클래스를 찾지 못했을 때 발생한다. |
| NullPointerException | null 오브젝트로 접근했을 때 발생한다. |
| ClassCastException | 변환할 수 있는 유형으로 객체를 변환할 때 발생한다. |
| OutOfMemoryException | 메모리 부족으로 메모리를 확보하지 못했을 때 발생한다. |
| StackOverflowError | 스택 오버플로일 때 발생한다. |
| ArrayIndexOutOfBoundException | 범위 밖의 배열 첨자를 설정했을 때 발생한다. |
| NegativeArraySizeException | 음스로 배열 크기를 설정했을 때 발생한다. |
| illegalArgumentException | 부적절한 문자열을 수치로 변환하려 할 때 발생한다. |
| IOException | 요청된 메소드가 허용되지 않을 때 발생한다. |
| NumberFormatException | 부적절한 문자열을 수치로 변환하려 할 때 발생한다. |
| ArithmeticException | 어떤 값을 0으로 나누었을 때 발생한다. |
<exception-type> 요소 사용 예]<web-app>
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/errorNullPointer.jsp</location>
</error-page>
</web-app>