본문 바로가기

개발(합니다)/Java&Spring

[Spring/maven] Postgresql와 MyBatis 설정

반응형

도로명 주소 API를 만들면서 설정 한 postgresql과 mybatis를 설정 한 과정을 남깁니다.



1. POM 설정

mybatis 추가

<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>

반복적인 jdbc 과정을 xml로 분리하여 로직에만 신경 쓸 수 있게 처리해주는 라이브러리

ORM인 JPA가 더 편리하다고..



postgresql 추가
<!-- https://mvnrepository.com/artifact/org.postgresql/postgresql -->
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.2.5</version>
        </dependency>
postgresql db를 사용하기 위한 라이브러리


spring-jdbc 추가

<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
java와 db를 연결하는  jdbc 라이브러리

2. datasource-context.xml 설정


jdbc.properties 추가
<!-- Properties Files -->
    <bean id="propertyConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:properties/jdbc.properties</value>
            </list>
        </property>
    </bean>
DB에 연결 시 사용하는 정보를 담는 곳 /jdbc.properties
아이디, 비번이 있으므로 따로 보관해야 하며 git, svn 등 공개원격저장소에는 푸시하지 않아야 합니다.

Mybatis 추가
    <!-- Mybatis를 활용한 sqlSessionFactory 지정 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property ref="dataSource" name="dataSource" />
        <!-- SqlMapper 리스트 -->
        <property name="mapperLocations">
            <list>
                <value>classpath:sqlmap/**/*.xml</value>
            </list>
        </property>
        <property name="configLocation" value="classpath:SqlConfigration.xml"></property>
    </bean>
    <!-- sqlSessionTemplate 지정 -->
    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg ref="sqlSessionFactory" />
    </bean>
mybatis를 사용하기 위한 사전 설정 
Spring에게 mybatis 설정 파일의 위치를 알려줍니다.
mpperLocation은 sql구문의 위치를 작성합니다.  ->  sqlmap/**/*.xml
configLocation은 sql의 설정의 위치를 작성합니다.  -> SqlConfigration.xml
sqlSessionTemplate은 db와 Session을 유지하게 합니다.

dataSource
<!-- DataSource Configuration -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
        <property name="driverClass" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</bean>
DB로 사용자 인증을 합니다.
jdbc.properties의 정보를 치환하여 확인합니다.

3. jdbc.properties 설정


아래와 같이 폴더와 properties 를 생성합니다.


jdbc.properties 작성

# -- test
jdbc.driverClassName=org.postgresql.Driver
jdbc.url=jdbc:postgresql://localhost:5432/test
jdbc.username=postgres
jdbc.password=password
jdbc.initialSize=5
jdbc.maxActive=20

db 재원에 맞게 작성합니다.

파일 선택 - 오른쪽 클릭 - team - ignore를 선택합니다.
unchanged도 같이 해주면 변경에 대해 index가 생성되지 않습니다.


4. SqlConfigration 설정




<?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">

<!-- SQL 설정. -->
<configuration>
    <settings>
        <setting name="cacheEnabled" value="true" />
        <setting name="lazyLoadingEnabled" value="false" />
        <setting name="multipleResultSetsEnabled" value="true" />
        <setting name="useColumnLabel" value="true" />
        <setting name="useGeneratedKeys" value="falsse" />
        <setting name="defaultExecutorType" value="SIMPLE" />
        <setting name="mapUnderscoreToCamelCase" value="false" />
        <setting name="jdbcTypeForNull" value="VARCHAR" />
    </settings>
    <typeAliases>
    </typeAliases>
</configuration>

기본적인 설정만 합니다.



5. sqlMap 설정



<?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="sample">



</mapper>   

sqlmap이 없이 실행하면 스캔 과정에서 에러를 뿜어냅니다.

임시 파일을 만들어 둡니다.


6. HelpSqlSessionTemplate 설정


import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;

public class HelpSqlSessionTemplate {
            @Autowired
            SqlSessionTemplate sqlSessionTemplate;
            
