2025. 4. 6. 17:09ㆍHigh Level Programming Language/JDBC Database Access
SQLExceptions 처리하기
이 페이지에서는 다음 주제를 다룹니다.
- SQLException 개요
- 예외 검색
- 경고 검색
- 분류된 SQLExceptions
- SQLException의 기타 하위 클래스
SQLException 개요
JDBC가 데이터 소스와의 상호 작용 중에 오류를 발견하면 Exception 대신 SQLException의 인스턴스를 throw합니다. (이 컨텍스트에서 데이터 소스는 Connection 객체가 연결된 데이터베이스를 나타냅니다.) SQLException 인스턴스에는 오류의 원인을 파악하는 데 도움이 되는 다음 정보가 포함되어 있습니다.
- 오류에 대한 설명. SQLException.getMessage 메서드를 호출하여 이 설명을 포함하는 String 객체를 검색합니다.
- SQLState 코드. 일부 코드는 데이터베이스 공급업체가 자체적으로 정의하도록 예약되어 있지만 이러한 코드와 해당 의미는 ISO/ANSI 및 Open Group(X/Open)에서 표준화했습니다. 이 String 객체는 5개의 영숫자 문자로 구성됩니다. SQLException.getSQLState 메서드를 호출하여 이 코드를 검색합니다.
- 오류 코드. 이는 SQLException 인스턴스가 throw되도록 한 오류를 식별하는 정수 값입니다. 해당 값과 의미는 구현별로 다르며 기본 데이터 소스에서 반환된 실제 오류 코드일 수 있습니다. SQLException.getErrorCode 메서드를 호출하여 오류를 검색합니다.
- 원인. SQLException 인스턴스에는 SQLException 인스턴스가 throw되도록 한 하나 이상의 Throwable 객체로 구성된 인과 관계가 있을 수 있습니다. 이 Cause 체인을 탐색하려면 null 값이 리턴될 때까지 SQLException.getCause 메서드를 재귀적으로 호출합니다.
- 연결된 예외에 대한 참조. 둘 이상의 오류가 발생하면 예외는 이 체인을 통해 참조됩니다. throw된 예외에서 SQLException.getNextException 메서드를 호출하여 이러한 예외를 검색합니다.
예외 검색
다음 메서드 JDBCTutorialUtilities.printSQLException은 SQLException에 포함된 SQLState, 오류 코드, 오류 설명 및 원인(있는 경우)과 연결된 다른 예외를 출력합니다.
public static void printSQLException(SQLException ex) {
for (Throwable e : ex) {
if (e instanceof SQLException) {
if (ignoreSQLException(
((SQLException)e).
getSQLState()) == false) {
e.printStackTrace(System.err);
System.err.println("SQLState: " +
((SQLException)e).getSQLState());
System.err.println("Error Code: " +
((SQLException)e).getErrorCode());
System.err.println("Message: " + e.getMessage());
Throwable t = ex.getCause();
while(t != null) {
System.out.println("Cause: " + t);
t = t.getCause();
}
}
}
}
}
예를 들어, Java DB를 DBMS로 사용하여 CoffeesTable.dropTable 메서드를 호출하고 테이블 COFFEES가 존재하지 않고 JDBCTutorialUtilities.ignoreSQLException 호출을 제거하면 출력은 다음과 유사합니다.
SQLState: 42Y55
Error Code: 30000
Message: 'DROP TABLE' cannot be performed on
'TESTDB.COFFEES' because it does not exist.
SQLException 정보를 출력하는 대신 먼저 SQLState를 검색한 다음 그에 따라 SQLException을 처리할 수 있습니다. 예를 들어, SQLState가 코드 42Y55와 같으면(그리고 Java DB를 DBMS로 사용하는 경우) JDBCTutorialUtilities.ignoreSQLException 메서드는 true를 리턴하여 JDBCTutorialUtilities.printSQLException이 SQLException을 무시하게 합니다.
public static boolean ignoreSQLException(String sqlState) {
if (sqlState == null) {
System.out.println("The SQL state is not defined!");
return false;
}
// X0Y32: Jar file already exists in schema
if (sqlState.equalsIgnoreCase("X0Y32"))
return true;
// 42Y55: Table already exists in schema
if (sqlState.equalsIgnoreCase("42Y55"))
return true;
return false;
}
Warning 검색
SQLWarning 객체는 데이터베이스 액세스 경고를 처리하는 SQLException의 하위 클래스입니다. 경고는 예외처럼 애플리케이션 실행을 중단하지 않습니다. 단순히 사용자에게 계획대로 발생하지 않은 사항을 알립니다. 예를 들어, 경고는 취소하려고 시도한 권한이 취소되지 않았음을 알릴 수 있습니다. 또는 경고는 요청된 연결 끊기 중에 오류가 발생했음을 알릴 수 있습니다.
경고는 Connection 객체, Statement 객체(PreparedStatement 및 CallableStatement 객체 포함) 또는 ResultSet 객체에서 보고될 수 있습니다. 이러한 각 클래스에는 호출 객체에서 보고된 첫 번째 경고를 확인하기 위해 호출해야 하는 getWarnings 메서드가 있습니다. getWarnings가 경고를 리턴하면 SQLWarning 메서드 getNextWarning을 호출하여 추가 경고를 가져올 수 있습니다. Statement을 실행하면 이전 Statement의 경고가 자동으로 지워지므로 경고가 쌓이지 않습니다. 그러나 이는 Statement에 대해 보고된 경고를 검색하려면 다른 Statement을 실행하기 전에 검색해야 함을 의미합니다.
JDBCTutorialUtilities.java의 다음 메서드는 Statement 또는 ResultSet 객체에서 보고된 경고에 대한 전체 정보를 가져오는 방법을 보여줍니다.
public static void getWarningsFromResultSet(ResultSet rs)
throws SQLException {
JDBCTutorialUtilities.printWarnings(rs.getWarnings());
}
public static void getWarningsFromStatement(Statement stmt)
throws SQLException {
JDBCTutorialUtilities.printWarnings(stmt.getWarnings());
}
public static void printWarnings(SQLWarning warning)
throws SQLException {
if (warning != null) {
System.out.println("\n---Warning---\n");
while (warning != null) {
System.out.println("Message: " + warning.getMessage());
System.out.println("SQLState: " + warning.getSQLState());
System.out.print("Vendor error code: ");
System.out.println(warning.getErrorCode());
System.out.println("");
warning = warning.getNextWarning();
}
}
가장 일반적인 경고는 SQLWarning의 하위 클래스인 DataTruncation 경고입니다. 모든 DataTruncation 객체에는 데이터 읽기 또는 쓰기에 문제가 있음을 나타내는 SQLState 01004가 있습니다. DataTruncation 메서드를 사용하면 데이터가 잘린 컬럼 또는 파라미터, 잘림이 읽기 또는 쓰기 작업인지 여부, 전송되었어야 하는 바이트 수 및 실제로 전송된 바이트 수를 확인할 수 있습니다.
분류된 SQLExceptions
JDBC 드라이버는 일반적인 SQLState 또는 특정 SQLState 클래스 값과 연결되지 않은 일반적인 오류 상태에 해당하는 SQLException의 하위 클래스를 throw할 수 있습니다. 이를 통해 보다 이식 가능한 오류 처리 코드를 작성할 수 있습니다. 이러한 예외는 다음 클래스 중 하나의 하위 클래스입니다.
- SQLNonTransientException
- SQLTransientException
- SQLRecoverableException
이러한 하위 클래스에 대한 자세한 내용은 java.sql 패키지의 최신 Javadoc 또는 JDBC 드라이버의 설명서를 참조하십시오.
SQLException의 기타 하위 클래스
다음 SQLException의 하위 클래스도 throw될 수 있습니다.
- BatchUpdateException은 배치 업데이트 작업 중에 오류가 발생할 때 throw됩니다. SQLException에서 제공하는 정보 외에도 BatchUpdateException은 오류가 발생하기 전에 실행된 모든 문에 대한 업데이트 수를 제공합니다.
- SQLClientInfoException은 하나 이상의 클라이언트 정보 속성을 연결에 설정할 수 없을 때 throw됩니다. SQLException에서 제공하는 정보 외에도 SQLClientInfoException은 설정되지 않은 클라이언트 정보 속성 목록을 제공합니다.
출처 : https://docs.oracle.com/javase/tutorial/jdbc/basics/sqlexception.html
Handling SQLExceptions (The Java™ Tutorials > JDBC Database Access > JDBC Basics)
The Java Tutorials have been written for JDK 8. Examples and practices described in this page don't take advantage of improvements introduced in later releases and might use technology no longer available. See Dev.java for updated tutorials taking advantag
docs.oracle.com
'High Level Programming Language > JDBC Database Access' 카테고리의 다른 글
Retrieving and Modifying Values from Result Sets (0) | 2025.04.06 |
---|---|
Setting Up Tables (0) | 2025.04.06 |
Connecting with DataSource Objects (0) | 2025.04.06 |
Establishing a Connection (0) | 2025.04.06 |
Processing SQL Statements with JDBC (0) | 2025.04.06 |