웹 개발을 하는 사람이라면 웹 개발에 절대 빠질수 없는 데이터베이스 연결에 대한 이야기이다. 이 Mybatis 연동은 개발의 사전준비라고 생각하면 된다.


1. Mybatus 란?




친절히 홈페이지에 설명 되있는 건데 쉽게 설명해서

기존에 JDBC를 이용하여 프로그래밍을 하는 방식에 비해서 MyBatis는 개발자의 부담을 굉장히 많이 덜어주고, 생산성 향상에도 도움이 된다.

기존에 JDBC를 이용하여 프로그래밍을 하는 방식은 프로그램 소스안에 SQL문을 작성하는 방식이었다.


2. Mybatis 라이브러리


스프링에서 MyBatis를 사용하려면 라이브러리가 필요하다. 

우리는 이미 Maven을 이용하여 라이브러리를 관리하기 때문에, 라이브러리의 추가가 굉장히 쉽다.

pom.xml에 다음을 추가한다. 



여기까지가 공통으로 들어가는 라이브러리고 사용하는 DB에 따라서 추가할 라이브러리가 약간 다르다.


1) MySQL 사용할 경우



이 코드만 추가 해주면 된다.


2) Oracle 사용할 경우

오라클의 경우 손이 더간다. 솔직히 말하면 나같은 초보자는 훨씬 더 간다!

그렇다고 오라클을 비추 하진 않는다 오히려 추천 한다.

ojdbc.jar 파일을 검색할 경우 다음과 같이 dependency가 나오는데 실제로는 다운 받을 수 없다 ㅠㅠ. (막히는 분들이 많을텐데)



이 부분을 이렇게 바꿔준다.


 

하지만 이렇게 바꾼다 해도 에러가 계속 뜰텐데 ;;

상단의 <properties> 부분에 다음과 같은 코드를 추가한다.



에러를 일으키는 ojdbc를 다운 받을 수 있는 Repository를 수동으로 등록한다.


3. Mybatis와 DB(데이터베이스) 연결 설정


Mybatis와 DB를 연결하는 방법을 살펴보자.


1) src/java/resource 폴더 밑에 config > spring 폴더를 만든다.


2) spring 폴더 안에 context-datasource.xml 파일을 만든다.



위와 같은 구조로 만들어준다.


3) web.xml에서 위의 설정파일을 읽도록 되어있는지 확인한다.

web.xml의 하단에 다음의 코드가 있어야한다.




이는 최초 서버가 시작될 때, 해당 위치에 있는 context 파일을 모조리 읽어들이는 것을 뜻한다. 

xml 태그에서 알 수 있듯이, contextConfigLocation을 설정하고, 그 위치는

위에서 만들었던 config > spring 폴더에 있는 context-로 시작하는 모든 xml 파일을 의미한다. 

앞으로 스프링 관련 여러가지 설정파일이 있기 때문에, 위와같이 설정파일을 읽어올 수 있도록 하였다.

 

 

4) Mybatis 연결 설정을 하자.

4-1) MySQL 의 경우 - context-datasource.xml

 

 <?xml version="1.0" encoding="UTF-8"?>

     
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://주소/스키마"/>
        <property name="username" value="아이디"/>
        <property name="password" value="비밀번호"/>
    </bean>
</beans>

 

별달리 여려운 설정은 없을것이라고 생각한다.

url에서 MySQL이 설치된 서버의 주소와 사용할 DB 스키마를 적어주면 된다. (개인PC에서 개발할 경우 localhost/스키마 또는 127.0.0.1/스키마 로 적어주면 된다.)

 

 

오라클의 경우도 별다를건 없다. MySQL과 다른거는 dataSource의 class와 url이 다르다. 그 점을 자세히 보길 바란다. 


<?xml version="1.0" encoding="UTF-8"?>
     
    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
        <property name="url" value="jdbc:oracle:thin:@localhost:1521:XE"/>
        <property name="username" value="아이디"/>
        <property name="password" value="비밀번호"/>
    </bean>
</beans>

(오라클의 경우 보통 Oracle 10g XE 또는 Oracle 11g XE 를 깔아서 연습하기때문에, 그에 맞춰서 소스를 썼다. 실제 오라클 엔터프라이즈의 경우 localhost 대신 IP 주소, XE 대신 사용하는 DB 스키마를 적어준다.)


 

4. MyBatis와 Spring의 연결

1) resource 폴더에 mapper 폴더를 생성한다.


2) resource > config > spring 폴더에 context-mapper.xml 파일을 생성한다.


3) context-mapper.xml 파일에 다음의 내용을 작성한다.


<?xml version="1.0" encoding="UTF-8"?>
 
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="mapperLocations" value="classpath:/mapper/**/*_SQL.xml" />
    </bean>
     
    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
        <constructor-arg index="0" ref="sqlSession"/>
    </bean
</beans>


몇가지 살펴보자.

6번째 줄의 property의 name과 ref가 dataSource로 정의되어있다. 

이 두가지는 같은것을 의미하지 않는다. name은 위에서 등록한 sqlSession 빈(bean)에서 사용할 이름이 dataSource이고, ref의 dataSource는 우리가 context-datasource.xml에서 정의한 빈(bean)을 참조하는 것을 의미한다. 


7번째 줄의 mapperLocations는 앞으로 우리가 작성할 SQL문이 위치할 장소이다. 여기서 classpath:/mapper/**/*_SQL.xml 이라는 정의를 살펴보자. 


