잡다한 공부/DB

Mybatis VS JPA

자이구 2024. 2. 26. 17:40

 

ava 기반의 Spring 또는 SpringBoot를 사용은 대규모 기업환경에서 안정성과 신뢰성이 검증된 프레임워크이기에, 

많은 프로젝트에서 안정적인 서비스를 운영할 수 있다는 점이 장점이다. 

 

DB를 활용해야 하는데, 백엔드에서 DB를 사용하는 프레임워크로 가장많이 사용하는 기술이 Mybatis 와 JPA 이다. 

 

DB 접속을 편하게 하기 위해 SQL Mapper 기술과 ORM 기술을 제공하는데 둘다 DB와의 연동, 저장을 위한 기술이며, 

SQL Mapper 개발자가 작성한 SQL 실행결과를 객체에 매핑 시켜주는 프레임워크이며, 

ORM 객체와 DB데이터를 자동으로 매핑시켜주는 프레임워크이다. 

 

SQL Mapper 기술을 제공하는 것이 Mybatis이며, ORM 기술을 제공하는 것이 JPA이다. 

두 가지 기술 모두 데이터를 관계형 DB에 저장, 영속화 시킨다는 측면에서 동일하지만 서로 다른 접근 방식을 채택한다. 


Mybatis란?

Mybatis 프레임워크란 반복적인 JDBC 프로그래밍을 단순화하여, 불필요한 Boilerplate 코드를 제거하고,

Java 코드에서 SQL 문을 분리하여 별도의 XML 파일로 저장하고, 이 둘을 서로 연결시켜주는 기능을 제공한다. 

 

더보기

Boilerplate 코드

코딩을 하다 보면 의미 없는 코딩을 할 때도 있고 불필요한 작업에 때문에 업무 생산성이 떨어지는 경우가 있다.

이럴 경우를 대비해 보일러 플레이트로 기본적인 골격을 미리 만들어서 업그레이드하는 방식이며 불필요한 코드와 생산성을 높일 수 있는 방법이다.

 

Java 코드와 SQL 매핑

 

Mybatis에서 Java 메소드와 SQL 간에 매핑을 시켜서 개발자는 Java 메소드 선언과 SQL 문만 만들면 Mybatis가 자동으로 찾아서 실행해 주는 기능을 한다. 

 

SQL 문장이 Java 코드 내에 들어가 있어서 수정하기도 힘들고, 가시성도 불편하여, SQL 문을 별도로 XML 분리하여  

관리가 편하게 하였으며, 분리된 SQL문을 Mybatis가 찾아서 실행해 주는 기능을 한다. 

 

동적  SQL 생성 기능 

 

동적인 SQL 생성 기능을 제공하여 프로그램 실행 중에 입력되는 파라미터에 따라 서로 다른 SQL문을 동적으로

생성해 내는 기능을 제공한다. 


JPA란?

JPA는 Java 객체와 관계형 데이터베이스 간의 매핑을 위한 API이다. ORM을 구현하는 자바 표준 스펙으로,

개발자가 객체지향 프로그래밍 언어에서 사용하는 객체 모델과 관계형 DB의 테이블 간의 매핑을 자동으로 처리해준다.

 

Mybatis와 같이 SQL 문과 Java 코드를 연계하는 접근 방식이 아니라 Java 객체와 DB 엔티티 자체를 그대로 매핑해서

처리할 수 있는 접근 방식을 채택한 새로운 기술 표준이다. 

 

JPA의 접근 방식은 ORM, 객체와 DB 간의 매핑 기술이며, 좀 더 객체지향 관점에서 개발할 수 있게 하고, 

개발을 용이하게 해주어서 DB와 Java 간의 불일치를 해소해준다. 

 

Java와 DB 데이터 간의 매핑을 자동화해주어서 개발자는 SQL 문을 작성할 필요가 없어지고, DB가 바뀌어도 DB에

따라 새로운 SQL을 작성할 필요가 없이 Hibernate에서 DB에 맞는 적합한 SQL 문을 생성해준다. 


Mybatis의 장점과 단점

 

SQL 직접 제어

SQL에 대한 직접 제어를 제공하므로, 개발자가 SQL을 직접 작성하고 최적화가 가능하다. 

복잡한 쿼리 또는 특정 데이터베이스에 최적화된 쿼리 작성이 필요한 경우 적합

 

학습 용이성

SQL을 잘 아는 경우에, JPA에 비해 학습이 용이하고 쉽게 사용 가능하다. 

SQL을 직접 제어하여 DB에 적합한 성능 좋은 SQL문을 만들어 사용 가능하고, 복잡한 쿼리를 만들어야할 경우에

자유롭게 테이블 간 JOIN 등을 통해서 원하는 데이터를 추출할 수 있어서 좋다.

 

CRUD 단순 작업에 반복 수작업 필요

SQL을 직접 만들어야 하므로 CRUD 같은 기본적인 코드에 대해서 단순한 코드를 계속 만들어야 하는 불편함이 있다.

 

DB 종속성

특정 DB를 기준으로 SQL 문이 작성되어 있어서, DB를 변경하려면 SQL 문을 전체 다 확인 후 수정해야 한다.

 


JPA의 장점과 단점

 

표준화된 인터페이스

JPA는 자바에서의 ORM을 위한 표준 인터페이스를 제공한다.

Hibernate, EclipseLink, Apache OpenJPA 등의 구현체가 JPA 표준을 따른다.

 

자동 매핑으로 개발 및 유지보수성 향상

JPA는 객체와 데이터베이스 간의 자동 매핑을 지원한다. 개발자가 별도의 SQL 작성 없이도 DB와 객체 간의 매핑이 이루어진다.

 

객체 지향적인 접근 지원

JPA는 객체 지향적인 개발에 중점을 둔다.

테이블 간의 연관 관계와 객체 간의 연관 관계를 쉽게 다룰 수 있다.

 

DBMS에 독립적

사용하는 DB 종류에 관계없이 JPA에서 자동으로 적합한 SQL Dialect를 만들어 주기 때문에 

DB가 변경되어도 SQL문을 다시 작성할 필요가 없다.

 

높은 학습곡선

MyBatis에 비해 배우기 어렵다.

 

복잡한 SQL 생성의 어려움

복잡한 쿼리를 만들어야 하는데 여러 테이블을 Join 해서 데이터 결과를 가져와야 하는 경우에,

JPA로는 복잡한 쿼리를 만드는 데 용이하지 않다.

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

 

JPA vs Mybatis, 현직 개발자는 이럴 때 사용합니다. I 이랜서 블로그

서버에서 데이터 베이스를 효율적으로 사용하기 위해 사용하는 JPA와 Mybatis를 실무에서는 언제 어떻게 사용할까요? 이랜서에서 알려드립니다. I 소트프웨어, 소프트웨어 개발자, 네이버 소프트

www.elancer.co.kr