본문 바로가기
카테고리 없음

[JPA] save, saveAll 성능차이

by Geunny 2022. 9. 5.
반응형

JPA 내부 소스 ( SimpleJpaRepository.class )

 

save 메서드

@Transactional
public <S extends T> S save(S entity) {
    Assert.notNull(entity, "Entity must not be null.");
    if (this.entityInformation.isNew(entity)) {
        this.em.persist(entity);
        return entity;
    } else {
        return this.em.merge(entity);
    }
}

saveAll 메서드

@Transactional
public <S extends T> List<S> saveAll(Iterable<S> entities) {
    Assert.notNull(entities, "Entities must not be null!");
    List<S> result = new ArrayList();
    Iterator var3 = entities.iterator();

    while(var3.hasNext()) {
        S entity = var3.next();
        result.add(this.save(entity));
    }

    return result;
}

 

소스에서 루프를 돌면서 save 메서드를 호출하게 된다면,

호출할때마다 트랜잭션을 새로 만들어 동작하게 되고,

만약 호출한 서비스레벨에서 트랜잭션이 선언되어 있다면 해당 트랜잭션에 참여하면서 프록시 비용이 발생하게 된다.

 

하지만 saveAll 의 경우 전체 리스트를 동일하게 루프를 돌게 되지만 인스턴스 안에 있는 save 메서드를 호출함으로써 동일한 Bean 객체에서 내부 매서드를 호출하게 되는 경우 이므로 새로운 트랜잭션이 발생하지 않게 된다.

 

즉, 다건을 저장할 경우 save 보단 saveAll 을 사용하는 것이 성능적인 면에서 훨씬 좋은 퍼포먼스를 낼 수 있다.

댓글