Back-end

DataAccessException이란? (What is DataAccessException?)

🧐 DataAccessException이란?

 

참고 :

https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/dao/DataAccessException.html

 

DataAccessException (Spring Framework 5.2.8.RELEASE API)

Root of the hierarchy of data access exceptions discussed in Expert One-On-One J2EE Design and Development. Please see Chapter 9 of this book for detailed discussion of the motivation for this package. This exception hierarchy aims to let user code find an

docs.spring.io

 

스프링 문서에서 DataAccessException에 대한 내용을 보면 

 

 this class is a runtime exception 

런타임 예외에 속하는 클래스이고,

 

 Root of the hierarchy of data access exceptions 

Data Access Exception 계층의 루트에 위치한 클래스이며,

 

 let user code find and handle the kind of error encountered without knowing the details of the particular data access API  

코드가 특정한 데이터 접근 API를 알 필요 없이 직면하는 에러를 발견하고 처리할 수 있도록 해준다고 한다.

 

 possible to react to an optimistic locking failure without knowing that JDBC is being used. 

또한 An Optimistic Locking Failure (낙관적인 락킹 실패)에 대해 특정한 API를 알 필요 없이 즉각적인 반응이 가능하다고 한다.

 

 

💡 낙관적인 락킹이란?

 

같은 정보를 두 명 이상의 사용자가 동시에 조회하고 순차적으로 업데이트를 할 때,

뒤늦게 업데이트한 것이 먼저 업데이트한 것을 덮어쓰지 않도록 막아주는 데 쓸 수 있는 기능.

 

 

💡 DataAccessException은 언제 사용할까?

 

UserDao의 add() 메소드를 JdbcTemplate으로 구현할 때 throws SQLException 선언이 사라졌음을 볼 수 있다.

public void add(final User user) {
	this.jdbcTemplate.update("insert into users(id, name, password) values(?,?,?)", user.getId(), user.getName(), user.getPassword());
}

이는 JdbcTemplate이 자체적으로 내부에서 발생하는

모든 SQLException을 런타임 예외인 DataAccessException으로 포장해서 던져줬기 때문이다.

 

왜냐하면 SQLException은 복구가 가능한 예외가 아닌 시스템의 예외이다.

 

쉽게 말해 프로그램의 오류 또는 개발자의 부주희 때문에 발생하는 경우이거나,

통제할 수 없는 외부상황 때문에 발생해 코드 레벨에서는 복구할 방법이 없다는 것이다.

 

(예시)

  • SQL 문법이 틀린 경우
  • 제약조건을 위반한 경우
  • DB 서버가 다운된 경우
  • 네트워크 불안정
  • DB커넥션 풀

따라서 JdbcTemplate은 입력 단계에서 강화시키기 위해 개발자가 빨리 인식할 수 있도록

런타임 예외인 DataAccessException으로 포장을 해준 것이다.

 

이로서 DataAccessException은

SQLException에 대해 애플리케이션 레벨에서 신경을 쓰지 않도록 해주고,

SQLException에 담긴 다루기 힘든 상세한 예외 정보를 의미 있는 예외로 전환시켜준다.

 

또한 DataAccessException은 또한 앞서 말했듯이 자바 데이터 액세스 기술에 상관없이 발생하는 예외에도 적용된다.

 

즉, 의미가 같은 예외라면 데이터 액세스 기술의 종류와 상관없이 일관된 예외가 발생하도록 만들어준다.

 

이로서 DAO 객체는 사용하는 기술에 완전히 독립적인 인터페이스로 분리를 시켜 구현해 줄 수 있다.

( ※ 데이터 액세스 기술에서 발생 가능한 대부분의 예외를 계층구조로 분류해놓음. )

 

 

🧯 주의사항

 

키 값이 중복이 되는 같은 상황이라도 똑같은 예외가 발생하지 않을 수 있다.

 

(예시)

데이터 액세스 기술에 상관없이 키 값이 중복이 되는 상황에 아래와 같이 동일한 예외가 발생하지 않는다.

JDBC는 DuplicateKeyException, 하이버네이트는 ContraintViolationException을 발생시킬 것이다.

 

 

참고 문서 : 

토비의 스프링3 (이일민)

반응형

'Back-end' 카테고리의 다른 글

Rest API?  (0) 2020.08.29