[java] Hibernate에서 예외(Exception) 처리하는 방법은?

1. try-catch 블록 사용

가장 기본적인 방법은 try-catch 블록을 사용하는 것입니다. Hibernate 작업을 수행하는 코드를 try 블록에 넣고, catch 블록에서 예외를 처리합니다.

try {
    // Hibernate 작업 수행
    session.beginTransaction();
    // ...
    session.getTransaction().commit();
} catch (HibernateException e) {
    // 예외 처리
    session.getTransaction().rollback();
    e.printStackTrace();
}

try 블록 내에서 Hibernate 작업을 수행하고, 예외가 발생하면 catch 블록으로 이동하여 예외를 처리합니다. 예외가 발생하면 해당 작업을 롤백하고, 예외 정보를 출력합니다.

2. throws 예외 선언

만약 예외를 직접 처리하지 않고 상위 호출자에게 처리를 위임하고 싶다면, 메서드 선언에 throws 예외를 추가할 수 있습니다.

public void performHibernateOperation() throws HibernateException {
    session.beginTransaction();
    // ...
    session.getTransaction().commit();
}

만약 performHibernateOperation() 메서드를 호출하는 곳에서 예외 처리를 하지 않는다면, 예외는 상위 호출자에게 전파됩니다.

3. try-with-resources 문장

Java 7부터는 try-with-resources 문장을 사용하여 자동으로 리소스를 정리하는 것이 가능해졌습니다. Hibernate에서는 Session 객체나 Transaction 객체를 열었을 경우에는 명시적으로 닫아주어야 합니다.

try (Session session = sessionFactory.openSession()) {
    Transaction tx = session.beginTransaction();
    // ...
    tx.commit();
} catch (HibernateException e) {
    // 예외 처리
    e.printStackTrace();
}

try-with-resources 문장을 사용하면 try 블록이 끝나는 시점에서 자동으로 리소스를 닫아주기 때문에, 명시적으로 닫아주지 않아도 됩니다.

4. 예외 잡아내기

Hibernate에서 발생하는 예외의 종류는 다양합니다. 예를 들어, QueryException, ConstraintViolationException, ObjectNotFoundException 등이 있습니다. 다양한 예외를 잡아내기 위해 모든 예외를 하나의 catch 블록에서 처리할 수도 있습니다.

try {
    // Hibernate 작업 수행
} catch (HibernateException e) {
    // 예외 처리
    e.printStackTrace();
} catch (Exception e) {
    // 그 외 예외 처리
    e.printStackTrace();
}

다만, 가능하다면 예외를 구체화하여 적합한 예외 처리를 수행하는 것이 좋습니다. 이렇게 하면 예외의 원인을 더 정확하게 파악할 수 있습니다.

결론

Hibernate에서 예외 처리는 각 작업마다 필요한 곳에 적절히 적용해야 합니다. 예외를 처리함으로써 애플리케이션의 안정성을 높이고, 데이터베이스와의 통신에서 발생할 수 있는 문제를 예방할 수 있습니다. Hibernate에서 발생하는 예외를 잘 처리하여 안정적인 애플리케이션을 개발하는 데 도움이 되길 바랍니다.