자바 기반의 애플리케이션에서는 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를 사용하는 것이 좋은 경우