Connection Pool

Connection Pool은 DB를 사용하는 어떤 프로젝트에서도 중요한 개념입니다.
일반적으로 Java의 Spring Framework든, PHP든, PHP 프레임워크인 Laravel이던간에, 프로그래밍 언어 또는 프레임워크에서 DB와의 연결을 맺게 되는데, 이를 커넥션이라 하며, 해당 커넥션을 보관하고, 다음에 사용할 때 재사용하여 매번 새로운 커넥션을 생성하지 않도록 해 성능을 향상시키는 기능이 바로 Connection Pool입니다.
DB에 연결하는 커넥션 시간은 일반적으로 1ms ~ 100ms 남짓입니다. 커넥션 1회 자체에 드는 시간은 적다고 할 수도 있으나, 프로젝트 규모가 커질수록, DB를 통해 작업하는 수가 많아질수록 해당 매번 새롭게 커넥션을 해야 하는 시간적인 비용과 CPU 자원을 사용해야 하는 비용은 부담스럽게 됩니다.
하지만 Connection Pool을 사용하게 된다면 앞서 말씀드렸듯 커넥션을 재사용해 해당 시간이 줄어들어, 일반적으로 사용하지 않을 때보다 약 10배 이상의 성능이 향상됩니다.

PHP는 Connection Pool를 지원하지 않는다

PHP 자체적으로 Connection Pool 동작이 내장되어 있지 않습니다. 아무래도 PHP라는 언어가 웹 사이트를 가장 쉽게 개발하는 언어라는 뚜렷한 목적으로 개발됐고, 규모가 크거나 성능이 중요한 프로젝트라면 일반적으로 다른 프로그래밍 언어를 사용할 거란 생각이지 않을까 생각하고 있습니다.

예전에는 PHP 언어만을 이용해 웹 사이트를 개발하거나, 오래된 프레임워크를 사용할 때에는 이 Connection pool에 대한 문제가 있고, 언어 자체에서는 Connection pool을 사용할 방법이 없기에 일정 규모 이상이 되는 시점에 다른 언어로 넘어가는 회사도 많았다고 합니다..

간혹 PHP mysqli(MySQL Improved Extension)로 해결할 수 있다고 말씀하시는 분들이 있으나, mysqli는 DB를 손쉽게 연결하고 사용하기 위함이고, connection pool과는 별개입니다.

다만, AWS RDS Proxy와 프록시 서버를 두어 서버단에서 해결할 수 있다고 합니다.

Modern PHP와 Laravel의 등장

C++ 언어에 Modern C++라는 말이 있듯이 PHP에도 Modern PHP가 존재합니다.
C++에서는 단순히 C 언어의 확장 버전이라는 느낌이 아니라 독자적인 언어로 발돋움하기 위해 Modern이라는 단어를 사용하였고,

PHP 또한 기존의 '성능을 거의 신경쓰지 않고 쉽고 간단하게 웹사이트를 개발하기 위한 언어'라는 사실이자 이미지를 벗어나기 위해 PHP7.1버전부터 성능을 대폭 높이고, PSR을 통해 비형식적인 언어에 형식을 두며, 패키지 매니저를 통해 소프트웨어의 버전 및 의존성을 관리합니다.
추가로 Modern PHP와 걸맞은 현대적인 느낌의 Laravel Framework까지 등장했습니다.

Laravel Framework에서는 Connection pool 기능이 내장되어 있으며, 커넥션 객체를 싱글톤으로 생성합니다. pool 관련 설정도 config/database.php에서 다음과 같이 설정할 수 있습니다.

'mysql' => [
    'driver' => 'mysql',
    'host' => env('DB_HOST', '127.0.0.1'),
    'port' => env('DB_PORT', '3306'),
    'database' => env('DB_DATABASE', 'forge'),
    'username' => env('DB_USERNAME', 'forge'),
    'password' => env('DB_PASSWORD', ''),
    'charset' => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
    'prefix' => '',
    'strict' => false,
    'engine' => null,
    'options' => [
        PDO::ATTR_PERSISTENT => true, // Enable persistent connections
    ],
    // Connection pool 설정 (필수는 아닙니다)
    'pool' => [
        'min_connections' => 1,
        'max_connections' => 10,
        'wait_timeout' => 3,
    ],
],

또한, DB를 비롯해 성능을 더 높이기 위해서는 Laravel의 고성능 확장 프로그램인 Laravel Octane 사용도 고려할 수 있습니다.

정리

  1. PHP 자체에서는 Connection pool을 사용할 수 없다.
    (AWS RDS Proxy 등을 이용해 서버단 프록시 서버에서 우회적으로 사용 가능하다)
  2. Laravel Framework에서는 기본적으로 Connection Pool을 지원한다.
profile
Back-end Developer

1개의 댓글

comment-user-thumbnail
2023년 11월 27일

라라벨 커넥션 풀관련 자료를 못찾고있습니다
혹여
"Laravel Framework에서는 Connection pool 기능이 내장되어 있으며, 커넥션 객체를 싱글톤으로 생성합니다",

"
'pool' => [
'min_connections' => 1,
'max_connections' => 10,
'wait_timeout' => 3,
],
"
이부분 라라벨 버전 및 레퍼런스 또는 참고할수있는 자료 알려주실 수 있으신가요?

답글 달기