JPA VS Mybatis
JPA와 MyBatis는 데이터베이스와의 상호작용을 위한 두 가지 주요 프레임워크로, 서로 다른 철학과 사용 방식을 가지고 있다.
JPA (Java Persistence Api)
자바 ORM (Object-Relational Mapping)을 구현하는 표준 스펙. OOP 언어에서 사용하는 객체 모델과 RDB 테이블 간의 매핑을 자동으로 처리해준다.
특징
- ORM: JPA는 객체와 데이터베이스 테이블 간의 매핑을 자동으로 처리. SQL을 직접 작성하지 않아도, 엔터티 클래스와 데이터베이스 테이블 간의 매핑 규칙을 기반으로 데이터를 저장하고 조회한다
- 추상화: SQL 대신 JPQL(Java Persistence Query Language)을 사용하여 객체를 기반으로 쿼리를 작성한다
- 자동 관리: 영속성 컨텍스트를 통해 데이터베이스와 객체 상태를 자동으로 동기화하며, 변경 감지, 지연 로딩(lazy loading), 캐싱 등 고급 기능을 제공합니다
장점
- 생산성: 반복적인 SQL 작성이 필요 없으며 객체 중심으로 개발이 가능하여 생산성을 높일 수 있다
- 유지보수성: 코드와 데이터베이스 간의 의존성을 줄이고, 객체 모델만 수정해도 데이터베이스 변경 사항이 반영된다
- 표준화: JPA는 자바의 표준 스펙으로, 특정 구현체(Hibernate, EclipseLink 등)를 선택하여 사용할 수 있다
단점
- 복잡성: 복잡한 쿼리나 대량의 데이터 처리가 필요할 때는 최적화가 어렵고 비효율적일 수 있다
- 러닝 커브: 초반 설정과 학습이 어렵고, 지연 로딩 등 고급 기능의 이해가 필요하다
이럴 때 사용
- 객체 중심의 도메인 모델이 중요한 경우: 복잡한 비즈니스 로직을 객체로 모델링하여 관리하는 도메인 주도 설계(DDD) 환경
- 데이터베이스 독립성이 필요한 경우: 여러 데이터베이스 벤더를 사용하거나, 데이터베이스 변경 가능성이 높은 경우
- 변경 추적 및 자동화된 데이터 관리가 필요한 경우: 엔터티 상태 변화에 따른 자동 동기화가 유리할 때
Mybatis
특징
- SQL Mapper: MyBatis는 SQL과 자바 객체 간의 매핑을 수동으로 정의. 개발자가 직접 SQL을 작성하며, 복잡한 쿼리를 유연하게 처리할 수 있다
- SQL 제어: 개발자가 SQL 실행을 완전히 제어할 수 있어서 최적화된 SQL 작성이 가능하다
- XML 또는 Annotation 기반: SQL 매핑은 주로 XML 파일에 정의하거나, 자바 코드 내에서 애노테이션으로 정의한다
장점
- 복잡한 SQL 처리: 복잡한 쿼리 작성, 조인, 서브쿼리, 대량 데이터 처리 등에 최적화
- 제어성: SQL을 직접 작성하므로, 데이터베이스의 특수 기능(예: 저장 프로시저, 특정 데이터베이스 문법)을 사용할 수 있다
- 간단한 구조: ORM과 달리, 데이터베이스 스키마와 자바 객체 간의 간단한 매핑을 제공
단점
- 생산성 저하: 반복적인 SQL 작성이 필요하므로, 개발 속도가 느려질 수 있다
- 유지보수성: SQL과 코드가 분리되어 있어, 데이터베이스 구조가 변경되면 관련 SQL을 수동으로 수정해야 한다
- 비표준성: 특정 데이터베이스에 종속적인 SQL을 작성할 경우, 데이터베이스 변경 시 수정이 필요하다
이럴 때 사용
- 복잡한 SQL이 필요한 경우: 복잡한 쿼리, 동적 쿼리, 최적화된 SQL이 필요한 환경
- 데이터베이스 특화 기능을 사용하는 경우: 특정 데이터베이스의 기능을 적극 활용해야 할 때
- SQL 제어가 중요한 경우: 개발자가 SQL의 실행 흐름과 성능을 완벽히 제어해야 하는 경우
JPA와 MyBatis의 비교 요약
항목 | JPA | MyBatis |
철학 | 객체 중심 (ORM) | SQL 중심 (SQL Mapper) |
쿼리 작성 | JPQL 또는 메서드 기반 | 직접 SQL 작성 |
생산성 | 높은 생산성 (반복 SQL 제거) | 낮은 생산성 (SQL 직접 작성 필요) |
유지보수 | 엔터티와 매핑된 테이블 자동 동기화 | SQL과 코드 분리로 유지보수 필요 |
복잡한 쿼리 | 상대적으로 어려움 (네이티브 SQL 필요) | 복잡한 쿼리 처리 용이 |
러닝 커브 | 높음 | 비교적 낮음 |
사용 사례 | 도메인 중심 설계, 자동화된 데이터 관리 | 복잡한 SQL, 성능 최적화 필요 |
선택 가이드
- JPA: 객체 중심의 설계가 중요하고, 데이터베이스 독립성 및 자동화된 데이터 관리가 필요할 때
- MyBatis: SQL을 세밀하게 제어하고, 복잡한 쿼리나 대규모 데이터 처리가 필요한 상황
레퍼런스
- chatGPT