Spring

[Spring] 오류 페이지

아잠만_ 2024. 8. 13. 15:31

HTTP 오류 코드 정리

  • 400 : Bad Request. 문법 오류(잘못 입력한 url)
  • 404* : Not Found. 요청한 문서를 찾지 못함(url확인 및 캐시 삭제가 필요한 상태)
  • 405 : Method not allowed. 메소드 허용 안됨(메소드 매핑이 안 될 때 발생)
  • 415 : 서버의 요청에 대한 승인 거부. (ContentType, Content Encoding 데이터 확인 필요)
  • 500* : 서버 내부 오류. (웹 서버가 요청사항을 수행할 수 없을 때 발생)
  • 505 : HTTP Version Not Supported.

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="4.0" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_4_0.xsd">

	<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
			/WEB-INF/spring/root-context.xml
			/WEB-INF/spring/security-context.xml
		</param-value>
	</context-param>
	
	<!-- Creates the Spring Container shared by all Servlets and Filters -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- Processes application requests -->
	<servlet>
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name>
			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
		
		<!-- web.xml의 설정은 WAS(Tomcat) 자체 설정일 뿐임. -->
		<!-- multipart-config : 메모리사이즈, 업로드 파일 저장 위치, 최대 크기 설정 -->
		<multipart-config>
			<location>c:\\upload</location><!-- 업로드 되는 파일을 저장할 공간 -->
			<max-file-size>20971520</max-file-size><!-- 업로드 파일의 최대 크기 1MB * 20 -->
			<max-request-size>41943040</max-request-size><!-- 한 번에 올릴 수 있는 최대 크기 40MB -->
			<file-size-threshold>20971520</file-size-threshold><!-- 메모리 사용 크기 20MB -->
		</multipart-config>
	</servlet>
		
	<servlet-mapping>
		<servlet-name>appServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
	
	<!-- 한글 처리
	웹 브라우저(크롬)에서 서버(톰캣)로 보내는 요청(Requeset)과 그 반대 방향인 응답(Response)을
		모두 UTF-8로 고정하기 위해 인코딩 필터를 설정함
	 -->
	<filter>
		<filter-name>encodingFilter</filter-name>
		<filter-class>
			org.springframework.web.filter.CharacterEncodingFilter
		</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
		<init-param>
			<param-name>forceEncoding</param-name>
			<param-value>true</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<!-- 모든 요청에서 -->
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<!-- multipart filter 추가하기(한글 처리 다음에 넣기!!!) -->
	<filter>
		<display-name>springMultipartFilter</display-name>
		<filter-name>springMultipartFilter</filter-name>
		<filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>springMultipartFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	
	<!-- 스프링 시큐리티가 제공하는 서블릿 필터 클래스를 서블릿 컨테이너에 등록함 -->
   <filter>
      <filter-name>springSecurityFilterChain</filter-name>
      <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
   </filter>
   <filter-mapping>
      <filter-name>springSecurityFilterChain</filter-name>
      <url-pattern>/*</url-pattern>
   </filter-mapping>
   
   <!-- 상태 코드를 사용하여 오류 페이지 설정 시작
   HTTP 오류 코드 정리
   - 400 : Bad Request. 문법 오류(잘못 입력한 url)
   - 404* : Not Found. 요청한 문서를 찾지 못함(url확인 및 캐시 삭제가 필요한 상태)
   - 405 : Method not allowed. 메소드 허용 안됨(메소드 매핑이 안 될 때 발생)
   - 415 : 서버의 요청에 대한 승인 거부. (ContentType, Content Encoding 데이터 확인 필요)
   - 500* : 서버 내부 오류. (웹 서버가 요청사항을 수행할 수 없을 때 발생)
   - 505 : HTTP Version Not Supported.
    -->
   <error-page>
      <error-code>400</error-code>
      <location>/error/error400</location>
   </error-page>
   <error-page>
      <error-code>404</error-code>
      <location>/error/error404</location>
   </error-page>
   <error-page>
      <error-code>500</error-code>
      <location>/error/error500</location>
   </error-page>
   <!-- HTTP 상태 코드를 사용하여 오류 페이지 설정 끝 -->
</web-app>

ErrorController.java

package kr.or.ddit.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import lombok.extern.slf4j.Slf4j;

@RequestMapping("/error")
@Slf4j
@Controller
public class ErrorController {
	
	@GetMapping("/error400")
	public String error400() {
		return "error/error400";
	}
	
	@GetMapping("/error404")
	public String error404() {
		return "error/error404";
	}
	
	@GetMapping("/error500")
	public String error500() {
		return "error/error500";
	}
	
	
}

error400.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!-- Main content -->
    <section class="content">
      <div class="error-page">
        <h2 class="headline text-warning"> 400</h2>

        <div class="error-content">
          <h3><i class="fas fa-exclamation-triangle text-warning"></i> Oops! Bad Request.</h3>

          <p>
            	잘못된 요청입니다
            <a href="/">return to main</a>
          </p>
        </div>
        <!-- /.error-content -->
      </div>
      <!-- /.error-page -->
    </section>
    <!-- /.content -->

error404.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!-- Main content -->
    <section class="content">
      <div class="error-page">
        <h2 class="headline text-warning"> 404</h2>

        <div class="error-content">
          <h3><i class="fas fa-exclamation-triangle text-warning"></i> Oops! Page not found.</h3>

          <p>
            	요청한 문서를 찾지 못했습니다.
            <a href="/">return to main</a>
          </p>

          
        </div>
        <!-- /.error-content -->
      </div>
      <!-- /.error-page -->
    </section>
    <!-- /.content -->

error500.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!-- Main content -->
    <section class="content">
      <div class="error-page">
        <h2 class="headline text-warning"> 500</h2>

        <div class="error-content">
          <h3><i class="fas fa-exclamation-triangle text-warning"></i> Oops! Server Inner Error.</h3>

          <p>
            	서버 내부 오류가 발생했습니다.
            <a href="/">return to main</a>
          </p>

          
        </div>
        <!-- /.error-content -->
      </div>
      <!-- /.error-page -->
    </section>
    <!-- /.content -->