취미로 음악을 하는 개발자

[Spring Framework] MyBatis란 본문

공대인/Spring[Boot]

[Spring Framework] MyBatis란

영월특별시 2019. 8. 9. 15:14
728x90

* 원래 공식 홈페이지(?)의 내용을 보고 정리하려고 했으나, 이것만으로 정리하기 힘들어서 다른 포스트들을 참고했다.

출처 : 1, 23, 번역문


MyBatis




- 객체 지향 언어인 자바의 관계형 데이터 베이스 프로그래밍을 보다 쉽게 도와주는 프레임 워크


- 자바에서는 관계형 데이터베이스 프로그래밍을 하기 위해 JDBC를 제공

* JDBC(Java Database Connectivity) : 자바 프로그램이 데이터베이스와 연결되어 데이터를 주고 받을 수 있게 해주는 인터페이스

ex) DriverClass, Connection, ResultSet, ...


- JDBC는 다양한 관계형 데이터베이스 프로그래밍을 위해 API 제공, 즉 좀 더 편하게 사용하기 위해 개발



MyBatis 특징


- SQL문이 코드에서 분리

: DAO 파일에 SQL문을 작성하지 않고 Mapper 파일에 SQL코드를 입력하여 DAO 파일에서 필요할 때마다 사용 가능


- 생산성

: 간결한 코드


- 유지보수성

: Mapper 파일에만 SQL 코드를 입력하고 나중에 SQL 코드를 변경할 때 이곳에서 유지보수만 하면 DAO에서는 아무런 영향이 없다. 

-> DAO에서는 Mapper 파일에서 작성된 SQL 코드를 가져다 쓰기만 하면 되기 때문.



MyBatis 구성



- SqlSessionFactoryBuilder

: Mybatis 구성 파일을 읽고 생성하는 SqlSessionFactory 구성 요소로, 스프링과 통합되어 사용하는 애플리케이션 클래스에서 직접 처리는 안함


- SqlSessionFactory

: SqlSession을 생성, 스프링과 통합되어 사용하는 애플리케이션 클래스에서 직접 처리는 안함


- SqlSession

: SQL 실행 및 트랜잭션 제어를 위한 API를 제공, Mybatis를 사용하여 데이터베이스에 액세스할 때 가장 중요한 역할을 함

스프링과 통합되어 사용하는 애플리케이션 클래스에서 직접 처리는 안함



- MyBatis 환경설정 파일, SqlSessionConfig.xml

: MyBatis가 JDBC 코드를 실행하는데 필요한 설정


ㄴ TypeAlias : 사용할 모델 클래스에 대한 별칭 설정 <typeAlias>


ㄴ DB 연동 : Database에 어떻게 접속할 것인지에 대한 설정 <enviroment>


ㄴ Mapper 설정 : 매핑 설정이 어디에 있는지 <mapper>


- Mapper 설정 파일, member.xml, company.xml

: SQL문과 관련된 설정을 하는 파일로서 MyBatis 환경설정 파일에 등록해야 함


SQL문 등록 태그

태그 구성 요소 : Parameter, Result, SQL문


SQL 태그 : insert, delete, update, select


공통 설정 태그 : <sql>


Select 결과 처리 설정

<resultMap>



Mybatis가 데이터베이스를 Access하는 순서



(1) ~ (3)은 응용 프로그램 시작시 수행되는 프로세스

1. 응용 프로그램이 SqlSessionFactoryBuilder를 위해 SqlSessionFactory를 빌드하도록 요청


2. SqlSessionFactoryBuilder는 SqlSessionFactory를 생성하기 위한 Mybatis 구성 파일을 읽음


3. SqlSessionFactoryBuilder는 Mybatis 구성 파일의 정의에 따라 SqlSessionFactory를 생성




(4) ~ (10)은 클라이언트의 각 요청에 대해 수행되는 프로세스

4. 클라이언트가 응용 프로그램에 대한 프로세스를 요청


5. 응용 프로그램은 SqlSessionFactoryBuilder를 사용하여 빌드된 SqlSessionFactory에서 SqlSession을 가져옴


6. SqlSessionFactory는 SqlSession을 생성하고 이를 애플리케이션에 반환


7. 응용 프로그램이 SqlSession에서 Mapper 인터페이스의 구현 개체를 가져옴


8. 응용 프로그램이 Mapper 인터페이스 메서드를 호출


9. Mapper 인터페이스의 구현 개체가 SqlSession 메서드를 호출하고 SQL 실행을 요청


10. SqlSession은 매핑 파일에서 실행할 SQL을 가져와 SQL을 실행



Mybatis-Spring 컴포넌트 구조 및 Access 순서


SqlSessionFactoryBean

: SqlSessionFactory를 작성하고 Spring DI 컨테이너에 개체를 저장하는 구성 요소

표준 Mybatis3에서 SqlSessionFactory는 Mybatis 구성 파일에 정의된 정보를 기반으로 하지만 SqlSessionFactoryBean을 사용하면 Mybatis 구성 파일이 없어도 SqlSessionFactory를 빌드할 수 있다.


MapperFactoryBean

: Singleton Mapper 개체를 만들고 Spring DI 컨테이너에게 개체를 저장하는 구성 요소

