보통 JPA를 쓰면 Entity 와 Repository 만으로도 DB CRUD 를 할 수 있는데, 현업에서는 JPA + Mapper(MyBatis 같은 매퍼) 를 같이 쓰는 경우 종종 있다!! 왜그런지 이유는??
🔹 JPA만으로 부족한 부분
- 복잡한 SQL 제어 어려움
- JPA는 객체 중심이라 동적 SQL, 복잡한 조인, 집계 쿼리 작성이 불편
- JPQL/Criteria API로 가능하긴 하지만, 가독성이 떨어지고 SQL 최적화 제어가 어려움
- DB 특화 기능 한계
- 오라클의 힌트, Tibero/Postgres의 특정 함수, Window 함수 등은 JPA 표준으로 다루기 어렵습니다.
- NativeQuery로 가능하지만, 유지보수가 불편
- 대용량 배치 처리
- JPA는 1차 캐시/영속성 컨텍스트를 사용하기 때문에 대량 데이터 처리 시 메모리 이슈가 발생
- 반면 MyBatis 같은 매퍼는 JDBC에 가깝게 동작해서 대량 insert/update/delete에 더 적합
🔹 Mapper(JDBC 기반) 같이 쓰는 이유
- 복잡한 조회 최적화
→ 조회 전용, 보고서성 쿼리, 다중 조인/서브쿼리는 Mapper(SQL 직작성)이 훨씬 깔끔. - 성능 제어 필요
→ SQL 튜닝, 인덱스 활용, DB Vendor 최적화 기능(힌트 등) 적용이 쉬움. - 대량 작업 (Batch)
→ Mapper는 executorType=BATCH 로 한번에 처리 가능.
→ JPA의 saveAll() 보다 메모리 안정적이고 빠름. - Legacy 호환
→ 기존 DB 스키마가 JPA 엔티티 매핑하기 까다롭다면 Mapper로 직접 매핑. - SQL 명확성
→ JPA는 SQL이 추상화되어 보이지 않는데, Mapper는 작성한 SQL이 그대로 실행되므로 디버깅/운영자 공유가 용이.
🔹 결론
👉 트랜잭션/일반 CRUD → JPA
👉 복잡 조회, 대량 배치, 튜닝 필요 SQL → Mapper
즉, JPA는 객체지향적 개발 편의성을, Mapper는 DB 성능 최적화와 유연한 SQL 제어를 위해 서로 보완적으로 사용
'DB' 카테고리의 다른 글
DB 파티션이란? (0) | 2025.09.12 |
---|---|
정규화 / 반정규화 란?? (0) | 2025.06.04 |
JPA (0) | 2025.01.16 |
Mybatis (0) | 2024.12.02 |
Spring <-> Oracle 연동방법 (0) | 2024.11.29 |