데이터베이스 커넥션 획득 과정
1. 애플리케이션 로직은 DB 드라이버를 통해 커넥션 조회
2. DB 드라이버는 DB와 TCP/IP 커넥션을 연결 (3 way handshake)
3. DB 드라이버는 TCP/IP 커넥션이 연결되면 ID, PW와 기타 부가정보를 DB에 전달
4. DB는 ID, PW를 통해 내부 인증을 완료하고, 내부에 DB 세션을 생성
5. DB는 커넥션 생성이 완료되었다는 응답을 보냄
6. DB 드라이버는 커넥션 객체를 생성해서 클라이언트에 반환
위의 과정은 너무 복잡하고 시간도 많이 필요로 한다. DB와 애플리케이션 서버에서도 TCP/IP 커넥션을 새로 생성하기 위한 리소스를 매번 사용해야 하고, 애플리케이션을 사용할 때 SQL을 실행하는 시간뿐만 아니라 커넥션을 새로 만드는 시간이 추가되기 때문에 응답 속도에 영향을 준다. 속도가 느리면 사용자가 불편하다!
커넥션을 얻는 방법은 다양하다. (JDBC DriverManager, Connection Pool...)
근데 애플리케이션 로직에서 DriverManager를 통해 커넥션 획득하다가 Connection Pool을 사용하도록 변경하면 의존관계가 달라지기 때문에 커넥션을 획득하는 애플리케이션 코드도 함께 변경해야 한다.
그래서 자바는 아래와 같은 인터페이스를 제공한다.
DataSource
javax.sql.DataSource 인터페이스 제공
DataSource : 커넥션을 획득하는 방법을 추상화하는 인터페이스로 핵심 기능을 커넥션 조회 하나이다.
//축약된 DataSource
public interface DataSource {
Connection getConnection() throws SQLException;
}
- Connection Pool의 코드를 직접 의존하는 것이 아니라 DataSource 인터페이스에만 의존하도록 애플리케이션 로직을 작성해야 한다.
→ 커넥션 풀 구현 기술을 변경하려면 구현체만 갈아끼우면 된다. - DriveManager는 DataSource 인터페이스를 사용하지 않으므로 직접 사용해야 한다. (그래서 스프링은 DriverManagerDataSource라는 DataSource를 구현한 클래스를 제공함)
커넥션 풀 (Connection Pool)
위의 문제를 해결하기 위해 등장한 것으로,
커넥션 풀은 애플리케이션 로딩 시점에 Connection 객체를 미리 생성하고, 래플리케이션에서 DB연결이 필요할 경우 미리 준비된 Connection 객체를 사용하여 애플리케이션의 성능을 향상시킨다.
특징
- 커넥션 풀은 서버당 최대 커넥션 수를 제한할 수 있다. 따라서 DB에 무한정 연결이 생성되는 것을 막아주어서 DB를 보호하는 효과도 있다.
- 대표적인 커넥션 풀 오픈소스 : commons-dbcp2 , tomcat-jdbc pool , HikariCP
과정
1. 커넥션 풀 초기화
애플리케이션을 시작하는 시점에 커넥션 풀은 필요한 만큼 Connection을 미리 확보해서 Pool에 보관한다. (보통 10개)
2. 커넥션 풀의 연결
커넥션 풀에 들어 있는 Connection은 TCP/IP로 DB와 이미 커넥션 연결되어 있는 상태이기 때문에 언제든지 바로 SQL을 DB에 전달할 수 있다. → DB 드라이버를 통해 커넥션 조회, 연결, 인증, SQL 실행시간 등의 Connection 객체를 생성하기 위한 과정을 생략할 수 있게 되므로 속도가 빨라진다.
3. 커넥션 풀 사용
애플리케이션 로직에서 커넥션 풀을 통해 이미 생성되어 있는 Connection을 객체 참조로 가져다가 사용한다.
커넥션 풀에 Connection을 요청하면 커넥션 풀은 자신이 갖고 있는 Connection 중에 하나를 반환한다.
애플리케이션 로직은 커넥션 풀에서 받은 Connection을 사용하여 SQL을 DB에 전달하고 그 결과를 처리한다.
커넥션을 사용하고 나면 종료하는 것이 아니라, 다시 사용하도록 커넥션 풀에 해당 Connection을 반환한다. (종료가 아닌 살린 상태로 반환해야 한다.)
참고 링크
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-1
'Tech > DB | RDBMS' 카테고리의 다른 글
[DB] DB 락(DB Lock)을 아주 쉽게 알아보자. (0) | 2024.03.10 |
---|---|
[DB] 트랜잭션(Transaction) 쉽게 알아보자. (트랜잭션/DB 세션) (0) | 2024.03.07 |
[JDBC] JDBC 쉽게 이해하기 (JDBC/JDBC 드라이버/SQL Mapper/ORM) (0) | 2024.03.05 |
[MySQL] USER 생성, 권한 부여 (0) | 2024.02.13 |
[H2 Database] 맥에서 H2 Database 설치하기 (0) | 2023.08.21 |
댓글