DAY40 - DBCP, JNDI

은나현·2023년 3월 23일
0

📌 1. DBCP

  • DBCP : DataBase Connection Pool
    • 데이터베이스와 연결된 커넥션을 미리 만들어서 저장해 두고 있다가 필요할 때 저장된 공간(pool)에서 가져다 쓰고 반환하는 기법을 말한다.
      • 커넥션 풀은 이용하면 커넥션을 미리 만들어 두고 사용하기 때문에 매번 사용자가 요청할 경우 드라이버를 로드하고, 커넥션 객체를 생성해 연결하고 종료하는 비효율적인 작업을 하지 않아도 된다.
      • 즉 데이터베이스의 부하를 줄일 수 있고 자원을 효율적으로 관리할 수 있다.

📍 1-1. DBCP 기본 설정 정보

  • driverClassName : DB작업을 위해 로딩할 JDBC 드라이버 파일에 드라이버 인터페이스를 상속하는 파일명 지정. Class.forName() 메소드의 인자값이다.
  • url : 접속할 DB 서버의 URL 지정
  • username : DB 서버에 로그인할 계정 지정
  • password : DB 서버에 로그인할 계정 비밀번호 지정
  • name : 현재 리소스를 등록할 이름 지정
  • type : 리소스의 타입 지정(javax.sql.DataSource)

📍 1-2. DBCP 사이즈 설정 옵션

  • maxActive : 생성할 Conneciton 수 지정
  • maxIdle : 일반적으로 활용할 Connection 수 지정
  • maxWait : Connection의 사용 요청이 있을 때의 대기 시간
    (밀리세컨드 단위, 대기시간이 지난 후에도 Connection을 얻지 못하면 Exception 발생)

➕ 반납되지 않은 커넥션 회수 옵션

  • ResultSet.close()를 통해 직접 닫아 주지 않은 코드를 추적해 복구하거나 재생할 때 사용하는 옵션
    • removeAbandoned : 사용할 수 있는 커넥션이 부족할 때 버려진 커넥션을 찾아 복구하고 재생한다. (기본값 : false)
      removeAbandoned = "true"
    • removeAbandonedTimeout : 커넥션이 버려졌다고 간주되기 전에 사용되지 않은 시간()를 설정한다.
      removeAbandonedTimeout = "5"
    • logAbandoned : 커넥션 자원을 낭비한 코드 위치의 로그를 남긴다.
      logAbandoned = "true"

📍 1-3. DBCP 설정, 사용 예시

  • Servers config 폴더 내의 context.xml에 추가
    <Resource
    	name = "jdbc/oracle"
    	auth = "Container"
    	type = "javax.sql.DataSource"
    	driverClassName = "oracle.jdbc.driver.OracleDriver"
    	url = "jdbc:oracle:thin:@localhost:1521:xe"
    	username = "jsp"
    	password = "jsp"
    	maxActive = "20"
    	maxIdle = "20"
    	maxWait = "-1"
    />
  • webapp - WEB-INF > web.xml에 추가
  <resource-ref>
  	<description>Connection</description>	// 리소스에 대한 설명
  	<res-ref-name>jdbc/oracle</res-ref-name>	// 리소스 이름 등록
  	<res-type>javax.sql.DataSource</res-type>	// 리소스 타입 지정
  	<res-auth>Container</res-auth>	// 리소스 권한 지정
  </resource-ref>
  • 커넥션 가져오기
		Context context = new InitialContext(null);
		DataSource dataSource = (DataSource)context.lookup
				("java:comp/env/jdbc/oracle");
       // 톰캣에서 리소스를 관리하는 가상의 디렉터리 `java:comp/env`에서 
       //`jdbc/myoracle`이라는 이름의 리소스를 찾는다.
		Connection conn = dataSource.getConnection();

📌 2. JNDI

  • JNDI : Java Naming and Directory Interface
    • 디렉토리 서비스에서 제공하는 데이터 및 객체를 발견하고 참고하기 위한 자바 API.
      • 외부(WAS)에 있는 객체를 가져오기 위한 기술 방법
      • DB Pool을 미리 Naming시켜 두는 방법 (DB 연결 방법 중 하나)
    • 우리가 저장해 놓은 WAS의 데이터베이스 정보에 JNDI를 설정해 놓으면, 웹 어플리케이션은 JNDI만 호출하면 간단하다.

➕ Naming & Directory 서비스

  • Naming & Directory 서비스는 이름값만을 가지고 자원을 연결하여 이용할 수 있게 하는 개념이다.
    • 실제 어떤 자원을 가지고 서비스하는 것이 아니라, 어떤 서버나 애플리케이션에서 분산환경에 서비스하고자 하는 자원을 이 Naming & Directory 서버에 이름값과 실제 자원을 연결하여 등록하면, 해당 자원을 이용하고자 하는 다른 애플리케이션에서 서버에 접근하여 이름값을 가지고 연결해서 이용할 수 있다.
      • 예시 : DNS 서버
        • 브라우저창에 URL을 입력하면 브라우저는 DNS서버를 통해 도메인에 해당하는 IP주소를 얻는다. 그리고 IP 주소를 통해 실제 인터넷 서버에 접속한다.
        • 결국 DNS 서버는 실제 인터넷 서비스를 수행해주는 곳이 아니며, 도메인과 IP 주소만을 연결해주는 기능을 한다.

📍 2-1. 사용 이유

  • 운영, 관리, 최적화 문제 대처에 다양한 이점이 있다.
    • 개발을 한 사람과 실제 서비스를 운영하는 담당자는 다른 경우가 많으므로 소스 레벨에서 설정되어 있는 것보다 WAS에서 설정되어 있는 것을 선호한다.
    • WAS에 여러 개의 웹 어플리케이션을 올려서 사용하기 때문에 WAS에서 한 번에 설정해 주는 것이 자원낭비를 줄일 수 있다.
    • 또한 장애가 나거나 성능이 정상적이지 못하면 다른 한 서버가 대신 일을 해줄 수 있다.

📍 2-2. DataSource

  • 커넥션 풀에서 생성된 Connection 객체들을 관리하기 위한 객체
    • JNDI Server를 통해 이용된다. 이 객체를 통해 필요한 Connection을 획득하거나 반납한다.
  • DataSource 이용 절차
    • 1) JNDI Server에서 lookup( ) 메소드를 통해 DataSource 객체를 획득한다.
    • 2) DataSource 객체의 getConnection( ) 메소드를 통해서 Connection Pool에서 Free 상태의 Connection 객체를 획득한다.
    • 3) Connection 객체를 통한 DBMS 작업을 수행한다.
    • 4) 모든 작업이 끝나면 DataSource 객체를 통해서 Connection Pool에 Connection반납한다.

0개의 댓글