벌써 이직한지 7개월이 지났네요.. 날씨가 급격하게 추워졌습니다. 오늘 날씨 영하 -9던데 다들 옷은 따듯하게 입으셨는지요? 오늘도 여러분들에게 작은 도움이 되고자 전 직장에서 있었던 경험담을 풀어보고자 합니다. ㅎㅎ
SPRING 환경에서 oracle DB를 붙여서 서비스 중이였습니다. 그러던 중 MSSQL DB를 붙여야하는 NEEDS가 발생했습니다!! 뭐 기존에 Oracle 관련 Spring 설정된 것이 있으니 별거 없겠지? 하고 안일하게 생각했습니다. 그러나... 은근 설정해줘야할 것들이 많아서 참 골치가 아팠습니다.
우선 로컬 개발 환경은 Tomcat서버가 설치되어 있었고, 운영 환경에서는 JEUS 6.0 버전이 설치돼 잇었는데요. Tomcat, 로컬에서 테스트가 잘 됐으니 JEUS는 큰 이상 없겠지? 하고 운영에 반영했다가.. 정말 가슴을 쓸어 내렸는데요.
그럼 바로 본론으로 들어가 Spring 다중 DB 연결 방법을 설명 하겠습니다!
1. Tomcat v8.0(로컬 환경)에서의 세팅
(1) server.xml DB 접속 정보 세팅
아래 이미지처럼 <Host> 태크 → <Context> 태크 → <Resource> 태그를 추가하여 DB 접속 정보를 세팅합니다.
<Context docBase="test" path="/" reloadable="true" source="org.eclipse.jst.jee.server:test">
//오라클
<Resource auth="Container"
driverClassName="oracle.jdbc.driver.OracleDriver"
maxActive="8"
maxIdle="4"
name="ORA_TEST"
password="TEST123"
type="javax.sql.DataSource"
url="jdbc:oracle:thin:@//Oracle서버 IP:1526/TESTDEV"
username="TEST"/>
//MSSQL
<Resource auth="Container"
driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
maxActive="8"
maxIdle="4"
name="MS_TEST"
password="TEST123"
type="javax.sql.DataSource"
url="jdbc:sqlserver://MS서버 IP;databaseName=TESTDEV"
username="TEST"/>
</Context>
(2) context-datasource.xml 수정
보통 프로젝트에서 resource 폴더 하위에 존재하는데요. 해당 파일은 DB Connection 관련 설정이 들어가 있습니다. 해당 파일을 아래와 같이 수정해 주겠습니다.
//Oracle DB 설정 부분
<bean id="dataSourceSpied" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/ORA_TEST</value>
</property>
</bean>
//MSSQL DB 설정 부분
<bean id="dataSourceSpiedMs" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/MS_TEST</value>
</property>
</bean>
여기서 체크하고 넘어가야 할 점은 바로 <value>태크 입니다. Tomcat의 경우는 java:comp/env/를 앞에 추가해야 합니다. 이렇게 해야만 server.xml에서 MS_TEST와 ORA_TEST DB 접속 정보를 읽어올 수 있습니다.
(이 부분은 구축 방식에 따라 차이가 있을 수 있습니다)
(3) context-mapper.xml 수정
마찬가지로 프로젝트의 resouces 폴더 하위에 존재하는 spring 관련 설정 파일인데요. 아래와 같이 코드를 추가해 줍니다.
//Oracle DB 설정 부분
<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactory" />
</bean>
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:sqlmap/config/sql-mapper-config.xml" />
<property name="mapperLocations" value="classpath:sqlmap/mappers/**/*.xml" /> //SQL이 작성된 파일의 경로를 지정
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.project.*.service.mapper" />
<property name="sqlSessionFactoryBeanName" value = "sqlSessionFactory"/>
</bean>
//MSSQL DB 설정 부분
<bean id="sqlSessionMs" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0" ref="sqlSessionFactoryMs" />
</bean>
<bean id="sqlSessionFactoryMs" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSourceMs" />
<property name="configLocation" value="classpath:sqlmap/config/sql-mapper-config.xml" />
<property name="mapperLocations" value="classpath:sqlmap/mappersMs/**/*.xml" /> //SQL이 작성된 파일의 경로를 지정
</bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.project.*.service.mapperMs" /> //Mapper파일의 위치 지정
<property name="sqlSessionFactoryBeanName" value = "sqlSessionFactoryMs"/>
</bean>
(4) Spring CRUD 작업을 위한 Mapper, xml파일 새로 구성하기
우선 스프링 데이터 처리 사이클을 구성하는 요소인 Mapper.java과 .xml파일이 들어가는 폴더를 아래 이미지처럼 Oracle용과 MSSQL용으로 각각 구분하여 만들어 줍니다. 아래 이미지에선 Ms라는 문구가 들어간 것이 MSSQL이며 아닌 것이 Oralce입니다.
그리고, ServiceImpl.java에서는 Oracle DB와 연결되는 Mapper와 MSSQL DB와 연결되는 Mapper를 각각 구분하여 정의하도록 합니다.
@Service("callService")
public class CalServiceImpl extends EgovAbstractServiceImpl implements CallService {
private static final Logger LOGGER = LoggerFactory.getLogger(CallServiceImpl.class);
@Resource(name="callMapper")
private CallMapper callMapper; //Oracle Mapper 정의
@Resource(name="callMsMapper")
private CallMsMapper callMsMapper; // MSSQL Mapper 정의
이렇게 하고
MSSQL DB를 사용해서 CRUD를 하는 경우에는 callMsMapper를
Oracle DB를 사용해서 CRUD를 하는 경우에는 callMapper를
사용해서 작업해 주면 되겠습니다.
(5) 라이브러리 추가
MSSQL JDBC를 위해서는 라이브러리를 추가해줘야겠죠? pom.xml에서 추가해줘도 되고 아래와 같이 직접 라이브러리를 ㅣlib폴더 하위에 추가해줘도 되겠습니다.
이렇게 하면 로컬 환경에서 Spring 다중 DB 연결이 마무리됩니다.
2. JEUS v6.0(운영 환경)에서의 세팅
Tomcat에서 세팅을 완료하고 그대로 운영 환경에 소스를 반영하면 정말 큰 코 다칩니다. 단순히 전 Tomcat에서는 server.xml에 접속정보를 세팅해 줬으니, Jeus는 JEUSMain.xml을 동일하게 세팅해주면 끝날 줄 알았습니다..
하지만.... ㅎㅎ
이제 운영 환경에서 추가로 수정해야 할 부분을 설명 드리며 Spring 다중 DB 연결을 진행해 보겠습니다.
(1) JEUSMain.xml에서 DB 접속 정보 세팅
<resource>
<data-source>
//Oracle DB설정 부분
<database>
<vendor>oracle</vendor>
<export-name>ORA_TEST</export-name>
<data-source-class-name>oracle.jdbc.pool.OracleConnectionPoolDataSource</data-source-class-name>
<data-source-type>ConnectionPoolDataSource</data-source-type>
<database-name>TESTDEV</database-name>
<port-number>1526</port-number>
<server-name>ORALCE 서버 IP</server-name>
<user>TEST</user>
<password>비밀번호입력</password>
<property>
<name>driverType</name>
<type>java.lang.String</type>
<value>thin</value>
</property>
<connection-pool>
<pooling>
<min>10</min>
<max>30</max>
<step>5</step>
<period>3600000</period>
</pooling>
<wait-free-connection>
<enable-wait>true</enable-wait>
</wait-free-connection>
<check-query>select 1 from dual</check-query>
<check-query-timeout>5000</check-query-timeout>
<non-validation-interval>60000</non-validation-interval>
<check-query-period>300000</check-query-period>
<destroy-policy-on-check-query>AllConnections</destroy-policy-on-check-query>
</connection-pool>
</database>
// MSSQL DB 설정 부분
<database>
<vendor>mssql</vendor>
<export-name>MS_rental</export-name>
<data-source-class-name>com.microsoft.sqlserver.jdbc.SQLServerConnectionPoolDataSource</data-source-class-name>
<data-source-type>ConnectionPoolDataSource</data-source-type>
<database-name>TEST</database-name>
<port-number>1430</port-number>
<server-name>MSSQL 서버 IP</server-name>
<user>TEST</user>
<password>비밀번호</password>
<connection-pool>
<pooling>
<min>2</min>
<max>30</max>
<step>1</step>
<period>3600000</period>
</pooling>
<wait-free-connection>
<enable-wait>true</enable-wait>
</wait-free-connection>
</connection-pool>
</database>
</data-source>
</resource>
(2) Spring context-datasource.xml 세팅
Tomcat에서는 <value> 태크에 java:comp/env/ 값을 추가해야 했지만, JEUS에선 제거합니다.
//Oralce DB 설정 부분
<bean id="dataSourceSpied" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>ORA_TEST</value>
</property>
</bean>
//MSSQL DB 설정 부분
<bean id="dataSourceSpiedMs" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>MS_TEST</value>
</property>
</bean>
(3) web.xml 세팅
아래와 같이 태그를 추가합니다.
//Oracle DB 설정 부분
<resource-ref>
<res-ref-name>ORA_TEST</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
//MSSQL DB 설정 부분
<resource-ref>
<res-ref-name>MS_TEST</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
(4) MSSQL JDBC 라이브러리 JEUS 설치 경로에 업로드
(5) WAS서버와 신규로 추가하는 DB 서버(MSSQL)간 방화벽이 오픈돼 있는지 확인
(6) JEUSMain.xml 파일을 수정했기 때문에 반드시 제우스 서버를 재기동하도록 합니다.
각자 운영하는 환경마다 설정이 다 달라서 제가 말씀드리는 부분이 100% 일치하지는 않을 지라도 이 글이 많은 개발자 분들에게 도움이 됐으면 좋겠습니다.
이상으로 Spring 다중 DB 연결을 마무리 하겠습니다.
마지막으로 12/2(금)에 있을 포르투갈 VS 한국의 월드컵 축구 경기를 응원합니다.
대한민국 축구 선수들 화이팅!
댓글