            public SqlSessionTemplate getSqlSessionTemplate() {
                return sqlSessionTemplate;
            }
    }


sqlSession을 편리하게 사용하기 위해 클래스로 만들어 둡니다.



7. Web.xml 설정

<context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>
            /WEB-INF/spring/root-context.xml
            /WEB-INF/spring/appServlet/datasource-context.xml
        </param-value>
    </context-param>
설정한 datasource-context.xml을 인식하게 하기 위해 작성합니다.




8. Contoller, DAO, Service, ServiceImpl, VO 생성

Spring MVC 구조에 맞게 생성합니다.



9. VO 작성

public class SigungudongVO extends ResourceSupport {
    String sido;
    String sido_cd;
    String gungu;
    String gungu_cd;
    String dong_cd;
    String dong;
이하 생략


10. Controller 작성

    @GetMapping("korea/address/")
    public String SidoListGET(HttpServletRequest req, Model model) {
        logger.info("address");
        List<SigungudongVO> list = null;
        try {
            list = Service.sidoList();
            model.addAttribute("sido_list", list);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return "korea/address";
    }


11. Service 작성

public interface AddressService {
    public List<SigungudongVO> sidoList() throws Exception;
    public List<SigungudongVO> siGunguList(String sido) throws Exception;
    public List<SigungudongVO> siGunguDongList(String sigungu) throws Exception;
}


12. Service 작성

@Service
public class AddressServiceImpl implements AddressService{
    @Inject
    private AddressDAO dao;

    @Override
    public List<SigungudongVO> sidoList() throws Exception {
        return dao.sidoList();
    }
    @Override
    public List<SigungudongVO> siGunguList(String sido) throws Exception {
        return dao.siGunguList(sido);
    }
    @Override
    public List<SigungudongVO> siGunguDongList(String sigungu) throws Exception {
        return dao.siGunguDongList(sigungu);
    }


13. DAO 작성

@Repository
public class AddressDAO extends HelpSqlSessionTemplate{
    public List<SigungudongVO> selectSidoList() throws Exception{
        return getSqlSessionTemplate().selectList("address.selectSidoList");
    }
    public List<SigungudongVO> selectSiGunguList(SigungudongVO sigungudongVo) throws Exception{
        return getSqlSessionTemplate().selectList("address.selectSiGunguList", sigungudongVo);
    }
    public List<SigungudongVO> selectSiGunguDongList(SigungudongVO sigungudongVo) throws Exception{
        return getSqlSessionTemplate().selectList("address.selectSiGunguDongList", sigungudongVo);
    }

DAO에서 파라미터가 있으면 꼭 넣어줍니다.


14. address.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="address">
    <select id="selectSidoList"
        resultType="com.otrodevym.addressServer.korea.address.vo.SigungudongVO">
        select
            sido,
            substring(beb_cd,0,3) sido_cd
        from
            addr_dong
        group by
            sido,
            sido_cd
        order by
            sido_cd
    </select>
    <select id="selectSiGunguList"
        parameterType="com.otrodevym.addressServer.korea.address.vo.SigungudongVO"
        resultType="com.otrodevym.addressServer.korea.address.vo.SigungudongVO">
         select
            gungu,
            substring(beb_cd, 0, 6) gungu_cd
        from
            addr_dong
        where
            substring(beb_cd, 0, 3) = #{sido_cd}
        group by
            gungu,
            gungu_cd
        order by
            gungu_cd
    </select>
    <select id="selectSiGunguDongList"
    parameterType="com.otrodevym.addressServer.korea.address.vo.SigungudongVO"
        resultType="com.otrodevym.addressServer.korea.address.vo.SigungudongVO">
        select
            dong,
            beb_cd
        from
            addr_dong
        where
            substring(beb_cd, 0, 6) = #{gungu_cd}
        group by
            dong,
            beb_cd
        order by
            beb_cd
    </select>     

단순 호출 쿼리문입니다.

참고만 하시길 바랍니다.



14. 테스트





반응형