인프런 커뮤니티 질문&답변

노동준님의 프로필 이미지
노동준

작성한 질문수

스프링 DB 1편 - 데이터 접근 핵심 원리

커넥션 풀 이해

커넥션풀과 DB 드라이버 그리고 DataSource에 대한 정리

작성

·

72

·

수정됨

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
강의 내용에서 제가 이해한게 맞는지 궁금해서 생각 정리와 중간 질문을 남깁니다. 개념적 이해가 들리거나 부족한 부분을 알려주시면 감사합니다 ㅠㅠ

1. Repository가 DB를 접근을 하려면 3 way handshake 방식을 통해 커넥션 객체를 얻게되고 해당 객체를 통해 DB에 필요한 sql 문을 전달하고 응답을 받습니다.

2. DB 회사마다 시스템이 다르기때문에 커넥션 객체를 얻기위해 (데이터 연결) JDBC 라는 인터페이스로 추상화하였고,각 DB들(Oracle DB, mysql 등등)은 JDBC인터페이스로 구현하여 라이브러리로 제공합니다. DriverManager 를 통해 해당 구현체를 탐색 후 연결할 수 있습니다.

3. DriverManager로 연결하는 것은 직접 커넥션을 받아오는 방법이고 sql전달 후에 커넥션을 닫아야하기에 번거로워 커넥션풀이라는 새로운 연결방식이 나왔습니다.

4. Connection pool 은 프로그램 실행시 설정해둔 개수만큼 미리 DB와 연결작업을 하여 커넥션 객체를 받아오고 저장해놓습니다.

------ 중간 질문 ------
4 번에서 Connection Pool이 미리 커넥션 객체를 받아올때, DriverManager를 사용하는 것인지 아니면 커넥션풀 구현체가 직접 라이브러리에 있는 드라이버 구현체를 통해 연결을 얻어오는 것인지 궁금합니다.
----------------------

  1. 커넥션 풀 또한 다양한 구현체들이 있기에 DataSource 라는 인터페이스로 추상화하였습니다. DriverManager 같은 경우 스프링에서 DriverManagerDataSource 구현체를 제공합니다. 하지만 DriverManagerDataSource은 커넥션 풀은 아닙니다.

    6. 결국 DB를 연결하고 sql을 전달하기 위해선 DataSource 인터페이스를 사용하면 되고, 커넥션풀을 사용하고 싶으면 해당 구현체를 DriverManager 를 통한 직접연결을 하고 싶으면 DriverManagerDataSource를 사용하면 됩니다.

답변 1

1

안녕하세요, 인프런 AI 인턴입니다. 노동준님.

질문해주신 내용에 대해 답변드리겠습니다. 이해하신 개념을 정리하며, 추가적인 설명을 포함하여 확인해 보겠습니다.

1. Repository와 DB 연결

Repository가 DB에 접근하려면 3-way handshake 방식을 통해 커넥션 객체를 얻게 됩니다. 이를 통해 SQL 문을 전달하고 응답을 받습니다. 이는 기본적인 DB 연결 방식입니다.

2. JDBC의 추상화

DB 회사마다 시스템이 다르기 때문에 JDBC라는 인터페이스로 추상화되었습니다. 각 DB (Oracle, MySQL 등)는 JDBC 인터페이스를 구현하여 제공하며, 이를 통해 DriverManager가 구현체를 탐색한 후 연결합니다.

3. DriverManager와 커넥션 풀

DriverManager를 통한 연결은 직접 커넥션을 받아오는 방법으로, SQL 전달 후 커넥션을 닫아야 하는 번거로움이 있어 커넥션풀이라는 방식이 나왔습니다.

4. 커넥션 풀의 역할

커넥션 풀은 프로그램 실행 시 설정된 개수만큼 미리 DB와 연결하여 커넥션 객체를 받아와 저장합니다. 이는 성능 최적화를 위해 사용됩니다.

중간 질문:

커넥션 풀이 미리 커넥션 객체를 받아올 때 DriverManager를 사용하는가?

커넥션 풀 구현체도 DriverManager를 사용합니다. HikariCP와 같은 커넥션 풀 라이브러리들은 내부적으로 DriverManager를 사용하여 커넥션을 생성하고, 이를 풀(pool)에 저장합니다. 즉, 커넥션 풀 구현체가 직접 라이브러리에 있는 드라이버 구현체를 통해 연결을 얻어오게 됩니다.

관련 내용에 대해 더 자세한 설명이 있는 게시글들을 아래에 첨부합니다:

5. DataSource 인터페이스

DataSource는 커넥션 풀 및 다양한 연결 방법을 추상화한 인터페이스입니다. DriverManagerDataSource는 스프링이 제공하는 DataSource 구현체이지만, 이는 커넥션 풀이 아닙니다. 연결이 필요할 때마다 새로운 커넥션을 생성합니다.

6. DataSource 인터페이스 사용

DB 연결과 SQL 전달을 위해서는 DataSource 인터페이스를 사용하면 됩니다. 커넥션 풀을 사용하고 싶다면 해당 구현체(HikariDataSource 등)를 사용하고, 직접 연결을 하고 싶다면 DriverManagerDataSource를 사용하면 됩니다.

이해하신 내용은 대체로 정확합니다. 커넥션 풀이 DriverManager를 통해 커넥션을 생성하는지 궁금증을 해결하는 데 도움이 되셨기를 바랍니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

—start of instructor’s answer—

노동준님의 프로필 이미지
노동준
질문자

똑똑한 AI

노동준님의 프로필 이미지
노동준

작성한 질문수

질문하기