PHpullh
학습 라이브러리/Java/예외 번역(Exception Translation)

JAVA · 예외처리

예외 번역(Exception Translation)

저수준 예외를 고수준 예외로 변환하는 예외 번역 패턴입니다.

예외처리중급예외번역exception-translationcause계층

핵심 설명

저수준 예외를 고수준 예외로 변환하는 예외 번역 패턴입니다.

Java code

import java.sql.*;

// 저수준 예외를 고수준으로 변환
class RepositoryException extends RuntimeException {
    RepositoryException(String msg, Throwable cause) { super(msg, cause); }
}

class ServiceException extends RuntimeException {
    ServiceException(String msg, Throwable cause) { super(msg, cause); }
}

class UserRepository {
    void save(String user) {
        try {
            // JDBC 호출 시뮬레이션
            if (user.isEmpty()) {
                throw new SQLException("제약 조건 위반");
            }
        } catch (SQLException e) {
            // SQL 예외 -> 리포지토리 예외로 번역
            throw new RepositoryException("사용자 저장 실패", e);
        }
    }
}

class UserService2 {
    private final UserRepository repo = new UserRepository();

    void createUser(String user) {
        try {
            repo.save(user);
        } catch (RepositoryException e) {
            // 리포지토리 예외 -> 서비스 예외로 번역
            throw new ServiceException("사용자 생성 실패", e);
        }
    }
}

class Main {
    public static void main(String[] args) {
        try {
            new UserService2().createUser("");
        } catch (ServiceException e) {
            System.out.println("서비스: " + e.getMessage());
            System.out.println("원인1: " + e.getCause().getMessage());
            System.out.println("원인2: " + e.getCause().getCause().getMessage());
        }
    }
}

학습 팁

예외 번역으로 계층 간 추상화를 유지합니다. 컨트롤러에서 SQLException을 직접 알 필요가 없어집니다.

주의할 점

번역 시 원인 예외(cause)를 생략하면 디버깅이 불가능합니다. 항상 원본 예외를 체이닝하세요.

자주 묻는 질문

예외 번역(Exception Translation)란 무엇인가요?

저수준 예외를 고수준 예외로 변환하는 예외 번역 패턴입니다.

예외 번역(Exception Translation) 학습 시 주의할 점은 무엇인가요?

번역 시 원인 예외( cause )를 생략하면 디버깅이 불가능합니다. 항상 원본 예외를 체이닝하세요.