.
고객에게 서비스를 하는 웹 서비스는 에러가 발생했을 때 에러 문구를 그대로 출력해서는 안 된다. 보안 상으로 문제가 생길 수 있기 때문이다. 그래서 지금 진행하는 프로젝트에서도 whitelabel error page를 그대로 출력하는 대신, 커스텀 된 에러 페이지를 출력해야겠다고 생각했다.
jsp에서는 web.xml에 error page를 등록하고, page 디렉터브의 errorPage 속성을 사용해서 에러 페이지를 설정할 수 있었다. Spring에서는 방법이 다르다.
1. proerties에 아래 속성을 추가한다.
server.error.whitelabel.enabled=false
2. error.html을 생성하고, 에러가 발생했을 때 출력할 페이지를 작성한다.
<!DOCTYPE html>
<html>
<title>Error page</title>
<body>
<h1>에러가 발생했습니다! </h1>
<a href="/">홈으로 돌아가기</a>
</body>
</html>

프로그램을 실행해보면, whitelabel error page 대신 커스텀한 에러 페이지가 출력되는 것을 확인할 수 있다.
이는 스프링이 기본적으로 /error에 대한 매핑을 지원하기 때문이다. 이외에도 Spring은 에러가 발생했을 때 에러의 세부사항이나 HTTP 상태, 에러 메시지를 JSON 형태로 제공해준다. server.error 속성을 사용하거나, ErrorController를 만들고 해당 유형의 빈 정의를 등록하거나, ErrorAttribute 유형의 빈을 추가하는 형태로 에러 페이지를 커스텀마이징할 수 있다.

4xx 에러가 발생했을 때와 5xx 에러가 발생했을 때의 에러 페이지를 다르게 만들어보았다.
@Controller
public class ErrorController implements ErrorViewResolver {
@Override
public ModelAndView resolveErrorView(HttpServletRequest request, HttpStatus status, Map<String, Object> model) {
if (status.is4xxClientError()) {
return new ModelAndView("4xx");
}else if(status.is5xxServerError()){
return new ModelAndView("5xx");
}
return new ModelAndView("error");
}
}
에러 처리를 맡을 ErrorController를 생성했다.
ErrorViewResolver를 implements받고 override받은 resolverErrorView 메소드를 재정의했다. status의 값이 4xx에러면 4xx 뷰를 출력하고, 아니면 5xx 뷰를, 둘 다 아니면 기본 error page를 출력하도록 만들었다.

5xx 에러가 발생했을 때의 실행 결과다.
- Reference
'java' 카테고리의 다른 글
[230805] [google drive api] java api 사용하기 (3) - 파일 검색 코드 작성 (0) | 2023.08.05 |
---|---|
[211005] JNI(Java Native Interface)로 C++ dll 사용하기 - cmd 사용 (0) | 2021.10.05 |
[210620] junit Assertions - Method (0) | 2021.06.20 |
[210530] junit에서 private 메소드 테스트하기 - reflection 사용 (0) | 2021.05.30 |
[210430] java wrapper class (0) | 2021.04.30 |