🥞 BE
home

MyBatis와 JPA

SQL Mapper와 ORM

데이터들이 프로그램이 종료되어도 사라지지 않고 어떤 곳에 저장되는 개념을 영속성(Persistence) 이라고 한다. 자바에서는 데이터의 영속성을 위한 JDBC를 지원해주는데, 이는 매핑 작업을 개발자가 일일히 수행해야 하고,기존 JDBC 만의 사용으로 쿼리문을 만들어 요청하는 과정은 쿼리문이 조금만 길어져도 관리가 힘들고 번거롭다.
SQL Mapper와 ORM은 개발자가 직접 JDBC Programming을 하지 않도록 기능을 제공해는 Persistence Framework 종류이다.

SQL Mapper

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

ORM

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

MyBatis vs JPA

MyBatis

MyBatis : Object Mapping 기술
자바에서 SQL Mapper를 지원해주는 프레임워크
SQL문을 이용해서 RDB에 접근, 데이터를 객체화 시켜줌
SQL을 직접 작성하여 쿼리 수행 결과를 객체와 매핑
쿼리문을 xml로 분리 가능
복잡한 쿼리문 작성 가능
데이터 캐싱 기능으로 성능 향상
but 객체와 쿼리문 모두 관리해야함, CRUD 메소드를 직접 다 구현해야함.

JPA

JPA : ORM(Object Relational Mapping) 기술
자바 ORM의 기술 표준
대표적인 오픈소스로 Hibernate
CRUD 메소드 기본 제공
쿼리를 만들지 않아도 됨
1차 캐싱, 쓰기지연, 변경감지, 지연로딩 제공
MyBatis는 쿼리가 수정되어 데이터 정보가 바뀌면 그에 사용 되고 있던 DTO와 함께 수정해주어야 하는 반면에, JPA 는 객체만 바꾸면 된다. 즉, 객체 중심으로 개발 가능.
but 복잡한 쿼리는 해결이 어려움

장단점

MyBatis 장점

SQL 직접 제어
MyBatis는 SQL에 대한 직접적인 제어를 제공하므로, 개발자가 SQL을 직접 작성하고 최적화할 수 있다. 또한 복잡한 쿼리 또는 특정 데이터베이스에 최적화된 쿼리 작성이 필요한 경우에 적합하다.
학습 용이성
SQL을 잘 아는 경우에, JPA에 비해 학습이 용이하고 쉽게 사용이 가능하다. SQL을 직접 제어할 수 있다는 것은 DB에 적합한 성능 좋은 SQL문을 만들어서 사용할 수도 있고, 통계/분석용 데이터 추출을 위해 복잡한 쿼리를 만들어야 하는 경우에 자유롭게 테이블 간 JOIN 등을 통해서 원하는 데이터를 추출할 수 있어서 좋다.

MyBatis 단점

CRUD 단순 작업에 반복 수작업 필요
SQL을 직접 만들어야 하므로 CRUD 같은 기본적인 코드에 대해서 단순한 코드를 계속 만들어야 하는 불편한 점이 있다. 단순한 코드를 반복해서 만들면 개발 생산성이 떨어지고, 코드에 대한 유지보수도 힘들어진다.
데이터베이스에 종속적
특정 DB를 기준으로 SQL 문이 작성되어 있어서, DB를 변경하려면 SQL 문을 전체 다 확인 후 수정해야한다.

JPA 장점

