Mybatis 시작하기 전..

2013. 1. 2. 16:55OpenSource/Mybatis&Ibatis

반응형
모든 MyBatis 애플리케이션은 SqlSessionFactory 인스턴스를 사용
SqlSessionFactory 인스턴스는 SqlSessionFactoryBuilder 를 사용
SqlSessionFactoryBuilder 는 XML 설정파일에서 SqlSessionFactory 인스턴스를 빌드할 수 있다.

Mybatis를 사용하기 위해 설정을 하고자 한다면 아래의 내용을 볼 수 있을 것이다.
아래는 spring에서 bean 설정을 해주는 부분이다.





아래의 용어들에 대해서 살펴볼 필요가 있다.

SqlSessionFactoryBuilder

이 클래스는 인스턴스회되어 사용되고 던져질 수 있다. SqlSessionFactory 를 생성한 후 유지할 필요는 없다. 그러므로 SqlSessionFactoryBuilder 인스턴스의 가장 좋은 스코프는 메서드 스코프(예를 들면, 메서드 지역변수)이다. 여러 개의 SqlSessionFactory 인스턴스를 빌드하기 위해 SqlSessionFactoryBuilder 를 재사용할 수도 있지만 유지하지 않는 것이 가장 좋다..

SqlSessionFactory

한번 만든뒤, SqlSessionFactory 는 애플리케이션을 실행하는 동안 존재해야만 한다. 그래서 삭제하거나 재생성할 필요가 없다. 애플리케이션이 실행되는 동안 여러 차례 SqlSessionFactory 를 다시 빌드하지 않는 것이 가장 좋은 형태이다. 재빌드하는 형태는 결과적으로 “나쁜 냄새” 가 나도록 한다. 그러므로 SqlSessionFactory 의 가장 좋은 스코프는 애플리케이션 스코프이다. 애플리케이션 스코프로 유지하기 위한 다양한 방법이 존재한다. 가장 간단한 방법은 싱글턴 패턴이나 static 싱글턴 패턴을 사용하는 것이다. 또는 구글 Guice 나 Spring 과 같은 의존성 삽입 컨테이너를 선호할 수 도 있다. 이러한 프레임워크는 SqlSessionFactory 의 생명주기를 싱글턴으로 관리할 것이다.

SqlSession

각각의 쓰레드는 자체적으로 SqlSession 인스턴스를 가져야 한다. SqlSession 인스턴스는 공유되지 않고 쓰레드에 안전하지도 않다. 그러므로 가장 좋은 스코프는 요청 또는 메서드 스코프이다. SqlSession 을 static 필드나 클래스의 인스턴스 필드로 지정해서는 안된다. 그리고 서블릿 프레임워크의 HttpSession 과 같은 관리 스코프에 둬서도 안된다. 어떠한 종류의 웹 프레임워크를 사용한다면, HTTP 요청과 유사한 스코프에 두는 것으로 고려해야 한다. 달리 말해서, HTTP 요청을 받을?때마다 만들고, 응답을 리턴할때마다 SqlSession 을 닫을 수 있다. SqlSession 을 닫는 것은 중요하다. 언제나 finally 블록에서 닫아야만 한다. 다음은 SqlSession 을 닫는 것을 확인하는 표준적인 형태다.

Mapper 인스턴스

Mapper 는 매핑된 구문을 바인딩 하기 위해 만들어야 할 인터페이스이다. mapper 인터페이스의 인스턴스는 SqlSession 에서 생성한다. 그래서 mapper 인스턴스의 가장 좋은 스코프는 SqlSession 과 동일하다. 어쨌든 mapper 인스턴스의 가장 좋은 스코프는 메서드 스코프이다. 사용할 메서드가 호출되면 생성되고 끝난다. 명시적으로 닫을 필요는 없다.


mybatis의 설정 기준은 spring + maven을 기준으로 설명 하겠다.

mybatis가 필요한 jar는 maven pom.xml을 통하여 받는다.
spring에서 사용 할 수 있고 위에서 본 내용들을 이용 할 수 있게 하는 lib  파일이라고 보면 될 것 같다.
까보지는 않아서 정확지는 않다..ㅋㅋ;

 <dependency>
   <groupId>org.mybatis</groupId>
   <artifactId>mybatis</artifactId>
   <version>3.1.1</version>
   <type>jar</type>
   <scope>compile</scope>
  </dependency>

 

2) context에 mybatis 관련 빈 추가(sqlSessionFactory)

  <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
       <property name="dataSource" ref="dataSource" />
       <property name="configLocation" value="classpath:sqlmap/sqlmap-config.xml"/>
       <property name="typeAliasesPackage" value="com.xxx.domain, com.yyy.domain"/>
 </bean> 

 <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
   <property name="basePackage" value="com.xxx.dao,com.yyy.dao" />
   <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
 </bean> 


SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
위처럼 SqlSessionFactoryBuilder를 통해 build를 하면 sqlSessionFactory 객체가 만들어진다.

SqlSession session = sqlSessionFactory.openSession();
또한 sqlSessionFactory는 openSession을 통해 session을 만든다.
SqlSession 인스턴스를 통해 직접 SQL 구문을 실행할 수 있다.

그리고 mapper 또한 SqlSession 에서 생성한다.

 
SqlSession session= sqlSessionFactory.openSession();
try {
 
BlogMapper mapper= session.getMapper(BlogMapper.class);
 
// do work
} finally {
  session
.close();
}


그런 뒤 mybatis를 사용하기 위해
sqlmap-config.xml에 mapper를 작성!

 <mappers>
    <mapper resource="sqlmap/sql/test1-map.xml"/>
    <mapper resource="sqlmap/sql/test2-map.xml"/>
    <mapper resource="sqlmap/sql/test3-map.xml"/>
 </mappers>


그리고 나머지 MVC구조에서 호출 해주면 끝!
- controller
   List<BoardVo> boards = boardService.selectBoardList(boardVo);

- service
   public interface BoardService {
        public List<BoardVo> selectBoardList(BoardVo boardVo);
   }

- service implement 부
  @Service
   public class BoardServiceImpl implements BoardService {
  @Autowired
   private BoardDao boardDao;
   @Override
    public List<BoardVo> selectBoardList(BoardVo boardVo) {
    List<BoardVo> boards = boardDao.selectBoardList(boardVo);
    return boards;
 }

- DAO
   public interface BoardDao {
      public List<BoardVo> selectBoardList(BoardVo boardVo);
   }

- test1-map.xml
<mapper namespace="com.kt.guide.board.dao.BoardDao" >
<select id="selectBoardList"  parameterType="BoardVo" resultType="BoardVo">
    SELECT 구문~블라블라~
 </select>

위의 내용은 DAO+DTO(도메인)을 바로 매핑 해서 쓰는 방법이다.
물론 http://ejaeyeol.blog.me/173680503 링크를 가서 보면 resultMap을 사용하여 컬럼을 매핑 하여
사용 할 수 도 있다.

참고 사이트 : http://www.mybatis.org/core/ko/getting-started.html

반응형