Chat 상우

java mybatis3 lifcycle 및 마이타비스란? 본문

Language/java

java mybatis3 lifcycle 및 마이타비스란?

chat-rilla 2023. 11. 21. 21:31

안녕하세요 chat 상우입니다.

오류가 있거나 수정이 필요한 부분은 피드백해주시면 감사드리겠습니다.

java Mybatis3

자바에서 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있도록 도와주는 개발 프레임워크로 JDBC를 이용하여 DB에 액세스 로직을 작업을 캡슐화하고 쿼리와 동적 쿼리 및 매핑을 지원하여 JDBC를 보다 간편하게 사용할 수 있도록 만든 기술이다. 하지만 DB의 매핑을 위한 OBJ가 변경되는 경우 매핑의 대한 부분을 다시 수정해야 하는 번거로움이 발생되며 이로 인한 유지보수 비용이 많이 발생된다는 단점이 존재하며 xml 파일로 쿼리를 분리해서 사용하고 있어 SQL을 다루기보다 편리한 장점을 가지고 있으나 실제로 코드를 실행해야 오류를 확인할 수 있는 단점이 존재한다는 단점을 가지고 있다.


Mybatis3 시스템 구성 요소

마이바티스 시스템구조

Mybatis 구성 요소

  1. Mybatis Configuration file
    Mybatis에서 DB 연결 정보 및 설정을 관리하는 XML파일이다.
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE configuration
      PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
      "https://mybatis.org/dtd/mybatis-3-config.dtd">
    <configuration>
      <environments default="development">
        <environment id="development">
          <transactionManager type="JDBC"/>
          <dataSource type="POOLED">
            <property name="driver" value="${driver}"/>
            <property name="url" value="${url}"/>
            <property name="username" value="${username}"/>
            <property name="password" value="${password}"/>
          </dataSource>
        </environment>
      </environments>
      <mappers>
        <mapper resource="org/mybatis/example/BlogMapper.xml"/>
      </mappers>
    </configuration>​
  2. SqlSessionFactoryBuilder
    Mybatis Configuration file의 구성 파일을 읽고 SqlSessionFactory를 생성하는 객체이다. 위 객체는 SqlSessionFactory를 생성하고 사용하지 않게 된다. SqlSessionFactory를 추가로 생성하는 경우 사용할 수 있으나 사용하지 않는 것이 리소스를 줄이기 위해서 좋은 선택이다.
    String resource = "org/mybatis/example/mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);​
  3. SqlSessionFactory
    SqlSession을 생성하는 컴포넌트로 Session을 생성하여 반환하는 작업을 하게 된다. 해당 컴포넌트는 애플리케이션과 생명주기를 같이 가지고 가기 때문에 삭제 혹은 재 생성의 필요가 없으며 하나의 SqlSessionFactory를 생성하는 것이 가장 효율적이기 때문에 싱글톤패톤으로 구형하여 사용하게 된다. 위 컴포넌트에서 생성된 Session은 PooledDataSource 설정을 하면 JDBC의 ConnectionPool을 사용하게 되며 UnpooledDataSource을 하게 되면 ConnectionPool을 미사용 하게 된다.
    Environment environment =
                    new Environment("dev"											//환경 정보 이름
                            , new JdbcTransactionFactory()							//트랜젝션 매니저 종류 결정(JDBC or MANAGED)
                            , new PooledDataSource(DRIVER, URL, USER, PASSWORD));	//ConnectionPool 사용 유무 (Pooled or UnPooled)

    JDBC ConnectionPool이란 DB에 연결된 인스턴스를 특정 개수만큼만 생성하고 Connection Pool에서 관리하여 사용자의 요청이 들어오게 되면 사용하지 않는 Session을 반환하고 사용이 완료된 Session을 반환받는 방식으로 연결된 객체를 관리한다.

  4. SqlSession
    DB와 직접 연결되어 액세스 할 때 가장 중요한 역할을 하는 구성 요소이다. SqlSession 인스턴스는 공유되지 않고 스레드에 안전하지 않다. 그러므로 가장 좋은 방법은 메서드 스코프이다. SqlSession을 static 필드나 클래스의 인스턴스 필드로 지정해서는 안된다. SqlSession을 닫는 것은 중요하다. 언제나 finally 블록에서 닫아야 한다.
    try (SqlSession session = sqlSessionFactory.openSession()) {
      // do work
    }
  5. Mapper 인스턴스
    Mybatis Configuration file에서 정의된 mapper 구문을 바인딩하는 인터페이스로 mapper 인터페이스를 SqlSession에서 생성을 하게 된다. 이러한 이유로 mapper 인스턴스는 sqlSession과 동일한 라이프 사이클을 갖게 되며 메서드가 호출되면 생성되고 끝나기 때문에 개발자가 닫아줄 필요는 없다.
    try (SqlSession session = sqlSessionFactory.openSession()) {
      BlogMapper mapper = session.getMapper(BlogMapper.class);
    }

MyBatis3 주요 구성 요소가 Database Access Flow

 

Mybatis 프로그램 구조

  • 프로젝트 실행 시
    1. 응용 프로그램은 SqlSessionFactoryBuilder에 대한 SqlSessionFactory 빌드를 요청한다.
    2. SqlSessionFactoryBuilder는 SqlSessionFactory 생성을 위한 Mybatis 구성 파일을 읽어온다.
    3. SqlSessionFactoryBuilder는 MyBatis 구성 파일의 정의에 따라 SqlSessionFactory를 생성한다.
  • 클라이언트 요청
    1. 사용자가 application에 요청을 한다.
    2. SqlsessionFactory에 요청하여 SqlSession을 생성한다.
    3. 생성된 SqlSession을 애플케이션에 반환한다.
    4. 응용 프로그램이 매퍼 인스터페이스 메서드를 호출한다.
    5. Mapper Interface를 메서드를 호출한다.
    6. 매퍼 인터페이스의 구현 개체가 SqlSession 메서드를 호출하고 SQL 실행을 요청한다.
    7. SqlSession은 매핑 파일에서 실행할 SQL을 가져와서 쿼리를 실행한다.