MyBatis

MyBatis (까만 도적 새 - 이론편)

꽃달린감나무 2023. 7. 19. 15:11
728x90

인턴을 하면서 실무 프로젝트를 코드분석할 기회가 생겼다.(방대한 코드와 데이터에 걱정이 이만저만이 아니였다..ㅠ) 실무 프로젝트에서는 JPA와 MyBatis를 모두 사용하고 있었다. 여태까지 해왔던 토이프로젝트나 협업 프로젝트에서는 모두 JPA를 통해 해결해왔었다. 근데 왜 실무에서는 두 가지 모두를 사용하고 있는 걸까..? 그 이유를 분석해보자

ORM vs SQL Mapper

이유를 분석하기전 이 두 녀석에 대해 조사를 좀 해보자면, Java에서는 데이터의 영속성을 위한 JDBC를 지원해주는데, 이는 매핑 작업을 개발자가 일일히 수행해야하는 번거로움이 존재한다. SQL Mapper와 ORM은 개발자가 직접 JDBC 를 작성하지 않도록 기능을 제공해주는 데 그 녀석이 바로, Persistence Framework이다. 이 프레임워크의 종류는 크게 SQL Mapper와 ORM으로 나뉘게 된다.

SQL Mapper

  • Object와 SQL의 필드를 매핑하여 데이터를 객체화 하는 기술
    • 객체와 테이블 간의 관계를 매핑하는 것이 아님
    • SQL문을 직접 작성하고 쿼리 수행 결과를 어떠한 객체에 매핑할지 바인딩 하는 방법
    • DBMS에 종속적인 문제
    • EX) JdbcTemplate, MyBatis

ORM

  • Object와 DB테이블을 매핑하여 데이터를 객체화하는 기술
    • 개발자가 반복적인 SQL을 직접 작성하지 않음
    • DBMS에 종속적이지 않음
    • 복잡한 쿼리의 경우 JPQL을 사용하거나 SQL Mapper을 혼용하여 사용 가능

 

MyBatis와 JPA의 주요한 차이점은 DB와의 상호작용 방식이다. MyBatis의 경우 개발자가 SQL를 작성하며, 데이터 매핑을 위해 XML 또는 어노테이션을 사용한다. 반면 JPA는 객체와 관계형 데이터베이스 간의 매핑을 제공하며 JPQL을 사용해서 개발자가 SQL을 작성할 필요없이 객채- 테이블 관계 매핑을 통해 데이터베이스와 상호작용을 한다.

 

결론을 내보자면, 각각 실무 환경에 적합하게 번갈아 쓴다면 좋다는 것이다. 예를 들어 JPA를 통해 데이터를 불러오기에는 조건이 너무 복잡하다면, MyBatis와 같은 SQL Mapper를, 데이터를 단순히 불러오는거라면 JPA와 같은 ORM 녀석을 쓴다고 보면 될 것 같다.

 

 

이제 MyBatis에 대해 알아보자. 

MyBatis

(https://mybatis.org/mybatis-3/ko/index.html) 공식문서 페이지

MyBatis란?

마이바티스는 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크이다. 마이바티스는 JDBC로 처리하는 상당부분의 코드와 파라미터 설정및 결과 매핑을 대신해준다. 마이바티스는 데이터베이스 레코드에 원시타입과 Map 인터페이스를 설정해서 매핑하기 위해 XML과 애노테이션을 사용할 수 있다. 

 

MyBatis 특징

- 복잡한 쿼리나 다이나믹한 쿼리에 강하다 - 반대로 비슷한 쿼리는 남발하게 되는 단점

- 프로그램 코드와 SQL 쿼리의 분리로 코드의 간결성 및 유지보수성 향상

- Vo를 사용하지않고 사용자 정의 DTO, MAP등으로 맵핑하여 사용가능

 

MyBatis 구조

MyBatis 구조

Service  > Repository, Mapper > MyBatis > JDBC > JDBC > DB 형식을 통해 넘겨준다. Repository에 어노테이션을 통해 연결해주거나 Mapper.xml 파일을 작성하면 MyBatis가 이를 JDBC Interface로 넘겨주는 형식이다. 

 

MyBatis 주요구성요소

구성 요소 / 구성 파일   설명
 MyBatis configuration file  MyBatis3의 작업 설정을 설명하는 XML 파일입니다.
 데이터베이스의 연결 대상, 매핑 파일의 경로, MyBatis3의 작업 설정 등과 같은 세부 사항을 설명하는 파일입니다. Spring과 통합하여 사용할 때 데이터베이스의 연결 대상과 매핑 파일 경로 설정을 구성 파일에 지정할 필요가 없습니다. 그러나 MyBatis3의 기본 작업을 변경하거나 확장 할 때 설정이 수행됩니다.
 org.apache.ibatis.session.SqlSessionFactoryBuilder  MyBatis3 구성 파일을 읽고 생성하는 SqlSessionFactory 구성 요소입니다.
이 구성 요소는 스프링과 통합되어 사용할 때 애플리케이션 클래스에서 직접 처리하지 않습니다.
 org.apache.ibatis.session.SqlSessionFactory  SqlSession을 생성하는 구성 요소입니다.
이 구성 요소는 스프링과 통합되어 사용할 때 애플리케이션 클래스에서 직접 처리하지 않습니다.
 org.apache.ibatis.session.SqlSession  SQL 실행 및 트랜잭션 제어를 위한 API를 제공하는 구성 요소입니다.
MyBatis3를 사용하여 데이터베이스에 액세스할 때 가장 중요한 역할을 하는 구성 요소입니다.
이 구성 요소를 스프링과 통합하여 사용할 경우 애플리케이션 클래스에서 직접 처리하지 않습니다.
 Mapper interface  typeafe에서 매핑 파일에 정의된 SQL을 호출하는 인터페이스입니다.
MyBatis3는 매퍼 인터페이스에 대한 구현 클래스를 자동으로 생성하므로 개발자는 인터페이스만 생성하면 됩니다.
 Mapping file  SQL 및 O/R 매핑 설정을 설명하는 XML 파일입다.

 

MyBatis가 DB에 접근하는 순서

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

2. SqlSessionFactoryBuilder는 SqlSessionFactory를 생성하기 위한 MyBatis Config 파일 참조

3. SqlSessionFactoryBuilder는 Config 파일에 요청에 따라 SqlSessionFactory 생성

 

 

참조 블로그

-https://khj93.tistory.com/entry/MyBatis-MyBatis%EB%9E%80-%EA%B0%9C%EB%85%90-%EB%B0%8F-%ED%95%B5%EC%8B%AC-%EC%A0%95%EB%A6%AC#google_vignette 

 

[MyBatis] MyBatis란? 개념 및 데이터구조

MyBatis란? 객체 지향 언어인 자바의 관계형 데이터베이스 프로그래밍을 좀 더 쉽게 할 수 있게 도와 주는 개발 프레임 워크로서 JDBC를 통해 데이터베이스에 엑세스하는 작업을 캡슐화하고 일반 SQ

khj93.tistory.com

- https://velog.io/@skyepodium/springboot-mybatis-MySql-%EC%97%B0%EB%8F%99

728x90