JDBC
쉽게 말해 JAVA에서 데이터베이스에 접근할 수 있도록 도와주는 API이다.
먼저 왜 JDBC가 등장했는지 확인해보자.
JDBC 이전의 문제점
- 새로운 데이터베이스의 사용법을 배워야한다.
- DB 벤더마다 사용법은 다름
- 다른 DB 사용 시, 새롭게 배워야하는 함
- 프로덕션 코드의 변경 범위가 커질 수 있다.
- 이게 무엇보다 큰 문제점
- DB를 다른 것으로 바꿀 경우, 모든 코드를 싹 고칠 수도 있음
- 이를
의존 역전 원칙(DIP)의 위배
라고 함
DIP는 추후에 알아보자
그렇기 때문에 JDBC는 DB에 접근하기 위한 모든 과정을 담당하여 우리는 DB 벤더마다 사용법을 학습할 필요가 없다.
JDBC의 구성요소
1. Driver
- DBMS와 통신하는 역할을 수행
- DB 벤더마다 별도의 드라이버가 필요
JDBC Driver Manager
- 라이브러리로 등록된 DB Driver를 관리하고, DB 커넥션을 획득
Driver Manager가 무엇을 하는지는 2번에서 살펴보자
2. Connection
- Connection 객체: 특정 데이터 원본과 연결된 객체, DB의 연결정보를 담고 있는 객체 (ip주소, port번호, 계정명, 비밀번호)
사용자가 Connection을 요청하면 DriverManager는 getConnection을 이용하여 적잘한 Driver를 찾는다,
Connection connection = DriverManager.getConnection(URL, USERNAME, PASSWORD);
그후, 등록된 모든 드라이버들에게 connect 환메소드를 통해 DB와의 연결을 요청한다.
그 후, 연결에 성공하게 되면 바로 Connection 객체를 반환한다.
이렇게 반환된 Connection을 가지고 쿼리를 수행하도록 해보자.
3. Statement
Statment는 해당 DB에 SQL문을 전달하고 실행한 후 결과를 받아내는 객체이다.
- Connection객체에 의해 프로그램에 구현되는 일종의 메소드 집합이다.
- Statement객체로 SQL문을 String객체로 담아 인자값으로 전달하여 질의 수행한다.
String sql ="SELECT * FROM MEMBER";
// Statement객체 생성
stmt = conn.createStatement();
// sql문 실행 후 결과 돌려받기
rset = stmt.executeQuery(sql);
이렇게 쿼리 실행 결과를 ResultSet을 통해 받게 된다.
4. ResultSet
SELECT문을 사용한 질의 성공시 반환되는 객체
- 만일 실행한 SQL문이 SELECT문일 경우 조회된 결과가 result set객체에 들어감
- INSERT와 UPDATE의 경우, ResultSet을 반환하지 않는다.
그러면 쿼리가 실행결과 투플이 없는 경우, ResultSet에서 어떻게 확인하는가?
next()
을 이용하여 SELECT 문의 결과 투플이 있는지 확인하면 된다.
if(!rs.next()) {
System.out.println("실행결과 투플이 없습니다.");
}
JDBC 실행 순서
해당 링크 중간 지점의 표가 매우 잘나와있어 이를 참고하면 좋을듯 싶다.
https://mundol-colynn.tistory.com/46
JDBC 사용으로 해결점
아까 문제점 중 두번째인 프로덕션 코드의 변경 범위를 커짐을 최소화할 수 있다.
각 DB 벤더가 JDBC 명세에 맞게 구현한 클래스를 제작하여 프로덕션 코드는 JDBC에 의존하기만 하면된다.
만약 DB를 변경할 경우, 사용할 DB의 드라이버 라이브러리로 변경하기만 하면 된다.
Spring JDBC
Spring JDBC는 왜 등장했는가?
- JDBC를 사용하여 데이터베이스와 상호 작용하는 과정을 단순화
JdbcTemplate
등의 객체를 이용하면Connection 연결/종료
와 같은 세부적인 작업을 직접 처리하지 않아도 됨- JDBC에서 발생하는 에러는 Runtime Exception를 내부적으로 커스텀한 일반 예외로 변환해 전파
DataSource
DB와 관계된 커넥션 정보를 담고있으며 빈으로 등록되어 있는 객체이다. 이를 통해 Spring은 DB와 연결된다.
DataSource의 기능
1, DB 서버와의 연결을 해준다.
2. DB의 Connetion pooling
기능
Connection Pool
웹 컨테이너(WAS)가 실행되면서 DB와 미리 연결 해놓은 객체들을 pool에 저장해두었다가,
클라이언트 요청이 오면 connection을 빌려주고, 처리가 끝나면 connection을 반납받아 pool에 저장하는 방식이다.
Connection Pool 사용 이유
매번 사용자가 요청을 할 때마다 드라이버를 로드하고 커넥션 객체를 생성하여 연결하고 종료하기 때문에 매우 비효율적이다. 따라서, 미리 DB와 연결하여 커넥션 풀을 만들고, 이를 재사용하는 방식으로 효율을 향상시킬 수 있다.
DBCP 과정
- 웹 컨테이너(WAS)가 실행되면서 connection 객체를 미리 pool에 생성
- HTTP 요청에 따라 pool에서 connection객체를 가져다 쓰고 반환
참고자료
https://velog.io/@anrun/JDBC%EC%99%80-JDBC-Driver-Manager%EC%9D%98-%EC%97%AD%ED%95%A0
https://velog.io/@goniieee/JDBC%EB%8A%94-%EC%96%B4%EB%96%BB%EA%B2%8C-DB%EC%99%80-%EC%97%B0%EA%B2%B0%EC%9D%84-%EB%A7%BA%EC%9D%84%EA%B9%8C
https://mundol-colynn.tistory.com/46
https://velog.io/@koseungbin/Spring-JDBC
'🛠 백엔드 > Spring' 카테고리의 다른 글
[Spring] 민감한 정보 관리하기 wt. secretKey (0) | 2024.07.01 |
---|---|
RequestBody의 원리와 기본 생성자 (0) | 2024.05.23 |
[초록스터디] Spring MVC 회고 (0) | 2024.05.15 |
[Java] 일급 컬렉션을 왜 사용할까? (0) | 2024.05.05 |
MVC 패턴 정의 및 규칙 (0) | 2024.04.30 |