본문 바로가기

DB/PostgreSQL

[PostgreSQL] DB 연결 변경하기

[PostgreSQL] DB 연결 변경하기

스프링으로 구성된 웹 applicationContext의 Bean 설정 변경을 통한 작업

사전 작업

  1. java Resources 나누기

    local 작업용으로 development

    배포 서버용으로 production

  1. development/applicationContext.xml

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
            <property name="driverClassName" value="org.postgresql.Driver" />
            <property name="url" value="jdbc:postgresql://192.168.1.44:5432/webdb" />
            <property name="username" value="webdb" />
            <property name="password" value="webdb" />
        </bean>
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
            <property name="dataSource" ref="dataSource"/> 
            <property name="configLocation" value="classpath:mybatis/configuration.xml" /> 
        </bean>
        <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
            <constructor-arg index="0" ref="sqlSessionFactory" />
        </bean>
  2. production/applicationContext.xml

<!-- Connection Pool DataSource-->
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="org.mariadb.jdbc.Driver" />
        <property name="url" value="jdbc:mariadb://localhost:3307/webdb" />
        <property name="username" value="webdb" />
        <property name="password" value="webdb" />
    </bean>

    <!-- MyBatis SqlSessionFactoryBean --> 
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
        <property name="dataSource" ref="dataSource"/> 
        <property name="configLocation" value="classpath:mybatis/configuration.xml" /> 
    </bean>

    <!-- MyBatis SqlSessionTemplate --> 
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSessionFactory" />
    </bean>

development에서는 PostgreSQL DB로 작업할 수 있도록 DataSource를 설정

production에서는 MySQL DB로 작업할 수 있도록 DataSource를 설정

위와 같이 작업 디렉토리를 구분하므로 얻는 이점은 동일한 mybatis/configuration 를 사용하기가 용이해졌으며 실질적으로 변경해야하는 구간은 DataSource, mybatis/mapper 이다.

추후에도 변경이 필요한 사항은 DataSource 와 mapper

DB에 따른 변경 내용

우선 applicationContext.xml에서 dataSource를 변경한다.

이제 sqlsessionfactory가 확인하는 mybatis/configuration.xml의 내용을 살펴보자

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <typeAliases>
        <!-- 마이바티스 상에서 alias는 꼭 소문자로 작성해야함 -->

        <!-- 맵퍼의 alias로 설정해준 Vo를 참조함 -->
        <typeAlias alias="uservo" type="com.cafe24.mysite.vo.UserVo"/>
        <typeAlias alias="guestbookvo" type="com.cafe24.mysite.vo.GuestbookVo"/>
        <typeAlias alias="boardvo" type="com.cafe24.mysite.vo.BoardVo"/>
        <typeAlias alias="pagevo" type="com.cafe24.mysite.vo.PageVo"/>
    </typeAliases>    

    <mappers>
        <mapper resource="mybatis/mapper/user.xml" />
        <mapper resource="mybatis/mapper/guestbook.xml" />
        <mapper resource="mybatis/mapper/board.xml" />
    </mappers>

</configuration>

두 작업 디렉토리 모두 동일한 구성이다.

하지만 DB가 변경됨에 따라 SQL 구문이 변경이 있을 수 있으므로 mapper 내용을 변경해보자

  1. PostgreSQL 을 사용하는 development/mybatis/mapper/guestbook.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="guest">
    
    <select id="getList" resultType="guestbookvo">
        <![CDATA[
            select no, name, contents, to_char(reg_date, 'YYYY-MM-DD') from guestbook order by reg_date desc
        ]]>
    </select>
    
    <delete id="delete" parameterType="guestbookvo" >
        <![CDATA[
            delete from guestbook where no=#{no} and password=#{password}
        ]]>
    </delete>
    
    <insert id="insert" parameterType="guestbookvo">
        <![CDATA[
         insert 
           into guestbook 
         values( default, #{name }, #{password }, #{contents }, now() ) RETURNING no
        ]]>
    
    </insert>    
    </mapper>
  2. MySQL 을 사용하는 production/mybatis/mapper/guestbook.xml

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    <mapper namespace="guest">
    
        <select id="getList" resultType="guestbookvo">
            <![CDATA[
                select no, name, contents, date_format(reg_date, '%Y-%m-%d %h:%i:%s') from guestbook order by reg_date desc
            ]]>
        </select>
    
        <delete id="delete" parameterType="guestbookvo" >
            <![CDATA[
                delete from guestbook where no=#{no} and password=#{password}
            ]]>
        </delete>
    
        <insert id="insert" parameterType="guestbookvo">
            <![CDATA[
             insert 
               into guestbook 
             values( null, #{name }, #{password }, #{contents }, now() )
            ]]>
            <selectKey keyProperty="no" resultType="long" order="AFTER">
                select last_insert_id()
            </selectKey>
        </insert>    
    </mapper>

최종적으로 local에서 작업할 때와 젠킨스로 배포하여 리눅스 서버에서 작업할 때 다른 DB를 참조하고 있는 것을 확인할 수 있을 것이다.
바꿔준 내용은 작업 디렉토리, applicationContext.xml 내 dataSource, mapper의 SQL 구문만 바꿔주면 된다.