커넥션 풀은 어떤 프레임워크를 사용하여도 DB 연결할 때 꼭 필요한 설정 중 하나이다. 내가 알고 있는 커넥션 풀은 DB커넥션을 요청에 따라 매번 할 수 없으니 미리 커넥션을 지정한 개수만큼 만들어 주고 그것을 요청마다 전달해 주는 것으로 알고 있다.
내가 알고 있는 것이 맞는지 확인하기 위해 커넥션 풀을 정리해보자.
데이터베이스의 커넥션 연결 과정
커넥션풀을 알기 전 데이터베이스에서 커넥션 연결과정이 어떻게 진행되는지 알 필요가 있다.
- 클라이언트 요청을 받아 애플리케이션은 응답을 위해 로직을 처리해야하는데 그러긴 위해 DB 연결하여 데이터 처리를 해야 한다.
- DB 연결을 위해 DB 드라이버를 통해 커넥션을 조회한다.
- DB 드라이버는 DB와 TCP/IP을 통해 커넥션 연결한다. 커넥션이 연결되면 ID,PW 등의 부가정보를 DB에 전달한다.
- DB는 전달받은 부가정보를 이용해 내부 인증을 완료하고, 내부에 DB 세션을 생성한다.
- DB는 커넥션 생성이 완료되었다는 응답을 보낸다.
- DB 드라이버는 커넥션 객체를 생성하여 클라이언트에 반환한다.
위 과정은 한 요청에 대한 데이터베이스 커넥션 연결과정을 정리한 내용이다. 매우 복잡한 과정임을 알 수 있고 이것이 매번 요청에 따라 새로 만들어진다면 시간적 소모가 많이 발생되는 것을 알 수 있다.
DB는 물론이고 애플리케이션 서버에서도 지속적으로 TCP/IP 커넥션을 새로 생성해야 되기 때문에 응답 속도에 있어 큰 문제가 발생되게 된다.
이런 문제를 해결하기 위한 방안을 생각해보면 '미리 커넥션을 만들어두고 사용하면 어떻까?'라는 아이디어가 생긴다. 커넥션풀은 그런 아이디어에서 착안된 방법이다. 커넥션을 미리 만들어두고 사용하는것 그것이 바로 커넥션 풀이다.
커넥션 풀 동작원리
커넥션 풀 초기화
애플리케이션이 시작되는 시점에 커넥션 풀은 필요한 만큼 커넥션을 미리 확보해서 풀에 보관한다. 기본값은 10개이며 서비스의 특징 및 서버 스펙에 따라 다르게 설정된다.
커넥션 풀의 연결 상태
커넥션 풀에 들어 있는 커넥션은 TCP/IP로 DB와 커넥션이 연결되어 있어 요청 시 즉시 SQL을 DB에 전달할 수 있다.
커넥션 풀 사용
커넥션 풀을 이용하면 기본처럼 DB 드라이버를 통해서 매번 새로운 커넥션을 획득할 필요가 없다. 이제는 커넥션 풀을 통해 이미 생성되어 있는 객체 참조로 그냥 가져다가 쓰면 된다.
커넥션 풀에 커넥션을 요청하면 커넥션 풀은 자신이 가지고 있는 커넥션 중 하나를 반환하게 된다.
애플리케이션 로직이 커넥션 풀에서 받은 커넥션을 이용해 SQL을 데이터베이스에 전달하고 그 결과를 받아서 처리한다. 커넥션을 처리하고 나면 그것은 종료시키는 것이 아니라, 다음에 다시 사용할 수 있도록 커넥션 풀에 반환한다.
이렇듯, 커넥션 풀은 커넥션을 종료시키지 않고 살아있는 상태를 유지함으로 지속적으로 사용할 수 있다.
커넥션 풀은 서비스에 맞는 적절한 풀 숫자를 지정함으로써 DB가 무한정 연결되는 것을 막아주어 DB를 보호하는 효과가 있다. 이런 이점때문에 실무에서는 기본으로 사용된다.
커넥션 풀은 개념적으론 단순해서 직접 구현할 수 있지만, 사용의 편리함과 성능이 보장된 오픈 소스 커넥션풀을 주로 사용한다. 대표적인 오픈소스로는 Commons-dbcp2, tomcat-jdbc pool, HikariCP 등이 있다. 옛날에는 다양한 오픈 소스를 사용하였지만 최근에는 성능적으로 가장 우수한 HikariCp를 주로 사용한다. 가장 많이 사용되는 스프링 부트 2.0 부터는 기본 커넥션 풀로 제공된다.
#커넥션 풀의 크기와 성능 추가 예정
Reference
김영한님의 인프런 강의 - [스프링 DB 1편 - 데이터 접근 핵심 원리]
https://code-lab1.tistory.com/209
'DB' 카테고리의 다른 글
[DB/SQLD] 데이터 모델링의 이해 (2) (0) | 2023.11.13 |
---|---|
[DB/SQLD] 데이터 모델링의 이해 (1) (0) | 2023.11.10 |