이번 시간에는 Spring의 익셉션 변환처리에 대해 알아보겠습니다.
SQL 문법이 잘못됐을 때 발생한 메시지를 보면 익셉션 클래스가 org.springframework.jdbc 에 속한 BadSqlGrammarException 클래스임을 알 수 있습니다. 해당 익셉션이 발생한 이유는 MySQLSyntaxErrorException이 발생했기 때문입니다.
org.springframework.jdbc.BadSqlGrammarException: ...
Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: ...
해당 익셉션이 발생한 코드를 살펴보면
jdbcTemplate.update((Connection conn) -> {
PreparedStatement pstmt = conn.prepareStatement("insert into MEMBER (EMAIL, PASSWORD, NAME, REGDATE) " +
"values (?, ?, ?, ?)",
new String[] {"ID"} );
BadSqlGrammarException을 발생한 메서드는 JdbcTemplate의 update() 메서드에서 발생하였습니다. update() 메서드는 DB 연동을 위해 JDBC API를 사용하는데 , JDBC API를 사용하는 과정에서 SQLException이 발생하면 이 익셉션을 알맞은 DataAccessException으로 변환해서 발생합니다.
try{
...JDBC Use Code
} catch (SQLException ex){
throw convertSqlToDataException(ex);
}
MySQL용 드라이버는 SQL 문법이 잘못된 경우 SQLException을 상속받은 MySQLSynataxErrorException을 발생시키는데 JdbcTemplate는 이 익셉션을 DataAccessException을 상속받은 BadSQlGrammarException으로 변환합니다.
DataAccessException은 스프링이 제공하는 익셉션 타입으로 데이터 연결에 문제가 있을 때 스프링 모듈이 발생시킵니다.
SQLException을 DaataAccessException으로 변환하는 이유
가장 주된 이유는 연동 기술에 상관없이 동일하게 익셉션을 처리할 수 있도록 하기 위함입니다.
스프링은 JDBC 뿐만 아니라, JPA, 하이버네이트 등에 대한 연동을 지원하고 MyBatis는 자체적으로 스프링 연동 기능을 제공합니다.
따라서 각각의 구현기술마다 익셉션을 다르게 처리해야 한다면 개발자는 기술마다 익셉션 처리 코드를 작성해야 할 것입니다. 아래와 같이 기술에 따라 발생하는 익셉션을 스프링이 제공하는 익셉션으로 변환함으로써 구현 기술에 상관없이 동일한 코드로 익셉션을 처리할 수 있게 됩니다.
//JDBC
try{
JDBC 연동코드
} catch(SQLException ex){
...
}
//하이버네이트
try{
하이버네이트 연동코드
} catch(SQLException ex){
...
}
//JPA
try{
JPA 연동코드
} catch(SQLException ex){
...
}
해당 코드들을 스프링은 아래와 같이 동일한 코드로 익셉션 처리 할 수 있게 해줍니다.
try{
DB 연동코드
} catch(DataAccessException ex){
...
}
스프링은 문법 오류 익셉션인 BadSqlGrammarException 외에도, DuplicateKeyException, QueryTimeoutException 등 DataAccessException을 상속한 다양한 익셉션 클래스를 제공합니다. 각 익셉션 클래스의 이름은 문제가 발생한 원인을 의미합니다.
DataAccessException은 RuntimeException입니다. JDBC를 직접 이용하면 try-catch문을 이용해서 익셉션을 처리해야 하는데(또한 메서드의 throws에 반드시 SQLException을 지정) DataAccessException은 RuntimeException이므로 필요한 경우에만 익셉션을 처리하면 됩니다.
//JDBC 를 직접사용하면 SQLException을 반드시 알맞게 처리해야함
try {
pstmt = conn.prepareStatement(someQuery);
...
} catch (SQLException ex) {
...// SQLException을 알맞게 처리해야 함
}
//스프링을 사용하면 DataAccessException을 필요한 경우에만 try-catch 사용
jdbcTemplate.update(someQuery, param1);
'Spring' 카테고리의 다른 글
[Spring] @Transacational과 프록시 (1) | 2024.03.01 |
---|---|
[Spring] Spring DB 트랜잭션 처리 (1) | 2024.02.28 |
[Spring] Spring DB 연동 과정에서 발생하는 Exception (0) | 2024.02.26 |
[Spring] Spring DB - 쿼리 실행 테스트 (1) | 2024.02.25 |
[Spring] Spring DB - 쿼리실행 (0) | 2024.02.21 |