본문 바로가기
Database

오라클 데이터베이스 연결 풀 개념과 사용법

by 굿센스굿 2024. 12. 5.
반응형

 

애플리케이션과 데이터베이스 간의 연결은 높은 성능과 안정성을 요구하는 핵심 요소입니다. 하지만 매번 새로운 연결을 생성하고 해제하는 작업은 시간과 리소스를 낭비할 수 있습니다. 이를 해결하기 위해 등장한 것이 **데이터베이스 연결 풀(Database Connection Pool)**입니다. 이 글에서는 연결 풀의 개념, 장점, 구성 방식, 그리고 실제 사용 방법에 대해 알아보겠습니다.


1. 데이터베이스 연결 풀의 개념

**데이터베이스 연결 풀(Connection Pool)**은 데이터베이스와 애플리케이션 간의 연결을 재사용할 수 있도록 미리 생성된 연결(Connection)을 관리하는 메커니즘입니다.

작동 방식

  1. 애플리케이션이 시작되면 미리 정의된 개수만큼의 데이터베이스 연결을 생성하여 풀(Pool)에 저장합니다.
  2. 애플리케이션이 데이터베이스 작업을 요청하면 풀에서 사용 가능한 연결을 할당합니다.
  3. 작업이 완료되면 해당 연결은 종료되지 않고 풀로 반환됩니다.
  4. 추가 요청이 들어오면 반환된 연결을 다시 재사용합니다.

이 방식은 연결을 반복적으로 생성하고 해제하는 작업을 줄여주며, 애플리케이션 성능을 크게 향상시킵니다.


2. 데이터베이스 연결 풀의 장점

  1. 성능 향상
    • 새로운 연결을 생성하는 시간과 비용을 줄여줍니다.
    • 연결 재사용으로 요청 처리 속도가 빨라집니다.
  2. 리소스 효율성
    • 제한된 연결 자원을 효율적으로 관리하여 데이터베이스 과부하를 방지합니다.
    • 미사용 연결이 풀로 반환되어 재사용되므로 리소스 낭비를 줄입니다.
  3. 확장성
    • 동시 접속이 많은 환경에서도 안정적인 연결 관리가 가능합니다.
    • 설정을 통해 풀 크기를 조정하여 유연하게 대응할 수 있습니다.
  4. 안정성
    • 잘못된 연결이나 누수를 방지하기 위해 타임아웃, 최대 연결 수 등의 관리 기능을 제공합니다.

3. 연결 풀 구성 방식

주요 설정 요소

  1. 최소 연결 수(Minimum Connections)
    • 풀에 항상 유지될 최소 연결 수.
  2. 최대 연결 수(Maximum Connections)
    • 풀에서 관리할 수 있는 최대 연결 수.
  3. 유휴 시간(Idle Timeout)
    • 유휴 상태의 연결이 일정 시간 사용되지 않으면 제거.
  4. 대기 시간(Wait Timeout)
    • 연결을 요청했을 때 대기할 수 있는 최대 시간.
  5. 검사 주기(Validation Interval)
    • 연결의 유효성을 주기적으로 검사하여 문제 있는 연결을 제거.

4. 연결 풀 사용법

예제 1: Java에서 HikariCP를 사용한 연결 풀

HikariCP는 고성능, 경량의 자바 연결 풀 라이브러리입니다.

Maven 의존성 추가

<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>5.0.1</version>
</dependency>

HikariCP 설정과 사용

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

public class ConnectionPoolExample {
    public static void main(String[] args) throws Exception {
        // HikariCP 설정
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:oracle:thin:@localhost:1521:xe");
        config.setUsername("your_username");
        config.setPassword("your_password");
        config.setMaximumPoolSize(10); // 최대 연결 수
        config.setMinimumIdle(2);     // 최소 유휴 연결 수
        config.setIdleTimeout(30000); // 유휴 시간 (30초)

        // 데이터소스 생성
        HikariDataSource dataSource = new HikariDataSource(config);

        // 연결 풀에서 연결 가져오기
        try (Connection connection = dataSource.getConnection();
             Statement statement = connection.createStatement()) {
            
            ResultSet resultSet = statement.executeQuery("SELECT * FROM EMPLOYEES");
            
            while (resultSet.next()) {
                System.out.println("Employee ID: " + resultSet.getInt("EMPLOYEE_ID"));
            }
        }

        // 데이터소스 닫기
        dataSource.close();
    }
}

예제 2: Python에서 SQLAlchemy와 연결 풀

SQLAlchemy와 psycopg2 설치

pip install sqlalchemy psycopg2

연결 풀 사용 코드

from sqlalchemy import create_engine

# 연결 풀 엔진 생성
engine = create_engine(
    "postgresql+psycopg2://user:password@localhost/dbname",
    pool_size=10,          # 최대 연결 수
    max_overflow=5,        # 초과 대기 연결
    pool_timeout=30,       # 대기 시간
    pool_recycle=1800      # 연결 재사용 주기
)

# 데이터베이스 연결 및 작업
with engine.connect() as connection:
    result = connection.execute("SELECT * FROM employees")
    for row in result:
        print(f"Employee ID: {row['employee_id']}")

# 엔진을 종료하지 않아도, 연결 풀에서 관리됨

5. 연결 풀 사용 시 주의 사항

  1. 풀 크기 조정
    • 풀 크기를 너무 작게 설정하면 대기 시간이 길어지고, 너무 크게 설정하면 데이터베이스에 과부하가 발생할 수 있습니다.
  2. 연결 누수 방지
    • 사용한 연결을 풀로 반환하지 않으면 연결 누수가 발생합니다. 반드시 반환되도록 관리합니다.
  3. 유효성 검사
    • 오래된 연결이 실패하지 않도록 정기적으로 유효성을 검사하는 설정을 추가해야 합니다.

6. 결론

데이터베이스 연결 풀은 애플리케이션의 성능과 안정성을 보장하는 핵심 기술입니다.
특히 트래픽이 높은 환경에서 연결 풀을 잘 활용하면 데이터베이스와 애플리케이션 간의 효율적인 연결 관리가 가능합니다.

HikariCP나 SQLAlchemy와 같은 다양한 라이브러리를 활용해 손쉽게 연결 풀을 설정하고, 효율적인 데이터베이스 관리를 시작해 보세요! 😄
궁금한 점이 있다면 언제든지 질문해 주세요!

반응형