반응형
java의 예외처리
java의 예외처리는 체크드 예외(Checked Exception)와 언체크드 예외(Unchecked Exception)로 구분된다.
체크드 예외는 컴파일 시점에 발생하는 예외로 빌드가 되지 않기 때문에 소스를 수정해야 하고,
언체크드 예외는 컴파일은 통과하였지만 실행 시점에 발생하는 예외이다. 스프링에서의 예외 처리는 언체크드 예외 처리이며, 예외처리 클래스는 RuntimeException을 상속해서 구현해야 한다.
보통의 java 프로그램에서는 try catch finally구문을 통해서 예외를 처리할 수 있지만, 스프링 기반의 웹 애플리케이션에서는 스프링에서 지원하는 예외처리 기법을 사용하면 편하게 처리 할 수 있다.
스프링의 2가지 예외처리방법
- @ControllerAdvice를 이용한 전역처리 방법
- 모든 컨트롤러에서 발생하는 예외를 일괄적으로 처리
- @ExceptionHandler를 이용한 로컬처리 방법
- 컨트롤러마다 발생하는 예외를 개별적으로 처리
전역 예외처리 순서
1. 사용자 정의 예외를 위한 RuntimeException을 상속하는 최상위 클래스를 만든다.
package com.tistory.hitomis.exception;
// 최상위 예외 클래스
public class HitomisException extends RuntimeException {
private static final long serialVersionUID = 1L;
public HitomisException(String message) {
super(message);
}
}
2. 최상위 클래스를 상속하는 각종 사용자 예외 클래스를 만든다.
package com.tistory.hitomis.exception;
// not found 예외 클래스
public class HitomisNotFoundException extends HitomisException {
private static final long serialVersionUID = 1L;
public HitomisNotFoundException(String message) {
super(message);
}
}
IllegalArgumentException나 SQLException 같은 java에 원래 존재하는 예외도 상속받아 사용자 예외 클래스를 만들수 있으며, 그냥 사용해도 상관없다.
3. @ControllerAdvice를 이용한 예외처리기 만들기
package com.tistory.hitomis.exception;
// 컨트롤러에서 발생하는 모든 예외를 처리 하도록 @ControllerAdvice 선언함
@ControllerAdvice
public class GlobalExceptionHandler {
// 사용자 정의 예외 처리용
@ExceptionHanlder(HitomisException.class)
public String hanlderCustomException(HitomisException exception, Model model) {
model.addAttribute("exception", exception);
return "/errors/hitomisError";
}
// 사용자 정의 예외 이외 전체 예외 처리용
@ExceptionHandler(Exception.class)
public String hanlderException(Exception exception, Model model) {
model.addAttribute("exception", exception);
return "/errors/globalError";
}
}
4. 예외발생시 표시화면
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Board Error</title>
</head>
<body>
<h1>HitomisException 발생</h1>
<a th:href="@{/}">메인 화면으로</a>
<hr/>
<table>
<tr>
<td bgcolor="green" align="left">예외메시지:[[${exception.message}]]</td>
</tr>
<tr th:each="trace : ${exception.stackTrace}">
<td th:text="${trace}"></td>
</tr>
</table>
</body>
</html>
반응형
'개발 > spring, spring boot' 카테고리의 다른 글
[Spring Boot] JPA와 Thymeleaf를 이용한 간단한 게시판 개발 예제 (0) | 2021.08.28 |
---|---|
[Spring Boot] JPA와 JSP를 이용한 간단한 게시판 개발 예제 (0) | 2021.08.14 |
[Spring Boot] 독립적으로 실행 가능한 JAR 배포 (0) | 2021.08.01 |
[Spring Boot] 로깅 (0) | 2021.07.12 |
[String Boot] 스프링부트를 구성하는 핵심 요소 3가지 (0) | 2021.07.10 |
댓글