JDBC는 자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API다.
JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공한다.
대표적으로 다음 3가지 기능을 표준 인터페이스로 정의해서 제공한다.
- java.sql.Connection: 데이터베이스에 접속하기 위한 객체
- java.sql.Statement: SQL문을 데이터베이스로 전송하기 위한 객체
- java.sql.ResultSet: SQL문 실행 결과를 저장하는 객체
커넥션을 획득하는 방법을 추상화한 인터페이스이다.
public interface DataSource {
Connection getConnection() throws SQLException;
}
- 사용자는 웹 애플리케이션 서버(WAS)나 DB 접근 툴 같은 클라이언트를 사용해서 데이터베이스 서버에 접근할 수 있다. 클라이언트는 데이터베이스
서버에 연결을 요청하고 커넥션을 맺게 된다. 이때 데이터베이스 서버는 내부에 세션이라는 것을 만든다. 그리고 앞으로 해당 커넥션을 통한 모든 요청은 이 세션을 통해서 실행하게 된다.
- 쉽게 이야기해서 개발자가 클라이언트를 통해 SQL을 전달하면 현재 커넥션에 연결된 세션이 SQL을 실행한다.
- 세션은 트랜잭션을 시작하고, 커밋 또는 롤백을 통해 트랜잭션을 종료한다. 그리고 이후에 새로운 트랜잭션을 다시 시작할 수 있다.
- 사용자가 커넥션을 닫거나, 또는 DBA가 세션을 강제로 종료하면 세션은 종료된다.
스프링은 앞서 설명한 문제들을 해결하기 위해 데이터 접근과 관련된 예외를 추상화해서 제공한다.
![Screenshot 2024-05-20 at 6 21 29 PM](https://private-user-images.githubusercontent.com/125632083/332012069-0c568de1-74d7-49dd-8bef-e7ace9d7383c.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjYxMTUxMDIsIm5iZiI6MTcyNjExNDgwMiwicGF0aCI6Ii8xMjU2MzIwODMvMzMyMDEyMDY5LTBjNTY4ZGUxLTc0ZDctNDlkZC04YmVmLWU3YWNlOWQ3MzgzYy5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwOTEyJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDkxMlQwNDIwMDJaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0xNTAwMTQxM2UzZWQwMmU4MWY2YzdiNjU1NDY1YTFjNjg0MmEwYTA0NjMwZjkxMjJlYjFmNjcyZTExZmZmNGNiJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.SRgwOz1rb84xY_A3-KNRcv6-RouIB7fPOFi2Mpgm5uA)
- 스프링은 데이터 접근 계층에 대한 수십 가지 예외를 정리해서 일관된 예외 계층을 제공한다.
- 각각의 예외는 특정 기술에 종속적이지 않게 설계되어 있다. 따라서 서비스 계층에서도 스프링이 제공하는 예외를 사용하면 된다. 예를 들어서 JDBC 기술을 사용하든, JPA 기술을 사용하든 스프링이 제공하는 예외를 사용하면 된다.
- JDBC나 JPA를 사용할 때 발생하는 예외를 스프링이 제공하는 예외로 변환해주는 역할도 스프링이 제공한다.
- 참고로 그림을 단순화 하기 위해 일부 계층을 생략했다.
- 예외의 최고 상위는
org.springframework.dao.DataAccessException
이다. 그림에서 보는 것 처럼 런타임 예외를 상속 받았기 때문에 스프링이 제공하는 데이터 접근 계층의 모든 예외는 런타임 예외이다. DataAccessException
은 크게 2가지로 구분하는데NonTransient
예외와Transient
예외이다.Transient
는 일시적이라는 뜻이다.Transient
하위 예외는 동일한 SQL을 다시 시도했을 때 성공할 가능성이 있다.- 예를 들어서 쿼리 타임아웃, 락과 관련된 오류들이다. 이런 오류들은 데이터베이스 상태가 좋아지거나, 락이 풀렸을 때 다시 시도하면 성공할 수 도 있다.
NonTransient
는 일시적이지 않다는 뜻이다. 같은 SQL을 그대로 반복해서 실행하면 실패한다.- SQL 문법 오류, 데이터베이스 제약조건 위배 등이 있다.
![Screenshot 2024-05-24 at 12 29 30 PM](https://private-user-images.githubusercontent.com/125632083/333435730-f67e673b-0657-4514-9119-072fd311bbb4.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjYxMTUxMDIsIm5iZiI6MTcyNjExNDgwMiwicGF0aCI6Ii8xMjU2MzIwODMvMzMzNDM1NzMwLWY2N2U2NzNiLTA2NTctNDUxNC05MTE5LTA3MmZkMzExYmJiNC5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwOTEyJTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDkxMlQwNDIwMDJaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT02NzNiMzdiZDgxZjU4MjNlMjA1M2U0MDMyNzM4NGE4YzQzMWE0OTk5YmNkYzVjMzdlZjNiZWU0ZmE4Yzk4NjA1JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.8dhfyfB4JQv344zkOy9sFeW1viu3wly2f5_7ZYbWEzg)