새로운 블로그로 이전하였습니다!

JNDI( Java Naming and Directory Interface )

정의

디렉터리 서비스에서 제공하는 데이터 및 객체를 발견( discover ) 하고 참고( lookup ) 하기 위한 자바 API

목적

  • 데이터베이스 커넥션을 자바 웹 애플리케이션이 아닌 WAS에서 데이터베이스 커넥션을 생성하고 풀로 관리하기 위함
  • WAS 의 설정파일 안에 JNDI 를 입력해놓으면 웹 애플리케이션은 JNDI 만 호출하면 DB 접속이 가능하다.

사용이유

  1. 개발을 하는 사람과 실제 서비스를 운영하는 사람은 다른 경우가 많기 때문에 소스 레벨에서 하드코딩 되어있는 것 보단 WAS에서 설정되어 있는 것을 선호한다.
  2. 보통 WAS에 서버를 여러개 생성해서 웹 애플리케이션을 배포하기 때문에 WAS 안에서 한번에 설정해주는 것이 자원을 비교적 적게 사용하게 된다.

이런 이유로 운영, 관리, 최적화 측면에서 소스 내에 하드 코딩 하는 것 보다 더 유리하다.

사용 방법 예시

WAS : Tomcat

DB : Oracle

다른 상용 WAS는 웹콘솔에서 지정하면 됨.

0. %CATALINA_HOME%\lib 디렉토리 안에 JDBC Driver 추가

각 DB 벤더사별 Driver 파일 추가

다른 WAS도 lib 폴더에 추가해야 함

1. %CATALINA_HOME%\conf 안에 server.xml 수정

<GlobalNamingResources> 태그 안에 <Resource> 태그 추가

한글부분 수정해서 사용

 

<Resource name="jdbc/DB명"
	auth="Container"
	type="javax.sql.DataSource"
	driverClassName="각 벤더사별 DB 클래스명"
	url="jdbc:oracle:thin:@//아이피:포트/DB명"
	username="root"
	password="password"
	initialSize="20"
	maxTotal="100"
	maxIdle="100"
	minIdle="20"
	maxWaitMillis="30000"
/>

name : 리소스 구분용으로 Resource_Type/Resource_Name 으로 사용하는 것을 추천

그래서 jdbc 로 구동되므로 Resource_Type 은 "jdbc" Resource_Name은 데이터베이스 명 으로 지정

auth : Container 로 지정

웹 애플리케이션 대신 컨테이너가 리소스 관리자에 로그인하고 관리하기 위함.

만약 프로그램으로 리소스 관리자에 로그인 할거면 Application 으로 지정하면 됨.

driverClassName

Tomcat은 Driver Class 로 접근

다른 상용 WAS( JEUS, WebLogic )는 Data Source Class 로 접근하는 점에서 구조적 차이가 있다.

예시)JEUS

2. 웹 애플리케이션 webapp\WEB-INF\web.xml 태그 추가

<resource-ref>
    <description>Resource</description>
    <res-ref-name>jdbc/DB명</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

3. CRUD 구현을 위한 DB 커넥션 불러오기

Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource)envCtx.lookup("jdbc/DB명");
conn = ds.getConnection();

InitialContext

WAS와 연결하기 위한 객체로 웹 애플리케이션이 배치될 때 생성됨.

"java:comp/env"

JNDI 문법. WAS 연결을 위해 생성된 Context 에서 was 내부 디렉토리에 접근하는 용도

3.A 만약 WAS와 다른 JVM에서 실행될 경우

JNDI 접근 정보를 담은 아래 2종을 InitialContext를 선언할 때 파라미터로 넘겨주어야 함

1. java.naming.factory.initial

- Context Factory 클래스의 이름을 지정하는 Property. 새로운 InitialContext 객체를 만들 때 사용

2. java.naming.provider.url

- JNDI 서비스를 제공하는 서버의 주소

아래 코드를 InitialContext 선언부분 위에 추가

HashTable env = new HashTable();
env.add("java.naming.factory.initial":"아래참조");
env.add("java.naming.provider.url":"아래참조");
Context initCtx = new InitialContext(env);

WebLogic JNDI Property

java.naming.factory.initial : weblogic.jndi.WLInitialContextFactory

java.naming.provider.url : t3://localhost:7001

JEUS JNDI Property

java.naming.factory.initial : jeus.jndi.JNSContextFactory

java.naming.provider.url : localhost

Tomcat 은 지원을 안해서 JBoss Context Factory 를 사용함

1. jnp-client.jar / jboss-common-client.jar 2개를

WEB-INF/lib, 톰켓 %CATALINA_HOME%\common\lib 두곳에 추가

2. java.naming.factory.initial : org.jnp.interfaces.NamingContextFactory

3. java.naming.provider.url : jnp://<SERVER>:1099

4. java.naming.factory.url.pkgs : org.jboss.naming:org.jnp.interfaces << 얘도 env.add( " " ) 필요

'Back-End > Java & Spring' 카테고리의 다른 글

[JAVA-Spring] 가변적인 Parameter 처리  (0) 2022.08.02
[JAVA] Log4j  (0) 2022.08.02
[JAVA] Apach Axiom API (XML Parser)  (0) 2022.08.02
[JAVA] JVM 메모리 구조와 라이프 사이클  (0) 2022.08.02
[JAVA] Java Framework 종류  (0) 2022.08.02
복사했습니다!