JNDI( Java Naming and Directory Interface )
정의
디렉터리 서비스에서 제공하는 데이터 및 객체를 발견( discover ) 하고 참고( lookup ) 하기 위한 자바 API
목적
- 데이터베이스 커넥션을 자바 웹 애플리케이션이 아닌 WAS에서 데이터베이스 커넥션을 생성하고 풀로 관리하기 위함
- WAS 의 설정파일 안에 JNDI 를 입력해놓으면 웹 애플리케이션은 JNDI 만 호출하면 DB 접속이 가능하다.
사용이유
- 개발을 하는 사람과 실제 서비스를 운영하는 사람은 다른 경우가 많기 때문에 소스 레벨에서 하드코딩 되어있는 것 보단 WAS에서 설정되어 있는 것을 선호한다.
- 보통 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 |