개요
예외(Exception)는 애플리케이션의 오류를 처리하는 기능이다.
런타임 시 발생하는 예외에 대해 NotFound나 HTTP관련 예외는 지원해 준다.
하지만 정확히 어떤 오류가 발생했는지를 사용자가 직접 지정하여 발생시킬 수 있다.
예외 처리는 MVC 구조에서 Controller나 Model에서 발생하는 오류를 처리하는 데 사용된다.
Exception Handling은 MVC의 일부는 아니지만, Controller나 Model에서 오류를 처리하는 데 필요하다.
하지만 MVC와 함께 사용되면서 애플리케이션의 유지보수성과 안정성을 높이는 역할을한다.
또한 사용자 지정 예외 처리를 만들게 되면, 개발을 진행하면서 어느 부분에서 에러가 발생했는지 쉽게 파악할 수 있다는 장점이 있다.
exception패키지를 생성하고, custom 패키지 내부에 발생할 예외를 정의했다.
handler 패키지 내부에 전역적으로 예외 관련 핸들러를 배치해주었고, 해당 에러 발생 시 반환하기 위한 DTO를 ErrorResponse로 지정해 주었다.
커스텀 예외 처리
package com.a207.smartlocker.exception.custom;
public class "예외 이름" extends RuntimeException {
public "예외 이름"(String message) {
super(message);
}
}
해당 프로젝트에서 모든 커스텀 예외는 위와 같은 형식으로 작성되어 있다.
해당 예외들은 서비스 로직 내부에서 예외를 던질때 지정을 해준다.
ErrorResponse.java
package com.a207.smartlocker.exception;
import lombok.Builder;
import lombok.Getter;
import java.time.LocalDateTime;
@Getter
@Builder
public class ErrorResponse {
private String message;
private LocalDateTime timestamp;
}
에러 정보를 반환하기 위한 DTO를 정의했다.
예외 발생 시 에러 메시지와 에러 발생 시각을 담아 클라이언트에게 리턴해 주게 된다.
GlobalExceptionHandler.java
package com.a207.smartlocker.exception.handler;
import com.a207.smartlocker.exception.ErrorResponse;
import com.a207.smartlocker.exception.custom.*;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import java.time.LocalDateTime;
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(NotFoundException.class)
public ResponseEntity<ErrorResponse> handleNotFoundException(NotFoundException ex) {
ErrorResponse error = ErrorResponse.builder()
.message(ex.getMessage())
.timestamp(LocalDateTime.now())
.build();
return new ResponseEntity<>(error, HttpStatus.NOT_FOUND); // 404
}
@ExceptionHandler(UnauthorizedException.class)
public ResponseEntity<ErrorResponse> handleUnauthorizedException(UnauthorizedException ex) {
ErrorResponse error = ErrorResponse.builder()
.message(ex.getMessage())
.timestamp(LocalDateTime.now())
.build();
return new ResponseEntity<>(error, HttpStatus.UNAUTHORIZED); // 401
}
@ExceptionHandler(RobotControlException.class)
public ResponseEntity<ErrorResponse> handleRobotControlException(RobotControlException ex) {
ErrorResponse error = ErrorResponse.builder()
.message(ex.getMessage())
.timestamp(LocalDateTime.now())
.build();
return new ResponseEntity<>(error, HttpStatus.SERVICE_UNAVAILABLE); // 503
}
@ExceptionHandler(InvalidTokenException.class)
public ResponseEntity<ErrorResponse> handleInvalidTokenException(InvalidTokenException ex) {
ErrorResponse error = ErrorResponse.builder()
.message(ex.getMessage())
.timestamp(LocalDateTime.now())
.build();
return new ResponseEntity<>(error, HttpStatus.FORBIDDEN); // 403
}
@ExceptionHandler(NoAvailableRobotException.class)
public ResponseEntity<ErrorResponse> handleNoAvailableRobotException(NoAvailableRobotException ex) {
ErrorResponse error = ErrorResponse.builder()
.message(ex.getMessage())
.timestamp(LocalDateTime.now())
.build();
return new ResponseEntity<>(error, HttpStatus.SERVICE_UNAVAILABLE); // 503
}
@ExceptionHandler(LockerAlreadyInUseException.class)
public ResponseEntity<ErrorResponse> handleLockerAlreadyInUseException(LockerAlreadyInUseException ex) {
ErrorResponse error = ErrorResponse.builder()
.message(ex.getMessage())
.timestamp(LocalDateTime.now())
.build();
return new ResponseEntity<>(error, HttpStatus.SERVICE_UNAVAILABLE); // 503
}
@ExceptionHandler(TaskAlreadyInQueueException.class)
public ResponseEntity<ErrorResponse> handleTaskAlreadyInQueueException(TaskAlreadyInQueueException ex) {
ErrorResponse error = ErrorResponse.builder()
.message(ex.getMessage())
.timestamp(LocalDateTime.now())
.build();
return new ResponseEntity<>(error, HttpStatus.SERVICE_UNAVAILABLE); // 503
}
}
각 예외 마다 반환할 에러의 DTO와 HTTP 상태를 리턴해 주기 위한 핸들러이다.
DTO는 위에서 언급했듯 에러 메시지와 발생한 시각을 전다랗게 되며, HTTP상태는 404, 401, 503등의 에러 코드를 반환하게 된다.
'프로젝트 > 무인 사물함' 카테고리의 다른 글
[AIoT] 무인 사물함 프로젝트 SpringBoot 서버 배포 (0) | 2025.02.14 |
---|---|
[AIoT] 무인 사물함 프로젝트 환경 설정 Config (0) | 2025.02.14 |
[AIoT] 무인 사물함 프로젝트 MVC 모델 작성 Controller (0) | 2025.02.13 |
[AIoT] 무인 사물함 프로젝트 MVC 모델 작성 Repository (0) | 2025.02.11 |
[AIoT] 무인 사물함 프로젝트 MVC 모델 작성 Model-DTO (0) | 2025.02.10 |