Back-end/JAVA,Spring

JNDI란? Java Naming and Directory Interface.

cheersHena 2023. 1. 10. 20:02
반응형

JNDI Java Naming and Directory Interface.

이름지정 및 디렉토리 서비스에서 제공하는 데이터 및 객체를 참조(lookup)하기 위한 자바 API이다. 

일반적으로 자바 애플리케이션을 외부 디렉터리 서비스(DB server,LDAP server..)에 연결할 때 쓰이는데

그중에서도 데이터베이스 연결에 가장 많이 쓰인다. 

 

데이터베이스 연결 시에는 데이터베이스 커넥션을 미리 만들어서 저장해두고,

필요할때 저장된 공간 (DB Pool)에서 가져다 쓰고 반환하는 기법이다. 

 

커넥션 풀을 이용하면 미리 커넥션을 만들어두고 사용하기 때문에 매번 사용할때마다 드라이버를 로드하고,

커넥션 객체 생성-연결-종료 하는 과정을 반복하지 않아도 되어서 데이터베이스의 부하를 줄이고 자원을 효율적으로 관리할 있다

 
 
 
 

JNDI를 왜 쓰나?

프로젝트 내부에 DB접속 정보를 저장해두지 않고, WAS 서버 (tomcat 등) 에 DB접속 정보를 저장해두고 사용하기 위함.

보통 개인 혹은 소규모 프로젝트에서는 DB서버를 하나만 사용한다. 이런 경우에는 JDBC(DBCP)를 설정해서 개발하는데 아무 문제가 없지만, 대규모 프로젝트에서는 개발서버, 운영서버 등 목적에 따라 서버를 구분하는 경우가 많다.

이런 경우 접속해야하는 서버가 바뀔때 마다 매번 dataSource정보를 변경해주어한다. 매우 번거럽고 서버가 헷갈리는 경우가 많다.

이런 경우 JNDI를 이용하면 WAS서버에 담아둔 DB정보를 참조하기 때문에 각 서버마다 별도의 WAS서버를 생성하면  번거로운 소스 변경작업을 생략할 수 있다. 

 

*JDBC와의 차이? 

jdbc는 데이터베이스 커넥션 인터페이스이다. 

DB Pool방식을 사용하지 않고 DB에서 정보를 가져올 때마다 매번 디비 객체 생성-연결-종료 하는 방식을 말한다.

통신 할때마다 커넥션을 하는것은 매우 비효율적이다.

 
WAS 서버의 context configuration 
context.xml )
<Resource name="[이름지정]" auth="Container" diverClassName="oracle.jdbc.driver.OracleDriver"
maxActive="20" maxIdle="10" maxWait="-1" autoReconnect="true" 
username="[DB계정]" password="[패스워드]" type="javac.sql.DataSource"
url="jdbc:oracle:thin:@[IP]:[PORT]:[SID]">
ex)
<Resource name="myOracle" auth="Container" diverClassName="oracle.jdbc.driver.OracleDriver"
maxActive="20" maxIdle="10" maxWait="-1" autoReconnect="true" 
username="root" password="root123" type="javac.sql.DataSource"
url="jdbc:oracle:thin:@127.0.0.1:1521:user">
<WatchedResource>WEB-INF/web.xml</WatchedResource>
context에 <Resource> 추가한 경우
server.xml 에 <GlobalNamingResouces> 추가한경우 
<GlobalNamingResources>
  <Resource auth="Container" 
  description="User database that can be updated and saved" 
  factory="org.apache.catalina.users.MemoryUserDatabaseFactory" 
  name="UserDatabase" 
  pathname="conf/tomcat-user.xml" 
  type="org.apache.catalina.UserDatabase"/>
</GlobalNamingResources>
 
메모리 번지수가 아닌 context 에서 지정해준 Resource의 이름(myOracle)으로 접근 및 관리할 수 있다.
이름 등록은 기동하고자 하는 프로젝트의 web.xml에서 설정한다. 

 

web.xml )
<resource-ref>
  <description>Oracle DataSource</description>
  <res-ref-name>myOracle</res-ref-name> //이름등록 
  <res-auth>Container<res-auth/>
</resource-ref>
 

 

반응형