JPA vs MyBatis [Spring] [1]

jbong·2025년 2월 17일
0

스프링부트

목록 보기
9/15

자바 기반의 애플리케이션에서는 JPA(Java Persistence API)와 MyBatis와 같은 두 가지 주요 데이터 접근 기술이 널리 사용되는데,
사이드 프로젝트를 진행하면서 JPA를 통해 구현하던 중, MyBatis와 Hibernate라는 다른 접근 방식을 접하게 되어 이에 대한 정리를 기록하고자 한다.


JPA

JPA 어노테이션을 사용하여 엔티티 클래스와 데이터베이스 테이블 간의 매핑을 정의

    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    @JoinColumn(name = "movie_id")
    private List<Video> videos;
    
    @ManyToOne(cascade = CascadeType.PERSIST)
    @JoinColumn(name = "director_id")
    private Director director;

1차 캐시, 2차 캐시, 지연로딩 등 데이터베이스의 엑세스 성능에 대한 기능을 제공하는데, JPA를 사용하면 가장 큰 장점개발자 직접 SQL 쿼리문을 작성할 필요가 없다는 점이다.
이에 기본적으로 CRUD 작업을 간편하게 처리할 수 있는 API를 제공하며, 매핑 작업이 자동화 되고 수정이 간단하기 때문에 생산성을 향상시킬 수 있다.
반면 단점으로는, 성능 이슈 문제인데, 복잡한 쿼리나 대량의 데이터를 처리하는 등 성능이 중요한 상황에서는 직접 SQL을 작성하는 것이 효율적이다.

대량의 데이터를 활용해야하는 공공 API 같은 경우 혹은 정자정부 프레임워크에서 기준을 Mybatis를 선호하며, 현업에서는 Mybatis를 사용한다고 한다.


Mybatis

SQL을 직접 작성하여 데이터베이스와 상호작용하는 프레임워크

@Repository
public interface BoardRepository extends JpaRepository<Board, Long> {
    @Query("SELECT b FROM Board b JOIN b.user u WHERE " +
            "(LOWER(b.brdTitle) LIKE LOWER(CONCAT('%', :keyword, '%')) " +
            "OR LOWER(b.brdContent) LIKE LOWER(CONCAT('%', :keyword, '%')) " +
            "OR LOWER(u.memNickname) LIKE LOWER(CONCAT('%', :keyword, '%')))")
    List<Board> searchByKeyword(@Param("keyword") String keyword);
}

개발자 직접 SQL를 작성한다. 이로 인해 장점은 복잡한 쿼리를 세밀하게 작업할 수 있으며 직접 작성하기 때문에 복잡한 쿼리나 대량의 데이터 처리에 유리하기에 성능 최적화가 용이하다.
다만 단점으로는 같은 코드를 반복적으로 작업해야 하는 경우, 번거롭고 양이 많아질 수 있으며 개발자가 직접 객체와 관계 매핑을 처리 해야 하기 때문에 그만큼 복잡하다.


📌 그래서?

JPA를 사용하는 것이 좋은 경우

  • 빠른 개발 주기가 필요할 때
  • 복잡한 관계 매핑을 정의하기 번거로울 때
  • 복잡한 쿼리, 대량의 데이터를 처리해야 하는 프로젝트가 아닐 때

Mybatis를 사용하는 것이 좋은 경우

  • 세밀한 작업이 필요할 때
  • 성능 최적화
  • 개발자가 직접 쿼리로 제어를 하고 싶을 때
profile
노력하는 개미

0개의 댓글