JNDI Java Naming and Directory Interface.
이름지정 및 디렉토리 서비스에서 제공하는 데이터 및 객체를 참조(lookup)하기 위한 자바 API이다.
일반적으로 자바 애플리케이션을 외부 디렉터리 서비스(DB server,LDAP server..)에 연결할 때 쓰이는데
그중에서도 데이터베이스 연결에 가장 많이 쓰인다.
데이터베이스 연결 시에는 데이터베이스 커넥션을 미리 만들어서 저장해두고,
필요할때 저장된 공간 (DB Pool)에서 가져다 쓰고 반환하는 기법이다.
커넥션 풀을 이용하면 미리 커넥션을 만들어두고 사용하기 때문에 매번 사용할때마다 드라이버를 로드하고,
커넥션 객체 생성-연결-종료 하는 과정을 반복하지 않아도 되어서 데이터베이스의 부하를 줄이고 자원을 효율적으로 관리할 수 있다.
JNDI를 왜 쓰나?
프로젝트 내부에 DB접속 정보를 저장해두지 않고, WAS 서버 (tomcat 등) 에 DB접속 정보를 저장해두고 사용하기 위함.
보통 개인 혹은 소규모 프로젝트에서는 DB서버를 하나만 사용한다. 이런 경우에는 JDBC(DBCP)를 설정해서 개발하는데 아무 문제가 없지만, 대규모 프로젝트에서는 개발서버, 운영서버 등 목적에 따라 서버를 구분하는 경우가 많다.
이런 경우 접속해야하는 서버가 바뀔때 마다 매번 dataSource정보를 변경해주어한다. 매우 번거럽고 서버가 헷갈리는 경우가 많다.
이런 경우 JNDI를 이용하면 WAS서버에 담아둔 DB정보를 참조하기 때문에 각 서버마다 별도의 WAS서버를 생성하면 번거로운 소스 변경작업을 생략할 수 있다.
*JDBC와의 차이?
jdbc는 데이터베이스 커넥션 인터페이스이다.
DB Pool방식을 사용하지 않고 DB에서 정보를 가져올 때마다 매번 디비 객체 생성-연결-종료 하는 방식을 말한다.
통신 할때마다 커넥션을 하는것은 매우 비효율적이다.
<Resource name="[이름지정]" auth="Container" diverClassName="oracle.jdbc.driver.OracleDriver"
maxActive="20" maxIdle="10" maxWait="-1" autoReconnect="true"
username="[DB계정]" password="[패스워드]" type="javac.sql.DataSource"
url="jdbc:oracle:thin:@[IP]:[PORT]:[SID]">
<Resource name="myOracle" auth="Container" diverClassName="oracle.jdbc.driver.OracleDriver"
maxActive="20" maxIdle="10" maxWait="-1" autoReconnect="true"
username="root" password="root123" type="javac.sql.DataSource"
url="jdbc:oracle:thin:@127.0.0.1:1521:user">
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<GlobalNamingResources>
<Resource auth="Container"
description="User database that can be updated and saved"
factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
name="UserDatabase"
pathname="conf/tomcat-user.xml"
type="org.apache.catalina.UserDatabase"/>
</GlobalNamingResources>
<resource-ref>
<description>Oracle DataSource</description>
<res-ref-name>myOracle</res-ref-name> //이름등록
<res-auth>Container<res-auth/>
</resource-ref>
'Back-end > JAVA,Spring' 카테고리의 다른 글
이클립스 Building workspace 무한반복 현상 해결 (1) | 2023.01.10 |
---|---|
eclipse-maven연동 m2e+wtp 사용시 ContextRoot 변경되는 문제 해결 (0) | 2023.01.10 |
스프링에서 자주 사용하는 기본 @어노테이션 정리 (1) | 2022.08.07 |
Spring DI 스프링 의존성 주입 3가지 방법 (2) | 2022.08.04 |
스프링 Service에서 ServiceImpl를 사용하는 이유 ? (0) | 2022.08.03 |