* Intro
- DB를 사용하기 위해 DB와 애플리케이션 간 통신을 할 수 있는 수단.
- DB Connection은 Database Driver와 Database 연결 정보를 담은 URL을 필요로 함.
- Java의 DB Connection은 JDBC를 주로 이용하며, URL 타입을 사용한다.
* DB Connection 구조
1. 2Tier : 클라이언트의 자바 프로그램(JSP)가 직접 데이터베이스 서버로 접근하여 데이터를 액세스 하는 구조.
2. 3Tier : 자바 프로그램과 데이터베이스 서버 중간에 미들웨어 층을 두어, 그 미들웨어 층에게 비지니스 로직 구현부터 트랜잭션 처리, 리소스 관리 등을 전부 맡기는 구조.
* JDBC
- JDBC( Java Database Connectivity ) 란 자바 언어로 다양한 관계형 데이터베이스 (RDBMS)에 접속하여 SQL문을 수행하여 처리하고지 할 때 사용되는 표준 SQL 인터페이스 API이다.
- 각각의 DB에는 연결 방식과 통신 규격이 따로 있기에 프로그램을 DB와 연결한다면, 해당 DB와 관련된 기술적 내용을 배우고 DB가 변경될 시 많은 변경 사항이 존재하나 각 DBMS에 맞는 JDBC를 받아들인다면 쉽게 DBMS를 변경할 수 있다.
- 즉 DBMS(My SQL, MsSQL, Oracle) 에 관계없이 하나의 JDBC API만을 사용하여 DB관련 작업을 할 수 있다.
- 자바 애플리케이션에서 DB에 접근하기 위해서는 JDBC API를 이용하여 접근해야하며, JDBC 드라이버를 거쳐서 통신함.
* JDBC 드라이브란
- 자바 프로그램 요청을 DBMS가 이해할 수 있는 프로토콜로 변환해 주는 클라이언트 사이드 어댑터.
1. DB 벤더에 맞는 드라이버 로드.
2. DB 서버의 IP, ID, PW 등을 DriverManager 클래스의 getConnection() 메소드를 사용하여 Connection 객체 생성
3. Connection에서 PreparedStatement 객체를 받음.
4. executeQuery를 수행하고, ResultSet 객체를 받아서 데이터 처리.
5. 사용한 ResultSet, PreparedStatement, Connecitons을 close 함.
- 위 사진과 같이 백엔드 서버와 DB 서버가 존재한다고 가정
- 백엔드 서버가 API 요청을 받고 DB 데이터 조회 경우 발생
- 쿼리를 DB로 보내서 데이터를 찾고 쿼리 응답을 한다.
- 처리를 한 다음 API 응답
- 보통 두 개의 서버는 각각의 컴퓨터에서 수행, 즉 네트워크 통신 과정
- 높은 송수신 신뢰성을 장점으로 한 TCP 기반으로 통신함.
- TCP는 연결지향적이고 3-way-handshake/4-way-handshake 과정을 통하여 신뢰성을 구축하는 정점이 존재.
반면에 매번 connection을 열고 닫는 시간적 비용이 발생함.
-> 이를 해결하기 위해서 DBCP(DataBase Connection Pool)이 등장하였다.
* 데이터베이스 커넥션 풀(DBCP) 이란?
1. 웹 컨테이너(WAS)가 실행되면 일정량의 Connection 객체를 미리 만들어서 (TCP 기반) pool 처럼 관리한다
2. 클라이언트 요청이 오면 Connection 객체를 빌려와 쿼리 요청을 보낸다.
3. 작업이 끝나면 Connection Poll에 Connection 객체를 반환한다. (Close Connection)
4. 이러한 Connection Pool을 DBCP(DataBase Connection Pool) 이라 부른다.
* 데이터베이스 커넥션 풀(DBCP) 동작 원리
- 다양한 DBCP 중 하나인 HikariCP를 예로 설명.
- Thread가 Connection을 요청하면 Connection Pool 방식에 따라 유휴Connection을 찾아서 반환한다.
- Hikari CP의 경우, 이전에 사용한 Connection이 존재한다면, 우선적으로 반환한다.
- 만약 유후 Connection 객체가 존재하지 않는다면, HandOffQueue를 Polling 하여 다른 Thread가 Connection을 반납하기를 기다림.
최종적으로 사용한 Connection을 반납하면 Connection Poll이 Connection 사용 내역 기록, HandOffQueue에 반납된 Connection 삽입한다. 이를 통해 HandOffQueue를 Polling 던 Thread는 Connection을 획득하고 작업을 계속한다.
* 데이터베이스 커넥션 풀을 사용함으로써 얻을 수 있는 장점이란 무엇인가?
- 커넥션 풀(Connection Pool)은 애플리케이션과 데이터베이스 간의 데이터베이스 연결(Connection)을 미리 생성해두고, 이를 재사용하는 기법을 말합니다. 데이터베이스에 접근할 때마다 연결을 생성하고 종료하는 대신, 미리 준비된 연결을 재사용함으로써 성능을 향상시키고 자원 사용을 최적화 할 수 있습니다.
커넥션 풀의 주요 구성 요소는 초기 풀 크기(Inital Pool size), 최소 풀 크기(Minimum Pool size), 최대 풀 크기(Maximum Pool size), 연결 대기 시간(Connection Timeout) 등이 있고, 이를 통해 커넥션을 효율적으로 관리하고 사용할 수 있다.
* 커넥션 풀 사이즈가 크면 클수록 좋을까?
- 커넥션을 사용하는 주체는 스레드(Thread)이기 때문에, 커넥션과 스레드를 연결지어 생각해야 합니다. 만약 커넥션 풀 사이즈가 스레드 풀사이즈보다 크면, 스레드가 모두 사용하지 못해서 리소스가 낭비됩니다. 반대로 커넥션 풀 사이즈가 스레드 풀 사이즈보다 작으면, 스레드가 커넥션이 반환되기를 기다려햐 하기 때문에 작업이 지연됨.
커넥션 풀 사이즈와 스레드 풀 사이즈의 균형이 맞더라도, 너무 큰 사이즈로 설정하면 리소스를 과도하게 사용하게 되므로 성능이 저하됨.
Q. Connection Pool 이란
Q. Connection Pool을 왜 쓰는가?
Q. 실시간 통신과 Pool 사용시 차이가 무엇인가?
'Computer Science > DB' 카테고리의 다른 글
스키마란? (1) | 2024.12.18 |
---|---|
B tree, B+ tree 개념 (0) | 2024.12.18 |
Transaction_and_ACID (0) | 2024.12.18 |
Transaction_Isolation_level (0) | 2024.11.28 |
DB의 Index(인덱스) (1) | 2024.11.28 |