<aside> 📖

학습 목표

1. 예외 추상화의 필요성

1-1. 예외 추상화란?

Spring은 다양한 기술과 라이브러리를 통합하는 프레임워크입니다. 각각의 기술은 고유한 예외 체계를 갖고 있으며, 예외 처리 방식도 서로 다릅니다. 예를 들어 JDBC는 SQLException, JPA는 PersistenceException을 던지며, 각각 별도로 처리해야 합니다.

이러한 문제를 해결하기 위해 Spring은 예외 추상화(Exception Abstraction) 계층을 제공합니다. 이를 통해 여러 기술의 예외를 일관된 방식으로 처리할 수 있게 됩니다.

1-2. 계층 구조 예시

Exception
└── RuntimeException
    └── DataAccessException (Spring의 추상 예외)
        ├── DuplicateKeyException
        ├── DataIntegrityViolationException
        ├── EmptyResultDataAccessException
        └── ... (다양한 세부 예외)

1-3. 다양한 기술에서 발생하는 예외 예시

// JDBC에서 발생하는 SQLException 처리 예시
try {
    Connection conn = DriverManager.getConnection(url, username, password);
    // JDBC 작업 수행
} catch (SQLException e) {
    // JDBC 관련 예외 처리 (로직 중복, 복잡도 증가)
}

// JPA에서 발생하는 PersistenceException 처리 예시
try {
    entityManager.persist(entity);
} catch (PersistenceException e) {
    // JPA 관련 예외 처리
}

위처럼 기술마다 다른 예외를 직접 처리하는 경우 예외 처리 코드가 중복되고비즈니스 로직과 섞여 가독성이 떨어집니다. 또한, 기술 변경 시 예외 처리 코드도 함께 수정해야 하므로 유지보수가 어려워집니다.

Spring은 이를 방지하기 위해 DataAccessException과 같은 공통 예외 계층을 제공하여, 개발자가 기술 세부 사항에 신경 쓰지 않고도 예외를 처리할 수 있게 돕습니다.

// Spring의 JdbcTemplate을 사용할 경우
try {
    jdbcTemplate.query("SELECT * FROM users", resultSetExtractor);
} catch (DataAccessException e) {
    // 기술에 관계없이 공통된 예외 처리 가능
    log.error("데이터 접근 중 오류 발생", e);
    throw new CustomException("DB 오류 발생");
}

1-4. 예외 추상화의 동작 구조

Spring은 내부적으로 기술별 예외를 추상화 계층으로 감싸는 작업을 수행합니다. 예를 들어 SQLException을 DataAccessException 하위 클래스로 변환하는 과정은 다음과 같습니다.

기술 원래 예외 변환 후 예외 (Spring)
JDBC SQLException DataAccessException 및 하위 클래스
JPA PersistenceException DataAccessException 및 하위 클래스
Hibernate HibernateException DataAccessException 및 하위 클래스

Spring 내부에서 SQLExceptionTranslatorJpaDialect 같은 컴포넌트가 이 역할을 수행합니다.

1-5. 예외 변환 흐름도

SQLException / PersistenceException / HibernateException
       ↓ (Spring 내부 변환)
DataAccessException (Spring의 공통 예외)
       ↓
개발자 정의 예외 처리 (CustomException 등)

1-6. 실무 팁