MyBatis는 SQL Mapper 프레임워크로, 개발자가 직접 SQL을 작성하고 Java 객체와 SQL 간 매핑을 수행할 수 있도록 지원하는 기술입니다.
JPA(Java Persistence API)는 ORM(Object Relational Mapping) 기술의 표준 인터페이스로, 객체와 데이터베이스 테이블을 매핑하여 보다 직관적인 데이터 조작을 가능하게 합니다.
{
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);
} 
✅ 복잡한 SQL을 직접 작성할 수 있어 최적화가 용이함
✅ SQL을 잘 알고 있는 개발자에게 친숙하며, 학습 비용이 상대적으로 낮음
✅ XML 기반의 SQL 분리로 인해 코드의 가독성이 향상됨 (개인차 존재)
❌ 객체지향적인 개발이 어렵고, 유지보수 비용이 높을 수 있음
✅ JPQL을 이용해 객체지향적인 쿼리 작성이 가능
✅ 특정 DBMS에 종속되지 않아 유지보수 및 확장성이 높음
✅ 영속성 컨텍스트를 활용하여 변경 사항을 자동으로 반영
✅ 코드가 간결해지고 유지보수가 쉬움
✅ 객체와 데이터 간의 패러다임 불일치 문제 해결
객체 지향 프로그래밍에서는 상속(Inheritance) 이 자연스럽게 사용되지만, 관계형 데이터베이스에는 상속 개념이 존재하지 않습니다.
MyBatis의 경우
INSERT INTO person ...
INSERT INTO employee ...
SELECT p.*, e.*
FROM person p JOIN employee e ON p.id = e.id;
JPA의 경우
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public class Person { ... }
@Entity
public class Employee extends Person { ... }
JPA를 활용하면 복잡한 SQL을 작성하지 않아도, 객체 지향적인 방식으로 데이터를 관리할 수 있습니다.
| 객체 | 관계형 데이터베이스 |
|---|---|
| 객체 레퍼런스를 통해 관계 표현 | 외래 키(Foreign Key) 사용 |
| 방향성이 존재 (단방향, 양방향) | 방향성이 없음 (JOIN을 활용) |
| 다대다 관계 지원 | 다대다 관계가 직접적으로 불가능, 조인 테이블 필요 |
MyBatis의 경우
JPA의 경우
@OneToMany(mappedBy = "employee")
private List<Task> tasks;
JPA를 사용하면 객체 간 관계를 자연스럽게 모델링할 수 있으며, 데이터 조작도 직관적으로 수행할 수 있습니다.
1) MyBatis를 사용한 경우
2) JPA를 사용한 경우
개인적인 결론