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
예제 코드
728x90