IT'S DO
Published 2022. 11. 28. 12:48
[JNDI] JNDI 및 연결법? 개발/JNDI
728x90

JNDI란?

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

JNDI는 일반적으로 다음의 용도로 쓰인다:

  • 자바 애플리케이션을 외부 디렉터리 서비스에 연결 (예: 주소 데이터베이스 또는 LDAP 서버)
  • 자바 애플릿이 호스팅 웹 컨테이너가 제공하는 구성 정보를 참고  

간단히 요약하자면 우리가 연결하고 싶은 데이터베이스의 DB Pool을 미리 Naming 시켜주는 방법 중 하나이다. 우리가 저장해놓은 WAS 의 데이터베이스 정보에 JNDI를 설정해 놓으면 웹 애플리케이션은 JNDI만 호출하면 간단해진다.

그럼 왜 사용하게 되는걸까? 우리는 보통 JDBC를 설정해서 개발을 한다. 하지만 웹 애플리케이션을 운영서버로 만들경우 얘기가 달라진다. 그 이유는

  1. 개발을 한 사람과 실제 서비스를 운영하는 Admin은 다른 경우가 많기 때문에 소스 레벨에서 설정되어 있는 것보다 WAS에서 설정되어 있는 것을 선호한다.
  2. 또한 WAS에 여러 개의 웹 애플리케이션을 올려서 사용하기 때문에 WAS에서 한 번에 설정해 주는 것이 자원낭비를 줄일 수 있습니다.
  3. 또한 장애가 나거나 성능이 정상적이지 못하면 다른 한 서버가 대신 일을 해줄 수 있습니다.

정리하자면 운영, 관리, 최적화 문제 대처에 다양한 이점이 있기 때문에 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>

 

    // DB 선언
    InitialContext    InitCtx            = null;
    DataSource        ds                 = null;
    Connection        Conn               = null;
 
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를 찾게함

 

(DataSource) wInitCtx.lookup("java:comp/env");
//아까 컨텍스트에서 설정한 resource의 name속성을 찾음

 

# initCtx.lookup (String  name)
이름 첨부 객체를 취득합니다.

 Context ctx = (Context)ic.lookup("java:comp/env");//DBcontext를 찾게함
 
(DataSource) wInitCtx.lookup("java:comp/env");
//아까 컨텍스트에서 설정한 resource의 name속성을 찾음

 

 

# ds.getConnection();

getConnection( ) 실제 자바 프로그램과 데이터베이스를 네트워크상에서 연결해주는 메소드이며 에 성공하면 DB와 연결된 상태를 Connection 객체로 표현하여 반환합니다.

 

 

getConnection 메소드의 인자 값은 다음과 같다.

  • String url : 접속할 서버의 URL이며, 프로토콜, 서버주소,서버포트, DB이름으로 구성된다.
  • String user : DB서버에 로그인할 계정
  • String password : DB서버에 로그인할 비밀번호

 

profile

IT'S DO

@멋진놈

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!