Server/- mysql

[ JNDI ] 설정하기

즐겁게 하하하 2024. 11. 10. 08:29
728x90

 

  • 코드의 간결성과 유지보수성: JNDI를 사용하면 데이터베이스 연결 정보(예: 드라이버, URL, 사용자명, 비밀번호 등)가 코드 내에 하드코딩되지 않고 애플리케이션 서버에 의해 관리됩니다. 이는 코드의 간결성을 높이고, 데이터베이스 정보가 변경될 때 애플리케이션을 수정하지 않아도 되므로 유지보수성이 향상됩니다.
  • 보안성: 데이터베이스 연결 정보가 애플리케이션 코드에서 분리되므로 코드에 민감한 정보(예: 비밀번호)를 포함하지 않게 되어 보안성이 높아집니다. 데이터베이스 자격 증명은 서버 설정에 저장되므로 코드 유출 시에도 보안이 강화됩니다.
  • 재사용성: JNDI를 통해 설정된 데이터베이스 연결은 애플리케이션 내의 여러 구성 요소에서 재사용할 수 있습니다. 이를 통해 일관된 데이터베이스 연결 관리를 가능하게 하고, 코드 중복을 줄일 수 있습니다.
  • 애플리케이션 배포의 유연성: 코드가 특정 데이터베이스 환경에 종속되지 않으므로 개발 환경, 테스트 환경, 운영 환경 등에서 서로 다른 데이터베이스를 쉽게 사용할 수 있습니다. 각 환경에 맞게 서버의 JNDI 설정만 변경하면 되기 때문에 배포가 용이해집니다.
  • 애플리케이션 서버의 자원 관리: JNDI를 사용하면 애플리케이션 서버가 데이터베이스 연결 풀(Connection Pool)을 관리할 수 있습니다. 이로 인해 데이터베이스 연결의 효율성이 높아지고, 성능이 향상됩니다. 서버는 필요한 시점에 연결을 재사용하거나 반환함으로써 리소스 낭비를 줄입니다.

1. web.xml

<!-- mysql jndi 연결 -->  
<resource-ref>
  <description>DB Connection</description>
  <res-ref-name>jdbc/EgovData</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>
</resource-ref>

 

2. context-datasource.xml

<!--  Jndi -->       
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
	<property name="jndiName" value="java:comp/env/jdbc/EgovData"/>
</bean>

 

  • <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">: Spring에서 JNDI를 통해 데이터 소스를 참조하기 위해 JndiObjectFactoryBean 클래스를 사용하여 dataSource 빈을 정의합니다.
  • <property name="jndiName" value="java:comp/env/jdbc/EgovData"/>: JndiObjectFactoryBean이 참조할 JNDI 리소스의 이름을 지정합니다. java:comp/env/jdbc/EgovData는 JNDI 컨텍스트 내의 데이터 소스 경로를 나타냅니다.

 

3. Server에 설치된 tomcat 폴더 내의  /conf/context.xml

