본문 바로가기

개발/Framework

[MyBatis] 기본 XML 설정 / SqlSession 생성

< MyBatis >

 

- 데이터의 입력, 조회, 수정, 삭제(CRUD)를 보다 편하게 하기 위해 xml로 구조화한 Mapper설정파일을 통해

  JDBC를 구현한 영속성 프레임 워크

 

 

 

https://mybatis.org/mybatis-3/ko/getting-started.html

 

MyBatis – 마이바티스 3 | 시작하기

 

mybatis.org

참고!!!

 

1. mybatis.jar 파일을 다운로드해서 클래스패스에 두어야 한다.

 

2. 동적 웹 프로젝트 하위에 소스폴더를 생성하여 mybatis-config.xml 파일을 작성한다.

< MyBatis XML 설정 >

<!DOCTYPE configuration
  PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
  "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
</configuration>

- 문서의 형식이 configuration(구성, 환경설정)임을 알려줌

- DTD(Document Type Definition 문서 타입 정의) : 유효성을 체크해줌 (문서의 구조 및 해당 문서에서 사용할 수 있는 적법한 요소와 속성을 정의)

- configuration 태그가 전체를 감싸고 있음

 

<settings>
    <setting name="jdbcTypeForNull" value="NULL" />	
</settings>

- settings : MyBatis 구동 시 선언할 설정들을 작성하는 영역

- jdbcTypeForNull : JDBC타입을 파라미터에 제공하지 않을때 null값을 처리한 JDBC타입을 명시*

(* Parameter로 값을 뽑을 때, 입력값이 없으면 빈문자열이 들어갈 수 있음!

setString으로 DB에 값을 전달하는 것이 아니기 때문에

SQL문 실행 시, 빈문자열을 문자로 인식하지 않는 에러 발생가능....

따라서, 이러한 값을 null로 해서 DB에 INSERT하라고(넣어주라고) 설정!)

 

<typeAliases>
  <typeAlias alias="Author" type="domain.blog.Author"/>
  <typeAlias alias="Blog" type="domain.blog.Blog"/>
  <typeAlias alias="Comment" type="domain.blog.Comment"/>
  <typeAlias alias="Post" type="domain.blog.Post"/>
  <typeAlias alias="Section" type="domain.blog.Section"/>
  <typeAlias alias="Tag" type="domain.blog.Tag"/>
</typeAliases>

- typeAliases : VO/DTO 클래스들의 풀클래스명을 단순한 클래스명으로 사용하기위해서 별칭을 등록할 수 있는 영역

- 타이핑을 줄이기 위해 XML설정에서 사용하는 자바 타입에 대한 짧은 이름. 타입 별칭

=> type 속성 : 풀클래스 / alias 속성 : 별칭, 짧은 이름

 

<environments default="development">
  <environment id="development">
    <transactionManager type="JDBC">
      <property name="..." value="..."/>
    </transactionManager>
    <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>

- environments : MyBatis에서 연동할 DB정보들을 등록하는 영역(여러개의 DB정보를 등록 가능)

=> default 속성으로 여러개의 id중 어떤 DB를 기본 DB로 사용할지 지정

=> environment : id 속성으로 DB 식별

 

- transactionManager : 마이바티스는 두 가지 타입의 TransactionManager를 제공

JDBC :  JDBC 커밋과 롤백을 처리하기 위해 사용. 트랜잭션 직접 관리 (수동 commit)

MANAGED : 개발자가 트랜잭션에 대한 어떤 영향도 행사하지 않음 (자동 commit)

 

- dataSource=> type속성 : Connection Pool* 사용 여부

POOLED : ConnectionPool 사용. 새로운 Connection 인스턴스를 생성하기 위해 매번 초기화하는 것을 피하게 하므로

   빠른 응답을 요구하는 웹 애플리케이션에서는 가장 흔히 사용

UNPOOLED : 매번 요청에 대해 Connection을 열고 닫음

 

* Connection Pool : Connection 객체들을 담아놓는 영역. 생성한 Connection객체들을 모아놓고 재사용하도록 함.

 

<!-- 클래스패스의 상대경로의 리소스 사용 -->
<mappers>
  <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
  <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
  <mapper resource="org/mybatis/builder/PostMapper.xml"/>
</mappers>

- mappers : 실행할 sql문들을 기록해 둔 mapper파일 등록하는 영역 

 

 

3. Connection 객체로 하던 일을 SqlSession이 처리하도록 생성메소드를 만들어준다.

public static SqlSession getSqlSession() {

    SqlSession sqlSession = null;
    String resource = "/* mybatis 설정 파일 */";

    try {
        InputStream stream = Resources.getResourceAsStream(resource);
        sqlSession = new SqlSessionFactoryBuilder().build(stream).openSession(false);
    } catch (IOException e) {
        e.printStackTrace();
    } 
    return sqlSession;
}
마이바티스를 사용하기 위한 기본적인 자바 인터페이스는 SqlSession이다. 이 인터페이스를 통해 명령어를 실행하고 매퍼를 얻으며 트랜잭션을 관리 할 수 있다. 우리는 SqlSession에 대해서 좀더 얘기해볼 것이지만 먼저 SqlSession의 인스턴스를 만드는 방법을 배워보자. SqlSession은 SqlSessionFactory인스턴스를 사용해서 만든다. SqlSessionFactory는 몇가지 방법으로 SqlSession인스턴스를 생성하기 위한 메소드를 포함하고 있다. SqlSessionFactory자체는 XML, 애노테이션 또는 자바 설정에서 SqlSessonFactory를 생성할 수 있는 SqlSessionFactoryBuilder를 통해 만들어진다.  

 

- 마이바티스 설정 xml파일을 읽어서 해당 DB와 접속된 SqlSession 객체를 생성해서 반환

① SqlSession객체 필요

② SqlSession객체를 얻기 위해서 SqlSessionFactory 필요 

③ SqlSessionFactory 얻기 위해서는 SqlSessionFactoryBuilder 필요

 

=> new SqlSessionFactoryBuilder() : SqlSessionFactoryBuilder 객체 생성 - ③

=> new SqlSessionFactoryBuilder().build(stream) : stream(통로)를 전달하면서 xml파일을 읽음 - ②

=> new SqlSessionFactoryBuilder().build(stream).openSession(false) : SqlSession객체 생성 - ①

이 때, false 전달 시, SqlSession객체 생성 및 앞으로는 트랜잭션 처리 시 자동 Commit을 하지 않겠다는 의미 (기본값)

 

- 필드로 생성하지 않고 메소드로 생성하는 이유?

: mybatis설정파일에 변경사항이 있을 수 있으므로, 사용시에 바로바로 파일과 연결하는 stream을 만들며 설정사항을 읽어서 사용하기 위해서!

 

- 공식 예제 -

 

4. Service단에서 3의 메소드를 호출하여 SqlSession객체를 생성, DAO단으로 전달한다.