현재 투입한 프로젝트에선 DB연결을 JNDI 관리하고있다. JNDI 이름은 들어봤는데 정확히 무엇을 의미하는 것인지 몰라서 이번 기회에 내용을 정리해보고자 한다.
JNDI에 대해 찾다보면 DBCP에 대한 설명을 함께 볼 수 있는데, 솔직히 처음에는 무슨차이인지 잘 이해가 되지 않았다. JNDI가 JAVA NAMING이라는데 그게 뭐지..? 열심히 검색한결과 JDBC는 JAVA DB 연결을 위한 API > JDBC, DBCP, JNDI를 각각 다른 것이라고 설명하는 글이 많았는데 따지고 보면 다 관련이 있다.
JDBC (Java DataBase Connectivity)는 자바와 데이터베이스를 연결하기 위한 자바API 이지 DB연결을 어떻게하고 관리하는지에 대한 특별한 방법이 아니다. 즉, jdbc는 데이터베이스에 접근하기 위한 것으로 비교를 하자면 ODBC(Open DataBase Connectivity)와 비교대상이지, dbcp, jndi와 비교대상이 아니다.
그렇다면 JDBC 연결 방식에 대해 설명하는 것은 뭘까? 나름대로 정리한 결과 JDBC 연결 방식이라고 칭하는 것은 JDBC만! 사용하여 DB 연결이 필요한 경우 매번 DB Connection을 열고, 닫고를 반복하는 것을 뜻한다. 당연히 이러한 방식은 자원낭비로 이어진다. 개인적으로는 DBCP와 JNDI의 필요성을 강조하기위해 ‘JDBC 방식’이라고 칭하는 것이 아닐까 생각한다.
따라서 다음으로 나온것이 ‘DBCP(DataBase Connection Pool)이다. DBCP는 어플리케이션을 시작하는 시점에 커넥션 객체를 원하는 만큼 만들어 Connection Pool에 넣어 놓고 DB연결이 필요할때마다 커넥션 객체를 사용하고, 사용이 끝나면 다시 Pool에 반납하는 방법을 말한다. 즉, Connection Pool을 사용하는 방식을 DBCP라고 칭하는 것이다. 이렇게 되면 또 의문이 생긴다. 그럼 JNDI방식은 Pool을 사용하지 않는 또다른 방식인 것인가? 결론부터 말하자면 JNDI 방식도 Pool을 사용하며 그것에 대한 설정을 WAS에서 처리한다.
그럼 엄밀히 말하자면 JDBC와 마찬가지로 DBCP또한 JNDI와 비교 대상이 아니라는 말이다. 다만, DBCP와 JNDI를 비교를 하는 것은 보통 DBCP방식 이라고 칭하는 것은 Connection Pool을 어플리케이션 소스단에 설정하는 방식이라 설명하며 JNDI와 비교를 한다. (물론 정확한 비교대상은 아니지만)
그렇다면 대망의 JNDI는 무엇일까?
JNDI(Java Naming and Directory Interface)는 "네이밍/디렉토리 서비스를 사용하기 위한 인터페이스"이다. 여기서 디렉토리 서비스는 각 자원을 디렉토리 별로 분류하여 검색하기 쉽게 만드는 서비스를 말하며("jdbc/mydb" 형식), 네이밍 서비스는 각 자원에 이름을 붙이는 것을 말한다.
즉, JNDI는 각 자원에 이름을 붙이고 이 이름을 통해 자원을 찾도록 도와주고, 이러한 설정을 WAS단에 미리 네이밍 해두는 방식을 말한다. 이렇게 WAS단에 데이터베이스 풀을 미리 네이밍 해 두면 DB설정정보를 파악하기 쉽고, DB Connection Pool을 효율적으로 사용할 수 있는 장점이 존재하기에 JDBC, DBCP와 비교하여 JNDI 방식을 가장 선호한다고 생각한다.