공부방

19_11_20일 공부정리(마이바티스 프로그래밍 원리와 활용 4장)

Winter_Snow 2019. 11. 21. 02:29

마이바티스 사용 시 필요한 파일

 1. 마이바티스 설정 xml 파일

 2. 마이바티스 매퍼 xml파일

 3. 실행 클래스


그중에 설정 xml에 관한 4장에 대해 공부중.

 4.1 설정 xml

 마이바티스 설정을 할 수 있는 방법은 1. xml 파일,  2. 설정 객체를 통해서 변경할 수 있는데,

 주로 정의된 dtd를 이용한 xml을 만들어 설정을 정의하는 방식이 쓰이며, 설정 객체를 만들어 쓰는 방법은 소스코드 단계에서 자유롭게 다룰 수 있다는 장점이 있어서, 먼저 xml로 설정 후, 설정 객체로 갱신하는 방법의 혼합 방식도 쓴다.

우리는 배우는 단계이니 xml 설정파일을 쓰는 방법에 대해 배우겠다.

설정 xml의 형식은 다음과 같다.

 1. xml파일 문자버전 문자 인코딩

 2. dtd파일 정의

 3. 최상위 구성요소 정의 

 

 1. <?xml version="1.0" encoding="UTF-8"?>

 2. <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

3. <configuration></configuration>

 

  4.2 최상위 구성요소 안에 들어가야할 필수 구성요소

 

 1. environment

  뒤에 나오는 trasactionManager, dataSource는 밀접한 관련을 맺는데, 이 둘을 하나 묶어 관리한다. 이를 환경이라고 한다.

 속성으로 id를 갖는데, 이는 어떤 환경을 사용할지 지정하기 위한 것으로, 실제 어떤 transactionManager , dataSource를 쓸지 그때그때 다르기에 미리 정의하고, sqlSessionFactory을 만들 때 id로 구분하여 사용한다.

 여러 환경을 만들었을 경우, environments라는 환경 스택 구성요소로 감싸준다.

 

 2. transactionManager

  트랜잭션이란 쿼리문을 처리할때 일련의 처리 작업의 묶음단위이다.  모든 쿼리문이 정상처리 시 commit으로, 하나라도 문제가 있을 시 rollback으로 처리를 한다.

 마이바티스는 자신이 직접 트랜잭션을 처리할지, 컨테이너에 트랜잭션 처리를 위임할지 선택할 수 있다. 

 속성으로 type을 가지며 우리는 JDBC 타입(직접 처리)을 쓰겠다.

 

 3. dataSource 

  데이터 소스에 DB 연결에 필요한 설정을 정의한다. 속성으로 type을 가지며 어떤 데이터 소스 팩토리를 선택할지를 지정한다. (우리는 UNPOOLED 데이터 소스 팩토리를 이용하겠다. )

 하위 구성요소로는 property를 가지며 속성으로 name 과 value를 가지고 있다.

예시로 

 <dataSource type ="UNPOOLED">

     <property name="driver" value="com.mysql.cj.jdbc.Driver"/>

    <property name="url" value="jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC"/>

    <property name="=username" value="root"/>

    <property name="password" value="1234"/>

 </dataSource>

 

 4. mapper

  현재 SQL문이 정의되어 있는 mapper xml 문서의 경로를 지정하는 구성요소로, 속성으로 resource, url, class를 가진다.

resourcemapper xml파일의 상대 경로를

url는 mapper xml파일의 절대 경로를

class는 mapper인터페이스의 상대 경로를 각각 나타내며 

mapper인터페이스가 많은 패키지를 지정할 때는 mapper 구성요소 대신 <package name="경로"/>를 사용한다.

여러 mapper , package는 mappers라는 구성요소로 묶어준다. 

예시로

<mappers>

    <mapper resource="resources/mybatis/ShopMapper.xml"/>

    <package name="resources.mybatis"/>

</mappers>

 

4.2까지의 과정으로 만들어진 설정 xml은 다음과 같다.

<?xml version="1.0" encoding="UTF-8"?>

 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

    <environments default="default">

         <environment id="default">

               <transactionManager type="jdbc"/>

               <dataSource type ="UNPOOLED">

                   <property name="driver" value="com.mysql.cj.jdbc.Driver"/>

                  <property name="url" value="jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC"/>

                   <property name="=username" value="root"/>

                   <property name="password" value="1234"/>

               </dataSource>

         </environment>

    </environments>         

    <mappers>

       <mapper resource="resources/mybatis/ShopMapper.xml"/>

       <package name="resources.mybatis"/>

    </mappers>

</configuration>

