sggnology
하늘속에서IT
sggnology
전체 방문자
오늘
어제
  • 분류 전체보기 (83)
    • Algorithm (31)
      • Programmers (27)
      • Baekjoon (4)
    • WIKI (4)
      • VirtualBox (1)
      • Power Toys (1)
    • NodeJS (4)
      • nvm (1)
      • React (1)
      • Vue (1)
    • Dev Language (3)
      • Java (2)
      • Kotlin (1)
    • Spring Boot (17)
      • Gradle (1)
      • JPA (3)
    • DB (4)
      • MariaDB (3)
      • Redis (0)
    • Android (6)
      • Debug (3)
    • Nginx (3)
      • Debug (1)
    • Intellij (0)
    • Network (1)
    • Git (2)
      • GitHub (2)
    • Chrome Extension (0)
    • ETC (5)
      • Monitoring (2)
    • Linux (1)
      • WSL (1)
    • Visual Studio (1)
    • Side Project (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 백준
  • 고득점 Kit
  • DB
  • 안드로이드 스튜디오
  • 연습문제
  • Android Studio
  • 레벨3
  • 레벨2
  • docker
  • JPA
  • spring boot
  • 알고리즘
  • 오블완
  • 고득점KIT
  • 프로그래머스
  • java
  • 티스토리챌린지
  • kotlin
  • mariadb
  • nginx

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
sggnology

하늘속에서IT

[Spring Boot] custom error page 적용(feat. 예제, ErrorController)
Spring Boot

[Spring Boot] custom error page 적용(feat. 예제, ErrorController)

2023. 5. 26. 00:58
728x90

상황

Spring 을 통해 웹서비스를 제공할 때 오류가 발생하면 에러 페이지(white label, 위사진)에 도달하게 되는데, 해당 에러 페이지와 웹서비스의 디자인이 많이 다름으로 사용자로 하여금 혼란이 올 수 있다는 생각이 들어서 임의의 에러 페이지를 제공하고자 하였다.

 

간단한 설명

  • Spring 에서는 에러 페이지 생성을 위해 ErrorController 를 제공한다.
  • ErrorController 를 사용하면 default 에러 페이지 핸들러를 대체하게 된다.
  • 예제 코드 밑에 자세한 설명을 포함하였습니다.

Custom Error Page 예제

 

View 생성

성공적으로 접근 되는 것을 확인하기 위한 페이지와, 에러 페이지 중에서 404 와 500 을 재연하기 위해 세개의 view 를 생성한다.

 

index.html (경로: resources/template/view/home)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <h1>여기는 홈페이지 입니다.</h1>
</body>
</html>

 

404.html (경로: resources/template/view/error)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <h1>페이지가 없습니다.</h1>
  <h2>404 오류에요.. ㅠㅠ</h2>
</body>
</html>

 

500.html (경로: resources/template/view/error)

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
</head>
<body>
  <h1>잘못된 접근입니다.</h1>
  <h2>500 오류에요.. ㅠㅠ</h2>
</body>
</html>

 

 

HomeController 및 ErrorController 생성

간단히 설명한 내용에서와 같이 ErrorController 의 구현체를 생성하여 에러를 제어할 것이다.

 

HomeViewController

@Controller
@RequestMapping("")
class HomeViewController {

    @GetMapping("/")
    fun home(): String{
        return "view/home/index"
    }

    @GetMapping("/homeError")
    fun homeError(): String{
        throw RuntimeException("Error")
    }
}

 

CustomErrorViewController

@Controller
@RequestMapping("/error")
class CustomErrorController: ErrorController {

    @GetMapping("")
    fun errorPage(
        httpServletRequest: HttpServletRequest
    ): String{
        val statusCode = httpServletRequest.getAttribute(RequestDispatcher.ERROR_STATUS_CODE)

        when(statusCode){
            404 -> return "view/error/404"
        }

        return "view/error/500"
    }
}

 


적용

 

페이지 접근

기본 포트는 8080 임으로 임의의 페이지에 접근하여 결과를 살펴볼 수 있다. 이 때, CustomErrorViewController 를 주석처리하면 어떻게 동작하는지 살펴보는게 재미 요소? 이다.

 

홈페이지 접근

 

잘못된 페이지 접근

 

오류가 발생하는 페이지 접근

 


자세한 설명

 

어떻게 CustomErrorViewController 가 default 에러 핸들러를 대체할까?

 

default 에러 핸들러 대체 원리 설명

  • ErrorController 의 구현체를 살펴보면 BasicErrorController 를 확인할 수 있다.
  • BasicErrorController 는 임의의 ErrorController 가 없을 때 default 에러 핸들러 역할을 하는 친구이다.

 

  • BasicErrorController 를 Bean 으로 등록하는 곳을 찾아보면 ErrorMvcAutoConfiguration 클래스를 찾아 볼 수 있다.
  • ErrorMvcAutoConfiguration 은 BaiscErrorController 를 Bean 으로 등록하려는 메서드에서 @ConditonalOnMissingBean 이라는 annotation 을 선언하였다.
    • @ConditonalOnMissingBean 은 BeanFacotry 에 value 로 입력된 class(여기서는 ErrorController.class)가 등록되지 않은 상태면 그 때 Bean 으로 등록하는 기능을 가지고 있다.
  • 즉, 우리가 ErrorController 구현체를 Bean 으로 등록하였기에 default 에러 핸들러를 대체할 수 있었던 것이다.

 

CustomErrorViewController 의 경로가 /error 인 이유

 

설명

  • default 값이 /error 로 선언되어 있기 때문이다.

 

그럼 임의의 값으로 경로 수정이 가능한가?

  • 수정 가능하다.
  • 임의의 경로인 /customError 로 변경해보자
    • server.error.path 프로퍼티 값을 /customError 로 입력
    • CustomErrorViewController 의 경로도 수정
  • 위와 같이 처리할 경우 경로가 수정된다.

출처

https://www.baeldung.com/spring-boot-custom-error-page

 

예제 코드

 

GitHub - sggnology/blog-example-spring-error-page

Contribute to sggnology/blog-example-spring-error-page development by creating an account on GitHub.

github.com

 

 

728x90

'Spring Boot' 카테고리의 다른 글

[Spring Boot] @ModelAttribute 로 맵핑하려는 대상의 depth 가 2 이상일 때 요청하였는데 오류가 난다면?(feat. kotlin)  (0) 2023.10.16
[Spring Boot] Spring 에서 Redis 를 사용할 때 ConnectionFactory 를 왜 Bean 으로 등록해서 사용해야 할까?(feat. Kotlin, Lettuce, LettuceConnectionFactory was not initialized through afterPropertiesSet())  (0) 2023.06.10
[Spring Boot] JWT 라이브러리를 의존성 추가했음에도 빌드 오류가 나는건 왜일까?(feat. `io.jsonwebtoken:jjwt-api`)  (2) 2023.05.25
[Spring Boot] s3 aws-java-sdk(v 1.1) 을 사용하는 개발환경에서 SSL 인증서와 무관하게 통신하는 방법(feat. ValidatorException: PKIX path building failed)  (0) 2023.05.23
[Spring Boot] Spring Boot 에서 JPA 로 값을 수정시 알 수 없는 이유로 sql 에러가 발생할 때(feat. SQL Error: 1064, SQLState: 42000)  (0) 2023.05.20
    'Spring Boot' 카테고리의 다른 글
    • [Spring Boot] @ModelAttribute 로 맵핑하려는 대상의 depth 가 2 이상일 때 요청하였는데 오류가 난다면?(feat. kotlin)
    • [Spring Boot] Spring 에서 Redis 를 사용할 때 ConnectionFactory 를 왜 Bean 으로 등록해서 사용해야 할까?(feat. Kotlin, Lettuce, LettuceConnectionFactory was not initialized through afterPropertiesSet())
    • [Spring Boot] JWT 라이브러리를 의존성 추가했음에도 빌드 오류가 나는건 왜일까?(feat. `io.jsonwebtoken:jjwt-api`)
    • [Spring Boot] s3 aws-java-sdk(v 1.1) 을 사용하는 개발환경에서 SSL 인증서와 무관하게 통신하는 방법(feat. ValidatorException: PKIX path building failed)
    sggnology
    sggnology
    하늘은 파란색이니까 내 삶도 파란색이길 ㅎㅎ

    티스토리툴바