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