<!-- dtd 파일에 의해 선언의 순서가 꼭 지켜져야 한다. -->


 4.3 기본 설정이 제공되는 구성요소

기본 설정은 마이바티스 내부에서 사용되는 설정이지만 사용자가 일일이 등록하기에는 번거로운 설정을 미리 등록해 놓은것을 의미한다. 즉 필요에 따라서 설정을 바꿔줄 수도 있다.   기본 설정 구성요소는 다음과 같다.

1. setting

  마이바티스 작동 방식을 결정짓는 매우 중요한 구성 요소이다.

 기본적으로 Configuration클래스의 필드에 초기화가 되어 있다.

 사용자가 setting구성요소로 바꾸면 XMLConfigBuilder클래스의 settingsElement()메소드를 통하여 Configuration클래스로 만든 객체의 필드 값을 갱신하여 바꾼다.

여러 setting은 settings로 묶어준다

예시

<settings>

    <setting name="mapUnderscoreToCamelCase" value="true"/>

    <setting name="lazyLoadingEnabled" value="true"/>

</settings>

 

2. typeAlias

   typeAlias는 쉽게 말하면 약어를 정해 놓는 것이다. 예를 들면 자바에서 이미 정의된 java.util.String을 약어로 string으로 쓸 수 있다. 사용자가 만든 클래스를 약어로 지정하려면 이렇게 지정하면 된다.  typeAlias는 setting 구성요소 이후에 정의해야 한다.

<typeAlias alias="shop" type="org.mybatis.domain.Shop"/> 

 

3. typeHandler

typeHandler란 java 타입을 jdbc 타입으로 변환을 처리하는 데 사용한다. 예시로 String 타입을 varChar타입으로 바꿔주는 걸 의미한다. 

기본적으로 Configuration클래스에서 TypeHandlerRegistry객체를 생성하고, TypeHandlerRegistry객체의 기본 생성자는 이미 널리 쓰이고 있는 자바 타입을 jdbc타입으로 변환 가능하게 등록한다.

사용자가 지정한 타입을 jdbc로 변환하고 싶을 때는 사용자 지정 타입핸들러를 등록하면 되는데, 그때는 XMLConfigBuilder클래스의 typeHandlerElement()메소드를 통해 등록되거나 갱신된다. 

타입핸들러 클래스 작성방법은 1. TypeHandler인터페이스를 구현 2.BaseTypeHandler클래스를 상속하여 작성 가능하다.

typeHandler 구성요소는 typeAlias 구성요소 이후에 작성해야 한다.

 

4. objectFactory

마이바티스는 객체를 사용자가 만들지 않고 objectFactory가 객체를 대신 만들고 초기화시켜준다.

ObjectFactory클래스를 만드는 법은 1. ObjectFactory 인터페이스 구현, 2. DefaultObjectFactory클래스를 상속하면 된다. 재정의 해야 되는 메소드는 setProperties()로 필요한 정보를 가져오고, create()로 객체를 만들고 초기화를 시킨다.

 

 

4.2까지의 과정으로 만들어진 설정 xml은 다음과 같다.

<?xml version="1.0" encoding="UTF-8"?>

 <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

    <settings>

       <setting name="mapUnderscoreToCamelCase" value="true"/>

       <setting name="lazyLoadingEnabled" value="true"/>

    </settings>

    <typeAlias alias="shop" type="org.mybatis.domain.Shop"/> 

    <typeHandler handler="org.mybatis.custom.CustomClobTypeHandler" jdbcType="CLOB"                        javaType="java.lang.String"/>

    <objectFactory type="org.mybatis.custom.CustomObjectFactory">

        <property name="status" value="false">

    <objectFactory/>

    <environments default="default">

         <environment id="default">

               <transactionManager type="jdbc"/>

               <dataSource type ="UNPOOLED">

                   <property name="driver" value="com.mysql.cj.jdbc.Driver"/>

                  <property name="url" value="jdbc:mysql://localhost:3306/mydb?serverTimezone=UTC"/>

                   <property name="=username" value="root"/>

                   <property name="password" value="1234"/>

               </dataSource>

         </environment>

    </environments>         

    <mappers>

       <mapper resource="resources/mybatis/ShopMapper.xml"/>

       <package name="resources.mybatis"/>

    </mappers>

</configuration>

<!-- dtd 파일에 의해 선언의 순서가 꼭 지켜져야 한다. -->


 4.4 알아두면 좋은 유용한 구성요소

1. 프로퍼티 구성 요소

2. 플러그인 구성 요소

3. 데이터베이스 아이디 프로바이더 구성요소

 

 

필요시 작성