With AI

MyBatis와 JPA의 관계

  • -
반응형

MyBatis와 JPA의 관계

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)

엔티티의 생명주기

  1. 비영속 (Transient): new로 객체를 생성했지만 아직 영속성 컨텍스트에 저장되지 않은 상태
  2. 영속 (Persistent): EntityManager.persist(entity)로 저장되어 관리되는 상태
  3. 준영속 (Detached): 영속 상태였지만 detach() 또는 clear()를 호출하여 관리에서 제외된 상태
  4. 삭제 (Removed): remove() 메서드로 삭제된 상태
User user = new User();
user.setName("홍길동");

// 영속 상태로 변경
em.persist(user);

// 트랜잭션 커밋 시 자동 반영
em.getTransaction().commit();
 

(5) Cascade (영속성 전이) & Fetch (데이터 로딩 방식)

  • Cascade: 부모 엔티티가 변경될 때 연관된 자식 엔티티도 같이 변경되도록 설정
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL)
private List<Order> orders;
  • EAGER: 즉시 로딩
    • LAZY: 지연 로딩 (필요할 때만 로드) -> 성능 최적화를 위해 기본적으로 권장됨Fetch: 연관된 데이터를 가져오는 방식
@ManyToOne(fetch = FetchType.LAZY)
private User user;

3. JPA의 장점과 단점

✅ JPA의 장점

  1. 생산성 향상: SQL을 직접 작성할 필요 없이 객체 중심 개발 가능
  2. 유지보수성 증가: 엔티티 기반으로 코드가 작성되므로 코드의 일관성이 유지됨
  3. 자동 변경 감지(Dirty Checking): persist() 후 객체 필드 변경 시 자동으로 반영됨
  4. 지연 로딩(Lazy Loading) 지원: 필요할 때만 데이터를 가져와 불필요한 성능 낭비 방지
  5. 트랜잭션 관리 용이: @Transactional을 활용한 일괄적인 트랜잭션 관리 가능

❌ JPA의 단점

  1. 러닝 커브: 처음 배우기가 쉽지 않으며, 개념이 많음
  2. SQL 최적화 필요: 단순한 CRUD에는 효율적이지만 복잡한 쿼리는 튜닝이 필요
  3. N+1 문제: 잘못된 Fetch 전략을 사용하면 다량의 추가 쿼리가 발생할 수 있음
    • 해결 방법: JOIN FETCH, @BatchSize, EntityGraph 활용

정리

  • MyBatis는 SQL을 직접 작성하는 방식이고, JPA는 ORM 기반으로 객체 중심 개발이 가능하도록 지원하는 표준 API입니다.
  • JPA는 유지보수성과 생산성이 뛰어나지만 학습 곡선이 있고, SQL 최적화가 필요할 수 있습니다.
  • MyBatis와 JPA를 함께 사용할 수도 있으며, JPA를 기본으로 사용하고 복잡한 쿼리는 MyBatis를 활용하는 방법도 고려할 수 있습니다.
반응형

'With AI' 카테고리의 다른 글

Maven이란?  (0) 2025.02.24
Gradle이란?  (0) 2025.02.23
Flutter에서 사용되는 Riverpod  (0) 2025.02.20
Java/Kotlin과 Spring 관계  (0) 2025.02.19
React Native와 Flutter 차이  (0) 2025.02.18
Contents

포스팅 주소를 복사했습니다.

이 글이 도움이 되었다면 공감 부탁드립니다.