8월 30, 2023

[Spring] JNDI를 사용한 DataSource 검색/ JNDI 정의, JDBC와 다른 장점

Spring에서 JNDI를 사용하여 DataSource를 검색할 수 있는 방법에 대해 알아보도록 하겠다.

 

1. JNDI란?

JNDI는 Java Naming and Directory Interface의 약자로, Java 언어를 사용하여 작성된 application에 이름 지정 및 디렉토리 기능을 제공해주는 API이다. 

 

우리가 흔히 알고 있는 JDBC와의 다른 점은 무엇일까?

JDBC는 DB에서 정보를 가져올 떄마다 매 번 DB연결을 열고, 닫고의 과정을 거치게 된다. 각 어플리케이션을 사용할 때마다 DB객체를 생성하고, connection을 연결하며 다 사용하면 connection을 종료하는 과정을 매번 거쳐야 하기 때문에 효율이 매우 떨어지는 방식이다. 이러한 이유로 상용되는 어플리케이션에서는 JDBC의 방식을 사용하지 않고 Pool 방식을 사용한다. 그리고 이러한 Pool 방식을 사용하는 예시로 JNDI 방식이 있다. 

 

JNDI는 어플리케이션이 아닌 WAS에 DB 커넥션 객체를 미리 네이밍해두는 방식인데 WAS 단에 미리 네이밍을 해둠으로써 DB 설정 정보를 파악하기 용이하며 효율적인 DB 커넥션 풀 방식을 이끌어낼 수 있다. 


 

2. JNDI기반으로 DataSource 검색하는 예시 

JNDI를 사용하여 DataSource를 검색하는 예시 코드를 살펴보자.

 

먼저 DB에 대한 이름 설정을 아래 web.xml 코드에서 설정해준다. 리소스에 대한 이름 등록은 <res-ref-name> 태그에서 해주게 된다. 

<resource-ref>
  <description>DataSource using JNDI example</description>
  <res-ref-name>jdbc/mydatabase</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
</resource-ref>

 

같은 xml 파일 또는 외부 설정 xml 파일에서 JNDI를 사용하여 검색을 수행할 수 있다. 

<jee:jndi-lookup id="dataSource" 
	jndi-name="jdbc/mydatabase" resource-ref="true" />

JNDI DatasSource 검색을 위해서는 jee 네임스페이스를 응용프로그램 안에서 정의해야 하며 

위 코드에서 볼 수 있듯이 jee:jndi-lookup 요소를 사용해야 한다.

 

위에서 id 특성은 해당 DataSource의 Bean이 노출될 ID를 지정하는 것이고 위 코드에서는 dataSource라는 아이디로 노출될 수 있도록 지정한 것이다. 

resource-ref="true"

위 코드는 해당 객체가 resource로서 응용프로그램 단위뿐 아니라 나아가 서버 scope에서 전역적으로 사용될 수 있게 한다는 뜻이다. 

 

위 설정을 지정하면 Spring에서는 JNDI 이름에 공통적으로 표준 접두사인

java:comp/env/

를 덧붙이게 되고 그러면서 전체 JNDI full 이름은 

java:comp/env/jdbc/mydatabase

가 되는 것이다. 


이렇게 JNDI 구성 방식을 사용하면 DataSource를 한 번만 만들고 여러 응용 application 프로그램 사이에 연결 풀을 공유하도록 할 때 효율적이고 용이하다는 장점이 있다.

 

또한 DB 연결 정보를 어플리케이션 단으로부터 독립시켜 구성할 수 있기 때문에 보안에도 안전하다.