본문 바로가기

Web/MyBatis

[ MyBatis ] MyBatis Framework란?

1. MyBatis란?

1.1 등장 배경

기존의 JDBC에서는 아래 예시와 같이 수많은 Boilerplate CodeSQL문이 프로그래밍 코드에 섞여 코드를 복잡하게 하고 사용 및 유지 보수가 어려웠습니다.

public class Test {
    public static void main(String[] args) {
        Connection conn = null;
        try {
            // 0. JDBC 드라이버 로딩
            Class.forName("com.mysql.cj.jdbc.Driver");
            
            // 1. 접속
            conn = DriverManager.getConnection(url, id, pw);
            
            // 2. Statemenet 객체 생성
            Statement stmt = conn.createStatement();
            
            String sql = "INSERT INTO ADDRESS(rec_key,name,age,tel,address,regdate) VALUES(addressSeq.nextval,'홍길동',20,'010-1234-5678','서울시 강남구 역삼동',default)";

            // 3. SQL 쿼리 실행
            int result = stat.executeUpdate(sql);
            System.out.println(result);
            
            // 4. 접속종료
            stat.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

이러한 문제점<JDBC의 수많은 Boilerplate Code로 인해 로직 파악이 어려운 Code> 을 해결<핵심로직과 횡단 로직의 분리>하기 위해 하기 위해 나타난 것이 퍼시스턴스 프레임워크입니다. 마이바티스는 이러한 퍼시스턴스 프레임워크 중 하나입니다.

마이바티스 프레임워크에서는 이러한 문제점을 해결하기 위해 아래와 같은 기능을 제공합니다.

  1. SQL 실행 결과를 자바 빈즈 또는 Map 객체에 매핑해 주는 Persistence 솔루션으로 관리.
  2. SQL문과 프로그래밍 코드를 분리해서 구현함. (SQL을 소스코드가 아닌 XML로 관리)
  3. 데이터 소스(DataSource) 기능과 트랜잭션 처리 기능을 제공

 

1.2 MyBatis의 객체

1. SQLSessionFactoryBuilder

MyBatis 환경설정 파일(xml)을 바탕으로 SqlSessionFactory를 생성합니다.

// SQLSessionFactory 생성 메소드
SqlSessionFactory build(InputStream inputStream)
SqlSessionFactory build(InputStream inputStream, String environment)
SqlSessionFactory build(InputStream inputStream, Properties properties)
SqlSessionFactory build(InputStream inputStream, String env, Properties props)
SqlSessionFactory build(Configuration config)

// SQLSessionFactory 생성 코드
SqlSessionFactory factory =
  sqlSessionFactoryBuilder.build(reader, props);

// ... or ...

SqlSessionFactory factory =
  new SqlSessionFactoryBuilder.build(reader, environment, props);

 

2. SQLSessionFactory

SQLSession 객체를 생성하는 역할을 합니다. SQLSessionFactory의 Session을 생성하는 메소드는 다음과 같이 총 8가지입니다. 생성자 메소드의 옵션에 Transaction, Connection, Execution 등 커스터마이징할 수 있는 옵션들이 제공됩니다.

SqlSession openSession()
SqlSession openSession(boolean autoCommit)
SqlSession openSession(Connection connection)
SqlSession openSession(TransactionIsolationLevel level)
SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level)
SqlSession openSession(ExecutorType execType)
SqlSession openSession(ExecutorType execType, boolean autoCommit)
SqlSession openSession(ExecutorType execType, Connection connection)
Configuration getConfiguration();

 

3. SQLSession

SQLSession은 가장 핵심적인 객체로서, SQL문을 실행하고 Transaction을 관리하는데 사용됩니다.

<T> T selectOne(String statement, Object parameter)
<E> List<E> selectList(String statement, Object parameter)
<T> Cursor<T> selectCursor(String statement, Object parameter)
<K,V> Map<K,V> selectMap(String statement, Object parameter, String mapKey)
int insert(String statement, Object parameter)
int update(String statement, Object parameter)
int delete(String statement, Object parameter)

// 커서는 List와 동일한 역할을 하지만, Iterator를 반환합니다
try (Cursor<MyEntity> entities = session.selectCursor(statement, param)) {
   for (MyEntity entity : entities) {
      // process one entity
   }
}

 

1.3 Java Persistence Framework

1. Persistence Framework란?

Persistence는 지속하다(persist)의 의미에서 파생된 지속성을 의미하며, 영원히 지속되다의 의미로 영속성이라고도 합니다. 프로그래밍에서 영속성(Persistence)란 "프로그램이 종료되더라도 사라지지 않는 데이터의 특성"을 의미합니다.

왜 이러한 이름(Persistence)을 갖는가 하면, 본래 프로그램이란 실행됨과 동시에 메모리에 올라가서 동작합니다. 이렇게 올라간 프로그램을 우리는 프로세스라고 하며, 프로세스가 실행되면서 (CPU적인 관점) 연산된 모든 데이터들은 프로세스가 종료되면서 메모리에서 없어지고 데이터들은 날라갑니다. 우리는 이것을 메모리의 휘발성이라고 알고 있죠.

하지만 이러한 데이터를 날라가게 두지 않고 저장하고 싶다면 어떻게 해야할까? 이때 사용되는것이 데이터베이스입니다. 영속성을 갖기 위해서는  Persistence Framework는 데이터베이스와 연동되는 시스템을 빠르게 개발하고 안정적인 구동을 보장해주는 프레임워크 입니다.

 

2. Persistence Framework의 종류

Persistence Framework는 SQLMapper와 ORM으로 나뉘며, MyBatis는 SQLMapper에 해당합니다. SQLMapper를 사용하면 개발자가 직접 쿼리를 조작하는 반면, ORM을 사용하면 객체를 통해 데이터베이스에 접근하게 됩니다.

  • SQL Mapper: SQL문장을 직접 데이터베이스 데이터로 다루는 SQL Helper (MyBatis, JdbcTemplate)
  • ORM(Obejct Relational Mapping): 객체를 통해 간접적으로 데이터베이스를 다루는 ORM (Hibernate, JPA)

 

3. Persistence Layer

데이터에 영속성을 부여해주는 계층입니다. (보통 데이터베이스에 접근하는 역할을 수행)

 

1.4 Mybatis 구조

Persistence Framework로

  • 실행 순서
  1. sqlMapConfig.xml에 MyBatis에서 사용될 환경을 설정(cacheEnabled, defaultStatementTimeout, 등등)합니다.
  2. sqlMap.xml에 각 기능별로 실행할 SQL문을 작성
  3. 애플리케이션에서 데이터베이스와 연동하는 데 필요한 데이터를 각각의 매개변수에 저장한 후 마이바티스에 전달
  4. 애플리케이션에서 요청한 SQL문을 sqlMap.xml에서 선택
  5. 전달한 매개변수와 선택한 SQL문을 결합
  6. 매개변수와 결합된 SQL문을 DBMS에서 실행
  7. DBMS에서 반환된 데이터를 애플리케이션에서 제공하는 적당한 매개변수에 저장한 후 반환.

 

2. 마이바티스 설치하기

2.1 Java Project (Jar로 설치)

  1. http://www.mybatis.org에 접속한 후 Products 탭을 클릭합니다.
  2. MyBatis3 옆에 있는 download 링크를 클릭합니다.
  3. mybatis-3.4.6.zip 파일을 클릭해 다운로드합니다.
  4. 다운로드한 압축 파일의 압축을 해제합니다
  5. mybatis-3.4.6.jar를 복사해 프로젝트의 lib 폴더에 붙여 넣습니다. 그리고 이 버전에 대응하는 ojdbc6.jar 파일도 복사해 붙여 넣습니다.

 

2.2 Maven Project

[pom.xml에 Mybatis 라이브러리 추가] > [Maven Update]

 

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.6</version>
</dependency>