JSP&Servlet/BASIC

[커넥션풀] ConnectionPool이란? / 커네션풀 적용및 JdbcTemplate 에서의 활용

유혁스쿨 2020. 9. 2. 00:34
728x90
반응형

 

ConnectionPool이란?

- 여러명의 사용자를 동시에 처리하는 웹 어플리케이션
- DB연결을 이용할 때 매번 연결하는 방식이 아닌 미리 연결을 맺고 사용하는 Connection Pool을 이용해 성능을 향상시킵니다.
- 커넥션 풀링은 미리 정해진 개수만큼 DB커넥션을 풀에 준비해두고, 어플리케이션이 요청할 때 마다 Pool로부터 꺼내와서 할당하며,
다시 돌려받아서 Pool에 넣는 기법입니다.

속도면에서 빠르며, 스프링에서는 최근 유행하는 HicariCP라이브러리를 사용합니다.

 



[DataSource]
- DB에 이용되는 URL,id,pw,DriverClass를 미리 정의해 놓고 사용하는 객체입니다.
- Spring-JDBC에서 기본으로 제공합니다.
- 여러 커넥션풀 라이브러리에서 기본으로 제공합니다.
- 속도면에서 빠르며 최근 스프링에서 유행하는 HikariCP 라이브러리가 있습니다.

DataSource 자체를 커넥션풀로 활용합니다.
기본적인 DataSource가 있고 우리가 그걸 조금 강화시킨 풀장이 커넥션 풀입니다.
웹 어플리케이션에 사용자가 몰렸을때, 매번 커넥션 객체를 만들기 보다는 미리 풀장에 깔아두고 원할때 마다 하나씩 꺼내주는 형태로 사용하는게 커넥션 풀 입니다.
DB연결을 이용할 때 매번 새로운커넥션을 연결하는게 아니라 Connection에 성공한 객체들을 Pool장에 가둬놓고 필요할때마다 하나씩 꺼내쓴 후 사용이 끝나면 다시 돌려받는등
커넥션을  재활용하게 됩니다.
이것을 커넥션풀링이라 하며, 커넥션을 사용할 때 커넥션속도를 개선시키는 방법입니다.

 


DBCP 커넥션풀 Tomcat에 설정하기.

1. tomcat.apache.org 로 접속합니다.

Documentation에서 Tomcat9.0을 선택합니다

 

2. User Guide에서 10번 JDBC DataSources를 선택합니다.

 

 

3. 4번의 Oracle 8i, 9i, 10g를 선택합니다.

 

 

4. 파란색으로 동그라미 친 부분을 복사합니다.

1. jdbc/myoracle 에서 myoracle은 db명입니다. 그러면 myoracle대신 자신이 설정한 데이터베이스명
을 입력합니다.
2. url은 오라클 접속주소입니다 여기서 1521 은 포트번호입니다. mysid 는 DB 명입니다. 그러므
로 mysid대신 자신이 설정한 DB명을 입력합니다. 
3. username 은 오라클 접속 사용자명입니다.  scott 대신 자신이 설정한 오라클 사용자명을 입력합니다.
4. password 는 오라클 사용자 계정의 비번입니다. tiger대신 자신이 설정한 오라클 비밀번호를 입력합니다.
5. maxIdle  은 유휴상태로 유지될 수 있는 최대 커넥션 개수 기본값이 8개
6. maxTotal  은 동시에 허용가능한 최대 커넥션 개수. 기본값이 8개
7. maxWaitMillis 는 최대 대기시간. 기본값이 -1이고 -1은 무한정.

 

TomcatServer가 들어있는 Servers폴더에서 Server.xml을 열고

커넥션 풀을 사용하고자하는 <Context>태그의 오토클로징 / 태그를 지우고 </Context>로 나눠줍니다.

<Context docBase="MVC" path="/MVC" reloadable="true"source="org.eclipse.jst.jee.server:MVC" >
    <Resource name="jdbc/DB명" auth="Container" type="javax.sql.DataSource" 
        driverClassName="oracle.jdbc.OracleDriver" username="사용자명" password="비밀번호" 
        url="jdbc:oracle:thin:@localhost:포트번호:DB명" maxWait="20" maxIdle="10" maxWaitMillis="-1"/>
