
MyBatis 프레임워크는 반복적인 JDBC 프로그래밍을 단순화하여, 불필요한 Boilerplate 코드를 제거하고, Java 소스코드에서 SQL 문을 분리하여 별도의 XML 파일로 저장하고, 이 둘을 서로 연결시켜주는 기능을 제공
MyBatis 내부에 Boilerplate 코드가 구현되어 있고, MyBatis에서 Java 메소드와 SQL 간에 매핑을 시켜서 개발자는 Java 메소드 선언과 SQL 문만 만들면 MyBatis가 자동으로 그 둘 간을 연결시켜줌.
프로그램 실행 중에 입력되는 파라미터에 따라 서로 다른 SQL 문을 동적으로 생성해 내는 기능을 제공
MyBatis 내에 if 문, choose, when, otherwise, foreach 등의 문법을 지원해서 동적인 SQL 문 생성이 가능합니다. 아래 예시에서는 title 파라미터를 입력받게 되면 SQL 문이 아래와 같이 생성되고,
SELECT * FROM BLOG WHERE state = ‘active’ AND title like #{title}
title 파라미터 없이 호출이 되는 경우엔, 아래와 같이 title 조건이 없는 SQL 문이 생성됩니다.
SELECT * FROM BLOG WHERE state = ‘active’
MyBatis는 SQL에 대한 직접적인 제어를 제공하므로, 개발자가 SQL을 직접 작성하고 최적화할 수 있습니다. 또한 복잡한 쿼리 또는 특정 데이터베이스에 최적화된 쿼리 작성이 필요한 경우에 적합합니다.
SQL을 직접 만들어야 하므로 CRUD 같은 기본적인 코드에 대해서 단순한 코드를 계속 만들어야 하는 불편한 점이 있습니다. 단순한 코드를 반복해서 만들면 개발 생산성이 떨어지고, 코드에 대한 유지보수도 힘들어집니다.
특정 DB를 기준으로 SQL 문이 작성되어 있어서, DB를 변경하려면 SQL 문을 전체 다 확인 후 수정해야 합니다.
JPA(Java Persistence API)는 Java 객체와 관계형 데이터베이스 간의 매핑을 위한 API. JPA는 ORM(Object-Relational Mapping)을 구현하는 자바 표준 스펙으로, 개발자가 객체지향 프로그래밍 언어에서 사용하는 객체 모델과 관계형 데이터베이스의 테이블 간의 매핑을 자동으로 처리해줌.
JPA는 자바에서의 ORM을 위한 표준 인터페이스를 제공합니다. Java의 표준을 이용하므로 특정 제품에 종속되지 않고, 개발자 간에 협업이 용이하고, 일관된 방식으로 개발을 할 수 있습니다.
JPA는 객체와 데이터베이스 간의 자동 매핑을 지원합니다. 개발자가 별도의 SQL 작성 없이도 데이터베이스와 객체 간의 매핑이 이루어집니다.
JPA는 객체 지향적인 개발에 중점을 둡니다. 테이블 간의 연관 관계와 객체 간의 연관 관계를 쉽게 다룰 수 있습니다.
사용하는 DB 종류에 관계없이 JPA에서 자동으로 적합한 SQL Dialect(방언)를 만들어 주기때문에, DB가 변경되어도 SQL 문을 다시 작성할 필요가 없습니다. DB 마이그레이션을 해야 할 경우에 MyBatis로 개발된 시스템과 비교하면 손쉽게 설정 변경만으로 DB 변경이 가능합니다.
JPA 관련 다양한 스펙과 작성법(@Entitity, @Table, @Column, @Id, @OneToMany, @ManyToOn)을 학습해야 하고, 또 JPA 적용으로 생기는 다양한 이슈, 즉시 로딩(EAGER LOADING), 지연 로딩(LASY LOADING), 영속성 전이(CascadeType), 복합키 매핑(@EmbededId, @IdClass) 등에 대한 해결 방법을 익혀야 합니다.
일반적으로 시스템을 개발하면 단순한 CRUD와 같은 기능도 많이 있지만, 통계 또는 분석과 같은 화면과 기능도 개발이 필요합니다. 이때는 복잡한 쿼리를 만들어야 하는데 여러 테이블을 Join 해서 데이터 결과를 가져와야 하는 경우에, JPA로는 복잡한 쿼리를 만드는 데 용이하지 않습니다.
직접적인 SQL 작성을 통해서 복잡한 쿼리를 만들어야 하는 경우, JPA와 같이 자동으로 만들어지는 SQL로는 원하는 결과를 정확히 얻기가 힘든 경우가 많습니다.
JPA에 의해 자동으로 SQL이 만들어지다 보니, DB의 특성(index, join 등)을 이해하고 DB에 맞는 SQL을 직접 튜닝해서 만들면 성능이 훨씬 뛰어날 수 있으나, 자동화된 SQL 문으로 인해서 데이터 조회 성능이 떨어질 가능성이 있습니다.
일반적인 간단한 CRUD에는 큰 문제가 없으나, 데이터가 많아지고, 테이블 간 Join이 많아지는 경우, SQL 문을 어떻게 튜닝하는 가로 인한 성능이 크게 차이가 날 여지가 있으므로, JPA 사용 시 이러한 부분을 주의해서 고려할 필요가 있습니다.
복잡한 쿼리와 SQL 제어가 필요한 경우는 MyBatis로 개발할 수 있습니다. 기존 SQL 경험이 풍부하거나, 특정 데이터베이스에 최적화된 SQL 작성이 필요한 경우는 MyBatis를 선택할 수 있습니다. JPA의 영속성 컨텍스트는 다양한 기능을 제공하지만 오버헤드도 존재한다. 따라서 batch job 처리에서는 Mybatis쪽이 더 좋다.
간단한 매핑 및 객체 지향적인 접근이 필요한 경우는 JPA가 SQL작성 등의 반복적인 부분을 해결해 줍니다. 표준화된 인터페이스와 자동 매핑이 중요하며, 다양한 데이터베이스에 대응해야 하는 경우는 JPA를 선택하면 DB가 변경되더라도 DB에 종속되지 않고 손쉽게 Migration이 가능합니다.
실제로 현업에서 튜닝이 중요한 부분에서는 MyBatis, QueryDSL을 사용하고, 도메인 중심 설계(DDD) 부분에서는 JPA를 사용한다.