해당 강의 링크를 보고 공부한 내용을 정리하였습니다.
해당 글에서 나오는 예시는, MySQL, HikariCP를 기준으로 합니다.
백엔드 서버와 데이터베이스 서버는 TCP 기반으로 서로 통신합니다.
TCP 기반 통신은 높은 신뢰성을 제공하며, 연결을 맺을 때는 3-way handshake를 사용하고, 연결을 해제할 때는 4-way handshake를 사용합니다.
그러나 TCP 기반 통신은 연결을 맺고 해제하는 과정에서 오버헤드가 발생할 수 있습니다. 백엔드 관점에서 이를 고려해볼 때, 매번 연결을 열고 닫을 때마다 시간적인 비용이 지속적으로 발생할 수 있습니다. 이러한 오버헤드는 서비스의 성능을 저하시킬 수 있는데요,
이를 해결하기 위해 몇 가지 방법을 고려할 수 있습니다. 하나는 커넥션 풀링을 사용하는 것인데, 이는 여러 연결을 미리 열어놓고 재사용함으로써 연결 및 해제 과정에서 발생하는 비용을 줄일 수 있습니다.
DBCP에 대해 자세히 알아봅시다.
커넥션 풀(Connection Pool)은 데이터베이스나 다른 리소스와의 연결을 미리 생성하고 관리하는 기술입니다. 이를 통해 연결을 맺고 끊는 과정에서 발생하는 비용을 줄이고, 효율적인 리소스 관리를 가능하게 합니다.
앞서 살펴봤듯,데이터베이스 연결은 상대적으로 느린 작업 중 하나입니다. 매번 데이터베이스에 접속해야 할 때마다 연결을 맺고 인증하는 과정은 시간이 오래 걸리고 성능을 저하시킬 수 있습니다.
커넥션 풀은 이러한 문제를 해결하기 위해 미리 여러 개의 연결을 생성해놓고 필요할 때마다 가져와 사용하고, 사용이 끝난 연결을 다시 풀에 반환하여 재활용합니다.
예를 들어, 여러 클라이언트가 동시에 백엔드 서버에서 데이터베이스에 연결을 요청할 때, 커넥션 풀은 미리 생성된 연결을 사용 가능한 상태로 유지하고 있습니다. 클라이언트가 데이터베이스에 접속하려면 풀에서 연결을 가져와 사용하고, 작업이 끝난 후에는 해당 연결을 다시 풀로 반환합니다. 이를 통해 연결을 반복적으로 맺고 끊는 과정에서 발생하는 오버헤드를 최소화하면서 효율적인 데이터베이스 연결 관리가 가능해집니다.
max_connections는 클라이언트(이 예제에서는 백엔드 서버)와 데이터베이스 사이에서 동시에 유지될 수 있는 최대 연결 수를 나타냅니다.
예를 들어, max_connections를 4로 설정한 경우를 살펴보겠습니다. 만약 Spring 서버에 트래픽이 증가하여 4개의 연결로는 처리할 수 없는 상황이 발생한다면, 이를 해결하기 위해 Spring 서버를 추가로 확장하려고 합니다. 그러나 max_connections가 4로 설정되어 있으면 새로운 서버가 추가되어도 커넥션 풀은 총 4개의 연결만을 관리할 수 있습니다.
이로 인해 새로운 서버가 커넥션 풀에 새 연결을 할당받지 못하게 되어 문제가 발생합니다.
따라서 max_connections 설정은 매우 중요한 역할을 합니다. 올바른 설정을 통해 트래픽 증가나 서버 확장 시에도 적절한 커넥션 관리를 할 수 있어야 합니다.
wait_timeout
은 MySQL 데이터베이스 서버에서 사용되는 중요한 설정 값 중 하나입니다. 이 값은 커넥션이 비활성 상태일 때, 다음 요청이 올 때까지 기다리는 시간을 결정합니다. 이 시간 내에 새로운 요청이 오지 않으면 커넥션은 닫히게 됩니다. 만약 시간 내에 새로운 요청이 도착하면 wait_timeout은 0으로 초기화됩니다.
wait_timeout이 발생할 수 있는 상황은 다음과 같습니다:
비정상적인 커넥션 종료: 연결이 비정상적으로 종료되는 경우, 커넥션은 활성 상태가 아니므로 wait_timeout의 영향을 받습니다.
커넥션 반환 지연: 커넥션 풀을 사용하는 경우, 커넥션을 사용한 후에 반환하지 않는 경우가 발생할 수 있습니다. 이로 인해 해당 커넥션은 여전히 활성 상태로 남아 있습니다. 이런 상황에서 wait_timeout 시간 내에 해당 커넥션을 사용하지 않으면 자동으로 종료됩니다.
네트워크 단절: 클라이언트와 서버 간의 네트워크 단절이 발생하는 경우, 해당 커넥션은 비활성 상태로 됩니다. 이 경우 wait_timeout에 설정된 시간 내에 다시 요청이 오지 않으면 커넥션은 닫히게 됩니다.
MySQL 데이터베이스 서버에서 wait_timeout을 설정하면, 데이터베이스 서버는 마지막 요청을 받은 시간으로부터 설정된 시간(wait_timeout 값) 동안 기다린 뒤, 새로운 요청이 없으면 해당 커넥션을 종료합니다. 이로써 해당 커넥션이 차지하던 리소스가 반환되어 MySQL 데이터베이스 시스템 자원을 효율적으로 관리할 수 있게 됩니다.