[JAVA EE] JNDI와 Connection Pool

JNDI(Java Naming and Directory Interface)?

먼저, Oracle 문서를 보면 ‘JNDI란 자바 어플케이션에 네이밍/디렉토리 기능을 제공하는 API’ 라고 한다. 이를 쉽게 풀면 ‘WAS에 자원에 대한 객체를 넣어놓고, 자바 어플리케이션에서 그 객체를 사용할 수 있게 도와주는 기술정도가 될 것 같다.

실제 개발에선 DataSource를 미리 네이밍 해놓고, 어플리케이션에서 이를 참조해 DB와 연결하는 식으로 많이 사용한다. 이런 식으로 DataSource를 어플리케이션이 아닌 WAS에 설정하는 이유는 다음과 같다. 첫째, 서버 운영자는 어플리케이션 단을 잘 모르기 때문에 DataSourceWAS에 설정되는 것을 선호한다. 둘째, 하나의 DB를 여러 개의 어플리케이션이 사용하는 경우, 하나의 WAS에서 커넥션 풀을 관리하는게 효과적이다. 셋째, 여러 개의 DB가 있을 때 WAS에서 로드밸런싱을 할 수 있다.


JNDI를 통해 자바 어플리케이션 DB에 연결되는 과정은 위의 그림과 같다먼저자바 어플리케이션은 WAS에 설정된 JNDI의 DataSource 객체를 바라본다그 다음그 객체에 지정된 커넥션 풀에서 사용 가능한 커넥션을 하나 얻는다마지막으로이 커넥션으로 RDB와 연결해 작업을 수행한다.

Connection Pool이란?

추가적으로 커넥션 풀을 정리한다. 커넥션 풀(DBCP)이란 데이터베이스와 연결된 커넥션 객체들을 미리 만들어 이들을 풀에 저장해놓고 필요할 때마다 풀에서 커넥션 객체를 가져와 사용하고 다시 반납하는 기술이다. 커넥션 풀을 이용하는 과정을 보면, (1) 어플리케이션이 커넥션 풀 안의 사용가능한 커넥션을 가져온다. (2) 커넥션 객체를 이용해 DB와 연결하고 작업을 수행한다. (3) 작업이 끝나면 커넥션 객체를 다시 커넥션 풀에 반납한다.



어플리케이션에서 커넥션 풀로 커넥션 객체를 관리하면 다음과 같은 이점이 있다. 먼저, 커넥션을 직접 열고 닫는데 걸리는 시간과 시스템 부하를 줄일 수 있다. 커넥션 풀을 사용하지 않는다면, 어플리케이션은 DB에 커넥션을 열고, 쿼리를 수행하고, 다시 커넥션을 닫는다. 여기서 커넥션을 여닫는 부분을 없애면 시간도 줄고 그만큼 시스템 부하도 줄을 것이다. 두번째로, 어플리케이션이 쉽게 다운되지 않는다. 커넥션 객체의 수를 제한하고 그 안에서만 DB에 접속할 수 있기 때문에 동접자 수가 많아지더라도 사용 가능한 커넥션 객체가 없으면 접속자는 대기 상태가 된다.

댓글