표준화된 인터페이스
JPA는 자바에서의 ORM을 위한 표준 인터페이스를 제공합니다. Hibernate, EclipseLink, Apache OpenJPA 등의 구현체가 JPA 표준을 따른다.
Java의 표준을 이용하므로 특정 제품에 종속되지 않고, 개발자 간에 협업이 용이하고, 일관된 방식으로 개발을 할 수 있다.
자동 매핑으로 개발 및 유지보수성 향상
JPA는 객체와 데이터베이스 간의 자동 매핑을 지원한다. 개발자가 별도의 SQL 작성 없이도 데이터베이스와 객체 간의 매핑이 이루어진다.
객체 지향적인 접근 지원
JPA는 객체 지향적인 개발에 중점을 둔다. 테이블 간의 연관 관계와 객체 간의 연관 관계를 쉽게 다룰 수 있다.
DBMS에 독립적
사용하는 DB 종류에 관계없이 JPA에서 자동으로 적합한 SQL Dialect를 만들어 주기때문에, DB가 변경되어도 SQL 문을 다시 작성할 필요가 없다. DB 마이그레이션을 해야 할 경우에 MyBatis로 개발된 시스템과 비교하면 손쉽게 설정 변경만으로 DB 변경이 가능하다.

JPA 단점

높은 학습곡선
JPA 관련 다양한 스펙과 작성법(@Entitity, @Table, @Column, @Id, @OneToMany, @ManyToOn)을 학습해야 하고, 또 JPA 적용으로 생기는 다양한 이슈, 즉시 로딩(EAGER LOADING), 지연 로딩(LASY LOADING), 영속성 전이(CascadeType), 복합키 매핑(@EmbededId, @IdClass) 등에 대한 해결 방법을 익혀야 한다. MyBatis에 비해 배우기가 어렵다.
복잡한 SQL 생성의 어려움
일반적으로 시스템을 개발하면 단순한 CRUD와 같은 기능도 많이 있지만, 통계 또는 분석과 같은 화면과 기능도 개발이 필요하다. 이때는 복잡한 쿼리를 만들어야 하는데 여러 테이블을 Join 해서 데이터 결과를 가져와야 하는 경우에, JPA로는 복잡한 쿼리를 만드는 데 용이하지 않다.
직접적인 SQL 작성을 통해서 복잡한 쿼리를 만들어야 하는 경우, JPA와 같이 자동으로 만들어지는 SQL로는 원하는 결과를 정확히 얻기가 힘든 경우가 많다.
성능에 대한 고려 필요
JPA에 의해 자동으로 SQL이 만들어지다 보니, DB의 특성(index, join 등)을 이해하고 DB에 맞는 SQL을 직접 튜닝해서 만들면 성능이 훨씬 뛰어날 수 있으나, 자동화된 SQL 문으로 인해서 데이터 조회 성능이 떨어질 가능성이 있습니다.
일반적인 간단한 CRUD에는 큰 문제가 없으나, 데이터가 많아지고, 테이블 간 Join이 많아지는 경우, SQL문을 어떻게 튜닝하는 가로 인한 성능이 크게 차이가 날 여지가 있으므로, JPA 사용 시 이러한 부분을 주의해서 고려할 필요가 있다.

선택 기준

그러면 둘 사이의 선택 기준은 어떻게 하는 것이 좋을까요?  MyBatis와 JPA는 DB와 Java 프로그램간의 데이터 저장, 조회를 위해 사용되지만, 각각의 특징과 사용 시나리오에 따라 선택해야 한다.
복잡한 쿼리와 SQL 제어가 필요한 경우는 MyBatis로 개발할 수 있습니다. 기존 SQL 경험이 풍부하거나, 특정 데이터베이스에 최적화된 SQL 작성이 필요한 경우는 MyBatis를 선택할 수 있다.
간단한 매핑 및 객체 지향적인 접근이 필요한 경우는 JPA가 SQL작성 등의 반복적인 부분을 해결해 줍니다. 표준화된 인터페이스와 자동 매핑이 중요하며, 다양한 데이터베이스에 대응해야 하는 경우는 JPA를 선택하면 DB가 변경되더라도 DB에 종속되지 않고 손쉽게 Migration이 가능하다.
물론, 실제 선택은 프로젝트의 특성, 개발자의 선호도, 팀의 스킬셋 등을 고려하여 이루어져야 한다. MyBatis 또는 JPA 중 하나를 선택하거나 때로는 두 기술을 혼용하여 사용하는 것도 가능하다.

Reference