[DB] - JDBC, DBCP, JNDI

chancehee·2022년 10월 25일
0

데이터베이스

목록 보기
1/2
post-thumbnail

들어가기 전에..

Q. Connection 비용

WAS와 데이터베이스 사이의 연결에는 많은 비용이 듭니다.
MySQL 8.0을 기준으로 INSERT 문 수행시 필요한 비용의 비율은 이러하다고 합니다. (괄호 안의 숫자는 비율을 의미합니다.)

  1. Connecting(3)
  2. Sending query to server(2)
  3. Parsing query(2)
  4. Inserting row(1)
  5. Inserting index(1)
  6. Closing(1)

즉, 서버가 DB에 연결하기 위한 Connecting 비용이 가장 큰 비율을 차지합니다.
그렇다면 커넥션 비용을 줄이는 방법이 있다면, DB작업 성능 개선에 있어서 중요한 방법일 것 입니다.

Q. Connection과 Connection pool

A. Connection은 네트워크상의 연결 자체를 의미하고, Connection pool은 커넥션 객체들을 관리하는 공간을 의미합니다.

  • 커넥션 풀은 데이터베이스와 연결된 커넥션을 미리 만들어 놓고 이를 pool로 관리하는 것입니다.
  • 미리 만들어 놓은 커넥션을 이용하면 커넥션에 필요한 비용을 줄일 수 있습니다.
  • 커넥션 풀을 사용하면 커넥션 수를 제한할 수 있어서 과도한 접속으로 인한 서버 자원 고갈을 방지할 수 있으며 DB 접속 모듈을 공통화하여 DB서버의 환경이 바뀔 경우 유지보수를 쉽게 할 수 있습니다.
  • 커넥션 풀은 프로그램이 실행될 때마다 커넥션 객체를 생성하는 JDBC 프로그래밍 문제점을 개선합니다.

Q. Datasource

A. API문서 내용을 요약하자면, "데이터소스란 물리적인 데이터와의 Connection을 위한 Factory이며, DriverManager의 대안이고 DataSource Interface를 구현하는 객체는 JNDI라는 기술을 통해서 등록된다." 라고 합니다.

  • javax.sql.DataSource라는 인터페이스는 Connection pool을 관리하는 목적으로 사용되는 객체입니다.
  • Connection Pool을 어플리케이션단에서 어떻게 관리할지를 구현하는 인터페이스입니다.
  • 기존의 DriverManager를 이용한 방식은 내부적으로 static한 필드를 사용하므로 Thread 환경에서 바람직하지 않습니다.

Q. JDBC(Java DataBase Connectivity)

A. JDBC는 데이터베이스를 조작하는 표준 SQL 인터페이스 API입니다. (즉, 데이터베이스 커넥션 인터페이스)

  • 일반적인 JDBC는 DB에서 정보를 가져올 때 마다 매번 DB연결을 열고 닫습니다.(비효율적)

Q. DBCP(Database Connection Pool)

A. 커넥션 풀 + DB 개념입니다.

  • 데이터베이스 커넥션 풀을 어플리케이션 소스단에 설정합니다.
  • 다중 스레드를 스레드풀로 관리하는 것과 비슷한 방식입니다.

Q. JNDI(Java Naming and Directory Interface)란?

A. Java 프로그래밍 언어를 사용하여 작성된 어플리케이션에 이름 지정 및 디렉토리 기능을 제공하는 API(Application Programming Interface)입니다.

  • 특정 디렉토리 서비스 구현과 독립적으로 정의됩니다. 따라서 다양한 디렉토리에 공통적인 방식으로 엑세스 할 수 있습니다.
  • 데이터베이스와 연결된 커넥션을 미리 만들어서 저장해두고 있다가 필요할 때 저장된 공간(pool)에서 가져다 쓰고 반환하는 기법 입니다.
  • 즉, 디렉터리 서비스에서 제공하는 데이터 및 객체를 발견(discovery)하고 참고(lookup)하기 위한 자바 API입니다.(DB pool을 미리 Naming 시켜두는 방법)
  • DBCP처럼 어플리케이션 소스단에 설정하는 방식이 아닌 WAS단에 데이터베이스 커넥션 객체를 미리 네이밍 해두는 방식입니다.

Q. JNDI 사용 이유

A. DB설정 정보를 파악하기 쉽습니다.(소스 레벨이 아닌 WAS단에 설정정보를 분리했기 때문) 그리고 DB 커넥션풀을 효율적으로 사용할 수 있습니다.(DB Pool은 비용이 비싼 자원입니다. 어플리케이션 마다 DB Pool이 각각 생성된다면 비용이 너무 많이 듭니다. 이를 WAS단에서 DB Pool을 하나로 관리하는 방법이 JNDI입니다. = 공유객체)
즉, JNDI는 운영, 관리, 최적화 문제에 대한 다양한 이점이 있기 때문에 사용합니다.

정리

JNDI를 알기 위해서는 DB용어에 관한 내용들을 알고 있어야 왜 JNDI 개념이 중요한지 알 수 있었습니다. 주의할 점은 DBCP방식이 JNDI방식보다 무조건 좋지 않다 그것은 아닙니다. 컨테이너에 하나의 어플리케이션만 올라간다면 서버설정을 건드릴 필요 없이 소스단에서 DB pool을 만들면 관리가 쉬워질 수 있습니다. 따라서 상황에 맞는 선택이 중요한 것 같습니다. 마지막으로 JNDI객체란 공유객체느낌으로 WAS에 DB pool을 하나로 관리해서 DB 커넥션 비용을 절감할 수 있는 장점과 DB설정 정보를 파악하기 쉽다는 크게 2가지의 장점이 있습니다.

0개의 댓글