MyBatis와 JPA는 모두 Java 기반의 데이터 액세스 기술이지만, 근본적인 접근 방식과 사용 목적이 다릅니다.
MyBatis: SQL 매퍼 프레임워크로, SQL을 직접 작성하고 XML 또는 어노테이션으로 매핑하여 사용합니다. SQL을 세밀하게 제어할 수 있어 복잡한 쿼리에 유리하지만, 객체와 관계형 데이터베이스 간의 매핑(ORM, Object-Relational Mapping) 기능은 제공하지 않습니다.
JPA (Java Persistence API): ORM 표준 기술로, 객체 중심의 프로그래밍을 지원하며 SQL을 직접 작성하지 않고도 데이터베이스와의 매핑을 수행할 수 있습니다. JPA의 대표적인 구현체로는 Hibernate, EclipseLink, OpenJPA 등이 있습니다.
MyBatis와 JPA의 차이점
특징
MyBatis
JPA
접근 방식
SQL 매퍼 (SQL 직접 작성)
ORM (객체 중심 매핑)
SQL 작성 방식
XML 또는 어노테이션을 이용한 명시적 SQL
JPQL 또는 메서드 호출을 통한 SQL 추상화
복잡한 SQL
유연하게 작성 가능
복잡한 SQL 작성이 제한적 (Native Query 필요)
학습 난이도
비교적 쉽고 직관적
학습 곡선이 있음
자동 매핑
부분 지원 (ResultMap)
완전한 ORM 지원
성능 최적화
직접 SQL 튜닝 가능
지연 로딩(Lazy Loading), 캐시, 배치 처리 등의 기능 제공
트랜잭션 관리
별도 설정 필요
@Transactional을 통해 일괄 관리 가능
결론적으로,
MyBatis는 SQL을 세밀하게 제어해야 하는 경우, 복잡한 조회(Query) 성능 최적화가 필요한 경우 적합합니다.
JPA는 객체 중심의 개발을 원하고, 유지보수성과 생산성을 높이고 싶은 경우 유리합니다.
프로젝트에 따라 MyBatis와 JPA를 혼용할 수도 있으며, 일반적으로 JPA를 기본으로 사용하고 복잡한 쿼리는 MyBatis를 병행하는 방식도 고려됩니다.
JPA(Java Persistence API) 상세 설명
1. JPA란?
JPA는 Java 애플리케이션에서 관계형 데이터베이스를 객체 모델로 다룰 수 있도록 하는 ORM (Object-Relational Mapping) 기술의 표준입니다. 즉, 개발자가 SQL을 직접 작성하지 않고도 엔티티(Entity) 객체를 통해 데이터베이스와 상호작용할 수 있도록 도와줍니다.
JPA의 대표적인 구현체
Hibernate (가장 널리 사용되는 JPA 구현체)
EclipseLink
OpenJPA
2. JPA의 주요 개념
(1) Entity (엔티티)
데이터베이스 테이블과 매핑되는 클래스
@Entity 어노테이션을 사용하여 선언
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
}
(2) EntityManager (엔티티 매니저)
엔티티의 영속성(Persistence)을 관리하는 객체
EntityManagerFactory를 통해 생성
엔티티의 생성, 조회, 수정, 삭제 기능을 담당
EntityManagerFactory emf = Persistence.createEntityManagerFactory("my-persistence-unit");
EntityManager em = emf.createEntityManager();
(3) JPQL (Java Persistence Query Language)
JPA에서 제공하는 객체 기반 쿼리 언어
SQL과 유사하지만 엔티티 객체를 대상으로 질의를 수행
TypedQuery<User> query = em.createQuery("SELECT u FROM User u WHERE u.name = :name", User.class);
query.setParameter("name", "홍길동");
List<User> users = query.getResultList();
(4) 영속성 컨텍스트 (Persistence Context)
JPA가 관리하는 엔티티 객체들의 저장 공간
EntityManager가 엔티티의 상태를 추적하며, 트랜잭션이 종료될 때 변경 내용을 자동으로 반영(Flush)
엔티티의 생명주기
비영속 (Transient): new로 객체를 생성했지만 아직 영속성 컨텍스트에 저장되지 않은 상태
영속 (Persistent): EntityManager.persist(entity)로 저장되어 관리되는 상태
준영속 (Detached): 영속 상태였지만 detach() 또는 clear()를 호출하여 관리에서 제외된 상태
삭제 (Removed): remove() 메서드로 삭제된 상태
User user = new User();
user.setName("홍길동");
// 영속 상태로 변경
em.persist(user);
// 트랜잭션 커밋 시 자동 반영
em.getTransaction().commit();