본문 바로가기
FrameWork & Runtime/Spring

MyBatis

by jaeaemin 2022. 3. 7.

 

Mybatis란

Mybatis는 SQL mapper라고도 불리며 Spring과 독립적인 프레임워크로, Java에 국한되지 않고 DAO 객체와 SQL문을 알아서 Mapping해주는 Persistence Framework이다.

(Java Objcet와 SQL 을 자동 매핑 기능을 가진 ORM framework이다 ( object relational mapping ) )

 

Mybatis의 특징

> 독립적인 프레임워크로 C나 C#, Ruby 등의 언어에서도 사용이 가능하다.

> SQL을 그대로 이용하면서 도메인 객체나 VO객체를 중심으로 개발이 가능하다.

> XML 형태로 서술된 JDBC 코드를 통해 깔끔한 소스코드를 유지하는 것이 가능하다.

 

> SQL과 코드의 분리 

MyBatis는 Spring framework에서 Data Access Layer에 속하는 계층으로 DB와 서비스의 소통을 지원한다.

MyBatis의 핵심 특징으로는 Java 코드와 SQL 코드를 분리한다는 특징으로 SQL 변경이 생길때마다 자바 코드를 수정하거나 컴파일하지 않아도 된다.

 

아래 그림을 참고하면 MyBatis는 DAO와 JDBC 사이에 위치하여 서로를 매핑해준다.

참조 https://pangtrue.tistory.com/

 

기존 JDBC 코드만을 사용했을 때의 단점은 중복 코드가 많이 생성되었다는 점이었다.

JDBC로 코드를 작성하면 다음의 순서로 DAO에 접근한다.

  1. DriverManager로 부터 Connection 객체를 할당받는다.
  2. Connection 객체로 PreparedStatement , Statement 객체를 생성한다.
  3. 수행할 query를 작성하고, executeQuery() , executeUpdate() 등을 사용하여 DB를 수정한다.
  4. 결과값을 ResultSet 혹은 타입 변수로 받아온다.

MyBatis는 이러한 사항들을 간략하게 줄여준다.

또한 SQL이 Java코드안에 들어있지 않고, resource의 Mybatis가 관리하는 Mapper 안에 들어있기 때문에, 쿼리를 XML에 넣어두기만 한다면 쿼리를 수정해도 새로 컴파일하지 않아도 가능하다. 

 

 

 

JDBC ( Java DataBase Connectivity) :

DB의 연결 및 작업을 하기 위한 row 수준의 자바 표준 인터페이스 

 

JAVA에서는 DBMS(oracle, mysql, mongo)의 종류와 상관없이, 하나의 JDBC API를 이용하여 DB 작업처리가 가능하다.

이를  통해 DB접근과 CRUD를 효율적으로 하고, 고성능의 표준 메서드를 쉽게 프로그래밍 할 수 있다.

 

  • JDBC API가 없으면, DB의 종류마다 각각의 문법에 맞춘 SQL문을 사용함 ( 유지보수성 떨어짐 ) => 문법 통일 
JDBC 프로그래밍 흐름 :     [1] JDBC 드라이버 로드 -> [2] DB 연결 -> [3] DB CRUD -> [4] DB 연결 종료
JDBC Driver Manager JDBC드라이버 매니저는 JDBC 아키텍처의 중심에서 자바 프로그램과 JDBC 프로그램 사이 접속 지원

JDBC Driver API JDBC Driver API는 JDBC 드라이버 매니저와 각 DBMS의 벤더에서 제공하는 JDBC Driver가 접속하기 위한 인터페이스

JDBC Driver - DBMS와 통신을 담당하는 자바 클래스 ( 접속제어 모듈 )
- DBMS 별로 알맞은 JDBC 드라이버가 필요함 ( .jar 파일 )

로딩코드 : Class.forName("JDBC 드라이버 이름");
 - mySQL : com.mysql.jdbc.Driver
 - Oracle  : oracle.jdbc.driver.OracleDriver
 - MSSQL : com.microsoft.sqlserver.jdbc.SQLServerDriver 

JDBC URL - DBMS와 연결을 위한 식별 값 ( JDBC 드라이버마다 형식 상이 )
- 구성 : " jdbc:[DBMS]:[DB식별자] 
       > jdbc:mysql://HOST[:PORT]/DBNAME[?[param=value]
       > jdbc.oracle.thin:@Host:Port:SID

 

 

 

 

 

MyBatis 아키텍처 

 

MyBatis는 JDBC의 언어제약과 다양한 초기 설정을 간략하게하여, 쉬운 접근성과 코드의 간결함을 장점으로 뽑을 수 있다.

또한 기존 JDBC만을 사용하는 애플리케이션은 Application Moudules에서 JDBC Interfaces를 바로 호출하지만,

MyBatis에서는 JDBC API를 감싸서 개발자가 접근하여  한번에 사용하므로 편리하게 사용할 수 있다.

 

MyBatis는 Data Access Layer에서 사용하는 프레임워크로 . Controller에서 Service를 호출하고 Service가 DAO 계층에 있는 메소드를 호출하면 DAO에서 MyBatis를 호출한다.

 

MyBatis를 사용하는 데이터 엑세스 계층

표현 계층의 컨트롤러에서 해당하는 서비스 계층의 서비스 클래스를 통해서 DAO 객체를 할당하고 접근한다.

Data Acess 계층에서 DAO 객체를 활용해 JDBC와 DBMS 사이를 통신한다. 

이 때 MyBatis Framework를 사용해  Data Access Layer의 DAO를 JDBC 통신하여 maaper.xml 파일을 참조해 알맞은 DB CURD를 실행한다. 그 후 다시 반환함

 

 

 

 

Mybatis의 주요 컴포넌트 

 

보라색 부분 = 개발자가 작성해야 하는 클래스

호출 순서 

 1. Application에서  SqlSessionFactroyBuilder라는 인터페이스를 호출함

 2. SqlSessionFactroyBuilder에서 MyBatis Config File을 읽어드림

 3. 읽은 내용을 토대로 SqlSessionFactory를 생성함 

 4-5. 애플리케이션에서 특정 Sql문을 사용하기 위한 메서드를 호출하고 SqlSessionFactory를 호출함

 6. SqlSession을 생성하고 애플리케이션의 요청을 MappingFile에서 알맞은 Sql문을 찾아서 호출해준다.

 

 

 

주요 컴포넌트 

Mybatis 설정파일
(SqlMapConfig.xml)
- 데이터베이스 접속 주소정보Mapping 파일의 경로 등의 고정된 환경정보를 설정한다
SqlSessionFactoryBuilder - MyBatis 설정 파일을 바탕으로 SqlSessionFactory를 생성한다.
SqlSessionFactory - SqlSession을 생성한다.
SqlSession - 핵심적인 역할을 하는 클래스로서, Sql 실행이나 트랜잭션 관리를 실행한다.
- SqlSession 오브잭트는 Thread-safe하지 않으므로 thread마다 필요에 따라서 생성
Mapping 파일
(user.xml)
- SQL문과 OR Mapping을 설정한다.

 

 

 

 

 

 

Mybatis-Spring의  연동을 위한 주요 컴포넌트 

 

반응형