[JDBC] JPA vs MyBatis의 데이터 저장 로직 차이
2025. 2. 26. 13:59ㆍ카테고리 없음
Mybatis를 사용하면서 JPA를 사용하던 습관으로, 동일한 키값에 대해 insert를 해주면 duplicated 처리가 되는것이 아니라
key값을 제외한 내용이 update가 될것이라고 생각했다.
그러나 MyBatis는 위와 같은 처리에 대해 DuplicateKeyException이 발생했다.
JPA의 데이터 저장 로직에 차이가 있기 때문이다.
1. JPA 동작 방식
- 영속성 컨텍스트(Persistence Context) : EntityManager나 JpaRepository를 통해 엔티티를 관리한다.
- 자동 병합(Merge) 동작 :
- entityManager.persist(entity) : 새로운 엔티티를 저장
- entityManager.merge(entity) : 이미 존재하는 ID를 가진 엔티티는 UPDATE, 없는 경우 INSERT.
- save() 메서드를 사용할 때 @Id 값이 있으면 UPDATE, 없으면 INSERT 수행.
- JPA에서는 동일한 ID에 대해 persist가 아닌 merge, save를 사용하면 중복 에러가 발생하지 않는다.
Order order = new Order();
order.setId(1L); // 기존 ID
orderRepository.save(order); // 자동으로 update 처리
2. MyBatis 동작 방식
- MyBatis는 JPA처럼 영속성 컨텍스트가 없고, SQL을 직접 작성해야 한다. 즉 내가 merge기능을 처리하도록 쿼리를 짜야지만 JPA처럼 동작할 수 있다는 것이다.
- INSERT 쿼리는 단순히 새 레코드를 추가하며, 중복 키가 존재하면 예외(DuplicateKeyException)을 발생시킨다.
- 중복된 키를 처리하려면 명시적으로 UPDATE 쿼리를 작성해야 한다.
아래 실제 프로젝트에서 insert를 update로 변환한 예시이다. 135번줄 위의 로직에서 이미 동일한 key값에 대한 insert가 수행되었기 때문이다.