티스토리 뷰
Chapter10. 예외 처리 : 도서 검색 오류에 대한 예외 처리하기
10.1 예외 처리의 개요
10.1.1 예외 처리
예외 처리는 일반적으로 프로그램이 처리되는 동안 특정한 문제가 일어났을 때 처리를 중단하고 다른 처리를 하는 것을 의미하며, 오류 처리라고도 한다.
프로그램을 실행할 때 발생할 수 있는 예외 상황에 대비한 코드를 작성해 프로그램이 비정상으로 종료되는 것을 막야한다. 이럴때 정상적인 실행 상태를 유지하는 예외 처리가 필요하다.
10.1.2 예외 처리 방법의 종류
스프링 MVC에서는 웹 요청에 따라 컨트롤러의 요청 처리 메서드가 실행하는 중에 발생한 예기치않은 예외를 처리할 수 있도록 애너테이션을 제공한다.
예외 처리를 위한 애너테이션
애너테이션 | 설명 |
@ResponseStatus | 예외 처리를 위한 가장 간단한 방법으로, 발생한 예외를 HTTP 상태 코드로 매핑시켜 응답하는 애너테이션이다. |
@ExceptionHandler | 컨트롤러 안에 요청 처리 메서드에서 발생하는 오류나 예외를 직접 구체화하여 예외 처리를 위한 메서드에 선언하는 애너테이션이다. |
@ControllerAdvice | 여러 컨트롤러에서 발생하는 오류의 공통점을 묶어 예외 처리를 위한 클래스에 선언하는 애너테이션이다. |
10.2 @ResponseStatus 를 이용한 HTTP 상태 코드 기반 예외 처리
@ResponseStatus는 웹 요청에 따라 예외가 발생하면 웹 브라우저에 출력하는 HTTP 상태 코드와 매핑시킨다.
10.2.1 HTTP 상태 코드의 개요
웹 브라우저에서 서버에 어떤 요청을 전달하면 서버는 응답을 보내준다. 즉 적절하게 처리되어 성공 응답과 함께 결과 값을 보내 주기도하고 정상적인 처리가 되지 않으면 실패 응답과 함께 오류 정보를 보내주기도 한다.
이와 같이 웹 브라우저에서 HTTP 요청을 보낸 결과, 서버가 정장적으로 처리되었거나 오류가 발생했는지 알려주는 정보를 담고 있는것을 HTTP 상태 코드라고 한다.
HTTP 상태 코드의 주요 유형
응답 상태 코드 | 설명 | |
200 | 정상적으로 처리되었을 때 사용된다. | |
400 | BAD_REQUEST | 일반적인 요청 실패에 사용한다. |
401 | UNAUTHORIZED | 클라이언트 인증에 문제가 있을 때 사용한다. |
403 | FORBIDDEN | 인증 상태에 상관없이 액세스를 금지할 때 사용한다. |
404 | NOT_FOUND | 요청 url에 해당하는 리소스가 없을 때 사용한다. |
405 | METHOD_NOT_ALLOWED | HTTP 메서드가 지원되지 않을 때 사용한다. |
406 | NOT_ACCEPTABLE | 요청된 리소스 미디어 타입을 제공하지 못할 때 사용한다. |
409 | CONFLICT | 리소스 상태에 위반되는 행위를 했을 때 사용한다. |
412 | PRECONDITION_FAILED | 조건부 연산을 지원할 때 사용한다. |
415 | UNSUPPORTED_MEDIA_TYPE | 요청 페이로드에 있는 미디어 타입이 처리되지 못했을 때 사용한다. |
500 | INTERNAL_SERRVER_ERROR | API가 잘못 작동할 때 사용한다. |
10.2.2 @ResponseStatus 를 이용한 예외 처리
@ResponseStatus는 웹 요청을 할 때 예외가 발생하면 지정된 HTTP 상태 코드를 웹 브라우저에 전달한다.
이런 기능은 ResponseStatusExceptionResolver 클래스가 제공하며 이 클래스는 디스패처 서블릿에 기본적으로 등록되어 있어 별도로 구성할 필요 없다.
//예외 메서드에 사용할 때
@ResponseStatus(value=HTTpStatus.상태 코드, reason="오류 설명")
@RequestMapping(...)
public String 메서드 이름() {
...
}
// 예외 클래스에 사용할 때
@ResponseStatus(value=HttpStatus.상태 코드, reason="오류 설명")
public class 클래스 이름 extends rtuntimeException{
...
}
* value 속성은 HttpsStatus에 정의되어 있는 HTTP 상태 코드를 지정한다. reason 속성으로 자세한 설명을 설정할 수도 있다.
@ResponseStatus 에서 사용하는 속성
요소 | 타입 | 설명 |
code | HttpStatus | 응답에 사용되는 상태 코드이다. |
reason | String | 응답에 사용되는 이유를 설명한다. |
value | HttpStatus | 코드에 대한 별칭이다. |
10.3 @ExceptionHandler를 이용한 컨트롤러 기반 예외 처리
@ExceptionHandler는 컨트롤러 안에 예외 처리를 위한 메서드를 선언한다.
10.3.1 @ExceptionHandler 를 이용한 예외 처리
@ExceptionHandler는 웹 요청에 따라 컨트롤러의 요청 처리 메서드를 실행하는 동안 예외가 발생하면 이것을 처리하기 위해 예외 처리 메서드를 사용한다.
* 실행 중 발생해도 예외처리가 가능하다.
@ExceptionHandler(value={예외 클래스1.class[,예외클래스2.class, ...]})
public String 메서드 이름() {
....
}
@ExceptionHandler
public String 메서드 이름(예외 클래스 exp){
...
}
@ ExceptionHandler에서 value는 예외 처리를 담당하는 클래스 이름을 설정한다.
value 속성이나 {}를 생략할 수 있다.
또한 속성을 생량하고 @ ExceptionHandler만 사용하려면 예외 처리 메서드의 매개변수로 예외 처리를 담당하는 클래스가 설정되어 있어야 한다.
@ExceptionHandler 에서 사용하는 요소
요소 | 타입 | 설명 |
value | Class<? extneds Throwable>[] | @ExceptionHandler가 선언된 메서드가 처리할 예외 클래스이다. |
10.4 @ControllerAdvice를 이용한 전역 예외 처리
@ControllerAdvice는 개별 컨트롤러가 아닌 애플리케이션 전체에 적용할 수 있는 전역 예외 처리 방법이다.
10.4.1 전역 예외 처리를 위한 @ControllerAdvice
스프링 MVC에서는 컨트롤러의 요청 처리 메서드에서 예외가 발생할 경우 같은 컨트롤러 안에서 예외 처리를 작성할 수 있다. 이런 예외 발생을 개별 컨트롤러에서 처리하지 않고 전체 애플리케이션에 한번에 적용할 수 있는 @controllerAdvice를 지원한다.
이것을 사용하면 하나의 컨트롤러가 아닌 여러 컨트롤러에서 발생하는 예외를 공통으로 처리할 수 있다.
@ControllerAdvice(basePackages={"기본 패키지 이름, ...})
public class 클래스 이름{
...
}
@ControllerAdvice에서 사용하는 요소
요소 | 타입 | 설명 |
annotations | Class<?extends Annotation>[] | 애너테이션의 배열이다. |
assignableTypes | Class<?>[] | 클래스의 배열이다. |
basePackageClasses | Class<?>[] | @ControllerAdvice가 적용된 클래스가 지우너할 컨트롤러를 선택할 수 있는 패키지를 지정한다. |
basPackages | String[] | 기본 패키지의 배열이다. |
value | String[] | basePackages 속성의 별칭이다. |
* @ControllerAdvice를 선언한 클래스에서는 컨트롤러에서 설정하는 @ExceptionHandler, @ModelAttribute, @InitBinder가 선언된 메서드를 사용할 수 있다.
'코딩 > spring' 카테고리의 다른 글
[16주 3일차] 로그 기록 (0) | 2024.01.24 |
---|---|
[16주 2일차] 예외 처리 : 도서 검색 오류에 대한 예외 처리하기 (1) | 2024.01.23 |
[16주 2일차] 파일 업로드 처리 : 이미지 파일 업로드하기 (0) | 2024.01.23 |
[16주 2일차] 파일 업로드 처리 (1) | 2024.01.23 |
[16주 1일차] 스프링 시큐리티 : 로그인/로그아웃 페이지 만들기 (0) | 2024.01.22 |
- Total
- Today
- Yesterday