java

Java 예외 처리 방식: Exception 클래스를 개별 생성 vs Enum으로 관리

curiousKidd 2024. 12. 20. 16:30
반응형

Spring과 Java 기반의 애플리케이션을 개발할 때, 예외 처리 방식은 시스템의 안정성과 유지보수성에 큰 영향을 미칩니다. 이번 글에서는 예외를 클래스별로 생성하는 방식과 Enum을 사용해 관리하는 방식의 장단점을 비교하여, 상황에 맞는 선택을 할 수 있도록 도와드리겠습니다.


1. Exception을 클래스별로 생성하는 방식

구현 방식

예외를 처리하기 위해 특정 상황에 맞는 예외 클래스를 각각 정의하는 방식입니다. 예를 들어, 다음과 같은 예외 클래스를 작성할 수 있습니다:

public class UserNotFoundException extends RuntimeException {
    public UserNotFoundException(String message) {
        super(message);
    }
}

public class InvalidInputException extends RuntimeException {
    public InvalidInputException(String message) {
        super(message);
    }
}

장점

  1. 명확한 책임 분리:

    • 예외 클래스를 개별적으로 생성하면, 각 예외의 역할과 의미를 명확히 구분할 수 있습니다.
    • 예외 클래스 이름 자체가 도메인 문제를 설명하는 역할을 합니다.
  2. 확장성:

    • 필요에 따라 특정 예외 클래스에 추가적인 속성(예: errorCode, details)이나 메서드를 정의할 수 있습니다.
    • 예외 처리 로직을 예외 클래스 내에 캡슐화할 수 있습니다.
  3. IDE 및 도구 지원:

    • IDE에서 예외를 쉽게 검색하거나 자동 완성 기능을 활용할 수 있습니다.
    • 특정 예외를 정확히 catch하거나 throw하기 용이합니다.

단점

  1. 클래스 수 증가:

    • 도메인이 복잡해질수록 예외 클래스의 수가 기하급수적으로 늘어나, 관리가 어려워질 수 있습니다.
  2. 중복 코드 발생 가능성:

    • 유사한 구조의 예외 클래스들이 반복적으로 정의될 가능성이 높습니다.
  3. 관리 부담:

    • 예외 클래스가 분산되어 있으면, 어떤 예외가 정의되어 있는지 한눈에 파악하기 어렵습니다.

2. Exception을 Enum으로 관리하는 방식

구현 방식

예외 코드를 Enum으로 정의하고, 단일 커스텀 예외 클래스를 통해 관리하는 방식입니다.

public enum ExceptionCode {
    USER_NOT_FOUND("사용자를 찾을 수 없습니다."),
    INVALID_INPUT("잘못된 입력입니다."),
    SERVER_ERROR("서버에서 오류가 발생했습니다.");

    private final String message;

    ExceptionCode(String message) {
        this.message = message;
    }

    public String getMessage() {
        return message;
    }
}

public class CustomException extends RuntimeException {
    private final ExceptionCode code;

    public CustomException(ExceptionCode code) {
        super(code.getMessage());
        this.code = code;
    }

    public ExceptionCode getCode() {
        return code;
    }
}

장점

  1. 중앙 집중화:

    • 모든 예외 상황을 하나의 Enum에 정의하여 관리하기 때문에 예외를 한눈에 파악할 수 있습니다.
  2. 코드 간소화:

    • 다수의 예외 클래스를 정의하지 않아도 되므로, 코드가 간결해집니다.
  3. 일관성 있는 메시지 관리:

    • 예외 메시지를 Enum에 통합하여, 메시지 관리가 용이하고 일관성을 유지할 수 있습니다.
  4. 다국어 지원 용이:

    • Enum의 메시지를 리소스 번들로 추출하면, 다국어 지원을 쉽게 구현할 수 있습니다.

단점

  1. 유연성 부족:

    • 각 예외별로 고유한 속성을 추가하거나, 복잡한 예외 로직을 정의하기 어렵습니다.
  2. catch 구문에서 구체성 부족:

    • 모든 예외가 같은 커스텀 예외 클래스(CustomException)를 통해 발생하기 때문에, 구체적인 예외를 구분해서 처리하려면 추가 로직이 필요합니다.
  3. 장황한 코드:

    • 예외 발생 시마다 Enum과 커스텀 예외를 조합해 사용해야 하므로, 단순한 예외 처리보다 코드가 다소 장황해질 수 있습니다.

3. 클래스 생성 방식 vs Enum 관리 방식: 비교표

구분 클래스별 생성 Enum 관리
구현 난이도 클래스 생성 및 상속 관계 구현이 필요 Enum과 단일 예외 클래스만 구현하면 간단
확장성 예외별로 추가적인 속성과 로직 구현 가능 개별 예외에 고유 로직이나 속성 추가가 어려움
코드 관리 클래스 수 증가로 관리가 복잡해질 가능성 있음 예외 코드가 중앙에 집중되어 관리가 용이
가독성 명확한 클래스 이름으로 도메인 문제를 설명 Enum의 이름과 메시지로 예외 상황 설명
로그 관리 예외 클래스 이름이 명확히 로깅됨 로그에서 커스텀 예외 클래스와 코드로 구분해야 함
다국어 지원 개별 클래스마다 다국어 메시지를 처리해야 함 Enum 메시지를 리소스 번들로 추출하여 쉽게 지원 가능

4. 결론 및 추천

클래스별 생성 방식을 선택해야 하는 경우

  • 도메인이 복잡하고, 각 예외가 고유한 속성과 동작을 가져야 하는 경우.
  • 예외의 확장성과 구체적인 처리가 중요한 시스템.
  • 디버깅과 로그 분석에서 예외 클래스를 명확히 구분하고자 할 때.

Enum 관리 방식을 선택해야 하는 경우

  • 비교적 단순한 도메인에서 예외 상황이 많지 않고, 메시지를 일관되게 관리하고 싶을 때.
  • 유지보수성과 다국어 지원이 중요한 애플리케이션.
  • 코드의 간결함과 중앙 집중적인 예외 관리를 선호할 때.

여러분의 프로젝트에 맞는 예외 처리 방식을 선택하여, 더욱 안정적이고 유지보수 가능한 애플리케이션을 개발하시기 바랍니다!

반응형

'java' 카테고리의 다른 글

[Java] Java 8 vs Java 21 - JVM & GC 변화와 메모리 관리 방식 정리  (0) 2025.04.12
인터페이스 VS 추상 클래스  (0) 2024.12.18
Java11  (0) 2023.12.07
Java8  (0) 2023.12.07
Java8 VS Java11  (0) 2023.12.07