1. mybatis

mybatis란 SQL Mapper Framework로, SQL 실행에 필요한 값을 표현하는 객체와 SQL 실행 후 조회된 데이터를 저장하는 객체를 매핑시켜서 데이터베이스 엑세스 작업을 수행하는 프레임워크이다. mybatis 구성 시에는 파라미터 객체, SQL, result 객체가 필요한데, 파라미터 객체는 Sql 실행에 필요한 값을 표현하는 객체이고, result 객체(resultSet)는 sql 실행 결과 값을 표현하는 객체이다.

mybatis의 장점

  1. 자바코드와 SQL 코드를 분리할 수 있다.
  2. JDBC 작업에서 반복적으로 수행했던 커넥션 획득 및 반납,
  3. PreparedStatement 획득 및 값 치환,
  4. ResultSet의 처리 등을 mybatis가 대신 처리한다.

단, 단점으로는 데이터베이스가 변경되거나 테이블의 구조가 변경(컬럼이 추가/삭제)되면 관련된 SQL을 모두 수정해야 한다. 하지만 이 단점은 mybatis를 사용하기 전에도 동일하게 발생했던 단점이다. 단, JPA는 이 단점도 극복한 프레임워크이다.

자세한 내용은 공식문서에서 더 자세히 확인할 수 있다.


mybatis의 구성요소

  1. Mapper 인터페이스
    • 데이터베이스 엑세스 작업이 정의된 인터페이스이다. (dao)
       @Mapper
       public interface UserDao {
        void insertBook(Book book);
       }
      
  2. Mapper 파일
    • Mapper 인터페이스에서 정의한 데이터베이스 엑세스 작업과 관련된 SQL이 정의된 xml 파일이다.
    • SQL과 파라미터 객체, SQL과 result 객체를 매핑시킨다.
    • 아래 코드에서 id는 Mapper 인터페이스에서 정의한 메소드의 이름과 동일하게 정의해야 한다. parameterType은 vo를 정의한 파일의 경로로 하고, values 이하에 들어가는 값은 vo에 정의된 멤버변수와 동일하게 정의한다.
        <insert id="insertBook" parameterType="com.sample.vo.Book">
            insert into sample_spring_books
            (book_no, book_title, book_author, book_publisher, book_price, book_discount_price, book_pub_date, book_stock)
            values
            (books_seq.nextval, #{title}, #{author}, #{publisher}, #{price}, #{discountPrice}, #{pubDate}, #{stock})
        </insert>
      
  3. Mapper 인스턴스
    • mybatis의 SqlSession의 getMapper 메소드는 Mapper 인터페이스를 구현한 객체를 반환한다. 이 객체를 Mapper 인스턴스라고 한다.
    • SqlSession의 getMapper()는 지정된 Mapper 인터페이스와 서로 연관된 Mapper 파일을 참조해서 Mapper 파일에 정의된 SQL을 실행시킬 수 있는 구현 객체를 생성한다.
    • 즉, SqlSession이 자동으로 생성하는 객체다.
    • 아래 코드는 context-root.xml의 일부이다.
        <mybatis-spring:scan base-package="com.sample.dao" factory-ref="sqlSessionFactory"/>
      

2. mybatis의 주요 API

  • SqlSessionFactoryBuilder
    • SqlSessionFactory를 생성하는 객체다.
  • SqlSessionFactory
    • SqlSession 객체를 생성하는 객체다.
  • SqlSession
    • CURD 기능이 구현된 객체다.
      • void insert(String sql 구문 id, 파라미터 객체);
      • void update(String sql 구문 id, 파라미터 객체);
      • void delete(String sql 구문 id, 파라미터 객체);
      • Object selectOne(String sql 구문 id, 파라미터 객체);
      • List selectList(String sql 구문 id, 파라미터 객체);

3. 스프링 컨테이너(context-root.xml) 파일 살펴보기

환경 설정은 링크에서도 확인할 수 있다.

<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
    <property name="driverClassName" value="oracle.jdbc.OracleDriver"></property>
    <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe"></property>
    <property name="username" value=""></property>
    <property name="password" value=""></property>
</bean>

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource"></property>
    <property name="configLocation" value="classpath:/mybatis/mybatis-config.xml"></property>
    <property name="mapperLocations" value="classpath:/mybatis/mappers/*.xml"></property>
</bean>
	
<mybatis-spring:scan base-package="com.sample.dao" factory-ref="sqlSessionFactory"/>

<context:annotation-config />
<context:component-scan base-package="com.sample.service" />
  1. bean dataSource
    • 데이터베이스와 연결된 Connection을 제공하는 Connection Pool 구현객체
  2. bean sqlSessionFactory
    • mybatis의 핵심 객체, SqlSessionFactory
    • SqlSession 객체를 제공한다.
    • CRUD문을 실행하는 메소드와 mapper 인터페이스 및 mapper xml파일을 이용해 mapper 인스턴스를 생성하는 메소드를 제공하는 객체다.
    • configLocation은 mybatis 환경설정 파일의 경로를 지정한다.
    • mapperLocation은 매핑된 SQL 구문이 정의된 xml 파일의 경로를 지정한다.
  3. <mybatis-spring:scan>
    • @Mapper 어노테이션이 붙어있는 mapper 인터페이스를 전부 스캔한다.
    • mapper 인터페이스를 구현한 객체(mapper 인스턴스)를 생성한다.
  4. <context:annotation-config />
    • @Autowired, @Resource, @PostConstructor, @PreDestroy 등의 어노테이션 스캔
    • 적절한 작업을 수행하는 객체들을 스프링 컨테이너에 등록시킨다.
  5. <context:component-scan/>
    • @Component, @Controller, @RestController, @ControllerAdvice, @Repository, @Service, @Configuration 등의 어노테이션 스캔
    • 클래스를 지정된 패키지와 하위 패키지 전부를 스캔 후 스프링 컨테이너에 등록시킨다.