JNDI란?
JNDI(Java Naming and Directory Interface)는 디렉터리 서비스에서 제공하는 데이터 및 객체를 발견(discover)하고 참고(lookup) 하기 위한 자바 API다.
JNDI는 일반적으로 다음의 용도로 쓰인다:
- 자바 애플리케이션을 외부 디렉터리 서비스에 연결 (예: 주소 데이터베이스 또는 LDAP 서버)
- 자바 애플릿이 호스팅 웹 컨테이너가 제공하는 구성 정보를 참고
간단히 요약하자면 우리가 연결하고 싶은 데이터베이스의 DB Pool을 미리 Naming 시켜주는 방법 중 하나이다. 우리가 저장해놓은 WAS 의 데이터베이스 정보에 JNDI를 설정해 놓으면 웹 애플리케이션은 JNDI만 호출하면 간단해진다.
그럼 왜 사용하게 되는걸까? 우리는 보통 JDBC를 설정해서 개발을 한다. 하지만 웹 애플리케이션을 운영서버로 만들경우 얘기가 달라진다. 그 이유는
- 개발을 한 사람과 실제 서비스를 운영하는 Admin은 다른 경우가 많기 때문에 소스 레벨에서 설정되어 있는 것보다 WAS에서 설정되어 있는 것을 선호한다.
- 또한 WAS에 여러 개의 웹 애플리케이션을 올려서 사용하기 때문에 WAS에서 한 번에 설정해 주는 것이 자원낭비를 줄일 수 있습니다.
- 또한 장애가 나거나 성능이 정상적이지 못하면 다른 한 서버가 대신 일을 해줄 수 있습니다.
정리하자면 운영, 관리, 최적화 문제 대처에 다양한 이점이 있기 때문에 JNDI를 사용한다.
사용 예시
설정해줘야 할 파일은 web.xml과 server.xml이다.
....web.xml
<resource-ref>
<description>Resource</description>
<res-ref-name>jdbc/EmployeeDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
<Context>
...server.xml
<Resource name="jdbc/EmployeeDB"
auth="Container"
type="javax.sql.DataSource"
username="dbusername"
password="dbpassword"
driverClassName="driverName"
url="jdbc:oracle:thin..."
maxActive="8"
maxIdle="4"/>
</Context>
InitialContext initCtx = new InitialContext();
DataSource ds = (DataSource) initCtx.lookup("java:comp/env");
Conn = ds.getConnection();
위와 같이 해주면 네이밍의 해당하는 디비의 컨넥션 값을 얻어온다.
# InitialContext
네이밍 조작을 실행하기 위한 개시 컨텍스트 입니다.
네이밍 조작은 모두, 컨텍스트를 기준으로 합니다. 초기 컨텍스트에 는 Context 인터페이스가 구현되어 이름을 해결하는 개시점이 제공됩니다.
//톰캣 객체에게
# initCtx.lookup (Name name)
지정된 객체를 취득합니다.
Context ctx = (Context)ic.lookup("java:comp/env");//DBcontext를 찾게함
//아까 컨텍스트에서 설정한 resource의 name속성을 찾음
# initCtx.lookup (String name)
이름 첨부 객체를 취득합니다.
Context ctx = (Context)ic.lookup("java:comp/env");//DBcontext를 찾게함
//아까 컨텍스트에서 설정한 resource의 name속성을 찾음
# ds.getConnection();
getConnection( ) 실제 자바 프로그램과 데이터베이스를 네트워크상에서 연결해주는 메소드이며 연결에 성공하면 DB와 연결된 상태를 Connection 객체로 표현하여 반환합니다.
getConnection 메소드의 인자 값은 다음과 같다.
- String url : 접속할 서버의 URL이며, 프로토콜, 서버주소,서버포트, DB이름으로 구성된다.
- String user : DB서버에 로그인할 계정
- String password : DB서버에 로그인할 비밀번호