안녕하세요🖐️ 쭈피셜입니다🌿
오늘은 JPA와 MyBatis의 차이점에 대해 소개하려고 합니다.
1학기 파이널 프로젝트를 진행하면서 JPA와 MyBatis 두가지를 혼용한 팀은 저희 반에서는 저희 팀밖에 없었는데요!
JPA와 MyBatis의 각각의 특징, 장단점에 대해 알아보고 프로젝트 사용 시 느꼈던 후기까지 기록해보고자 합니다!
먼저 JPA와 MyBatis를 알아보기 전에,
DB에 상호작용 하는 방식 ORM 과 SQL Mapper에 대해 알아보겠습니다.
개발자가 직접 SQL 쿼리를 작성하고 매핑하는 방식
개발자는 쿼리와 데이터베이스 간의 매핑을 명시하며, 직접 상호작용하기 때문에 섬세한 제어가 가능합니다.
원하는대로 최적화가 가능하고, 복잡한 쿼리나 성능 튜닝이 필요한 경우 유용합니다.
대표적인 SQL Mapper 프레임워크로 MyBatis가 있습니다.
객체와 데이터베이스간의 매핑을 자동화하는 방식
개발자는 객체를 사용하여 데이터베이스 작업을 수행하고, ORM이 객체와 테이블간의 매핑을 처리합니다.
개발자가 SQL를 직접 작성하지 않고도 객체를 사용하여 CRUD작업을 수행할 수 있습니다.
객체지향적인 개발방식을 지원하며, 지연로딩, 트랙잭션관리 등의 기능을 제공합니다.
대표적인 ORM 프레임워크로는 Spring Data JPA가 있습니다.
XML이나 Annotation을 통하여 SQL문을 작성하고 객체들을 연결시키는 프레임워크
xml방식은 SQl매퍼를 XML파일에 작성하며 <select>... <resultMap>
등의 요소로 작성합니다.
어노테이션 방식은 @Select
처럼 자바 어노테이션을 활용하여 SQL 매퍼를 작성합니다.
직관적인 매핑
세밀한 제어
유연한 SQL 작성
복잡한 매핑
반복적인 코드
JPA 어노테이션을 사용하여 엔티티 클래스와 데이터베이스 테이블 간의 매핑을 정의
1차캐시, 2차캐시, 지연로딩등을 통해 데이터베이스 액세스 성능에 대한 기능을 제공합니다.
지연로딩을 통해 연관된 엔티티를 필요로 할 때까지 데이터베이스 접근을 지연시킵니다. 불필요한 데이터베이스 액세스를 피하고 성능을 향상시킬 수 있습니다. 보통 지연로딩을 기본으로 설정하게 되고 이는 어노테이션을 통해 관리합니다.
또한, JPA는 컴파일타임에 스키마와의 일치성과 구문 오류를 확인할 수 있습니다.
객체 지향적
자동 매핑
Easy CRUD
생산성 향상
유지보수 용이
성능 이슈
제한된 데이터베이스 지원
러닝 커브가 있는 편
1학기 파이널 프로젝트 사용 툴 - Spring
JPA
MyBatis
MySQL
Vue
이번 프로젝트를 하면서 느꼈던 MyBatis의 장점은 일단 직관적으로 원하는 값을 얻기 쉽다는 것이었습니다. 하지만 비슷한 코드나 간단한 CRUD작업을 JPA는 자동적으로 제공해주는 반면, 간단한 기능도 코드를 길게 계속 추가를 해야하는 것이 번거로웠습니다.
진행하면서 초기 데이터베이스 설계에서 추가되거나 변경사항이 많았었는데 테이블이나 스키마의 변경이 JPA는 자동적으로 적용되니까 그 부분에서 정말 편리하였습니다. create나 update도 따로 지정할 수 있어서 필요할 때마다 바꾸어서 덕분에 시간적으로 많이 절약했다고 생각합니다. 또한, 알아서 매핑해주기 때문에 잘만 사용하면 오류를 현저히 적게 발생시킬 수 있다고 생각하였습니다.
다만 프로젝트의 짧은 준비기간으로, JPA에 대한 깊은 공부를 하지 않고 사용하였어서 어노테이션 및 흐름에 있어서 이해를 하는데에 어려움이 크긴 했습니다. 1:N 관계에서 순환참조나 참조무결성같은 오류를 발견하였고 해결하기 위해 시간을 더 내어 공부를 해보았습니다.
이상으로 MyBatis와 JPA의 차이점에 대해서 알아보았습니다!
세밀한 제어가 필요하거나 SQL 중심적인 개발 방식을 선호한다면 마이바티스를,
ORM의 장점을 느끼고 매핑작업을 간편하게 처리하여 개발 시간을 단축하고 싶다면 JPA를 사용해보세요😊
그립습니다 쭈피셜