관리 메뉴

HAMA 블로그

초보자를 위한 JNDI 본문

오픈소스, 미들웨어

초보자를 위한 JNDI

[하마] 이승현 (wowlsh93@gmail.com) 2015. 7. 16. 11:16


JNDI 는 자바 네이밍 / 디렉토리 인터페이스인데 J2EE 의 가장 중요한 스펙중하나이다.

많은 전문가들은 JNDI 의 역할과 중요성을 이해하지 못하고서는 진정한 J2EE EJB 를 알고있다고 말할수없다고 한다.

과연 JNDI 의 역할은 멀까?

JNDI 의 역할을 이해하기위해  "JNDI 가 없다면 어떻게 해야하는지"  를 먼저 보고  JNDI 를 사용하는것에 대해 살펴보자. 

마지막으로 JNDI 의 실행모습과 환경설정등에 대해 알아보자.


* 구체적인 사용방법은 다른 블로그를  참고하도록하자. 




1. JNDI 왜  사용하나? 


JNDI 의 역할을 이해하기위해  "JNDI 가 없다면 어떻게 해야하는지"  를 먼저 보고  JNDI 를 사용하는것에 대해 살펴보자. 


JNDI 없이 


MySQL 데이타베이스에 접근하기위한 어플리케이션을 개발할때,  MySQL JDBC 드라이버 클래스를  참조하기위해 

해당되는 JDBC URL 를 사용하는데 대략 다음과 같다.


Java code 


Connection conn = null; 
try { 
    Class.forName ("com.mysql.jdbc.Driver" , true, Thread.currentThread (). getContextClassLoader ()); 
    conn = DriverManager.getConnection ("jdbc: mysql :/ / MyDBServer? user = qingfeng & password = mingyue"); 

    ...... 
    conn.close (); 
} 
.....


이것은 전통적인 접근방법이며 , 다른 언어개발자들에게도 일반적인 방법이다. 이 접근법은 일반적으로 작은규모의 개발

 프로세스에 적합하며  자바언어에 익숙하기만하면 어플리케이션을 금방 만들수있는 장점이 있다. 


 

JNDI 식 접근 


1. 데이타베이스 서버이름 MYDBSERVER/사용자이름,비밀번호/ 바꿀필요가 있을때라든지 JDBC URL 을 수정할필요가 있을때

2. 데이타베이스가 다른것(DB2, Oracle등) 으로 바뀔수있을때

3. JDBC 설정이 바뀔필요가 있을때 (커넥션 풀 파라미터등등) 


해결책 : 

프로그래머는 데이타베이스 백그라운드에서의 특별한 세팅에 대해 신경쓰게 하고 싶지 않다. 데이타베이스 관리자가 

진두지휘하고 프로그래머는 그냥 가져다 쓰게하고싶다.


그럴때 JNDI 가 있다.


우선 J2EE 컨테이너에 JNDI 파라미터를 설정하고, 데이타소스등을 정의한다. JBoss 에서의 예를 보자


<? Xml version = "1.0" encoding = "UTF-8"?> 
<datasources> 
<local-tx-datasource> 
<jndi-name> MySqlDS </ jndi-name> 
<connection-url> jdbc: mysql :/ / localhost: 3306/lw </ connection-url> 
<driver-class> com.mysql.jdbc.Driver </ driver-class> 
<user-name> root </ user-name> 
<password> rootpassword </ password> 
<exception-sorter-class-name> org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter </ exception-sorter-class-name> 
<metadata> 
<type-mapping> mySQL </ type-mapping> 
</ Metadata> 
</ Local-tx-datasource> 
</ Datasources>


2 . 소스에서 사용하기 


Java code 
Connection conn = null; 
try { 
    Context ctx = new InitialContext (); 
    Object datasourceRef = ctx.lookup ("java: MySqlDS"); / / reference data source 
    DataSource ds = (Datasource) datasourceRef; 
    conn = ds.getConnection (); 

...... 
c.close (); 
} 
.....




시스템에 대해 배포후에 , 만약 데이타베이스 관련된 파라미터가 바뀔때 오직 mysql-ds.xml 설정만 바꿔주면 된다.

소스코드를 바꿀필요없이  아마 그것만 하는 관리(개발)자를 두면 그사람이 알아서 회사(제품)방침에 따라서 조작 할것이다.

JNDI 는 프로그램과 데이타베이스간에 타이트하게 묶여있는 커플링을 피하게 해주며, 쉽게 설정,배포하게해준다.


3. 관련 이미지 




위의 예는 DB 에 접근하기위한 방법에 대한 예이지만, 모든 리소스들에 대해서도 투명화하기위하면 사용할만하겠다. 

예를 들어서  밴더별 컴포넌트, 디바이스 드라이버, 환경설정등등..

근데 요즘 OSGi 도 살펴보는중인데 OSGi 는 JNDI 의 특성(위치투명성)과 기존 컴포넌트베이스개발방법론이 합쳐진거

같은 느낌을 받았다.



2. JNDI 모습들과 환경설정에 관하여




환경 설정에 관한 이야기들 


웹로직/톰캣 서버가 부팅시에 JNDI 객체를 등록합니다.

JNDI 서버의 실제 구현 기능은 각 Application Server의 Vendor (톰캣, 웹로직같은) 가 제공함

JNDI 서버 단독실행 가능함 : http://meri-stuff.blogspot.kr/2012/01/running-jndi-and-jpa-without-j2ee.html

간단한 JNDI 서버 : https://code.google.com/p/osjava/wiki/SimpleJNDI

어떻게 원격 JNDI 서버에 접속하나? : http://stackoverflow.com/questions/15272467/how-to-lookup-remote-jndi







레퍼런스:

http://www.databaseskill.com/216815/





Comments