JPA VS MyBatis
— Spring Boot, Spring Data JPA — 7 min read
MyBatis
마이바티스는 개발자가 지정한 SQL, 저장프로시저 그리고 몇가지 고급 매핑을 지원하는 퍼시스턴스 프레임워크입니다. 마이바티스는 JDBC로 처리하는 상당부분의 코드와 파라미터 설정및 결과 매핑을 대신해줍니다.
마이바이스는 데이터베이스 레코드에 원시타입 Map 인터페이스, 자바 POJO를 설정해서 매핑하기 위해 XML과 어노테이션을 사용할 수 있습니다.
아래의 코드는 SQL문을 매핑하기 위해 작성한 XML의 예시입니다.
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="org.mybatis.example.BlogMapper"> <select id="selectBlog" resultType="Blog"> select * from Blog where id = #{id} </select></mapper>한 개의 매퍼 XML 파일에는 많은 수의 매핑 구문을 정의할 수 있습니다. 개발자가 IDE를 사용할 때 매핑된 SQL 구문을 사용할 떄의 수고를 덜어줍니다. 마지막으로는 리턴타입에 대해 타입 캐스팅을 하지 않아도 됩니다.
JPA
JPA는 자바 퍼시스턴스의 줄임말이며 자바 플랫폼 SE와 자바 플랫폼EE를 사용하는 응용프로그램에서 관계형 데이터베이스의 관리를 표현하는 자바 API입니다.
JPA에 대해서 더 알아가기 전에 ORM에 대해서 간단하게 소개를 하겠습니다.
ORM (Object-Relational Mapping)
애플리케이션 클래스와 RDBMS의 테이블을 매핑한다는 뜻이며, 기술적으로는 어플리케이션의 객체를 RDBMS 테이블에 자동으로 영속화 해주는 것이라고 보면됩니다.
ORM 장점
- SQL문이 아닌 메서드를 통해 DB를 조작할 수 있어 개발자는 객체 모델을 이용하여 비즈니스 로직을 구성하는데만 집중할 수 있습니다.
- Query와 같이 필요한 선언문, 할당 등의 부수적인 코드가 줄어들어, 각종 객체에 대한 코드를 별도로 작성하여 코드의 가독성을 높입니다.
- 객체지향적인 코드 작성이 가능하여 생산성이 증가합니다.
- 매핑하는 정보가 클래스로 명시되어 있기 때문에 ERD를 보는 의존도를 낮출 수 있고 유지보수 및 리팩토링에 유리합니다.
ORM 단점
- 프로젝트의 규모가 크고 복잡하여 설계가 잘못된 경우, 속도 저하 및 일관성을 무너뜨리는 문제점이 생길 수 있습니다.
- 복잡하고 무거운 Query는 속 도를 위해 별도의 튜닝이 필요하기 때문에 SQL문을 써야할 수도 있습니다.
JPA란?
자바 진영에서 ORM 기술 표준으로 사용하는 인터페이스 모음입니다. 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스입니다.
인터페이스 이기 때문에 Hibernate, OpenJPA 등이 JPA를 구현합니다.
JPA를 사용하는 이유
JPA는 반복적인 CRUD SQL문을 처리해줍니다. JPA는 매핑된 관계를 이용해서 SQL을 생성하고 실행하는데, 개발자는 어떤 SQL이 실행될지 생각만 하면 되고, 예측도 쉽게 할 수 있습니다. 추가적으로 JPA는 네이터브 SQL 기능을 제공하는데 관계 매핑이 어렵거나 성능에 대한 이슈가 우려되는 경우 SQL을 직접 작성할 수 있습니다.
JPA를 사용하여 얻을 수 있는 가장 큰 것은 SQL이 아닌 객체 중심으로 개발할 수 있습니다. 이에 따라 생산성이 좋아지고 유지보수도 수월합니다.
그래서 마리아주에서 JPA를 선택한 이유는?
마리아주에서 JPA를 선택한 이유는 다음과 같습니다.
-
ERD에 의존성이 낮습니다. 현재 개발하면서 사용하고 있는 데이터베이스는
MySQL을 사용하고 있습니다. 하지만 테스트때 사용하는 데이터베이스는 메모리에서 동작하고 가벼운H2 DB를 사용하고 있습니다. ERD에 대한 의존성이 낮기 때문에MySQL과H2 DB를 동시에 사용하여 개발을 진행할 수 있습니다. -
반복적인 CRUD SQL문을 처리해줍니다. MyBaits에서는 반복적인 CRUD문을 작성하다보면 까먹거나 잘못 적는 경우가 발생할 수 있는데 이것을 사전에 방지할 수 있고 반복적인 작업을 줄여 피로도를 낮출 수 있습니다.
-
컴파일 시점에서 오류를 탐지합니다.
MyBatis는XML에서 작성하여 컴파일 시점에 오류를 탐지하지 못하여 런타임중 오류를 탐지할 수 있습니다. 하지만 JPA는 컴파일 시점에 오류를 탐지하여 버그의 발생 확률을 낮출 수 있습니다. -
MyBatis에 존재하는@Qeury어노테이션은JPA에도 존재합니다.MyBatis에서XML파일에 작성하지 않고 어노테이션으로 작성할 수 있는데 이것은JPA에서도 작성할 수 있어 차별점으로 느끼지 못하였습니다.JPA에서_작성한_JPQL@Modifying@Query("DELETE FROM Cart c WHERE c.id = :cartId")void deleteByCartId(@Param("cartId") Long cartId);
마리아주에서는 위와 같은 이유로 MyBatis 대신에 Spring Data JPA를 선택하였습니다.