본문 바로가기
DB Connection

Application & DB

by 이상한나라의개발자 2023. 10. 12.

Connection Pool

 

커넥션 풀은 데이터베이스와의 연결을 미리 여러 개 생성해두고, 필요할 때마다 이 연결들을 재사용하는 기술입니다. 이는 매번 연결을 새로 생성하고 종료하는 것보다 훨씬 효율적이며, 시스템 성능과 자원 사용률을 크게 향상시킬 수 있습니다.

 

 

Connection Pool 작동 방식 

작동 방식

 

1. 초기화 : 시스템이 시작될 때. 설정된 초기 연결 수 만큼 데이터베이스 연결이 생성됩니다.

2. 연결요청 : 어플리케이션에서 데이터베이스 연결이 필요할 때, 커넥션 풀에서 사용 가능한 연결을 제공합니다.

3. 연결반환 : 어플리케이션에서 데이터베이스 작업이 완료되면 연결을 커넥션 풀로 반환합니다. 이 연결은 다시 다른 요청에 재사용 됩니다.

4. 연결유지 : 사용되지 않는 연결도 일정 시간 동안 유지됩니다. 설정된 최대 유지 시간이 지나면 연결은 종료 됩니다.

 

자바에서는 다양한 커넥션 풀 라이브러리가 있는데요. DBCP, C3P0, HikariCP 등이 있습니다. Spring 2.x 이상 버전에서는 HikariCP를 기본으로 제공하며 요즘은 대부분 HikariCP를 사용합니다.

 

 

DataSource

 

DataSource는 커넥션을 얻는 방법을 추상화한 인터페이스이다. 

 

public interface DataSource  extends CommonDataSource, Wrapper {

  Connection getConnection() throws SQLException;

  Connection getConnection(String username, String password)
    throws SQLException;

 

  • 대부분의 커넥션 풀은 DataSource 인터페이스를 이미 구현해 두었다. 따라서 개발자는 DBCP, HikariCP 커넥션 풀 의 코드를 직접 의존하는 것이 아니라 DataSource 인터페이스만 의존하도록 어플리케니션 로직을 작성하면 된다.
  • 다른 커넥션 기술로 변경하고 싶으면 구현체를 변경하면 된다.
  • DriverManager은 직접 커넥션을 생성하는데 사용되며 DataSource는 연결 풀링을 통해 데이터베이스 연결을 제공하는데 사용 된다. 

 

Transaction

 

트랜잭션은 ACID 라는 원자성, 일관성, 격리성, 지속성을 보장해야 한다.

 

  • 원자성 : 트랜잭션 내에서 실행되는 작업들은 마치 하나의 작업인 것처럼 모두 성공 하거나 실패해야 한다.
  • 일관성 : 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다. 예를 들어 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다.
  • 격리성 : 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리한다. 예를 들어 동시에 같은 데이터를 수정하지 못하도록 해야 한다. 격리성은 동시성과 관련된 성능 이슈로 인해 트랜잭션 격리 수전을 선택할 수 있다.
  • 지속성 : 트랙잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 한다. 중간에 시스템에 문제가 발생해도 데이터베이스 로그 등을 사용해서 성공한 트랜잭션 내용을 복구해야 한다.