관리자 글쓰기

 본 내용은 혼자 공부하기 위하여 다른 포스트를 보면서 저에게 필요한 부분과 궁금했던 부분을 게시하는 곳입니다.


궁금한 것에 대한 것은 모르는 것이 많겠지만 함께 알아보도록 노력하겠습니다.


참조 게시 포스트 : http://addio3305.tistory.com/


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


1. Mybatis란?


- 객체지향 언어인 자바의 관계형 데이터 베이스 프로그래밍을 좀더 쉽게 할수 있게 도와주는 개발 프레임워크


- 자바에선 데이터베이스 프로그래밍을 하기 위해 JDBC(자바에서 제공하는 데이터베이스 프로그래밍 API)를 제공


- JDBC는 관계형 데이터 베이스를 사용하기 위해 다양한 API를 제공


- 다양한 관계형 데이터베이스를 지원하기 위해 JDBC는 세부적인 작업이 가능하게 작업별로 각각의 메소


드를 호출하게된다. 이러한 사항들은 다수의 메소드를 호출하고 관련된 객체를 해제해야하는 단점이 존재


-->Mybatis는 JDBC보다 좀더 편하게 사용하기 위해 개발되었음


1.1 특징


 - 간단하다 : 간단한 퍼시스턴스 프레임워크


 - 생산성 : 62%정도 줄어드는 코드 , 간단한 설정


 - 성능 : 구조적강점(데이터 접근 속도를 높여주는 Join 매핑)

   여러가지 방식의 데이터를 가져오기 전략 (가져오기 미루기 , SQL 줄이기 기법)


 - 관심사의 분리 : 설계를 향상 (유지보수성)

   리소스를 관리하여 계층화를 지원(커넥션,PreparedStetement,결과셋)


 - 작업의 분배 : 팀을 세분화하는 것을 도움


 - SQL문이 애플리케이션 소스 코드로부터 완전 분리


 - 이식성 : 어떤 프로그래밍 언어로도 구현가능 (자바,C#,.NET,RUBY


 - 오픈소스이며 무료이다.


-참조 : http://iotsw.tistory.com/77


1.2 라이브러리



이미 pom.xml에 추가 되있지만 이 부분이 Mybatis를 사용하기 위해 필요한 라이브러리들이다.


데이터베이스는 작성자는 mysql을 사용할 예정이기 때문에 혹여나 오라클을 사용하고자 하는 분이라면 상단에 포스트로 가면 친절히 알려준다.


1.3 MyBatis와 DB(Mysql) 연결 설정

1) main/resources/config/spring 경로의 폴더들을 만든다.


2) context-datasource.xml 파일을 만든다.

3) web.xml 파일에서 contextConfigLocation 파라미터의 value 값을 주석 처리해 놓은 것을 풀어준다.


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

xml 태그에서 알 수 있듯이, contextConfigLocation을 설정하고, 그 위치는 위에서 만들었던 config > spring 폴더에 있는 context-*로 시작하는 모든 xml 파일을 의미한다. 



1.4 MyBatis 연결 설정


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
                        http://www.springframework.org/schema/jdbc  http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd">
     
    <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 스키마를 적어주면 된다. 


1.5 MyBatis와 Spring 연결

1) main/resources/config/spring 경로에 context-mapper.xml 파일을 만든다.


2) context-mapper.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:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
 
    <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>

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


- 10번째줄

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단계로 구분된다. 그것을 유연성 있게 대처하도록 해줬다. 


- 13번째줄

sqlSessionTemplate은 마이바티스 스프링 연동모듈의 핵심이다. SQLSessionTemplate은 SqlSession을 구현하고, 코드에서 SqlSessoin을 대체하는 역할을 한다.



1.6 DAO 작성


- com.mycompany.myapp.common.dao 패키지에 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);
    }
}

5번째 줄의 SqlSessionTemplate는 아까 작성하였던 context-mapper.xml 에서의 빈 객체를 가져와서 어노테이션(@Autowired)를 사용하여 자동으로 의존 주입(DI) 시켜준 값이다.

sqlSession 값을 이용하여 쿼리를 사용하면 되는데 이 부분은 로그 값을 남기기 위하여 사용 되었다.

이 클래스는 앞으로 작성할 DAO 클래스를 할당해주기 위한 부모클래스이다.


1.7 sample_SQL.xml 작성

해당 sample_SQL.xml이 없으면 에러가 발생한다. 

resources/mapper/sample 폴더를 만들어 sample_SQL.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="sample">
     
     
</mapper>



현재까지 진행하고 서버를 실행하여 별다른 문제가 존재하지 않는 경우 잘 따라오고 있는 것이다.

(localhost:8080/myapp/testInterceptor.do) <-- 콘솔에 로그가 찍히는 지 확인.