프로젝트/무인 사물함

[AIoT] 무인 사물함 프로젝트 예외 처리 Exception

마달랭 2025. 2. 14. 14:14
반응형

개요

예외(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등의 에러 코드를 반환하게 된다.

 

728x90
반응형