예외 처리
프로그램이 처리되는 동안 특정 문제가 발생했을 때,
처리를 중단하고 다른 처리를 하는 것을 의미합니다.
프로그램이 실행될 때 발생할 수 있는 예외 상황에 대비해 코드를 작성하여
비정상으로 종료되는 것을 막고 정상적인 실행 상태를 유지시켜야 합니다.
웹 애플리케이션에는 모든 유형의 오류가 발생할 수 있으므로
예외 처리는 필수적으로 해주어야 합니다.
예외 처리 방법의 종류
스프링 MVC에서 다음과 같이 예외 처리를 위한 애너테이션을 제공합니다.
애너테이션 | 설명 |
@ResponseStatus | 예외 처리를 위한 가장 간단한 방법, 발생한 예외를 HTTP 상태 코드로 매핑시켜 응답 |
@ExceptionHandler | 컨트롤러 안에 요청 처리 메소드에서 발생하는 오류나 예외를 직접 구체화하여 예외 처리를 위한 메소드에 선언 |
@ControllerAdvice | 여러 컨트롤러에서 발생하는 오류의 공통점을 묶어 예외 처리를 위한 클래스에 선언 |
HTTP 상태 코드의 개요
웹에서 서버로 어떠한 요청을 하면 서버는 그에 맞게 응답을 해줍니다.
만약 요청에 대해 적절하게 처리가 되면 성공 응답과 함께 결과 값을 보내주지만
정상적으로 처리가 되지 않으면 실패 응답과 함께 오류 정보를 보내줍니다.
HTTP 상태 코드란 서버가 요청에 대해 정상적으로 처리했는지 오류가 발생했는지
알려 주는 정보를 말합니다.
다음은 HTTP 상태 코드의 주요 유형입니다.
응답 상태 코드 | 설명 | |
400 | BAD_REQUEST | 일반적인 요청 실패 |
401 | UNAUTHORIZED | 클라이언트 인증에 문제 발생 |
403 | FORBIDDEN | 인증 상태에 상관없이 액세스 금지 |
404 | NOT_FOUND | 요청 URI에 해당하는 리소스 없음 |
405 | METHOD_NOT_ALLOWED | HTTP 메소드 지원 불가 |
406 | NOT_ACCEPTABLE | 요청된 리소스 미디어 타입 제공 불가 |
409 | CONFLICT | 리소스 상태에 위반되는 행위 |
412 | PRECONDITION_FAILED | 조건부 연산 지원 |
415 | UNSUPPORTED_MEDIA_TYPE | 요청 페이로드에 있는 미디어 타입 처리 실패 |
500 | INTERNAL_SERVER_ERROR | API 오작동 |
@ResponseStatus를 이용한 예외 처리
@ResponseStatus는 예외 발생 시 지정된 HTTP 상태코드를 웹 브라우저에 전달합니다.
ResponseStatusExceptionResolver 클래스가 제공하며 디스패처 서블릿에 기본적으로 등록되어 있습니다.
형식은 다음과 같습니다.
//예외 메소드에 사용 시
@ResponseStatus(value=HttpStatus.상태코드,reason="오류 설명")
@RequestMapping(...)
public String 메소드 이름() { ...}
//예외 클래스에 사용 시
@ResponseStatus(value=HttpStatus.상태코드,reason="오류 설명")
public class 클래스 이름 extends RuntimeException {...}
다음은 @ResponseStatus에서 사용하는 속성입니다.
요소 | 타입 | 설명 |
code | HttpStatus | 응답에 사용되는 상태 코드 |
reason | String | 응답에 사용되는 이유 |
value | HttpStatus | 코드에 대한 별칭 |
메소드에 @ResponseStatus를 선언해서 웹 요청에 대한 예외 발생 시
지정된 응답 상태 코드를 웹에 전달해서 오류 메시지를 출력하는 예시입니다.
package com.springmvc.controller;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
@Controller
public class Example01Controller {
@ResponseStatus(value=HttpStatus.BAD_REQUEST, reason="요청 실패했습니다.")
@RequestMapping("/exam01")
public String requestMethod(Model model) {
model.addAttribute("data", "@ResponseStatus 처리 예제");
return "webpage10_01";
}
}
webpage10_01.jsp파일입니다.
<%@ page contentType="text/html; charset=utf-8"%>
<html>
<head>
<title>Exception</title>
</head>
<body>
<h3>예외 처리 예</h3>
<p> ${data}
</body>
<html>
위 코드를 실행하게 되면 HTTP 400코드와 함께 reason에 저장된 문자열이 출력됩니다.
다음은 클래스에 @ResponseStatus를 선언해서 지정된 HTTP 코드를
웹에 전달하는 예시입니다.
package com.springmvc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class Example02Controller {
@RequestMapping("/exam02")
public void handleRequest() throws Exception {
throw new Exception(new Example02Exception("Example02Exception 메시지"));
}
}
package com.springmvc.controller;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.http.HttpStatus;
@SuppressWarnings("serial")
@ResponseStatus(value=HttpStatus.NOT_FOUND, reason="찾을 수 없습니다")
public class Example02Exception extends Exception{
public Example02Exception(String message) {
super(message);
}
}
위 코드 실행 시 HTTP 404코드와 함께 reason에 저장된 문자열이 출력됩니다.
'SPRING' 카테고리의 다른 글
[SPRING]#34 도서 쇼핑몰 구현 (예외 처리3) (0) | 2024.01.15 |
---|---|
[SPRING]#33 도서 쇼핑몰 구현 (예외 처리2) (0) | 2024.01.15 |
[SPRING]#31 도서 쇼핑몰 구현 (파일 업로드5) (0) | 2024.01.12 |
[SPRING]#30 도서 쇼핑몰 구현 (파일 업로드4) (0) | 2024.01.11 |
[SPRING]#29 도서 쇼핑몰 구현 (파일 업로드3) (0) | 2024.01.11 |