본문 바로가기
코딩도전기/DB(mariaDB)

JNDI / DBCP

by 코도꼬마 2023. 12. 20.

Connection Pool의 생성배경

웹 어플리케이션 소스단에서 직접 DB를 연결하여 작동하는 어플리케이션의 경우

 -> 어플리케이션 구동시 DB와 커넥션을 맺는 부분에서 상당히 많은 시간이 걸리게 됩니다.

 -> 따라서 어플리케이션에서 DB에 접속하면 할수록, 쿼리를 사용하면 할수록, 어플리케이션은 급격히 느려지게 됩니다.

이러한 속도 저하를 막기 위해서 한번 DB와 맺은 Connection을 제거하지 않고 다른 쿼리들도 사용할 수 있도록 재활용 하도록 도와주는 라이브러리(DBCP)입니다

매번 접속마다 Connection을 열닫는 절차가 줄어듬으로써 속도가 빨라짐

 

WAS에 DataSource를 설정 하는 이유

그전에 WAS에 Datasource를 설정 하는 이유에 대해서 간략하게 말씀 드리겠습니다.

보통 이클립스에서 개발을 할때는 순수 JDBC 또는 Spring에서 제공하는 기본적인 JDBC(DBCP)설정을 사용하서 개발을 합니다.

하지만 웹 어플리케이션을 운영 서버로 deploy할 경우 JDBC 설정이 달라집니다.

 

그 이유는 

첫째. 운영을 할 경우 개발은 웹 어플리케이션을 만드는 분(개발자)들이 하시지만 실제 서비스 운영(WAS Admin)은 님(개발자)들이 만드신 웹 어플리케이션을 잘 모르는 사람들이 운영을 하게 됩니다.

그렇기 때문에 아무래도 소스 레벨에서 설정되어 있는 것보다 WAS에 설정이 되어 있는 것을 선호 합니다.

 

둘째. 하나의 WAS에 하나의 웹 어플리케이션을 올리기도 하지만 대부분은 그렇지 않습니다. 

즉 <WAS:웹 어플리케이션의 관계>가 <1:n 관계>가 많을 것입니다.

WAS가 관리하지 않고 n개의 어플리케이션들이 동일 db를 본다면, DB pool도 n개가 나오게 되겠죠.

그렇게 되면 관리도 어렵고, 자원 또한 낭비가 됩니다.

그렇기 떄문에, WAS에 설정되어 있는 것이 자원낭비를 줄일 수 있습니다.

 

셋째. 장애가 나거나 성능이 정상적이지 못할 때 다른 한 서버가 대신 일을 해주는 failover 기능입니다.

예를 들어서 DB1에 장애가 발생하면 백업 DB2로 로드 밸런싱을 해야 합니다.

이런 기능들은 대부분 WAS에 제공 합니다. 

즉, WAS에서 설정을 하게 되면 다양한 이점이 있습니다.

 

즉 운영,관리,최적화,장애대처 등 다양한 이점이 있기 때문에 WAS에 DB Source를 설정 하는 것입니다.

 

모든 WAS에서도 마찬가지지만 DataSource를 설정하는 기술에는 자바 스펙인 Java Naming and Directory Interface (JNDI)를 이용 합니다.

JNDI는 쉽게 말해서 WAS에 공유 오브젝트를 저장 후에 쉽게 가져다가 쓰는 방식 입니다.

출처: https://nastyle.tistory.com/15 [오 좋은 정보인걸:티스토리]

 

 

DBCP / JDNI 요약

DBCP(DataBase Connection Pool)

  •    어플리케이션 시작 시 설정한 개수의 Connection 객체를 미리 만들어 Pool에 넣어 놓고 DB연결 시 사용 후 반납하는 방식
  •    다중 스레드를 스레드풀로 관리하는 방식과 비슷

 

JNDI(Java Naming and Directory Interface)

  •    Java Application에서 네이밍 서비스에 접근하기 위한 표준 인터페이스
  •    WAS에 DB Connection을 네이밍하여 사용
  •    Application이 DB에 직접 Connection 요청을 하는 것이 아니라 JNDI를 통해 Connection 요청
  •    DB Connection을 WAS에서 제어하여 서버에서 하나의 Connection Pool을 공유
  •    WAS에 설정정보를 저장하여 운영자가 DB 설정정보를 파악하기 쉽고 WAS 변경에 용이
  •    JDBC 방식과 달리 하드코딩 하지 않고, 재활용 가능하여 효율적임

 

DB Connection 구현 방식

  • META-INF 하위 context.xml 파일 생성 및 DB 연결 설정
  • utils 폴더 하위 dbConnecter 폴더 생성 및 DbConnection Class 생성
  • DbConnection Class
    1. context.xml 파일 설정 정보 객체화
    2. Resource 호출 및 DataSource로 객체화
    3. DataSource에서 Connection 호출
    4. Connection 객체가 null이 아닐 경우 반환