프로그래밍/JAVA

[JAVA] JNDI란 무엇인가? 그리고 언제 사용하는가?

리신 2025. 4. 20. 00:00
반응형

Java 애플리케이션이 어떻게 DB와 연결되는지를 JNDI를 통해 흐름 순서대로 정리한 구조도

JNDI란?

JNDI(Java Naming and Directory Interface)
Java 기반 웹 애플리케이션에서 DB 연결 정보(DataSource) 를 외부 설정으로 분리하고
필요할 때 코드에서 lookup 방식으로 꺼내 쓰는 기술

 

쉽게 말하면
“DB 접속 정보를 미리 서버(Tomcat 등)에 등록해두고 앱에서는 그냥 이름만 불러서 사용하는 방식”

 

 

전체 흐름 한눈에 보기 (위 다이어그램 설명)

TOMCAT 설정 → JNDI에 DataSource 등록됨
        ↓
Java Application이 JNDI에서 lookup()
        ↓
DataSource에서 Connection 꺼냄
        ↓
DB에 쿼리 날림

✅ 흐름 설명 (실제 동작 순서)

  1. Tomcat에서 server.xml이나 context.xml에 JNDI DataSource 설정을 해둠
  2. WAS가 실행되면 설정된 JNDI 리소스가 등록됨 (예: jdbc/myDB)
  3. Java 코드에서 lookup("java:comp/env/jdbc/myDB") 호출 → 등록된 JNDI 리소스를 가져옴
  4. 가져온 DataSource 객체에서 getConnection() 호출 → DB에 커넥션 연결
  5. 연결된 커넥션을 통해 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