Error 메시지를 처리해보자
코딩을 하다 보면 404, 500 에러 등 정말 많은 에러코드와 마주하게 된다.
보기 싫어도 볼 수밖에 없고, 해결했다고 생각해도 다시 뜨는 게 에러다.
뭐 어쩌겠는가 에러가 뜨는걸 나보고 어떻게 하라는 건지..
어차피 뜰 에러라면 조금 즐겁게 에러를 맞이할 수는 없을까?라는 생각이 들어서 코딩했다.
일단 결과물을 보면 이렇다. 기본적으로 뜨는 404 오류... 보다 유쾌하게 오류 페이지를 맞이할 자세가 되었다.. 아닌가..?
일단 했던 코딩은 코딩이라고 하기에 애매할 정도로 간단하다.
우리가 eclipse에서 코딩을 할 때 다이나믹 웹을 만들어서 진행한다. 그 안에는 WebContent 폴더가 있고, 또 그 안에는 WEB-INF 폴더가 있다. 평소에는 잘 쓰지 않지만 오류나 웹 페이지 application 선언, servlet 선언 등을 할 때 사용할 수 있다.
그 안에 있는 web.xml에 다음과 같은 코드를 적어주면 된다.
[ 방법 1 ]
[A. web.xml]
<error-page>
<error-code>500</error-code>
<location>/error/error500.jsp</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/error/error404.jsp</location>
</error-page>
에러 코드 404, 500에 대해서 에러가 나게 되면 기존 에러 페이지를 보여주는 것이 아닌,
내가 설정한 위치에서 불러오라는 뜻이다.
[B. error404.jsp / C. error500.jsp]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<style>
body{
text-align : center;
}
img{
width:900px;
}
</style>
<title>Insert title here</title>
</head>
<body>
<h1>404 ERROR</h1>
<h1>페이지를... 찾을.. 수... 없어...</h1>
<img src="trap.jpg">
</body>
</html>
에러 404와 500을 동일한 코드로 처리했기 때문에 하나만 넣었다.
A에서 벌써 에러 페이지를 설정해줬기 때문에 B, C에서 작성하는 코드는 부담 없이 작성해도 된다.
따로 여기가 에러 페이지예요!라고 외치지 않아도 되고 그냥 내가 웹의 한 페이지를 만드는 것처럼 만들게 되면 지정해둔 에러가 발생했을 때 이 페이지로 오게 되어있기 때문이다.
그렇다면 방금 말한 내가 에러가 나면 이쪽으로 보내고 싶어요! & 나는 에러 페이지예요! 하는 방법은 무엇이 있을까?
[ 방법 2 ]
[D. readParameter.jsp]
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page errorPage="/error/viewErrorMessage.jsp" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
name 파라미터 값 ::
<%=request.getParameter("name").toUpperCase() %>
</body>
</html>
이 코드에서 이상한 점을 살펴보면 에러가 왜 나는지 쉽게 알 수 있다.
<%= request.getParameter("name") %>
를 보게 되면 다른 페이지에서 form이나 param을 통해서 값을 던져준 것이 없다.
하지만, 스스로 값을 받으려고 하고 있다. 이때 에러가 발생하게 된다.
<%@ page errorPage="/error/viewErrorMessage.jsp" %>
2번째 라인에 이와 같이 내가 에러가 나면 이쪽으로 갈 거야!라고 선언을 해줬기 때문에 일반적으로 보이는 에러 페이지 대신에 아래 웹 페이지가 보이게 된다.
[E. viewErrorMessage.jsp]
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page isErrorPage="true" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<title>viewErrorMessage</title>
</head>
<body>
<p>
요청 처리 과정에서 에러가 발생했습니다.<br>
빠른 시간 내에 해결하도록 하겠습니다.<br>
에러타입 : <%=exception.getClass().getName() %><br>
에러메세지 : <%= exception.getMessage() %><br>
만약 에러페이지 길이 513바이트 이하면, 인터넷 익스플로러는 이 페이지를 출력하지 않는다.<br>
</p>
<div class="container">
<div class="row">
<div class="col-sm-4">
에러가 났어요.. 고쳐주세요... 에러가 났어요.. 고쳐주세요...에러가 났어요.. 고쳐주세요...에러가 났어요.. 고쳐주세요...에러가 났어요.. 고쳐주세요...에러가 났어요.. 고쳐주세요...에러가 났어요.. 고쳐주세요...에러가 났어요.. 고쳐주세요...에러가 났어요.. 고쳐주세요...에러가 났어요.. 고쳐주세요...에러가 났어요.. 고쳐주세요...
</div>
<div class="col-sm-4">
에러가 났어요.. 고쳐주세요... 에러가 났어요.. 고쳐주세요...에러가 났어요.. 고쳐주세요...에러가 났어요.. 고쳐주세요...에러가 났어요.. 고쳐주세요...에러가 났어요.. 고쳐주세요...에러가 났어요.. 고쳐주세요...에러가 났어요.. 고쳐주세요...에러가 났어요.. 고쳐주세요...에러가 났어요.. 고쳐주세요...에러가 났어요.. 고쳐주세요...
</div>
<div class="col-sm-4">
에러가 났어요.. 고쳐주세요... 에러가 났어요.. 고쳐주세요...에러가 났어요.. 고쳐주세요...에러가 났어요.. 고쳐주세요...에러가 났어요.. 고쳐주세요...에러가 났어요.. 고쳐주세요...에러가 났어요.. 고쳐주세요...에러가 났어요.. 고쳐주세요...에러가 났어요.. 고쳐주세요...에러가 났어요.. 고쳐주세요...에러가 났어요.. 고쳐주세요...
</div>
</div>
</div>
</body>
</html>
이는 에러 페이지를 작성한 코드로 내용은 중요하지 않을 수 있다.
하지만 여기서 알아가야 할 것은 window explorer에서는
에러 페이지의 길이가 513바이트가 넘지 않으면 기존의 에러 페이지로 자동 연결된다는 점이다.
오늘은 에러 페이지에 대한 대응으로 두 가지 방법을 살펴봤다.
에러 페이지를 재미있게 만드는 건 비효율적이고, 전혀 생산적이지 않은 과정일 수 있지만 그걸로 인해서 코딩 재미를 느낀다면 이 또한 하나의 코딩이라고 생각한다.