티스토리 뷰

코딩/spring

[16주 2일차] 예외 처리

ehzim 2024. 1. 23. 14:36

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가 선언된 메서드를 사용할 수 있다.

 

 

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday