-
[Spring DB] 커넥션풀과 데이터소스 이해Study/Spring 2025. 7. 12. 15:35
커넥션 풀 이해
데이터베이스 커넥션을 매번 획득
데이터베이스 커넥션을 획득할 때는 아래 과정을 거침
- 어플리케이션 로직은 DB 드라이버를 통해 커넥션을 조회한다.
- DB 드라이버는 DB와 TCP/IP 커넥션을 연결한다. 이 과정에서 3 Way Handshake 같은 TCP/IP 연결을 위한 네트워크 동작이 발생한다.
- DB 드라이버는 TCP/IP 커넥션이 연결되면 ID, PW와 기타 부가정보를 DB에 전달한다.
- DB는 ID, PW를 통해 내부 인증을 완료하고, 내부에 DB 세션을 생성한다.
- DB는 커넥션 생성이 완료되었다는 응답을 보낸다.
- DB 드라이버는 커넥션 객체를 생성해서 클라이언트에 반환한다.
단점
- 커넥션을 새로 만드는 것은 과정도 복잡하고 시간도 많이 소요됨
- DB와 어플리케이션 서버 모두 TCP/IP 커넥션을 새로 생성하기 위한 리소스를 매번 사용해야 함
- SQL을 실행하는 시간 뿐 아니라 커넥션을 생성하는 시간이 추가되어 결과적으로 응답 속도에 영향을 줌
커넥션 풀 활용
- 위 문제를 해결하는 아이디어가 커넥션을 미리 생성하고 사용하는 '커넥션 풀' 방법임
- 커넥션 풀은 서버당 최대 커넥션 수를 제한할 수 있기 때문에 DB에 무한정 연결이 생성되는 것을 막아줌
- 최근에는 hikariCP를 주로 사용함 (Spring Boot 2.0부터 기본 커넥션 풀로 hikariCP 제공)
커넥션 풀 초기화 및 연결 상태
- 어플리케이션을 시작하는 시점에 필요한 만큼 커넥션을 미리 생성해서 커넥션 풀에 보관함
- 커넥션 풀에 들어있는 커넥션은 TCP/IP로 DB와 커넥션이 연결되어 있는 상태이기 때문에 언제든지 SQL을 DB에 전달할 수 있음
커넥션 풀 사용
- 어플리케이션 로직에서 이제는 DB 드라이버를 통해 새로운 커넥션을 획득하는 것이 아님
- 이제는 커넥션 풀을 통해 이미 생성되어 있는 커넥션을 객체 참조로 가져다 쓰기만 하면 됨
- 커넥션 풀에 커넥션을 요청하면 커넥션 풀은 자신이 가지고 있는 커넥션 중 하나를 반환함
- 어플리케이션 로직은 커넥션 풀에서 받은 커넥션을 사용해 SQL을 DB에 전달하고 그 결과를 받아서 처리함
- 커넥션을 모두 사용하고 나면 이제는 커넥션을 종료하는 것이 아니라, 다음에 다시 사용할 수 있도록 해당 커넥션을 그대로 커넥션 풀에 반환하면 됨. 이때 커넥션을 종료하는 것이 아니라 커넥션이 살아있는 상태로 커넥션 풀에 반환해야 함
DataSource 이해
커넥션을 획득하는 방법을 추상화
- 자바에서는 javax.sql.DataSource라는 인터페이스를 제공함
- DataSource는 커넥션을 획득하는 방법을 추상화하는 인터페이스임
- 이 인터페이스의 핵심 기능은 커넥션 조회 하나
정리
- 대부분의 커넥션 풀은 DataSource 인터페이스를 이미 구현해두었으므로, DataSource 인터페이스에만 의존하도록 어플리케이션 로직을 작성하면 됨
- DriverManager는 DataSource 인터페이스를 구현하지 않지만 스프링은 DriverManager도 DataSource를 통해서 사용할 수 있도록 DriverManagerDataSource라는 DataSource 인터페이스를 구현한 클래스를 제공함
- 자바는 DataSource를 통해 커넥션을 획득하는 방법을 추상화함. 이제 어플리케이션 로직은 DataSource 인터페이스에만 의존하면 됨
예제 - DriverManager, 커넥션 풀
참고
'Study > Spring' 카테고리의 다른 글
[Spring DB] 데이터 접근 핵심 원리 - JDBC 이해 (1) 2025.06.28 [Spring] 스프링 핵심 원리 - 스프링 AOP 주의사항 (0) 2025.05.07 [Spring] 스프링 핵심 원리 - 스프링 AOP (0) 2025.04.23 [Spring] 스프링 핵심 원리 - @Aspect AOP (0) 2025.04.22 [Spring] 스프링 핵심 원리 - 빈 후처리기 (0) 2025.04.21