5 익셉션 처리
학습목표 웹 컴포넌트 실행 중에 발생하는 에러를 익셉션이라고 부른다. 이번 장에 서 웹 컴포넌트에서 발생하는 익셉션의 처리 방법을 배워 보자. 내용 웹 컴포넌트에서 발생하는 익셉션 처리 에러 페이지 만들어서 호출하기 web.xml 파일에 에러 페이지 등록하기
1. 웹 컴포넌트에서 발생하는 익셉션 처리 스탠드얼론 프로그램과 웹 컴포넌트에서의 익셉션 처리 방법 웹 서버와 무관하게 독립적으로 작동하는 스탠드얼론 프로그램에서는 try문을 이용해서 익셉션을 처리한다. [예제5-1] 두 수를 더하는 스탠드얼론 프로그램 public class Adder { public static void main(String args[]) { try { int num1 = Integer.parseInt(args[0]); int num2 = Integer.parseInt(args[1]); int result = num1 + num2; System.out.printf( “%d + %d = %d ”, num1, num2, result); } catch (NumberFormatException e) { System.out.println( “잘못된 데이터가 입력되었습니다. ”);
1. 웹 컴포넌트에서 발생하는 익셉션 처리 스탠드얼론 프로그램과 웹 컴포넌트에서의 익셉션 처리 방법 [예제5-2] 두 수를 더하는 서블릿 클래스 - 잘못된 구조 import javax.servlet.http.*; import javax.servlet.*; import java.io.*; public class AdderServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String str1 = request.getParameter( “NUM1 ”); String str2 = request.getParameter( “NUM2 ”); response.setContentType( “text/html;charset=euc-kr ”); PrintWriter out = response.getWriter(); try { int num1 = Integer.parseInt(str1); int num2 = Integer.parseInt(str2); int result = num1 + num2; out.println( “<HTML> ”); out.println( “<HEAD><TITLE>덧셈 프로그램</TITLE></HEAD> ”); out.println( “<BODY> ”); out.printf( “%d + %d = %d ”, num1, num2, result); out.println( “</BODY> ”); out.println( “</HTML> ”); } catch (NumberFormatException e) { out.println( “<HEAD><TITLE>덧셈 프로그램 - 에러 화면</TITLE></HEAD> ”); out.println( “잘못된 데이터가 입력되었습니다. ”);
1. 웹 컴포넌트에서 발생하는 익셉션 처리 스탠드얼론 프로그램과 웹 컴포넌트에서의 익셉션 처리 방법 [예제5-3] 두 수를 더하는 JSP 페이지 - 잘못된 구조 <%@page contentType= “text/html; charset=euc-kr ”%> <% try { String str1 = request.getParameter( “NUM1 ”); String str2 = request.getParameter( “NUM2 ”); int num1 = Integer.parseInt(str1); int num2 = Integer.parseInt(str2); int result = num1 + num2; %> <HTML> <HEAD><TITLE>덧셈 프로그램</TITLE></HEAD> <BODY> <%= num1 %> + <%= num2 %> = <%= result %> </BODY> </HTML> } catch (NumberFormatException e) { <HEAD><TITLE>덧셈 프로그램 - 에러 화면</TITLE></HEAD> 잘못된 데이터가 입력되었습니다.
2. 에러 페이지 만들어서 호출하기 JSP 페이지에서 에러 페이지 호출하기 [예제5-4] 두 수를 더하는 JSP 페이지 <%@page contentType= “text/html; charset=euc-kr ”%> <% int num1 = 0, num2 = 0, result = 0; try { String str1 = request.getParameter( “NUM1 ”); String str2 = request.getParameter( “NUM2 ”); num1 = Integer.parseInt(str1); num2 = Integer.parseInt(str2); result = num1 + num2; } catch (NumberFormatException e) { RequestDispatcher dispatcher = request.getRequestDispatcher( “DataError.jsp ”); dispatcher.forward(request, response); %> <HTML> <HEAD><TITLE>덧셈 프로그램</TITLE></HEAD> <BODY> <%= num1 %> + <%= num2 %> = <%= result %> </BODY> </HTML>
2. 에러 페이지 만들어서 호출하기 JSP 페이지에서 에러 페이지 호출하기 [예제5-5] 잘못된 데이터가 입력되었을 때 호출되는 에러 페이지 <%@page contentType= “text/html; charset=euc-kr ”%> <HTML> <HEAD><TITLE>덧셈 프로그램 - 에러 화면</TITLE></HEAD> <BODY> 잘못된 데이터가 입력되었습니다. </BODY> </HTML> [그림 5-4]를 호출하면서 URL 뒤에 데이터를 직접 쓰세요 정상적인 결과 이번에는 입력 데이터 중 하나를 수치가 아닌 값으로 쓰세요 에러가 발생했을 때의 결과 [그림 5-1] 예제 5-4, 5-5의 실행 결과
<%@page errorPage= “DataError.jsp ” %> 2. 에러 페이지 만들어서 호출하기 JSP 페이지에서 에러 페이지 호출하기 익셉션을 발생하는 JSP 페이지에서 page 지시자에 errorPage 애트리뷰트를 쓰고 URL 경로명을 지정해 놓으면, JSP 페이지 안에서 익셉션이 발생했을 때 그 URL 경로명 위치 에 있는 웹 자원이 호출된다. 애트리뷰트에 다음과 같은 값을 써 놓으면 에러가 발생했을 때 같은 디렉터리에 있는 DataError.jsp가 호출 된다. <%@page errorPage= “DataError.jsp ” %> 에러 페이지의 URL 경로명
2. 에러 페이지 만들어서 호출하기 JSP 페이지에서 에러 페이지 호출하기 [예제5-6] 두 수를 더하는 JSP 페이지 – page 지시자의 errorPage 애트리뷰트 사용 <%@page contentType= “text/html; charset=euc-kr ” errorPage= “DataError.jsp ” %> <% String str1 = request.getParameter( “NUM1 ”); String str2 = request.getParameter( “NUM2 ”); int num1 = Integer.parseInt(str1); int num2 = Integer.parseInt(str2); int result = num1 + num2; %> <HTML> <HEAD><TITLE>덧셈 프로그램</TITLE></HEAD> <BODY> <%= num1 %> + <%= num2 %> = <%= result %> </BODY> </HTML>
2. 에러 페이지 만들어서 호출하기 JSP 페이지에서 에러 페이지 호출하기 exception 내장 변수를 사용하기 위해 먼저 해야 할 일: JSP 페이지에는 기본적으로 exception 내장 변수가 생기지 않기 때문에, page 지시자에 isErrorPage라는 애트리뷰트 를 쓰고 true 값을 지정해야 한다. exception 내장 변수는 일반 자바 프로그램에서 익셉션 객체를 표현할 때 사용하는 것과 동일한 java.lang.Throwable 클래스 타입이기 때문에, 이 내장 변수에 대해 getMessage 메서드를 호출하면 에러 메시지를 가져올 수 있다. <%@page isErrorPage= “true ” %> exception 내장 변수가 생기도록 만드는 애트리뷰트 값 String message = exception.getMessage(); 에러 메시지를 가져오는 메서드
2. 에러 페이지 만들어서 호출하기 JSP 페이지에서 에러 페이지 호출하기 [예제5-7] 잘못된 입력 데이터를 처리하는 에러 페이지 - 미완성 <%@page contentType= “text/html; charset=euc-kr” isErrorPage= “true” %> <HTML> <HEAD><TITLE>덧셈 프로그램 - 에러 화면</TITLE></HEAD> <BODY> 잘못된 데이터가 입력되었습니다. <BR><BR> 상세 에러 메시지: <%= exception.getMessage() %> </BODY> </HTML>
2. 에러 페이지 만들어서 호출하기 JSP 페이지에서 에러 페이지 호출하기 [그림 5-3] 예제 5-6, 5-7의 실행 결과(1) [그림 5-3] 예제 5-6, 5-7의 실행 결과(2)
2. 에러 페이지 만들어서 호출하기 JSP 페이지에서 에러 페이지 호출하기 [그림 5-4]는 웹 브라우저에 내장되어 있는 에러 표시용 웹 페이지이며, 이런 결과가 나 오는 이유는 [예제 5-7]이 생성한 HTML 문서와 함께 웹 브라우저로 전달된 HTTP 상 태 코드 때문이다. HTTP 상태 코드란 HTTP 응답 메시지의 시작 행에 표시되는 3자리의 숫자인데, 메시지 에 포함된 HTML 문서가 정상적인 실행의 결과인지 에러 발생의 결과인지 구분하는 역 할을 한다.
2. 에러 페이지 만들어서 호출하기 JSP 페이지에서 에러 페이지 호출하기 [그림 5-5] HTTP 응답 메시지의 상태 코드
response.setStatus(200); 2. 에러 페이지 만들어서 호출하기 JSP 페이지에서 에러 페이지 호출하기 웹 브라우저는 상태 코드 값이 500이면 HTTP 응답 메시지에 포함된 HTML 문서의 내 용을 무시하고 웹 브라우저 자체에 내장된 에러 메시지를 출력한다. 인위적으로 HTTP 상태 코드의 값을 200으로 바꿔주기 위해서는 response 내장 변수에 대해 setStatus라는 메서드를 호출하면서 200이라는 파라미터값을 넘겨주면 된다. response.setStatus(200); HTTP 상태 코드 [예제5-8] 잘못된 입력 데이터를 처리하는 에러 페이지 - 완성 <%@page contentType= “text/html; charset=euc-kr” isErrorPage= “true ” %> <% response.setStatus(200); %> <HTML> <HEAD><TITLE>덧셈 프로그램 - 에러 발생</TITLE></HEAD> <BODY> 잘못된 데이터가 입력되었습니다. <BR><BR> 상세 에러 메시지: <%= exception.getMessage() %> </BODY> </HTML>
2. 에러 페이지 만들어서 호출하기 서블릿 클래스에서 에러 페이지 호출하기 [예제5-9] 두 수를 더하는 서블릿 클래스 import javax.servlet.http.*; import javax.servlet.*; import java.io.*; public class NewAdderServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { try { String str1 = request.getParameter( “NUM1 ”); String str2 = request.getParameter( “NUM2 ”); int num1 = Integer.parseInt(str1); int num2 = Integer.parseInt(str2); int result = num1 + num2; response.setContentType( “text/html;charset=euc-kr ”); PrintWriter out = response.getWriter(); out.println( “<HTML> ”); out.println( “<HEAD><TITLE>덧셈 프로그램</TITLE></HEAD> ”); out.println( “<BODY> ”); out.printf( “%d + %d = %d ”, num1, num2, result); out.println( “</BODY> ”); out.println( “</HTML> ”); } catch (NumberFormatException e) { RequestDispatcher dispatcher = request.getRequestDispatcher( “data-error ”); dispatcher.forward(request, response);
2. 에러 페이지 만들어서 호출하기 서블릿 클래스에서 에러 페이지 호출하기 [예제5-10] 에러 메시지를 출력하는 서블릿 클래스 import javax.servlet.http.*; import javax.servlet.*; import java.io.*; public class DataErrorServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType( “text/html;charset=euc-kr ”); PrintWriter out = response.getWriter(); out.println( “<HTML> ”); out.println( “<HEAD><TITLE>덧셈 프로그램 - 에러 화면</TITLE></HEAD> ”); out.println( “<BODY> ”); out.println( “잘못된 데이터가 입력되었습니다. ”); out.println( “</BODY> ”); out.println( “</HTML> ”); return; }
2. 에러 페이지 만들어서 호출하기 서블릿 클래스에서 에러 페이지 호출하기 [그림 5-6] 예제 5-9 예제 5-10의 설치 및 등록 방법
2. 에러 페이지 만들어서 호출하기 서블릿 클래스에서 에러 페이지 호출하기 ①[그림 5-9]를 호출하면서 URL 뒤에 데이터를 직접 쓰세요. ②입력 데이터 중 하나를 수치가 아닌 값으로 쓰세요.
3. web.xml 파일에 에러 페이지 등록하기 익셉션 타입별로 에러 페이지를 등록하는 방법 web.xml 파일에는 타입별로 에러 페이지를 등록해 놓을 수 있다. 그 web.xml 파일이 속 하는 웹 애플리케이션 디렉터리 안에서 해당 타입의 익셉션이 발생하면 자동으로 등록 된 에러 페이지가 호출된다. web.xml 파일의 루트 엘리먼트인 <web-app> 엘리먼트 안에 <error-page>라는 서브엘리 먼트를 쓰고, 다시 그 안에 <exception-type>과 <location>이라는 두 개의 서브엘리먼트 를 쓴다. 익셉션의 타입 <web-app ... > ... <error-page> <exception-type>java.lang.NumberFormatException</exception-type> <location>/NumberFormatError.jsp</location> </error-page> </web-app> 에러 페이지의 URL 경로명
3. web.xml 파일에 에러 페이지 등록하기 익셉션 타입별로 에러 페이지를 등록하는 방법 [예제5-11] 두 수의 곱을 구하는 JSP 페이지 – java.lang.NumberFormatException 발생 가능 <%@page contentType= “text/html; charset=euc-kr ”%> <% String str1 = request.getParameter( “NUM1 ”); String str2 = request.getParameter( “NUM2 ”); int num1 = Integer.parseInt(str1); int num2 = Integer.parseInt(str2); int result = num1 * num2; %> <HTML> <HEAD><TITLE>곱셈 프로그램</TITLE></HEAD> <BODY> <%= num1 %> * <%= num2 %> = <%= result %> </BODY> </HTML>
3. web.xml 파일에 에러 페이지 등록하기 익셉션 타입별로 에러 페이지를 등록하는 방법 [예제5-12] 두 수의 몫을 구하는 JSP 페이지 – java.lang.NumberFormatException 발생 가능 <%@page contentType= “text/html; charset=euc-kr ”%> <% String str1 = request.getParameter( “NUM1 ”); String str2 = request.getParameter( “NUM2 ”); int num1 = Integer.parseInt(str1); int num2 = Integer.parseInt(str2); int result = num1 / num2; %> <HTML> <HEAD><TITLE>나눗셈 프로그램</TITLE></HEAD> <BODY> <%= num1 %> / <%= num2 %> = <%= result %> </BODY> </HTML>
3. web.xml 파일에 에러 페이지 등록하기 익셉션 타입별로 에러 페이지를 등록하는 방법 예제 5-11, 12, 13을 brain05 웹 애플리케이션 디렉터리에 각각 Multiplyer.jsp Divider.jsp, NumberFormatError.jsp라는 이름으로 저장한다. brain05 웹 애플리케이션 디렉터리의 WEB-INF 서브디렉터리로 가서 web.xml파일을 열 고 <error-page> 엘리먼트를 추가한다. [예제5-13] java.lang.NumberFormatException이 발생했을 때 호출되는 에러 페이지 <%@page contentType=“text/html; charset=euc-kr” isErrorPage=“true ” %> <% response.setStatus(200); %> <HTML> <HEAD><TITLE>숫자 포맷 에러</TITLE></HEAD> <BODY> 숫자 포맷이 잘못되었습니다. <BR><BR> 상세 에러 메시지: <%= exception.getMessage() %> </BODY> </HTML>
3. web.xml 파일에 에러 페이지 등록하기 익셉션 타입별로 에러 페이지를 등록하는 방법
3. web.xml 파일에 에러 페이지 등록하기 익셉션 타입별로 에러 페이지를 등록하는 방법 ①[예제 5-11]을 실행하면서 입력 데이터 중 하나를 수치가 아닌 값으로 쓰세요. ②[예제 5-12]을 실행하면서 입력 데이터 중 하나를 수치가 아닌 값으로 쓰세요
[그림 5-11] web.xml 파일에 여러 개의 에러 페이지를 등록하는 방법 익셉션 타입별로 에러 페이지를 등록하는 방법 web.xml 파일에는 여러 타입의 익셉션에 대한 에러 페이지를 함께 등록할 수도 있다. 새로 추가한 <error-page> 엘리먼트 [그림 5-11] web.xml 파일에 여러 개의 에러 페이지를 등록하는 방법 [예제5-14] java.lang.ArithmeticException이 발생했을 때 호출되는 에러 페이지 <%@page contentType=“text/html; charset=euc-kr” isErrorPage=“true” %> <% response.setStatus(200); %> <HTML> <HEAD><TITLE>산술 연산 에러</TITLE></HEAD> <BODY> 산술 연산 도중에 에러가 발생했습니다. <BR><BR> 상세 에러 메시지: <%= exception.getMessage() %> </BODY> </HTML>
3. web.xml 파일에 에러 페이지 등록하기 익셉션 타입별로 에러 페이지를 등록하는 방법 brain05 웹 애플리케이션 디렉터리에 ArithmeticError.jsp라는 이름으로 저장한다. 서블릿 클래스에서 발생하는 익셉션도 web.xml에 등록한 에러 페이지를 이용해서 처리 할 수 있다. [예제 5-12]을 실행하면서 두 번째 입력 데이터를 0으로 쓰세요 [그림 5-12] 예제 5-12, 예제 5-14의 실행 결과
3. web.xml 파일에 에러 페이지 등록하기 익셉션 타입별로 에러 페이지를 등록하는 방법 [예제5-15] 두 수의 몫을 구하는 서블릿 클래스 import javax.servlet.http.*; import javax.servlet.*; import java.io.*; public class DividerServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String str1 = request.getParameter( “NUM1 ”); String str2 = request.getParameter( “NUM2 ”); int num1 = Integer.parseInt(str1); int num2 = Integer.parseInt(str2); int result = num1 / num2; response.setContentType( “text/html;charset=euc-kr ”); PrintWriter out = response.getWriter(); out.println( “<HTML> ”); out.println( “<HEAD><TITLE>나눗셈 프로그램</TITLE></HEAD> ”); out.println( “<BODY> ”); out.printf( “%d / %d = %d ”, num1, num2, result); out.println( “</BODY> ”); out.println( “</HTML> ”); }
3. web.xml 파일에 에러 페이지 등록하기 익셉션 타입별로 에러 페이지를 등록하는 방법 [그림 5-13] 예제 5-15의 설치 및 등록 방법
3. web.xml 파일에 에러 페이지 등록하기 ① [예제 5-15]를 실행하면서 숫자가 아닌 데이터를 입력하세요 [예제 5-15]를 실행하면서 두 번째 데이터로 0을 쓰세요. [그림 5-14] 예제 5-15의 실행 결과
[그림 5-15] URL에 해당하는 웹 자원이 없을 때 톰뱃이 출력하는 에러 페이지 3. web.xml 파일에 에러 페이지 등록하기 HTTP 상태 코드별로 에러 페이지를 등록하는 방법 톰캣은 웹 브라우저로부터 받은 URL에 해당하는 웹 자원이 없으면 다음과 같은 웹 페이 지를 만들어서 웹 브라우저로 보낸다. 위 404라는 숫자는 URL에 해당하는 웹 자원이 없을 때 웹 서버가 발생시키는 HTTP 상 태 코드이다. [그림 5-15] URL에 해당하는 웹 자원이 없을 때 톰뱃이 출력하는 에러 페이지
3. web.xml 파일에 에러 페이지 등록하기 HTTP 상태 코드별로 에러 페이지를 등록하는 방법 web.xml 파일에는 상태 코드 별로 에러 페이지를 등록할 수 있다. 방법은 web.xml 파일 의 루트 엘리먼트 아래에 <error-page>라는 서브엘리먼트를 쓰고, 그 안에 다시 <error- code>와 <location>이라는 두 개의 서브엘리먼트를 쓰는 것이다. HTTP 상태 코드 <web-app ... > ... <error-page> <error-code>404</error-code> <location>/NotFoundError.jsp</location> </error-page> </web-app> 에러 페이지의 URL 경로명
[그림 5-16] web.xml파일에 404 상태 코드에 대한 에러 페이지를 등록하는 방법 HTTP 상태 코드별로 에러 페이지를 등록하는 방법 위 예제를 brain05 웹 애플리케이션 디렉터리에 NotFoundError.jsp라는 이름으로 저장 후 web.xml 파일에 다음과 같은 <error-page> 엘리먼트를 추가한다. [예제5-16] 404 에러를 처리하는 에러 페이지 <%@page contentType= “text/html; charset=euc-kr ” %> <% response.setStatus(200); %> <HTML> <HEAD><TITLE>페이지 없음 에러</TITLE></HEAD> <BODY> 해당 페이지를 찾을 수 없습니다. </BODY> </HTML> 새로 추가한 <error-page> 엘리먼트 [그림 5-16] web.xml파일에 404 상태 코드에 대한 에러 페이지를 등록하는 방법
3. web.xml 파일에 에러 페이지 등록하기 HTTP 상태 코드별로 에러 페이지를 등록하는 방법 웹 브라우저의 주소 창에 brain05 웹 애플리케이션 디렉터리 내에 존재하지 않는 웹 자 원의 URL을 입력한다. 웹 컴포넌트 안에서 익셉션이 발생했을 때 발생하는 500이라는 HTTP 상태 코드에 대 한 에러 페이지도 등록할 수 있다. brain05 웹 애플리케이션 디렉터리에 없는 웹 자원의 URL을 입력하세요 HTTP 상태 코드 <web-app ... > ... <error-page> <error-code>500</error-code> <location>/ServerInternalError.jsp</location> </error-page> </web-app> 에러 페이지의 URL 경로명
[그림 5-18] web.xml 파일에 500 상태 코드에 대한 에러 페이지를 등록하는 방법 HTTP 상태 코드별로 에러 페이지를 등록하는 방법 위 예제를 brain05 웹 애플리케이션 디렉터리에 ServerInternalError.jsp라는 이름으로 저장한 후 web.xml 파일에 다음과 같은 <error-page> 엘리먼트를 추가한다. [예제5-17] 500 에러를 처리하는 JSP 페이지 <%@page contentType= “text/html; charset=euc-kr ” %> <%response.setStatus(200);%> <HTML> <HEAD><TITLE>웹 서버 에러</TITLE></HEAD> <BODY> 웹 서버 내부에서 에러가 발생했습니다. </BODY> </HTML> [그림 5-18] web.xml 파일에 500 상태 코드에 대한 에러 페이지를 등록하는 방법
3. web.xml 파일에 에러 페이지 등록하기 HTTP 상태 코드별로 에러 페이지를 등록하는 방법 [예제5-18] 소수를 출력하는 JSP 페이지 <%@page contentType= “text/html; charset=euc-kr ” %> <% String str = request.getParameter( “NUM ”); int num = Integer.parseInt(str); %> <HTML> <HEAD><TITLE>소수</TITLE></HEAD> <BODY> int arr[] = { 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 }; for (int cnt = 0; cnt < num; cnt++) out.println(arr[cnt]); </BODY> </HTML>
3. web.xml 파일에 에러 페이지 등록하기 HTTP 상태 코드별로 에러 페이지를 등록하는 방법 웹 서버는 웹 컴포넌트 안에서 발생하는 모든 익셉션에 대해 500이라는 상태 코드를 발 생하기 때문에 500 상태 코드에 대한 에러 페이지는 웹 컴포넌트 안에서 발생한 모든 익 셉션에 대해 적용 된다. ① [예제 5-18]을 호출하면서 출력할 소수의 개수를 입력하세요 ②이번에는 소수의 개수를 10보다 큰 값으로 입력하세요.. [그림 5-19] 예제 5-18의 실행 결과