01. 예외 처리의 개요
예외 처리는 프르그램이 처리되는 동안 특정한 문제가 발생했을 때 처리를 중단하고 다른 처리를 하는것으로 오류 처리라고도 합니다. 웹사이트를 이용하다가 주소를 잘못 입력하면 오류 페이지를 보게 됩니다. 이페이지는 웹 서버가 제공하는 오류 페이지로 해당 페이지에 발생한 오류, 디렌터리 구조, 톰캣 버전 등의 정보가 나타나 있기 때문에 웹 보안이 취약하여 쉽게 해킹당할 수 있습니다.
이와 같이 웹 애플리케이션 실행 도중에 발생할 수 있는 오류에 대비한 예외 처리 코드를 작성하여 비정상적인 종료를 막을 수 있습니다. 웹 애플리케이션에서 오류가 발생하더라도 정상적인 실행 상태를 유지하는 에외 처리 방법은 다음과 같습니다.
예외 처리 방법의 종류
예외 처리 방법 | 설명 |
page 디렉티브 태그를 이용한 예외 처리 | errorPage 와 isErroPage속성을 이용한다. |
web.xml 파일을 이용한 예외 처리 | <error-code> 또는 <exceprion-type>요소를 이용한다. |
rty/catch/finally를 이용한 예외처리 | 자바 언어의 예외 처리 구문을 이용한다. |
NOTE_예외 처리 방법의 우선순위
하나의 웹 애플리케이션에 page디렉티브 태그, web.xml 파일, try/catch/finally 등의 예외 처리 방법을 모두 사용 할 때 다음과 같은 우선순위에 따라 오류 페이지가 호출된다.
1.JSP페이지에서 try-catch-rinally 문으로 처리하는 경우 발생한 오류를 출력한다. -> 2. page디렉티브 태그의 erroPage 속성에서 설정한 오류페이지를 출력한다. ->3.JSP페이지에서 발생한 예외 유형이 web.xml 파일에서 설정한 예외 유형과 동일한 경우 설정한 오류 페이지를 출력한다. ->4.JSP 페이지에서 발생한 오류 코드가 web.xml 파일에서 설정한 오류 코드와 동일한 경우 설정한 오류 페이지를 출력한다. -> 5. 이러한 항목에 해당되지 않는 경우 웹 서버가 제공하는 기본 오류 페이지를 출력한다.
02 page 디렉티브 태그를 이용한 예외 처리
page 디렉티브 태그를 이용한 예외 처리는 page 디렉티브 태그에 erroPage 와 isErroPage 속성을 사용하여 오류 페이지를 호출하는 방법이다.
2.1 erroPage 속성으로 오류 페이지 호출하기
erroPage 속성은 오류 페이지를 호출하는 page 디렉티브 태그의 속성을 ㅗ형식은 다음과 같다. JSP 페이지가 실행되는 도중에 오류가 발생하면 웹 서버의 기본 오류 페이지를 대신하여 erroPage 속성에 설정한 페이지가 오류 페이지로 호출된다.
<%@ page errorPage = "오류 페이지 URL">
[page 디렉티브 태그에 erroPage속성을 이용하여 오류 페이지 호출하기]
errorPage.jsp
<%@ page contentType="text/html; charset=utf-8"%>
<%@ page errorPage="errorPage_error.jsp"%> <!-- JSP페이지가 실행되는 도중에 오류가 발생하면 오류 페이지를 호출하도록 작성 -->
<html>
<head>
<title>Exception</title>
</head>
<body>
name 파라미터 : <%=request.getParameter("name").toUpperCase() %><!-- toUpperCase()메소드는 파라미터 값을 대문자로 변환하여 출력한다.
이떄 파라미터 name이 존재하지 않아서 오류가 발생한다. -->
</body>
</html>
errorPage_error.jsp
<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>Exception</title>
</head>
<body>
오류가 발생했습니다.!
</body>
</html>
2.2 isErrorPage속성으로 오류 페이지 만들기
isErrorPAge속성은 현재JSP페이지를 오류 페이지로 호출하는 page디렉티브 태그의 속성으로 형식은 다음과 같습니다. 이때 오류 페이지에서 exception 내장객체를 사용할 수 있다.
<%@ page isErrorPage = " true " %>
exception 내장 객체 메소드
메소드 | 형식 | 설명 |
getMessage() | String | 오류 이벤트와 함께 들어오는 메시지를 출력한다. |
toString() | String | 오류 이벤트의 toString()을 호출하여 간단한 오류 메시지를 확인한다. |
printStackTrace() | String | 오류 메시지의 발생 근원지를 찾아 단계별로 오류를 출력한다. |
다음은 현재 JSP페이지가 오류 페이지가 되도록 page 디렉티브 태그에 isErrorPage속성을 사용하는 예이다. 앞의 예에서 NullPointerException 오류가 발생하여 현재 JSP 페이지가 오류 페이지로 출력된다.
isErrorPage.jsp
<%@ page contentType="text/html; charset=utf-8"%>
<%@ page errorPage="isErrorPage_error.jsp"%> <!-- JSP페이지가 실행되는 도중에 오류가 발생하면 오류 페이지를 호출하도록 작성 -->
<html>
<head>
<title>Exception</title>
</head>
<body>
name 파라미터 : <%=request.getParameter("name").toUpperCase() %><!-- toUpperCase()메소드는 파라미터 값을 대문자로 변환하여 출력한다.
이떄 파라미터 name이 존재하지 않아서 오류가 발생한다. -->
</body>
</html>
isErrorPage_error.jsp
<%@ page contentType="text/html; charset=utf-8"%>
<%@ page isErrorPage="true" %>
<html>
<head>
<title>Exception</title>
</head>
<body>
<p> 오류가 발생하였습니다.
<p> 예외 유형 : <%=exception.getClass().getName() %> <!-- 오류가 발생했을 때 해당 예외 객체타입을 가져와 출력하도록 표현문태그에
exception 내장객체의 getClass().getName()메소드를 작성. -->
<p> 오류 메시지 : <%= exception.getMessage() %><!-- 오류가 발생했을 때 오류 메시지를 가져와 출력하도록 표현문 태그에 exception 내장 객체의
getMessage()메소드를 작성. -->
</body>
</html>
03 web.xml파일을 이용한 예외 처리
web.xml 파일을 이용한 예외 처리는 web.xml파일을 통해 오류 상태와 오류 페이지를 보여주는 방법으로, <error-page>...</error-page> 요소 내에 처리할 오류 코드나 오류 유형 및 오류 페이지를 호출하며 형식은 다음과 같다.
<error-page>
<error-code>...</error-code>|<exception-type>...</error-exception-type>
<location>...</location>
</error-page>
<error-page>를 구성하는 요소
요소 | 설명 |
<error-code> | 오류 코드를 설정하는 데 사용한다. |
<exception-type> | 자바 예외 유형의 정규화된 클래스 이름을 설정하는 데 사용한다. |
<location> | 오류 페이지의 URL을 설정하는 데 사용한다. |
3.1 오류 코드로 오류 페이지 호출하기
오류코드는 웹 서버가 제공하는 기본 오류 페이지에 나타나는 404, 500 과 같이 사용자의 요청이 올바르지 않을 때 출력되는 코드로 응답상태 코드라고 한다. JSP페이지에서 발생하는 오류가 web.xml 파일에 설정된 오류 코드와 일치하는 경우 오류 코드와 오류 페이지를 보여준다. web.xml 파일에 오류 코드와 오류 페이지를 설정하는 형식은 다음과 같다.
<error-page>
<error-code>오류 코드</error-code>
<location>오류 페이지의 URL </location>
</error-page>
주요 오류 코드의 종류
200 : 요청이 정상적으로 잘 처리된다.
307 : 임시로 페이지가 리다이렉트 된다.
400 : 클라이언트의 요청이 잘못된 구문으로 구성된다.
401 : 접근이 허용되지 않는다.
404 : 지정된 URL 을 처리하기 위한 자원이 존재하지 않는다. (페이지가 없음)
405 : 요청된 메소드가 허용되지 않는다.
500 : 서버 내부의 에러이다. (jsp에서 예외가 발생하는 경우)
503 : 서버가 일시적으로 서비스를 제공할 수 없다. (서버 과부하나 보수 중인 경우)
3.2 예외 유형으로 오류 페이지 호출하기
예외 유형에 따른 오류 페이지 호출방법은 JSP 페이지가 발생시키는 오류가 web.xml파일에 설정된 예외 유형과 일치하는 경우 예외 유형과 오류 페이지를 보여준다. web.xml 파일에 예외 유형과 오류 페이지를 설정하는 형식은 다음과 같다.
<error-page>
<exception-type>예외 유형</exception-type>
<location>오류 페이지의 URL </location>
</error-page>
주요 예외 유형의 종류
예외 유형 | 설명 |
ClassNotFoundException | 클래스를 찾지 못했을 떄 발생한다. |
NullPointerException | null 오브젝트로 접그 했을 때 발생한다. |
ClassCastException | 변환할 수 있는 유형으로 객체를 변환할 대 발생한다. |
OutOrMemoryException | 메모리 부족으로 메모리를 확보하지 못했을 때 발생한다. |
StackOverflowError | 스택 오버플로일 떄 발생한다. |
ArrayIndexOutOfBoundException | 범위 밖의 배열 첨자를 설정했을 때 발생한다. |
NegativeArraySizeException | 음수로 배열 크기를 설정했을 때 발생한다. |
illegalArgumentException | 부적절한 문자열을 수치로 변환하려 할 때 발생한다. |
IOException | 요청된 메소드가 허용되지 않을 때 발생한다. |
NumberFormatException | 부적잘한 문자열을 수치로 변환하려 할 때 발생한다. |
AritmeticException | 어떤 값을 0으로 나누었을 때 발생한다. |
다음은 예외 유형과 오류 페이지를 호출하는 예이다. 웹페이지 처리과정에서 null예외가 발생했을 때 예외 유형 java.lang.NullPointerException과 오류 페이지 errorNullPointer.jsp를 출력한다.
[<exception-type>요소 사용 예 ]
<error-page>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/errorNullPointer.jsp</location>
</error-page>
04 try-catch-finally 를 이용한 예외 처리
try-catch-finally 는 자바의 예외 처리 구문으로 스크립틀릿 태그에 작성하며 형식은 다음과 같다. try구문에는 예외가 발생할 수 있는 코드를 작성하고, catch구문에는 오류가 발생할 수 있는 예외 사항을 예측하여 오류를처리하는 코드를 작성한다. 그리고 finally구문에는 try구문이 실행 된 후 실행할 코드를 작성하는데 이는 생략할 수 있다.
try{
//예외가 발생할 수 있는 실행문
}
catch{
//예외 처리문
}
[finally{
//예외와 상관없이 무조건 실행되는 문장 (생략가능 )
}]
[try-catch-finally 를 이용하여 예외 처리하기]
tryCatch.jsp
<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>Exception</title>
</head>
<body>
<form action="tryCatch_process.jsp" method="post">
<p>숫자1 : <input type="text" name="num1">
<p>숫자2 : <input type="text" name="num2">
<p><input type="submit" value="submit">
</form>
</body>
</html>
tryCatch_process.jsp
<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>Exception</title>
</head>
<body>
<%
try{
String num1 = request.getParameter("num1");
String num2 = request.getParameter("num2");
int a = Integer.parseInt(num1);
int b = Integer.parseInt(num2);
int c = a / b;
} catch(NumberFormatException e){
RequestDispatcher dispatcher = request.getRequestDispatcher("tryCatch_error.jsp");
dispatcher.forward(request, response);
}
%>
</body>
</html>
tryCatch_error.jsp
<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>Exception</title>
</head>
<body>
<p>잘못된 데이터가 입력되었습니다.
<p> <%= " 숫자1 : "+request.getParameter("num1") %>
<p> <%= " 숫자2 : "+request.getParameter("num2") %>
</body>
</html>
'JSP, Servlet, MySQL > JSP - webmarket' 카테고리의 다른 글
JSP Servlet 필터 : 로그 기록하기 (0) | 2024.01.14 |
---|---|
JSP Servlet 예외 처리 : 예외 처리 페이지 만들기 -2 (2) | 2024.01.13 |
JSP Servlet 시큐리티 : 상품 등록 페이지의 보안 처리하기 2 (0) | 2023.09.15 |
JSP Servlet 시큐리티 : 상품 등록 페이지의 보안 처리하기 (0) | 2023.09.15 |
JSP Servlet 다국어 처리 : 상품 등록 페이지의 다국어 처리하기 2 (2) | 2023.09.15 |