JPA
JPA는 자바 애플리케이션에서 객체와 관계형 데이터베이스 테이블 간의 매핑을 관리하는 API로, 객체 관계 매핑(ORM)을 지원합니다. JPA는 SQL 쿼리를 직접 작성할 필요 없이 객체 모델을 기반으로 데이터베이스에 접근할 수 있는 방법을 제공합니다.
특징
- JPA는 객체 모델을 사용하여 관계형 데이터베이스를 다루기 대문에, 개발자는 SQL을 신경 쓸 필요 없이 객체 간의 관계를 설정하고 자동으로 데이터를 저장하거나 로드할 수 있습니다.
- JPQL(Java Persistence Query Language)을 사용하여 SQL처럼 쿼리를 작성하되, 데이터베이스 독립적으로 쿼리를 생성할 수 있습니다.
- JPA는 데이터베이스 벤더에 의존하지 않으므로, 데이터베이스 교체 시 코드 수정이 적습니다.
장점
- JPA는 객체 매핑을 자동으로 처리하고, 엔티티 간 관계도 설정할 수 있기 때문에 코드의 양을 크게 줄이고 개발 속도를 높입니다.
- ORM을 활용하면 객체 모델이 데이터베이스와 일관되게 유지되므로, 데이터베이스 구조 변경시 코드 수정이 상대적으로 간단합니다.
- JPA는 트랜잭션 처리 및 1차 캐시를 자동으로 관리하여 성능을 최적화하고, 데이터베이스 호출 횟수를 최소화할 수 있습니다.
단점
- 복잡한 쿼리나 조인이 많은 쿼리에서는 JPA의 추상화로 인해 성능 문제가 발생할 수 있습니다. 예를 들어 N + 1가 발생할 수 있습니다.
더보기
JPA N + 1 문제 :
1번 조회해야할 것을 N개의 종류의 데이터 각각을 추가로 조회하게 되서 총 N + 1번 DB조회를 하게 되는 문제이다.
ex) 데이터 조회 시 1번만 조회할 것을 5만개 종류의 데이터가 있어 50,001번 DB 조회하게 되는 문제이다.
- JPA에서 지원하는 기능이 많은 만큼 내부 로직에 이해와 학습에 대한 어려움이 존재할 수 있습니다.
MyBatis
MyBatis는 자바 객체와 SQL 사이의 매핑을 직접 설정하는 프레임워크입니다. JPA와 달리 SQL 쿼리를 직접 작성하여 데이터베이스와의 상호작용을 제어할 수 있습니다. MyBatis는 복잡한 쿼리나 데이터베이스 성능 최적화가 필요한 경우에 유용하게 사용할 수 있습니다.
특징
- MyBatis는 XML 또는 어노테이션을 사용하여 SQL 쿼리를 직접 작성하고, 이를 자바 객체와 매핑합니다. 그러기 때문에 개발자는 SQL을 완전 제어할 수 있습니다.
- MyBatis는 SQL을 완전히 제어할 수 있어 복잡한 쿼리나 데이터베이스 최적화에 매우 유용합니다.
- SQL 기능을 제공하여, 조건에 따라 쿼리를 동적으로 생성할 수 있습니다.
- SQL 쿼리가 XML 파일로 분리되어 있기 때문에, SQL의 변경사항이 명확히 드러나고, SQL과 자바 코드의 역할 불리가 잘 이루어 집니다.
장점
- MyBatis는 SQL을 직접 다룰 수 있기 때문에 복잡한 비즈니스 로직을 처리하는데 유리하고, 특정 성능 최적화가 필요한 상황에 적합합니다.
- SQL 최적화에 유리하여, 인덱스를 활용한 쿼리 최적화나 복잡한 조인을 최적화하는 데 더 용이합니다.
- SQL이 XML 파일에 명시적으로 기록되어 있기 때문에, 쿼리 로직을 쉽게 수정하거나 이해할 수 있습니다.
단점
- SQL을 매번 작성해야 하기 때문에, JPA보다 더 많은 코드가 필요하고 코드 중복 또한 발생할 수 있습니다.
- 객체 모델과 데이터베이스 테이블 간의 매핑을 개발자가 직접 관리해야 해 실수로 인해 불일치가 발생할 수 있습니다.
- 복잡한 객체 관계를 다루는 데 있어 JPA만큼 직관적이지 않아 개발자가 직접 매핑 로직을 작성해야 할 수 있습니다.
JPA vs MyBatis
JPA가 적합한 경우
- 비즈니스 도메인의 모델을 객체로 자연스럽게 매핑하고 싶을 때 JPA는 매우 유용합니다.
- 빠른 개발과 유지보수가 중요한 경우 데이터 베이스와 매핑을 자동화하여 유용합니다.
- 데이터베이스 교체가 자주 있을 수 있는 프로젝트에서는 JPA가 벤더에 독립적이기 때문에 유리합니다.
MyBatis가 적합한 경우
- 복잡한 쿼리를 다루는 시스템에서는 SQL을 직접 작성하고 최적화할 수 있기 때문에 유리합니다.
- SQL을 완전히 제어하고 싶을때 사용하면 다양한 조건에 따라 쿼리를 유연하게 작성할 수 있어 유리합니다.
- 성능에 민감한 작을 할 때, SQL을 세밀하게 제어하고 싶다면 MyBatis가 더 유리합니다.
결론
사실 JPA만 사용하다 보니 편리하게 SQL을 사용했지만 경우에 따라서 MyBatis를 사용해보면 좋을거 같습니다. 한 번도 사용해 보지 않아서 찾아보게 되었는데 생각보다 MyBatis는 까다로운거 같았습니다 경우에 따라서 쉬운 SQL문은 JPA로 복잡한 부분은 MyBatis를 사용해 보고싶습니다.