JPA vs MyBatis

김정민·2025년 3월 28일

DB

목록 보기
1/2

1. MyBatis와 JPA의 개념

MyBatis란?

MyBatis는 SQL Mapper 프레임워크로, 개발자가 직접 SQL을 작성하고 Java 객체와 SQL 간 매핑을 수행할 수 있도록 지원하는 기술입니다.

MyBatis의 특징

  • SQL을 직접 작성하여 사용자가 쿼리를 완전히 제어할 수 있음
  • 복잡한 쿼리 작성 및 최적화에 용이
  • XML 또는 어노테이션을 활용한 SQL 관리 가능

JPA란?

JPA(Java Persistence API)는 ORM(Object Relational Mapping) 기술의 표준 인터페이스로, 객체와 데이터베이스 테이블을 매핑하여 보다 직관적인 데이터 조작을 가능하게 합니다.

JPA의 특징

  • ORM 기반으로 객체와 테이블 간 매핑을 자동화
  • JPQL(Java Persistence Query Language)을 사용하여 쿼리 작성 가능
  • 특정 DBMS에 종속되지 않고 독립적으로 프로젝트 수행 가능
  • 영속성 컨텍스트를 통해 객체 변경 사항을 자동으로 추적 및 반영
    {
    			Employee e = em.find(Employee.class, 1); /// id가 1인 녀석		
    			System.out.println(e);
    			//find를 통해서 영속화를 이미 시켜놨기 때문에 값이 바뀌는 것을 볼 수 있다. 
    			e.setAddress("대전 어디"); // 하지만 이 시점에 update 되는 것은 아니다. 영속화된 객체의 field값을 변경하면 DB에 반영이 된다.
    			System.out.println(e);
    			//....
    			e.setAddress("부산 어디");
    			System.out.println(e);
    		}

2. MyBatis와 JPA의 장단점 비교

MyBatis의 장점

✅ 복잡한 SQL을 직접 작성할 수 있어 최적화가 용이함

✅ SQL을 잘 알고 있는 개발자에게 친숙하며, 학습 비용이 상대적으로 낮음

✅ XML 기반의 SQL 분리로 인해 코드의 가독성이 향상됨 (개인차 존재)

❌ 객체지향적인 개발이 어렵고, 유지보수 비용이 높을 수 있음


JPA의 장점

✅ JPQL을 이용해 객체지향적인 쿼리 작성이 가능

✅ 특정 DBMS에 종속되지 않아 유지보수 및 확장성이 높음

✅ 영속성 컨텍스트를 활용하여 변경 사항을 자동으로 반영

✅ 코드가 간결해지고 유지보수가 쉬움

✅ 객체와 데이터 간의 패러다임 불일치 문제 해결

3. 패러다임 불일치 문제와 JPA의 해결 방법

1. 객체 상속과 관계형 데이터베이스

객체 지향 프로그래밍에서는 상속(Inheritance) 이 자연스럽게 사용되지만, 관계형 데이터베이스에는 상속 개념이 존재하지 않습니다.

MyBatis의 경우

  • 개발자가 직접 테이블을 나누거나 JOIN을 사용하여 데이터를 조회해야 함
INSERT INTO person ...
INSERT INTO employee ...
SELECT p.*, e.*
FROM person p JOIN employee e ON p.id = e.id;

JPA의 경우

  • JPA는 객체의 상속 구조를 테이블에 매핑할 수 있는 전략을 제공
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Person { ... }

@Entity
public class Employee extends Person { ... }

JPA를 활용하면 복잡한 SQL을 작성하지 않아도, 객체 지향적인 방식으로 데이터를 관리할 수 있습니다.


2. 객체 간 관계와 관계형 데이터베이스

객체관계형 데이터베이스
객체 레퍼런스를 통해 관계 표현외래 키(Foreign Key) 사용
방향성이 존재 (단방향, 양방향)방향성이 없음 (JOIN을 활용)
다대다 관계 지원다대다 관계가 직접적으로 불가능, 조인 테이블 필요

MyBatis의 경우

  • 직접 외래 키를 관리해야 하며, 다대다 관계는 조인 테이블을 만들어 해결해야 함

JPA의 경우

  • 객체 간 참조를 설정하면, 데이터베이스 테이블 간의 관계도 자동으로 관리됨
@OneToMany(mappedBy = "employee")
private List<Task> tasks;

JPA를 사용하면 객체 간 관계를 자연스럽게 모델링할 수 있으며, 데이터 조작도 직관적으로 수행할 수 있습니다.

4. 실전 적용: 개인 프로젝트에서 JPA와 MyBatis 사용해본 소감

1) MyBatis를 사용한 경우

  • SQL을 직접 작성하여 관리하므로, XML 파일을 통해 SQL을 명확히 분리 가능
  • 코드가 직관적이며, 쿼리 최적화가 용이
  • 하지만, SQL 작성이 번거로울 수 있음

2) JPA를 사용한 경우

  • 데이터베이스 프레임워크가 변경되더라도 유연하게 대응 가능
  • JPQL을 통해 객체 기반 쿼리를 작성할 수 있음
  • 하지만, 특정 DBMS를 사용하고 변경 계획이 없다면 장점이 크게 와닿지 않을 수도 있음

개인적인 결론

  • SQL 최적화가 중요한( 섬세하고 복잡한 쿼리가 요구되는) 프로젝트에서는 MyBatis가 더 적합
  • 객체 중심의 데이터 모델링이 중요한 프로젝트에서는 JPA가 더 효율적
  • 결국, 프로젝트의 성격과 요구 사항에 따라 선택하는 것이 중요함
profile
computer science engineering

0개의 댓글