<?xml version="1.0" encoding="UTF-8"?>
 
 	<!-- mysql -->
    <Context>
        <Resource name="jdbc/EgovData"
                  auth="Container"
                  type="javax.sql.DataSource"
                  maxTotal="100"
                  maxIdle="30"
                  maxWaitMillis="10000"
                  username="name"
                  password="pwd"
                  driverClassName="net.sf.log4jdbc.sql.jdbcapi.DriverSpy"
                  url="jdbc:log4jdbc:mysql://11.11.11.11:3306/testSchema"/>
	</Context>
    
    <!-- oracle -->
    <Context>
        <Resource name="jdbc/EgovData"
                  auth="Container"
                  type="javax.sql.DataSource"
                  maxTotal="100"
                  maxIdle="30"
                  maxWaitMillis="10000"
                  username="name" <!-- 오라클 사용자 이름 -->
                  password="pwd" <!-- 오라클 비밀번호 -->
                  driverClassName="oracle.jdbc.OracleDriver" <!-- 오라클 JDBC 드라이버 클래스 -->
                  url="jdbc:oracle:thin:@11.11.11.11:1521:ORCL"/> <!-- 오라클 데이터베이스 URL (thin 드라이버 사용) -->
    </Context>

 

  • name="jdbc/EgovData": 애플리케이션에서 참조할 때 사용하는 JNDI 이름.
  • auth="Container": 인증을 서버(Container)가 관리하도록 설정.
  • type="javax.sql.DataSource": 데이터 소스의 Java 타입을 정의하여 데이터베이스 연결 제공.
  • maxTotal="100": 연결 풀의 최대 연결 개수(최대 동시 연결 수).
  • maxIdle="30": 연결 풀 내에서 유지할 수 있는 최대 유휴 연결 수.
  • maxWaitMillis="10000": 연결을 사용할 수 없을 때 대기할 최대 시간(밀리초).
  • username="aiportal": 데이터베이스 접속에 사용할 사용자 이름.
  • password="This2587!@#": 데이터베이스 접속에 사용할 비밀번호.
  • driverClassName="net.sf.log4jdbc.sql.jdbcapi.DriverSpy": JDBC 드라이버 클래스 이름으로, log4jdbc 드라이버를 사용하여 SQL 로그 출력.
  • url="jdbc:log4jdbc:mysql://10.2.2.8:3306/aiportal": 데이터베이스 연결 URL, MySQL 데이터베이스에 연결 설정.

 

web.xml에 설정 안하고  context-datasource.xml   에만 설정하는 방법도 있다.

 

1. context-datasource.xml 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:jdbc="http://www.springframework.org/schema/jdbc"
       xmlns:jee="http://www.springframework.org/schema/jee"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
       http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd
       http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.0.xsd">

     <!-- DB1 -->
    <jee:jndi-lookup id="dataSourceBase" jndi-name="oracleTest1DataSource" resource-ref="true" />
    
    <!-- DB2 -->
    <jee:jndi-lookup id="dataSourceBase2" jndi-name="oracleTest2DataSource" resource-ref="true" />

</beans>

 

2. context-transaction.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    	http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
    	http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">

	<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
	    <property name="dataSource" ref="dataSourceBase" />
	</bean>
	
	<tx:advice id="txAdvice" transaction-manager="txManager">
	    <tx:attributes>
	        <tx:method name="*" rollback-for="Exception"/>
	    </tx:attributes>
	</tx:advice>
	
	<aop:config>
	    <aop:pointcut id="requiredTx" expression="execution(* TestProject..impl.*Impl.*(..))"/>
	    <aop:advisor advice-ref="txAdvice" pointcut-ref="requiredTx" />
	</aop:config>
 
</beans>

 

3. Server에 설치된 tomcat 폴더 내의  /conf/context.xml

<Resource id="oracleTest1DataSource" class="javax.sql.DataSource">
    <Property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
    <Property name="url" value="jdbc:oracle:thin:@//[DB_HOST]:[DB_PORT]/[SERVICE_NAME]"/>
    <Property name="username" value="[DB_USERNAME]"/>
    <Property name="password" value="[DB_PASSWORD]"/>
    <Property name="maxTotal" value="20"/>
    <Property name="maxIdle" value="10"/>
    <Property name="maxWaitMillis" value="-1"/>
</Resource>

<Resource id="oracleTest2DataSource" class="javax.sql.DataSource">
    <Property name="driverClassName" value="oracle.jdbc.OracleDriver"/>
    <Property name="url" value="jdbc:oracle:thin:@//[DB_HOST]:[DB_PORT]/[SERVICE_NAME]"/>
    <Property name="username" value="[DB_USERNAME]"/>
    <Property name="password" value="[DB_PASSWORD]"/>
    <Property name="maxTotal" value="20"/>
    <Property name="maxIdle" value="10"/>
    <Property name="maxWaitMillis" value="-1"/>
</Resource>
728x90