Spring Boot 예외 처리 프로세스 고도화

최민길(Gale)·2023년 7월 2일
1

Spring Boot 적용기

목록 보기
34/46

안녕하세요 오늘은 이펙티브 자바를 기반으로 하여 기존의 예외 처리 프로세스를 고도화하는 작업을 진행해보겠습니다. 사실 이번 고도화 작업의 경우 최대한 예외를 던지지 않는 방식으로 변경하려고 하였으나 현재 지식으로는 코드가 너무 복잡해져서 현재 프로세스의 안정성을 향상시키는 방향으로 진행했습니다.

우선 가장 먼저 진행한 부분은 던지는 예외를 하위 예외로 변경해주었습니다. 기존 에러 체크는 RuntimeException을 상속받은 클래스를 모든 상황에서 던져 해당 에러만 캐치하면 로직 상에서 처리하고자 하는 예외를 처리해주는 방식으로 진행했습니다. 하지만 RuntimeException의 경우 상위 예외이기 때문에 여러 성격의 예외들을 포괄하는 클래스이므로 안정적으로 테스트할 수 없습니다. 따라서 각 예외의 성격에 맞는 하위 예외들을 상속받는 새로운 예외 클래스들을 생성했습니다.

아래 보시는 것처럼 상황에 맞는 예외 클래스들을 생성했습니다. 여기서 중요한 점은 다른 사람들이 익히고 사용하기 쉽기 때문에 유지보수 측면에서 강점이 있는 자바의 표준 예외를 사용했다는 점입니다. 파라미터에 값이 없을 경우 던지는 NoArgException은 NullPointerException을, 파라미터 값이 잘못되었을 경우 던지는 WrongArgException은 IllegalStateException을 상속받아 구현했습니다.

기존 예외를 그대로 사용해도 되는데 이렇게 새롭게 구현한 이유는 예외를 캐치했을 때 출력하기를 원하는 리스판스가 있기 때문에 이를 별도로 처리하기 위함입니다. 이를 클래스 내부에 열거 타입을 생성하여 해당 예외에서 출력 가능한 예외 목록들만 접근 가능할 수 있도록 하였습니다.

package com.toda.api.TODASERVERSPRINGBOOT.exceptions;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.RequiredArgsConstructor;

@AllArgsConstructor
@Getter
public final class NoArgException extends NullPointerException{
    @RequiredArgsConstructor
    @Getter
    public enum of{
        NO_URI_EXCEPTION(101,"존재하지 않는 Uri입니다."),
        NO_HEADER_EXCEPTION(102,"헤더값이 인식되지 않습니다.");

        private final int code;
        private final String message;
    }

    private final of element;
}

하지만 몇 가지 수정점이 존재합니다. 먼저 위에서 말씀드렸던 것처럼 최대한 예외를 발송하지 않는 방식으로 변경함과 동시에 코드 가독성을 향상시키는 방법에 대한 고찰이 필요하고, 열거 타입을 내부에 생성하다보니 외부에서 해당 열거 타입에 접근 시 클래스 이름.열거 타입 이름 의 순서로 참조해야 해서 코드가 길어지게 됩니다. 이 부분도 해결할 수 있는 방법에 대해서 조금 더 알아보면 좋을 것 같습니다. 그럼 이상으로 포스팅 마치도록 하겠습니다!

profile
저는 상황에 맞는 최적의 솔루션을 깊고 정확한 개념의 이해를 통한 다양한 방식으로 해결해오면서 지난 3년 동안 신규 서비스를 20만 회원 서비스로 성장시킨 Software Developer 최민길입니다.

0개의 댓글