본문 바로가기
프로그래밍 언어/JAVA(JSP, Spring)

JPA vs MyBatis 핵심 차이점, 사용 방식, 용도 완벽 정리

by upself 2025. 11. 20.
728x90

Java 기반 백엔드 개발에서 데이터베이스 연동은 필수적입니다. 이때 주로 사용되는 기술이 JPA (Java Persistence API)MyBatis입니다. 이 두 기술은 모두 데이터 영속성(Persistence)을 처리하지만, 접근 방식과 철학에서 큰 차이를 보입니다. 

1. 개념 및 구조적 차이 : ORM vs SQL Mapper

핵심 역할 ORM (Object-Relational Mapping) 기술의 자바 표준 명세 SQL Mapper 프레임워크
구조적 접근 객체 중심 개발. 자바 객체와 데이터베이스 테이블을 자동으로 매핑 SQL 중심 개발. 개발자가 작성한 SQL과 자바 객체(DTO/VO)를 매핑
SQL 작성 직접 작성할 필요가 적음. 엔티티 매핑과 메소드 이름/JPQL을 통해 자동 생성/실행 SQL을 직접 작성하고 XML 파일 또는 애노테이션으로 관리
핵심 구현체 Hibernate, EclipseLink 등 (JPA는 명세, 구현체가 실제 기능 제공) MyBatis 프레임워크 자체
데이터 독립성 높음. DB가 변경되어도 객체 모델만 유지되면 코드 수정이 적음 (방언(Dialect) 지원) 낮음. 특정 DB에 최적화된 SQL을 사용하면 DB 변경 시 SQL 전체를 수정해야 함

JPA (ORM)

JPA는 객체 지향 프로그래밍의 패러다임을 관계형 데이터베이스로 확장하는 것을 목표로 합니다.

  • 객체 중심 : 개발자는 테이블이 아닌 엔티티(Entity) 객체를 다루며, 데이터베이스와의 상호작용은 JPA가 대신 처리합니다.
  • 생산성 : 기본적인 CRUD(Create, Read, Update, Delete) 작업은 메소드 호출만으로 자동 처리되어 반복적인 SQL 작성 부담이 크게 줄어듭니다.
  • 영속성 컨텍스트 : 데이터를 캐싱(1차 캐시), 변경 감지(Dirty Checking), 지연 로딩(Lazy Loading) 등 고급 기능을 제공하여 성능 최적화와 트랜잭션 관리를 돕습니다.

MyBatis (SQL Mapper)

MyBatis는 개발자가 작성한 SQL과 자바 객체 간의 매핑을 단순화해주는 프레임워크입니다.

  • SQL 중심 : SQL을 직접 작성하고, 그 결과를 DTO(Data Transfer Object)나 VO(Value Object)에 매핑합니다.
  • 세밀한 제어 : 복잡하고 특수한 SQL 튜닝 및 최적화가 필수적인 경우에 개발자가 직접 SQL의 모든 것을 제어할 수 있어 유리합니다.
  • 명확한 분리 : SQL 코드를 XML 파일 등에 명확하게 분리하여 관리하므로, SQL 전문가와의 협업이 용이합니다.

2. 사용 방식 및 코드 예시

JPA 사용 방식

SQL 없이 객체 메소드 호출로 데이터 작업을 수행합니다.

  1. 엔티티(Entity) 정의 : @Entity, @Id 등의 어노테이션으로 클래스와 필드를 테이블 및 컬럼에 매핑합니다.
  2. Repository 인터페이스 : Spring Data JPA에서는 JpaRepository를 상속받는 인터페이스를 정의합니다.
  3. 쿼리 : 간단한 조회는 메소드 이름을 규칙에 맞게 정의하고(예: findByUserIdAndName(...)), 복잡한 쿼리는 JPQL (Java Persistence Query Language)이나 QueryDSL을 사용합니다.
// Spring Data JPA Repository 예시
public interface UserRepository extends JpaRepository<User, Long> {
    // 메소드 이름으로 쿼리 자동 생성
    List<User> findByEmail(String email); 
    
    // JPQL을 사용한 쿼리
    @Query("SELECT u FROM User u WHERE u.age > :minAge")
    List<User> findUsersOlderThan(@Param("minAge") int minAge);
}

MyBatis 사용 방식

SQL을 직접 작성하고 이를 자바 메소드와 연결하여 사용합니다.

  1. Mapper 인터페이스 : SQL을 실행할 메소드를 정의합니다.
  2. XML Mapper 파일 : <select>, <insert>, <update>, <delete> 태그를 사용하여 SQL 쿼리를 직접 작성하고, 동적 쿼리는 <if>, <choose>, <foreach> 등의 태그로 처리합니다.
  3. 매핑 : XML 내에서 쿼리 결과를 DTO/VO에 매핑합니다.
<!-- MyBatis XML Mapper 예시 -->
<mapper namespace="com.example.UserMapper">
    <select id="selectUsersByEmail" resultType="com.example.UserDTO">
        SELECT user_id, name, email
        FROM users
        WHERE email = #{email}
    </select>
    
    <select id="selectUsersOlderThan" resultType="com.example.UserDTO">
        SELECT *
        FROM users
        WHERE age > #{minAge}
    </select>
</mapper>

 

3. 프로젝트 용도에 따른 선택

JPA (ORM) 객체 지향 설계 및 생산성 최우선


- 복잡한 도메인 모델: 상속, 연관관계 등 객체 관계가 복잡하여 객체지향적인 접근이 필요한 경우


- 유지보수 용이성: DB 스키마 변경이 잦거나, DB 독립성이 중요할 때


- 개발 초기 속도: 기본적인 CRUD가 많아 빠른 개발이 필요할 때


- 적합 프로젝트: 신규 프로젝트, 엔터프라이즈 애플리케이션, 비즈니스 로직이 복잡한 서비스
MyBatis (SQL Mapper) SQL 제어 및 성능 최적화 최우선


- 레거시/대규모 서비스: 기존 SQL 인프라를 활용하거나, 복잡하고 최적화된 SQL을 반드시 사용해야 하는 경우


- 동적 쿼리: 조건에 따라 SQL 구조가 크게 변하는 동적 쿼리가 많은 경우 (XML로 제어 용이)


- DB 함수/프로시저: 특정 DB의 고급 기능(함수, 저장 프로시저)을 적극적으로 활용할 때


- 적합 프로젝트: 성능 튜닝이 매우 중요한 서비스, 기존 DB 구조에 맞춰야 하는 레거시 통합 프로젝트

 

최신 트렌드 : 많은 기업에서는 기본적인 CRUD는 JPA로 처리하고, JPA로 해결이 어렵거나 성능 최적화가 필요한 복잡한 조회 쿼리에 한해서만 MyBatis 또는 Native Query를 혼용하는 전략을 사용하고 있습니다.

반응형