Mybatis3 표준 메커니즘에 의해 생성된 Mapper 객체는 스레드가 안전하지 않다. 따라서 각 스레드에 대한 인스턴스를 할당해야 했는데 Mybatis-Spring 구성 요소에 의해 생성된 Mapper 개체는 안전한 Mapper 개체를 생성할 수 있다.

따라서 서비스 등 싱글톤 구성 요소에 DI를 적용할 수 있다.


SqlSessionTemplate

: SqlSession 인터페이스를 구현하는 Singleton 버전의 SqlSession 구성 요소

이 요소도 MapperFactoryBean과 같은 이유로 각 스레드에 대한 인스턴스를 할당해야 했다. Mybatis-Spring 구성 요소에서 생성된 SqlSession 개체는 안전한 스레드 SqlSession 개체를 생성할 수 있다. 따라서 서비스 등 싱글톤 구성 요소에 DI를 적용할 수 있다.



(1) ~ (4)는 응용 프로그램 시작시 수행되는 프로세스

1. SqlSessionFactoryBean은 SqlSessionFactoryBuilder를 위해 SqlSessionFactory를 빌드하도록 요청


2. 응용 프로그램은 SqlSessionFactoryBuilder를 사용하여 빌드된 SqlSessionFactory에서 SqlSession을 가져옴


3. SqlSessionFactoryBuilder는 Mybatis 구성 파일의 정의에 따라 SqlSessionFactory를 생성하고 생성된 SqlSessionFactory는 Spring DI 컨테이너에 의해 저장


4. MapperFactoryBean은 안전한 SqlSession(SqlSessionTemplate) 및 스레드 안전 매퍼 개체(Mapper 인터페이스의 프록시 객체)를 생성함. 따라서 생성되는 Mapper 객체는 Spring DI 컨테이너에 의해 저장되며 서비스 클래스 등에 DI가 적용된다. Mapper 객체는 안전한 SqlSession(SqlSessionTemplate)을 사용하여 스레드를 안전하게 구현하도록 제공함




(5) ~ (11)은 클라이언트의 각 요청에 대해 수행되는 프로세스

5. 클라이언트가 응용 프로그램에 대한 프로세스를 요청


6. 애플리케이션(서비스)은 DI 컨테이너에서 주입한 Mapper 개체(Mapper 인터페이스를 구현하는 프록시 개체)의 방법을 호출


7. Mapper 객체는 호출된 메소드에 해당하는 SqlSession(SqlSessionTemplate) 메서드를 호출


8. SqlSession(SqlSessionTemplate)은 프록시 사용 및 안전한 SqlSession 메서드를 호출


9. 프록시 사용 및 스레드의 SqlSession은 트랜잭션에 할당된 Mybatis3 표준 SqlSession을 사용

 트랜잭션에 할당된 SqlSession이 존재하지 않으면 SqlSessionFactory 메서드를 호출하여 표준 Mybatis3의 SqlSession을 가져옴


10. SqlSessionFactory는 Mybatis3 표준 SqlSession을 반환하는데 반환된 Mybatis3 표준 SqlSession이 트랜잭션에 할당되기 때문에 동일한 트랜잭션 내에 있는 경우 새 SqlSession을 생성하지 않고 동일한 SqlSession을 사용한다. on 메서드를 호출하고 SQL 실행을 요청


11. Mybatis3 표준 SqlSession은 매핑 파일에서 실행할 SQL을 가져와 실행



IBatis와의 차이점


Java 요구 버전

ㄴ IBatis : JDK 1.4 이상

ㄴ MyBatis : JDK 1.5 이상, 버전 3.2 이상은 JDK 1.6 이상을 요구함



Package 내부 구조 변경

ㄴ IBatis : com.ibatis.*

ㄴ MyBatis : org.apache.ibatis.*, MyBatis로 이름이 바뀌었지만 여전히 IBatis를 사용함

* 근데 난 왜 org.mybatis.~ 로 돼있는 것 같지..



SqlMap.xml 내부 구조 변경

: parameterMap을 사용하지 못하게 되어 기존 parameterMap을 사용하던 부분은 parameterType으로 정의하게 됨.


1
2
3
4
<insert id="insertBlobData" parameterType="LobVo">
insert into test_blob(user_no, user_name, blob_data, clob_data, reg_date)
values(#{userNo}, #{userName}, #{blobData,jdbcType=BLOB}, #{clobData,jdbcType=CLOB}, #{regDate})
</insert>
cs



사용하는 용어의 변경

SqlMapConfig -> Configuration

sqlMap -> mapper



네임스페이스 방식의 변경

: sqlMap 별로 줄여놓은 이름을 사용할 수 없게 되며 경로를 모두 명시해주어야 함, 또 IBatis와 달리 MyBatis에서는 namespace가 필수 항목이다.


1
2
iBatis : <sqlMap namespace="Lob">
MyBatis : <mapper namespace="com.altibase.sample.mapper.LobMapper">
cs



'공대인 > Spring[Boot]' 카테고리의 다른 글

[Spring Boot] MyBatis 파라미터 사용  (0) 2019.08.14
[Spring Boot] MyBatis  (0) 2019.08.13
[Spring Boot] InitBinder, Valid  (0) 2019.08.05
[Spring Boot] 데이터 검증, Validator  (0) 2019.08.02
[String Boot] lombok  (0) 2019.08.02
Comments