</Context>

나눠진 태그 안에 해당 소스를 붙여넣기 합니다. 

 

나머지 DB명 사용자명 비밀번호 포트번호 등의 설정은 본인이 설정하신 세팅에 맞게 설정하시면 됩니다.


 JNDI를 활용하여 등록된 커넥션풀을 불러오기

 

JNDI란?

JNDI(Java Naming and Directory Interface)는 디렉토리 서비스에서 제공하는 데이터 및 객체를 발견하고 찾기위한 api입니다.

JNDI의 정의를 보면 디렉터리 서비스에서 제공하는 데이터 및 객체를 발견하고 참고(lookup)하기 위한 자바 API라고 되어있습니다.

쉽게 말하면 외부에 있는 객체를 가져오기 위한 기술입니다.

 

Tomcat와 같은 WAS를 보면 특정 폴더에 필요한 데이터 소스(라이브러리)가 있는데 그것을 우리가 사용하기 위해 JNDI를 이용해서 가져오는 것입니다.

아까 우리가 Tomcat의 server.xml에 등록한 코드가 있었는데 기억나시나요?

그것이 WAS에 DB풀을 미리 네이밍해 둔것이며 JNDI를 활용하여 가져오게 되는것입니다.

WAS에 DB풀을 미리 네이밍 해 두면 이점이 있습니다.

 

1. DB설정 정보를 파악하기 쉽습니다.

소스레벨(DAO같이 DB설정정보가 사용되는 자바의 클래스)에 DB설정 정보등 DB연결에 필요한 정보들을 설정해 놓으면 소스개발자 외에는 DB설정 정보를 찾거나 알아보기가 어렵습니다.

어플리케이션이 하나더라도 여러 DB를 끌어와 쓸 수 있다는 점에서 DB설정정보를 소스단에 심어놓으면 몇개의 DB가 붙어 돌아가는 시스템인지 파악하기 힘듭니다.

만약 파악하더라도 소스분석에 걸리는 시간이 오래걸릴 수 있다.

하지만 JNDI를 사용한다면 WAS에 설정정보를 저장하게되는데 이때 몇개의 DB가 붙었는지, DB정보를 파악하기 쉬워집니다.

 

2. DBCP를 효율적으로 사용할 수 있습니다.

서버에서 어플리케이션 컨테이너가 하나이더라도 내부어플리케이션 소스는 ..... https://eongeuni.tistory.com/43 ....참조하십시오.

 

지루하시죠? 어쨋든 JNDI는 커넥션풀을 일반적으로 등록하여 객체를 생성하지않고 톰캣의 설정파일에 미리 정보등을 기입,설정해두고 JNDI를 통해 설정된 풀을 찾아 객체로 만들어 효율적이게 관리할수 있도록 도와주는 api라고 하겠습니다.

 

JNDI 예시 로직입니다.

 

public class ConExDAO {

	DataSource ds = null; //DBCP커넥션 풀 관리
    public ConExDAO() {
		try {
			Context ctx = new InitialContext();//JNDI서버객체 생성
			ds=(DataSource)ctx.lookup("java:comp/env/jdbc/xe");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}

커넥션 풀을 관리해주는 ds객체를 생성 - 이클립스 톰캣 가상서버 경로의 server.xml에 설정된 xe 디비명을 찾아서 커넥션 풀 관리해주는 ds객체를 생성합니다.

ctx가 JNDI객체이며, 이 객체 하위의 lookup()메서드로 server.xml의 xe디비를 찾습니다.

lookup()메서드의 인자값 경로중 java:comp/env 는 톰캣에서 리소스 자원을 관리하는 가상 디렉토리 경로입니다.

가상디렉토리 경로 뒤에는 "현재 사용중인 DB API 방식/설정한 DB명" 을 작성합니다. 

728x90
반응형