앞에서 web.xml에서 spring context 설정파일을 읽어오기 위해서 classpath*:config/spring/context-*.xml 라고 정의했던것을 기억하자.


앞으로 우리는 다양한 SQL 파일을 만들것인데, 그것을 일일이 등록해서 사용할 수는 없다. (원래는 xml 파일에 XML도 bean으로 설정해야한다.) 그렇지만 다양한 사람들이 작업하는 프로젝트의 특성상, 그것을 일일이 등록할 수 없고, 할 수 있더라도 귀찮은 일이다. 따라서 서버가 시작될 때 자동으로 SQL이 정의되어 있는 XML 파일도 읽어오도록 하는것이 필요하다. 

따라서 SQL이 위치할 mapper 폴더를 잡아주고, 그 안에 모든 폴더를 의미하는 **를 붙여준 후, 마지막으로 _SQL로 끝나는 모든 xml 파일을 읽어주도록 한다. 

여기서 중간에 ** 를 붙인 이유는, 유연한 폴더구조의 변경을 위해서 이렇게 작성했다. 예를 들어 mapper > first > *_SQL.xml 와 mapper > first > second > *_SQL.xml 은 다른 경로이다. (mapper 폴더 밑에 first, second 라는 이름의 폴더가 있는 경우를 의미)

우리는 앞으로 게시판에 관련된 쿼리만 작성하겠지만, 실제 프로젝트에서는 굉장히 많은 패키지가 생성되기 때문에 2,3단계로 구분된다. 그것을 유연성있게 대처하도록 해줬다. 


마지막으로 10번째 줄의 sqlSessionTemplate은 마이바티스 스프링 연동모듈의 핵심이다. SQLSessionTemplate은 SqlSession을 구현하고, 코드에서 SqlSessoin을 대체하는 역할을 한다. 실제 코드에서 어떻게 사용하는지를 나중에 보면서 다시 이야기해보자.


5. DAO 작성


마지막으로 실제 소스에서 위에서 선언한 SqlSessionTemplate을 사용할 DAO를 만들어주자.

DAO는 Data Access Object의 약자로, Data Access Object를 Factory 패턴화 시키는 것으로, 비즈니스 로직을 모듈화 하는 방법이다. Factory 패턴이 무엇인지 잘 모르면, 디자인 패턴에 대해서 공부하면 좋다. 여기서는 디자인 패턴에 대한 설명은 생략하고 어떻게 사용하는지만 보도록 하겠다. 


1) src/main/java 폴더의 first > common 패키지 밑에 dao 패키지를 생성한다.


2) dao 패키지 안에 AbstractDAO.java를 생성한다.



3) AbstractDAO에 다음 소스를 작성한다.


public class AbstractDAO {
    protected Log log = LogFactory.getLog(AbstractDAO.class);
     
    @Autowired
    private SqlSessionTemplate sqlSession;
     
    protected void printQueryId(String queryId) {
        if(log.isDebugEnabled()){
            log.debug("\t QueryId  \t:  " + queryId);
        }
    }
     
    public Object insert(String queryId, Object params){
        printQueryId(queryId);
        return sqlSession.insert(queryId, params);
    }
     
    public Object update(String queryId, Object params){
        printQueryId(queryId);
        return sqlSession.update(queryId, params);
    }
     
    public Object delete(String queryId, Object params){
        printQueryId(queryId);
        return sqlSession.delete(queryId, params);
    }
     
    public Object selectOne(String queryId){
        printQueryId(queryId);
        return sqlSession.selectOne(queryId);
    }
     
    public Object selectOne(String queryId, Object params){
        printQueryId(queryId);
        return sqlSession.selectOne(queryId, params);
    }
     
    @SuppressWarnings("rawtypes")
    public List selectList(String queryId){
        printQueryId(queryId);
        return sqlSession.selectList(queryId);
    }
     
    @SuppressWarnings("rawtypes")
    public List selectList(String queryId, Object params){
        printQueryId(queryId);
        return sqlSession.selectList(queryId,params);
    }
}


간단히 살펴보자. 

우리가 앞에서 SqlSessionTemplate을 설정하였고, 이는 SqlSession을 대체한다고 이야기 했었다.

5번째 줄에 SqlSessionTemplate을 선언하고 여기에 Autowired 어노테이션(Annotation)을 통해서 xml에 선언했던 의존관계를 자동으로 주입하도록 하였다. 


쿼리는 sqlSession.메서드를 호출하면 되는데, 여기서는 앞으로 개발할때, 좀 더 보기편하게 로그를 남기기위해서 AbstractDAO를 만들어서 insert, delete, update, select 메서드를 재정의 하였다. 


실제 개발에서는 각 비즈니스 로직을 담당할 DAO를 생성하여 AbstractDAO를 상속받도록 할 계획이다. 

앞으로 개발하면서 차차 보게될 것이다. 


여기까지 작성하고 서버를 실행시켜서 에러가 나지 않으면, 설정에 문제가 없는것으로 판단할 수 있다. 


---------------------------------------------------------------------------------------


여기까지가 Mybatis 설정이 완료 되었습니다.

글이 많이 길어졌네요 ! 그래도 개발에 있어서 꼭 필요한 부분이니깐 잘 읽어보고 이해 하시는걸 추천해드려요!

블로그 이미지

시니M

시니의 자바 공부

,