본문 바로가기

Server Development/Spring Basic

Spring - Exception

 

예외처리에는 크게 두가지로 볼 수 있다.

Spring에서 기본적으로 제공해주는 Exception, 우리가 직접 구현해서 사용해는 Exception이 있다.

그 둘에 대해서 모두 알아보려고 한다.

 

우선, Exception은 다음과 같은 계층구조를 갖는다.

 

 

Exception

-RuntimeException - NullPointerException

-IOException

 

 

기본 예외 처리 방식(Handler 생성)

" @ControllerAdvice 또는 @RestControllerAdvice 로 모든 컨트롤러에서 발생할 수 있는 예외를 정의하고, @ExceptionHandler를 통해 발생하는 예외마다 처리할 메서드를 정의 "

 

- Exception을 처리

- @RestControllerAdvice는 예외발생시 Json 형태로 반환, 이를 통해, 예외가 발생했음을 Client에게 알림.

 

@RestControllerAdvice
public class MemberExceptionHandler {
	
	@ExceptionHandler(value = Exception.class)
	public ResponseEntity<Map<String, String>> ExceptionHandler(Exception e) {
		HttpHeaders responseHeaders = new HttpHeaders();
        responseHeaders.add(HttpHeaders.CONTENT_TYPE, "application/json");
        HttpStatus httpStatus = HttpStatus.BAD_REQUEST;

        Map<String, String> map = new HashMap<>();
        map.put("error type", httpStatus.getReasonPhrase());
        map.put("code", "400");
        map.put("message", "에러 발생");

        return new ResponseEntity<>(map, responseHeaders, httpStatus);
    }
}

 

예를 들어 위와 같이 작성했다고 가정해보자

모든 컨트롤러에서 발생하는 예외들에 대해서 처리를 해줄 것이고

반환은 바로 Client로 Json 형태로 반환을 할 것이다.

이를 위해, JSON에 담고자하는 내용들을 담아 바로 전달하는 내용이다.

이런식으로, 전반적인 오류에 대해 이렇게 처리를 할 수 있다.

 

사용은 해당 처리하고자 하는 클래스에 throws Exception 처리를 해주면 런타임시 발생하는 예외에대한 처리를 해준다.

 

 

 

Custom 예외처리

런타임시 발생하는 여러 에러가 있을 것이다. 다만, 이러한 에러들은 프로그램 내부는 모르나, 사용자나 개발자만 아는 에러가 있을 것이다. 이러한 에러들을 처리하는데에는 Custom 예외처리가 필요하다.

 

예를들어, 회원가입을 하는데 이미 존재하는 아이디로 회원가입을 처리하는 경우가 있을것이다.

그런 경우, 프로그램은 이것이 오류인지 모르므로 따로 처리를 해줘야한다.

 

방식은 Exception 클래스를 만들어 Error를 정의하고 Handler를 통해 처리했다. Handler는 위와 같이 작성하였다.

아래는 예외 Class 양식이다.

 

public class ExistMemberException extends RuntimeException{

	private String message;
	private static final long serialVersionUID = 5867172506387382920L;
	
	
	public ExistMemberException(String message) {
		this.message = message;
	}
	
	public String getMessage() {
        return this.message;
    }
	
}

 

 

위와 같이 처리 후 Handler로 전송하는 구조이다.

 

또한 사용은 해당 오류가 발생할 것 같은 클래스에 조건을 걸고 throw ExistMemberException()의 형태로 작성하면 된다.

 

그리고 내 생각엔 한 API 처리 단위로 하나의 예외처리 클래스를 만들고 메시지를 전달해 각각에 맞는 예외처리 작성없이 기능단위 예외처리도 좋은 생각인 것 같다. 구별은 메시지로 하면 된다.

 

 

 

 

'Server Development > Spring Basic' 카테고리의 다른 글

Spring - Multiple Requests, Threads  (0) 2023.04.05
Spring - AOP  (0) 2023.04.02
Spring - Log(LogBack)  (0) 2023.04.01
Spring - MVC  (0) 2023.03.24
Spring - Spring Boot  (0) 2023.03.24