오늘은 Java 기반 데이터 액세스 기술의 대표적인 ORM vs SQL Mapper에 대한 글을 작성해보려 한다.
JPA, MyBatis
- Java Application에서 DB와 상호작용을 위한 프레임워크

MyBatis
- SQL Mapper 프레임워크
- SQL 쿼리를 XML이나 annotation 으로 정의하여 사용


MyBatis - 동적 SQL
자바코드로 처리하기 보다는 xml 코드로 처리하는게 빈번하다.


MyBatis - 트랜잭션


MyBatis 장단점
-
장점
- 직관적이고 명시적인 SQL 관리
- 유연성(동적SQL)
-
단점
- 코드량 증가
- 반복적인 SQL 코드, Mapper XML 등등
- Object-Relational 불일치 문제
- 객체 지향 설계(OOP)와 관계형 DB(RDB) 간의 불일치
- SQL 지식 필요
JPA(Java Persistence API)
관계형 DB 를 객체지향설계를 할 수 있게 끔 class 로 만들면 되지 않을까? 해서 나오게 된 기술
-
Object Relational Mapping(ORM) 표준 API
- Java EE(Enterprise Edition)의 표준
- 구현체: Hibernate, EclipseLink
-
DB 테이블을 Java 객체로 Mapping 하여 OOP와 RDB 간의 간극을 줄임
-
annotation 기반 설정으로 Mapping을 정의( XML 불필요 )
-
영속성 컨텍스트
- 1차 캐시 역할을 하여 DB의 부하를 줄임
- 지연 로딩(lazy loading)을 통해 필요한 시점에 데이터를 로딩하여 성능 최적화
-
JPQL(Java Persistence Query Language): Java 객체를 대상으로 쿼리를 작성
JPA(Java Persistence API)
- 클래스만 보고도 DB 테이블이 대충 어떻게 생겼는지 예측 가능
@Entity 라는 어노테이션으로 Pserson 이라는 클래스는 DB 테이블임을 명시


JPA(Java Persistence API) - 동적 SQL
low query 를 사용하기도 하고

low query 를 안쓰면 queryDSL 을 사용해서 동적 SQL 생성 가능

JPA(Java Persistence API) - 트랜젝션


JPA(Java Persistence API) 장단점
-
장점
- 생산성 향상: 자동화된 CRUD, DB도 이젠 객체지향 설계!
- 트랜잭션 관리의 자동화: @Transactional 사용
- Entity 간의 관계를 쉽게 관리할 수 있어 1:N, N:1, N:N 관계를 지원함
- 유연성: Java EE의 표준이므로 다양한 구현체 선택 가능
-
단점
- 복잡성 증가: 높은 Learning curve. SQL보다 어려운 JPA 쿼리 작성 방식
- 성능 이슈
- 의도하지 않는 지연 로딩으로 인해 성능이 느려질 수 있음
- 대규모 DB 작업시에는 성능 저하가 발생
- 완전히 해결 할 수 없는 Object-Relational 불일치 문제