본문 바로가기
스프링 부트3

Custom Error Page 생성하기

by 굿센스굿 2024. 12. 11.
반응형

 

웹 애플리케이션을 개발하다 보면 사용자가 특정 요청을 처리하지 못했을 때, 기본적으로 제공되는 오류 페이지가 아닌 **커스텀 오류 페이지(Custom Error Page)**를 설정하는 경우가 많습니다. 커스텀 오류 페이지는 사용자 경험을 개선하고, 브랜드 이미지 및 애플리케이션의 신뢰도를 높이는 데 기여합니다.

이번 글에서는 스프링 부트 3(Sprint Boot 3)를 사용하여 Custom Error Page를 구현하는 방법을 단계별로 살펴보겠습니다.


1. Custom Error Page의 필요성

스프링 부트는 오류 발생 시 기본 오류 페이지(Whitelabel Error Page)를 제공합니다. 하지만 이 페이지는 사용자 친화적이지 않고, 애플리케이션의 내부 정보를 노출할 위험이 있습니다.

Custom Error Page를 생성하면 다음과 같은 장점이 있습니다:

  1. 브랜드 아이덴티티 강화: 오류 페이지에 로고나 디자인 요소를 추가해 애플리케이션의 정체성을 강조할 수 있습니다.
  2. 사용자 안내 강화: 친근하고 이해하기 쉬운 메시지로 사용자가 다음에 해야 할 작업을 안내할 수 있습니다.
  3. 보안 강화: 오류 발생 시 내부 정보가 노출되지 않도록 보호할 수 있습니다.

2. Custom Error Page 생성 방법

(1) HTML 기반 오류 페이지 설정

스프링 부트는 기본적으로 src/main/resources/static 또는 src/main/resources/templates 디렉토리에 HTML 파일을 배치해 오류 페이지를 설정할 수 있습니다.

404.html 예제

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>페이지를 찾을 수 없습니다</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            text-align: center;
            margin-top: 50px;
        }
        h1 {
            color: #FF0000;
        }
        p {
            font-size: 18px;
        }
        a {
            color: #007BFF;
            text-decoration: none;
        }
    </style>
</head>
<body>
    <h1>404 오류 - 페이지를 찾을 수 없습니다</h1>
    <p>요청하신 페이지가 존재하지 않습니다. <a href="/">홈으로 돌아가기</a></p>
</body>
</html>

이 HTML 파일을 src/main/resources/templates에 저장하면 404 오류 발생 시 자동으로 적용됩니다.

(2) JSON 기반 오류 메시지 설정

API 서버에서는 HTML보다는 JSON 형식으로 오류 메시지를 제공하는 경우가 많습니다. 이를 구현하려면 ErrorController를 커스터마이징해야 합니다.

CustomErrorController.java

package com.example.demo.controller;

import org.springframework.boot.web.error.ErrorAttributeOptions;
import org.springframework.boot.web.servlet.error.ErrorAttributes;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.context.request.WebRequest;

import java.util.Map;

@Controller
public class CustomErrorController implements ErrorController {

    private final ErrorAttributes errorAttributes;

    public CustomErrorController(ErrorAttributes errorAttributes) {
        this.errorAttributes = errorAttributes;
    }

    public ResponseEntity<Map<String, Object>> handleError(WebRequest webRequest) {
        Map<String, Object> attributes = errorAttributes.getErrorAttributes(webRequest, ErrorAttributeOptions.defaults());
        HttpStatus status = HttpStatus.valueOf((int) attributes.get("status"));
        return new ResponseEntity<>(attributes, status);
    }

    public String getErrorPath() {
        return "/error";
    }
}

이 코드는 API 요청에서 발생한 오류를 JSON 형식으로 반환합니다. 예를 들어, 404 오류가 발생하면 다음과 같은 응답을 받을 수 있습니다:

{
  "timestamp": "2024-12-05T12:34:56.789+09:00",
  "status": 404,
  "error": "Not Found",
  "message": "해당 URL을 찾을 수 없습니다.",
  "path": "/invalid-path"
}

(3) 특정 오류 코드별 커스텀 페이지 설정

스프링 부트에서는 특정 HTTP 상태 코드에 따라 다른 오류 페이지를 설정할 수 있습니다. 이를 위해 ErrorViewResolver를 사용할 수 있습니다.

CustomErrorViewResolver.java

package com.example.demo.config;

import org.springframework.boot.web.servlet.error.ErrorViewResolver;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import java.util.Map;

@Component
public class CustomErrorViewResolver implements ErrorViewResolver {

    @Override
    public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) {
        if (status == HttpStatus.NOT_FOUND) {
            return new ModelAndView("404");
        } else if (status == HttpStatus.INTERNAL_SERVER_ERROR) {
            return new ModelAndView("500");
        }
        return new ModelAndView("error");
    }
}

여기서 404.html과 500.html은 오류별로 제공할 HTML 파일입니다.


3. Custom Error Page 구현 예제

예제 1: 404 페이지

404 오류가 발생했을 때 사용자에게 친근한 안내 메시지를 표시합니다.

  • HTML 예제: 위에서 설명한 404.html 파일
  • 적용 경로: /invalid-path

예제 2: API의 JSON 오류 응답

사용자가 /api/invalid 경로에 접근했을 때, JSON 형식으로 다음과 같은 오류 메시지가 반환됩니다:

{
  "status": 404,
  "message": "해당 API를 찾을 수 없습니다.",
  "path": "/api/invalid"
}

예제 3: 500 페이지

서버 오류가 발생했을 때 500.html을 보여줍니다.

  • HTML 예제:
<h1>서버 오류</h1>
<p>현재 서버에 문제가 발생했습니다. 잠시 후 다시 시도해 주세요.</p>

4. 결론

Custom Error Page는 사용자 경험을 향상시키고 애플리케이션의 품질을 높이는 데 중요한 요소입니다. 스프링 부트 3를 활용하면 간단한 설정으로 HTML 기반 페이지부터 JSON 응답까지 다양한 형식으로 커스터마이징할 수 있습니다.

지금 바로 커스텀 오류 페이지를 구현해 애플리케이션의 전문성을 한 단계 업그레이드하세요! 🚀

반응형