Connection을 미리 생성하는 이유

 

Spring Boot을 사용하면 Connection pool에 미리 Connection을 생성하는데, 미리 생성하는 이유로 DB와 connection을 맺는 비용이 크기 때문에 애플리케이션 시작 시 미리  pool에 생성해 두어 필요할 때마다 꺼내 사용한다고 알고 있다.

 

DB와 애플리케이션이 Connection을 맺는데 비용이 큰 이유가 뭘까?

우리는 애플리케이션과 DB가 통신하는 방법을 알아야 한다.

기본적으로 애플리케이션과 DB 서버와 통신을 하는 방법은 TCP/IP를 통해 통신을 하게 된다.
TCP/IP는 신뢰성이 높은 통신 방법으로 신뢰성을 보장하기 위해 3-way handshake 과정을 통해 연결을 하고 연결을 종료할 때는 4-way handshake 과정을 통해 연결을 종료하게 된다.

 

https://seungjjun.tistory.com/229

 

TCP와 UDP의 특징 (3-way-handshaking, 4-way-handshaking)

TCP와 UDP는 OSI 7계층의 전송계층에서 사용되는 프로토콜이다. 전송계층을 간단히 설명하면 송신자와 수신자를 연결해 데이터의 전달을 담당하는 계층이라고 생각하면 된다. 먼저 TCP부터 알아보

seungjjun.tistory.com

이러한 연결을 맺고 종료하는 과정의 비용이 작지 않기 때문에 애플리케이션에서 데이터가 필요하여 DB에 접근할 때마다 연결을 맺고 종료하는 과정이 일어난다면 비효율적임과 동시에 그만큼 시간이 소모될 것이다.
그래서 애플리케이션은 미리 사용할 만큼의 커넥션을 애플리케이션 시작 시 DB와 통신을 맺어 커넥션을 생성하여 Connection Pool에 저장을 해둔다.

 

DBCP(Database Connection Pool)

애플리케이션(DBCP 사용하는 애플리케이션 한정)에서는 DB와 연결이 필요하면 이 Connection Pool에서 미리 생성해 둔 Connection을 사용하고, 사용이 완료되면 다시 재사용을 위해 반납을 하는 구조이다.

Spring Boot의 경우 기본적으로 HikariCP라는 Connection pool 라이브러리를 사용하고 있다.
기본적으로 아무 설정을 하지 않으면 10개의 connection을 생성한다.

미리 생성해둔 connection을 모두 사용한 경우 커넥션 부족으로 인한 에러가 발생할 수 있다.
단순히 트래픽이 몰려 미리 준비해 둔 커넥션을 사용한 경우도 있지만 데드락으로 인한 커넥션을 반환하지 않는 경우나 긴 쿼리로 인한 DB연결을 오래 잡고 있는 이유로도 커넥션이 부족할 수 있다.

 

미리 Connetcion을 충분히 생성해 두면 되는 거 아니야?

그럼 커넥션이 부족하지 않게 미리 충분한 커넥션을 생성해두면 되는거 아니야?라는 생각을 할 수 있다.

적절한 커넥션을 미리 생성하는 건 도움이 되지만 불필요하게 많은 커넥션을 생성해 두는 건 오히려 자원낭비를 유발한다.

불필요하게 많은 커넥션을 생성해 두면 장기간 사용되지 않는 Idle(유휴) 상태의 커넥션이 많아지게 되는데, 이러한 커넥션을 유지하기 위해 애플리케이션은 메모리를 사용하게 된다.
즉, 실제로 사용하지 않는 커넥션을 유지하기 위해 한정된 자원인 메모리를 사용해야 하기 때문에 이는 자원 낭비로 이어진다.

 

적절한 Connection 수 설정

그럼 커넥션이 부족하지도 않고 많지도 않도록 자신의 애플리케이션의 커넥션 수를 설정하는 방법이 무엇일까?

애플리케이션마다 트래픽이 다르고 비즈니스 로직이 다르기 때문에 적절한 커넥션 수를 설정하는 공식 같은 정답은 없다.

그래서 트래픽이 언제 얼마큼 들어오는지를 파악하거나 다양한 시나리오에서 부하 테스트를 통해 자신의 애플리케이션에 적절한 커넥션 수를 찾는 게 중요하다.