본 포스팅은 [인프런] 스프링 DB 1편 - 데이터 접근 핵심 원리을 강의를 바탕으로 공부하고 정리한 글입니다.
커넥션 풀이란?
웹 컨테이너(WAS)가 실행되면 일정량의 커넥션을 미리 만들어 pool에 보관했다가, 클라이언트 요청이 오면 자신이 가지고 있는 커넥션을 빌려주고 임무가 완료되면 다시 커넥션을 반납 받아 pool에 보관하는 프로그래밍 기법이다.
기존에 데이터베이스에 접근하기 위한 커넥션을 획득하기 위해서는 다음과 같은 과정을 거친다.
- 애플리케이션 로직은 DB 드라이버를 통해 커넥션을 조회
- DB 드라이버는 DB와 TCP/IP 커넥션을 연결 (이때 3 way handshake 같은 TCP/IP 연결을 위한 네트워크 동작 발생)
- DB 드라이버는 TCP/IP 커넥션이 연결되면 ID, PW 같은 부가정보를 DB에게 전달
- DB는 ID, PW를 통해 내부 인증을 한 뒤 내부에 DB 세션을 생성
- DB는 커넥션 생성이 완료되었다는 응답을 보냄
- DB 드라이버는 커넥션 객체를 생성해 클라이언트에 반환
이런 과정은 매우 복잡하고 많은 시간이 소요된다.
고객이 애플리케이션을 사용할 때 SQL을 실행하는 시간 뿐만 아니라 커넥션을 새로 만드는 시간까지 추가되어 응답 속도가 느려진다.
이런 문제를 해결하기 위해 커넥션을 미리 생성해두고 사용하는 커넥션 풀을 사용한다.
커넥션 풀 어떻게 쓸까?
애플리케이션 시작 시점에 필요한 만큼의 커넥션을 미리 생성해 커넥션 풀에 보관한다.
몇 개의 커넥션을 보관할 지는 서비스마다 다르지만 기본값은 보통 10개이다.
커넥션 풀에 보관되어 있는 커넥션은 이미 TCP/IP로 DB와 연결되어 있는 상태이기 때문에 즉시 SQL을 DB에 전달이 가능하다.
DB 드라이버를 통해 새로운 커넥션을 획득해서 사용하는 것이 아닌, 커넥션 풀을 통해 이미 생성되어 있는 커넥션을 객체 참조로 그냥 가져다 쓰기만 하면 되는 것이다.
커넥션 풀에 커넥션을 요청하면 커넥션 풀은 자신이 가지고 있는 커넥션 중 하나를 반환한다.
애플리케이션 로직은 반환 받은 커넥션을 사용해 SQL을 DB에 전달하고 그 결과를 받아 처리한다. → 기존 커넥션을 새로 만드는 시간 절약됨!
커넥션을 모두 사용한 후에는 커넥션을 종료하지 않고, 다시 사용할 수 있도록 해당 커넥션을 커넥션 풀에 그대로 반환해준다.
(⭐️ 커넥션이 살아있는 상태로 반환)
정리
- 적절한 커넥션 풀의 숫자는 서비스의 특징, 애플리케이션 서버 스펙, DB 서버 스펙에 따라 다르기 때문에 성능 테스트를 통해 결정해야 한다.
- 커넥션 풀은 서버당 최대 커넥션 수를 제한할 수 있다. 따라서 DB에 무한정 연결 생성을 막아줘 DB를 보호하는 효과도 있다.
- 실무에서는 커넥션 풀을 항상 기본으로 사용
- 커넥션 풀을 직접 구현할 수도 있지만, 뛰어난 오픈소스 커넥션 풀이 많아 오픈소스 커넥션 풀을 사용하는 것이 좋다.
- ex) commons-dbcp2, tomcat-jdbc pool, HikariCP 등
- 성능과 사용의 편리함 측면에서 최근 대부분 HikariCP를 사용 (스프링 부트 2.0부터 기본 커넥션 풀로 제공)
'🌱 Spring > DB 접근 기술' 카테고리의 다른 글
트랜잭션 전파 (0) | 2023.06.07 |
---|---|
트랜잭션 이해하기 (0) | 2023.06.01 |
데이터 접근 기술 (SQL Mapper 기술 - JdbcTemplate, MyBatis) (0) | 2023.03.10 |