Backend/JAVA

JNDI๋ž€?

dddzr 2025. 2. 26. 20:25

๐Ÿ” JNDI๋ž€? (Java Naming and Directory Interface)

 

Java EE์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋„ค์ด๋ฐ ์„œ๋น„์Šค๋กœ, ๋ฆฌ์†Œ์Šค (DataSource, JMS ๋“ฑ)๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‰ฝ๊ฒŒ ์ฐพ๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์คŒ.

โœ… 1. ๊ธฐ๋ณธ ๊ฐœ๋…

  • DataSource
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฐ์ฒด๋กœ, ์ง์ ‘ DriverManager.getConnection()์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  JNDI๋ฅผ ํ†ตํ•ด ์ œ๊ณต๋จ.
    • Connection pool์„ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๋‹จ์—์„œ ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌํ• ์ง€๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค

 

โญDriverManager.getConnection():์‹ค์ œ ์ž๋ฐ” ํ”„๋กœ๊ทธ๋žจ๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋„คํŠธ์›Œํฌ์ƒ์—์„œ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ๋ฉ”์†Œ๋“œ์ด๋‹ค. 

  • Connection: ๋„คํŠธ์›Œํฌ ์ƒ์˜ ์—ฐ๊ฒฐ ์ž์ฒด๋ฅผ ์˜๋ฏธ
  • Connection Pool (์ปค๋„ฅ์…˜ ํ’€): ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ์‹œ์ ์— Connection์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ์„ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด ๋‘๊ณ  ํ•„์š”ํ•  ๋•Œ ๊ฐ€์ ธ๋‹ค ์“ฐ๋Š” ๋ฐฉ์‹์œผ๋กœ, ์„ฑ๋Šฅ ํ–ฅ์ƒ ๋ฐ ๋ฆฌ์†Œ์Šค ์ ˆ์•ฝ์„ ์œ„ํ•œ ๊ธฐ๋ฒ•.

 

๐Ÿ”ฅJNDI VS DBCP VC JDBC

๊ตฌ๋ถ„ JNDI DataSource DBCP DataSource JDBC (์ง์ ‘ ์—ฐ๊ฒฐ)
์„ค์ • ๋ฐฉ์‹ Tomcat(WAS)์—์„œ JNDI๋กœ ์„ค์ •๋œ DataSource๋ฅผ ์ฐธ์กฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ง์ ‘ **DBCP (Database Connection Pooling)**์„ ์ƒ์„ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด JDBC ๋“œ๋ผ์ด๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง์ ‘ DB ์—ฐ๊ฒฐ
Spring ํด๋ž˜์Šค org.springframework.jndi.JndiObjectFactoryBean org.apache.commons.dbcp.BasicDataSource java.sql.Connection, java.sql.DriverManager
์ปค๋„ฅ์…˜ ๊ด€๋ฆฌ WAS (Tomcat)์—์„œ ์ปค๋„ฅ์…˜ ํ’€ ๊ด€๋ฆฌ, ์—ฌ๋Ÿฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๊ฐ™์€ ์„ค์ • ๊ณต์œ  ๊ฐ€๋Šฅ ๊ฐœ๋ณ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ์ปค๋„ฅ์…˜ ํ’€ ์ง์ ‘ ์ƒ์„ฑ ๋ฐ ๊ด€๋ฆฌ ์ปค๋„ฅ์…˜ ํ’€ ์—†์Œ, ๋งค๋ฒˆ DriverManager.getConnection()์„ ํ˜ธ์ถœํ•˜์—ฌ ์—ฐ๊ฒฐ ์ƒ์„ฑ

 

โœ… 2. ์ถ”์ฒœ ๋ฐฉ์‹

  • JNDI: WAS(Tomcat ๋“ฑ)์—์„œ ์ค‘์•™์—์„œ ์ปค๋„ฅ์…˜ ๊ด€๋ฆฌ, ์šด์˜ ํ™˜๊ฒฝ์—์„œ ์œ ์ง€๋ณด์ˆ˜ ํŽธ๋ฆฌ
  • DBCP: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์ง์ ‘ ์ปค๋„ฅ์…˜ ํ’€ ๊ด€๋ฆฌ, ์„ค์ •์ด ๊ฐ„ํŽธ
  • JDBC: ์ปค๋„ฅ์…˜ ํ’€ ์—†์ด ์ง์ ‘ ์—ฐ๊ฒฐ, ์„ฑ๋Šฅ ์ €ํ•˜ ๊ฐ€๋Šฅ

 

โœ… 3. JNDI ์„ค์ • ๋ฐฉ๋ฒ• (JNDI ์˜ˆ์ œ)

1๏ธโƒฃ Context-datasorce.xml

<!-- JNDI ๋ฐฉ์‹ -->
<?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
        http://www.springframework.org/schema/jdbc 
        http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd"> 
    <!-- Oracle JNDI DataSource --> 
    <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="jdbc/ifn" />
    <property name="resourceRef" value="true" />
    </bean>
</beans> 

<!-- DBCP ๋ฐฉ์‹ -->
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/jdbc
        http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd">
    <!-- Oracle : ๊ฐœ๋ฐœ DB --> 
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
        <property name="url" value="jdbc:oracle:thin:@11.111.111.11:1521/dbname" />
        <property name="username" value="user" />
        <property name="password" value="password" />
    </bean> 
</bean>

 

2๏ธโƒฃ  web.xml์—์„œ JNDI ๋ฐ์ดํ„ฐ ์†Œ์Šค ์„ค์ • ์ถ”๊ฐ€

<resource-ref>
    <description>DB Connection</description>
    <res-ref-name>jdbc/ifn</res-ref-name>
    <res-type>javax.sql.DataSource</res-type>
    <res-auth>Container</res-auth>
</resource-ref>

 

3๏ธโƒฃ Tomcat Connection Pool ์„ค์ •

๐Ÿ“– Context.xml (๊ถŒ์žฅ)

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <!-- Default set of monitored resources. If one of these changes, the web application will be reloaded. -->
    <WatchedResource>WEB-INF/web.xml</WatchedResource>
    <WatchedResource>${catalina.base}/conf/web.xml</WatchedResource>

    <!-- JNDI DataSource ์„ค์ • ์ถ”๊ฐ€ -->
    <Resource name="jdbc/ifn"
              auth="Container"
              type="javax.sql.DataSource"
              driverClassName="oracle.jdbc.OracleDriver"
              url="jdbc:oracle:thin:@11.111.11.11:1521/dbname"
              username="user"
              password="password"
              maxTotal="10"
              maxIdle="5"
              maxWaitMillis="10000"/>             

</Context>

 

๐Ÿ“– server.xml (๊ถŒ์žฅ x)

<GlobalNamingResources>
    <Resource name="jdbc/ifn"
              auth="Container"
              type="javax.sql.DataSource"
              driverClassName="oracle.jdbc.OracleDriver"
              url="jdbc:oracle:thin:@localhost:1521:dbname"
              username="your_username"
              password="your_password"
              maxTotal="20"
              maxIdle="10"
              maxWaitMillis="-1"/>
</GlobalNamingResources>



๐Ÿšจerror: Caused by: javax.naming.NameNotFoundException: Name [jdbc/ifn]์€(๋Š”) ์ด ์ปจํ…์ŠคํŠธ์— ๋ฐ”์ธ๋”ฉ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. [jdbc]์„(๋ฅผ) ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์œ„์˜ ์„ค์ • ์ œ๋Œ€๋กœ ์•ˆ ํ–ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์—๋Ÿฌ!!