반응형
JNDI란?
JNDI(Java Naming and Directory Interface) 는
Java 기반 웹 애플리케이션에서 DB 연결 정보(DataSource) 를 외부 설정으로 분리하고
필요할 때 코드에서 lookup 방식으로 꺼내 쓰는 기술임
쉽게 말하면
“DB 접속 정보를 미리 서버(Tomcat 등)에 등록해두고 앱에서는 그냥 이름만 불러서 사용하는 방식”임
전체 흐름 한눈에 보기 (위 다이어그램 설명)
TOMCAT 설정 → JNDI에 DataSource 등록됨
↓
Java Application이 JNDI에서 lookup()
↓
DataSource에서 Connection 꺼냄
↓
DB에 쿼리 날림
✅ 흐름 설명 (실제 동작 순서)
- Tomcat에서 server.xml이나 context.xml에 JNDI DataSource 설정을 해둠
- WAS가 실행되면 설정된 JNDI 리소스가 등록됨 (예: jdbc/myDB)
- Java 코드에서 lookup("java:comp/env/jdbc/myDB") 호출 → 등록된 JNDI 리소스를 가져옴
- 가져온 DataSource 객체에서 getConnection() 호출 → DB에 커넥션 연결
- 연결된 커넥션을 통해 DB 작업 수행
왜 필요한가?
- 보안: DB ID/PW를 코드에 직접 적지 않음
- 환경 분리: 개발/운영서버 환경마다 설정 다르게 가져갈 수 있음
- 커넥션 풀 관리: DB 커넥션을 효율적으로 재사용 → 성능 향상
- 트랜잭션 제어: DB 세션을 명확히 제어 가능 → 불필요한 세션 낭비 방지
구성 예시
✅ server.xml (Tomcat)
<Resource
name="jdbc/myDB"
auth="Container"
type="javax.sql.DataSource"
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@192.168.111.14:1555/EZBILL"
username="myuser"
password="mypassword"
maxActive="10"
maxIdle="5"
maxWait="5000"
removeAbandoned="true"
removeAbandonedTimeout="60"
logAbandoned="true"
validationQuery="select 1 from dual"/>
✅ context.xml
<Context>
<ResourceLink name="jdbc/myDB" global="jdbc/myDB" type="javax.sql.DataSource"/>
</Context>
✅ Java 코드에서 사용
Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("java:comp/env/jdbc/myDB");
Connection conn = ds.getConnection();
커넥션 풀 설정 요소
설정명 | 설명 |
maxActive | 동시에 사용할 수 있는 최대 연결 수 |
maxIdle | 대기 상태로 유지되는 최대 연결 수 |
removeAbandoned | 일정 시간 동안 사용되지 않으면 커넥션 회수 여부 |
validationQuery | 커넥션이 유효한지 검사할 쿼리 |
💡 커넥션 풀을 잘 설정하면
불필요한 세션 낭비 없이 성능도 높이고 세션 폭주도 막을 수 있음
언제 사용해야 할까?
👉 JNDI는 “Java 애플리케이션이 DB에 연결할 때” 사용함
단순히 데이터를 넣고 뽑는 게 아니라 WAS 환경에서 안정적으로 커넥션을 관리하려는 목적이 큼
✅ 사용해야 하는 상황
- Java 애플리케이션에서 DB에 연결해야 할 때
- JDBC를 직접 쓰기보다 톰캣/WAS에 미리 등록해두고 꺼내 쓰는 구조가 필요할 때
- 운영환경과 개발환경 설정을 분리하고 싶을 때
- 코드에 DB URL/ID/PW를 직접 넣는 게 아니라 환경 설정 파일에서만 관리하고 싶을 때
- DB 커넥션 풀을 도입하고 싶을 때
- 세션을 효율적으로 재사용하고 TPS(초당 트랜잭션 수) 가 많은 시스템에서 성능을 높이고 싶을 때
- 세션 누수 DB 접속 제한 같은 문제를 방지하고 싶을 때
- DB_LINK처럼 세션이 계속 유지되는 방식 대신 명확하게 열고 닫히는 구조가 필요한 경우
❌ 꼭 JNDI를 안 써도 되는 경우
- 아주 작은 테스트용 프로젝트
- DB 접속도 1~2회 트랜잭션도 적음
- 로컬에서만 쓰는 간단한 툴성 애플리케이션
- 환경 분리나 커넥션 관리가 중요하지 않음
🔚 한 줄 요약
JNDI는 Java와 DB를 안정적으로 연결하고,
DB 커넥션을 효율적으로 관리할 수 있게 해주는 설정 방식이다.
반응형
'프로그래밍 > JAVA' 카테고리의 다른 글
[ JAVA ] 네트워킹 (Networking) (0) | 2023.04.25 |
---|---|
[ JAVA ] 직렬화란 (0) | 2023.04.25 |
[ JAVA ] 입출력 (0) | 2023.04.05 |
[ JAVA ] 쓰레드란? (0) | 2023.02.21 |
[JAVA] Properties 란? (0) | 2023.01.31 |