Spring

[Spring]DataSource / JNDI / Connection Pool

siyuning 2022. 10. 26. 11:11

DataSource

  • 물리적인 DB에 연결하기 위한 팩토리
  • 데이터소스는 DB에 연결하기 위해 이름/비밀번호, URL을 사용한다. 보통 데이터소스는 Connection을 얻기 위해 사용된다. JDBC API가 제공하는 데이터소스 객체를 사용하면, DriverManager를 사용하지 않고 DB연결을 할 수 있다.
  • 자바에서 데이터소스는 javax.sql.DataSource 인터페이스를 구현한다. 이 데이터소스의 구현체는 JNDI 서비스에 등록되고, JNDI 이름을 사용하여 식별된다.
  • 데이터소스를 통해 다음을 얻을 수 있는 것
  1. 커넥션 객체
  2. 커넥션 풀에서 사용가능한 커넥션
  3. 분산 트랜잭션과 커넥션 풀에서 사용가능한 커넥션

  • DB와 관계된 커넥션 정보를 담고있고, 빈으로 등록하여 인자로 넘겨준다. → 이런 과정을 통해 Spring은 DataSource로 DB와의 연결을 획득한다.
  • DB 서버와의 연결을 해준다.
  • DB Connetion pooling기능
  • 종류 : JDBC Driver vendor(MySQL, Oracle)별로 여러가지가 존재한다.

✨JNDI(Java Naming and Directory Interface)

  • 디렉터리 서비스에서 제공하는 데이터 및 객체를 참고하여 사용할 수 있도록 도와주는 자바 API
  • 자바 네이밍 / 디렉토리 인터페이스인데 J2EE 의 가장 중요한 스펙 중 하나
  • 프로젝트 내부에 DB정보를 담아두는 것이 아니라 Tomcat과 같은 WAS 서버에 DB정보를 담아두고 사용하기 위해서 사용한다. 시스템에 배포 후 , 만약 DB 정보를 변경해야할 필요가 있을 경우 Tomcat의 설정파일만 변경할 수 있다.
  • 보통 개인들이 하는 프로젝트에서는 DB서버를 하나만 사용하지만, 회사에서는 개발 목적, 운영 목적 등으로 구분되어 여러 서버를 사용하는 경우가 있다.

이런 경우 목적에 적합한 DB를 실행시키기 위해 매번 dataSource정보를 변경하여 적용하는 것은, 귀찮은 작업이고 실수가 유발되면 큰 사고가 날 수도 있다.

이런 상황에서 WAS 서버에 담아둔 DB정보를 사용하여 추가적인 코드 변경 없이 목적에 맞는 DB를 사용할 수 있도록 해준다. (DB 개수만큼 WAS서버를 생성)


✨Connection Pool

💡커넥션 풀(DBCP)

  • 웹 컨테이너(WAS)가 실행되면서 DB와 미리 connection(연결)을 해놓은 객체들을 pool에 저장해두었다가, 클라이언트 요청이 오면 connection을 빌려주고, 처리가 끝나면 다시 connection을 반납받아 pool에 저장하는 방식을 말한다.
  • 즉, 필요할 때마다 Connection Pool의 connection을 이용하고 반환하는 기법이다.
  • Connection을 생성하는 작업은 비용이 많이 드는 작업인데, 이를 보완할 수 있는 방법이 바로 Connection Pool이다. 미리 만들어 놓은 Connection을 이용하면 필요한 비용을 줄일 수 있다. 따라서 DB에 빠르게 접속할 수 있다.
  • 커넥션 수를 제한할 수 있어서 과도한 접속으로 인한 서버 자원 고갈을 방지할 수 있으며 DB 접속 모듈을 공통화해 DB 서버의 환경이 바뀔 경우 유지보수를 쉽게 할 수 있다.

*DBCP : DataBase Connection Pool 의 약자로 DB와 커넥션을 맺고 있는 객체를 관리하는 역할

💡HikariCP

  • 가벼운 용량과 빠른 속도를 가지는 JDBC의 connection pool 프레임워크
  • Spring Boot 2.0버전부터는 Tomcat JDBC 대신에 Hikari를 사용하며 spring-boot-starter-data-jpa 와 spring-boot-starter-jdbc에 의존성이 포함되어 있다.
  • 미리 정해놓은 만큼의 connection을 pool에 담아 놓고 요청이 들어오면 Thread가 connection을 요청하고, HikariCP는 Pool 내에 있는 connection을 연결해준다.

참조

[Spring] Spring JDBC, DataSource란?

[Spring] JNDI를 이용한 Tomcat에 Datasource 구성

[Spring] JNDI 설정법 및 테스트

[Spring] 커넥션 풀(Connection pool)이란?

DB 커넥션 풀(Connection pool)이란? HikariCP란?

HikariCP 소개

HikariCP란?