MyBatis

mybatis 홈페이지

객체 지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있게 도와 주는 개발 프레임 워크로서 JDBC를 통해 데이터베이스에 엑세스하는 작업캡슐화하고 일반 SQL 쿼리, 저장 프로 시저 및 고급 매핑을 지원하며 모든 JDBC 코드 및 매개 변수의 중복작업을 제거 합니다. Mybatis에서는 프로그램에 있는 SQL쿼리들을 한 구성파일에 구성하여 프로그램 코드와 SQL을 분리할 수 있는 장점을 가지고 있습니다.

객체와 관계형데이터베이스를 매핑하는 퍼시스턴스 프레임워크

퍼시스턴스(persistence, 영속성)란?
프로그램이 종료되더라도 사라지지 않는 데이터의 특성을 말한다. RDBMS 혹은 파일 시스템 등 별도 데이터베이스에 영구적으로 저장하여 데이터가 영속성을 가지는 것을 말한다.

모델 DB의 매개체 역할의 프레임워크 - ORM(Object Relational Mapping)

Java 소스코드 안에 SQL문을 작성하면 코드가 길어지고 섞여 있어서 유지보수 및 분업이 쉽지 않아진다. MyBatis는 기존 JDBC 방식과는 달리 SQL문을 XML 파일에 작성함으로써 코드가 줄어들고 SQL문 수정이 편해진다. 또한 DBCP를 사용하여 커넥션을 여러개 생성하기 때문에 JDBC만 사용하는 것보다 작업 효율과 가독성이 좋아진다.

운영 중에 에러로그로 식별할 수 없는 이슈인 out of memory가 발생하거나, DB서버에서부터 발생한 장애로 서버가 뻗는 경우는 대부분 WAS와 DB서버간의 이슈 즉, DBCP와 관련된 이슈입니다.

DBCP란?

DBCPDataBase Connection Pool의 약자이며, 데이터베이스와 애플리케이션을 효율적으로 연결하는 커넥션 풀 라이브러리를 말합니다. 이러한 DBCP는 WAS가 실행되면서 미리 일정량의 DB Connection 객체를 생성하고 Pool이라는 공간에 저장합니다. 저장된 DB Connection 객체는 요청에 따라 필요할 때마다 Pool에서 가져다 쓰고 반환할 수 있습니다. 따라서 요청할 때마다 DB Driver에 로드하여 물리적인 Connection 객체를 생성하는 비용이 줄어들어 앞서 말씀드린 문제를 해결할 수 있게 됩니다.

DBCP 사용이유

데이터베이스에서 원하는 데이터를 얻어올 때 가장 비용이 큰 부분은, 서버가 물리적으로 DB서버에 최초로 연결되어 Connection을 생성하는 부분입니다. 이 문제는 DBCP를 사용하면 해결할 수 있습니다.

iBatis(jdk 1.4 이상부터 지원) → MyBatis(jdk 1.5 이상부터 지원)
iBatis와 MyBatis의 차이점은 몇 개의 문법 및 사용용어(명칭,단어) 변경 등이다.

ORM이란?

object와 DB테이블을 매핑하여 데이터를 객체화하는 기술

  • 개발자가 반복적인 SQL문을 직접 작성하지 않음
  • DBMS에 종속적이지 않음
  • 복잡한 쿼리의 경우 JPQL을 사용하거나 SQL Mapper을 혼용하여 사용 가능

객체와 RDBMS를 자동으로 매핑해주는 것을 말한다.

객채 ↔ 관계형 데이터베이스

객체 지향 프로그맹은 객체를 사용하고 관계형 데이터베이스는 테이블을 사용하기 때문에 상호간 필드가 불일치가 존재한다. MyBatis와 같은 ORM을 통해 객체와 관계형데이터베이스를 연동해 SQL문을 생성하여 문제점을 해결한다. ORM에는 JPA, Hibernate, JDBC 가 있다. Hibernate는 최근 Spring boot에 채택되어 사용되어 진다.

MyBatis 특징

복잡한 쿼리나 다이나믹한 쿼리에 강하다. 반대로 비슷한 쿼리는 남발하게 되는 단점이 있다. 프로그램 코드와 SQL 쿼리의 분리로 코드의 간결성 및 유지보수성 향상 resultType, resultClass등 Vo를 사용하지 않고 조회결과를 사용자 정의 DTO, MAP 등으로 맵핑하여 사용 할 수 있다. 빠른 개발이 가능하여 생산성이 향상된다.

MyBatis 작동원리

  1. SqlSessionFactoryBuilder는 SqlSessionFactory를 생성하기 위한 MyBatis 구성파일을 읽는다.
  2. 클라이언트(개발자)가 응용 프로그램에 대한 프로세스를 요청한다.
  3. Application은 SqlSessionFactoryBuilder를 사용하여 빌드된(build) SqlSessionFactory 에서 SqlSession을 가져온다.(openSession)
  4. Application이 SqlSession에서 Mapper 인터페이스 구현 개체를 가져온다.
  5. Application이 Mapper 인터페이스의 메소드를 호출한다.
  6. Mapper 인터페이스의 구현 객체가 SqlSession 메소드를 호출하고 SQL문 실행을 요청한다.
  7. SqlSession은 Mapping 파일에서 실행할 SQL문을 가져와서 실행한다.

MyBatis와 JPA 차이


JPA는 OR mapping 즉 객체(Object)와 DB(Relational Database)간의 매핑을 위한 프레임워크이다. 특별한 Native SQL 없이도 객체가 DB와 연동되는 것을 보면 매우 신기하다. 장점은 설정을 통해 대부분의 작업을 손쉽게 자동화 할 수 있다. JPA의 전신은 Hibernate라고 볼 수 있는데 Hibernate 개발자가 interface 형태로 만든게 JPA(Java Persistence API - 이것은 자바의 공식 API)이다. JPA는 인터페이스 덩어리이고 이것의 구현체가 여럿 있는데 특별한 경우가 아니라면 대부분 Hibernate가 구현체로 사용된다.

MyBatis 설치

    implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.2.0'
mybatis.type-aliases-package=com.example.mvc.domain
# 카멜표기법으로 표시
mybatis.configuration.map-underscore-to-camel-case=true
logging.level.com.example.mvc.repository.mybatis=trace
profile
발전하기 위한 공부

0개의 댓글