JPA : Bulk 연산의 주의할 점

    JPA의 Bulk 연산

    public void updateMemberName(Long memberId) {
        queryFactory.update(member)
                .set(member.name, "memberA")
                .execute();
    }

    한번에 수많은 값을 수정하거나 삭제하고 싶을 때는 JPA가 제공하는 Bulk 연산을 사용하면 된다. 주로 다음과 같은 형태로 사용할 수 있다. 

     


    JPA의 Bulk 연산 사용 시 주의할 점

    JPA의 Bulk 연산은 영속성 컨텍스트를 거치지 않고 DB에 바로 반영이 된다. 일반적으로 JPQL을 사용했을 때, DB에서 먼저 엔티티를 조회하는 것을 생각하면 당연하다. 대신 Bulk 연산은 DB에 반영된 값을 다시 한번 영속성 컨텍스트에 반영해주지 않는다. 따라서 Bulk 연산을 하게 되면 DB 엔티티의 상태와 영속성 컨텍스트의 엔티티 상태가 서로 다를 수 있다. 

    즉, Bulk 연산을 한 후에는 가급적이면 DB의 엔티티와 영속성 컨텍스트의 엔티티 상태를 동일하게 맞춰주는 작업을 해줘야한다. 

     


    JPA의 Bulk 연산 후, 영속성 컨텍스트 / DB 동기화

    Bulk 연산은 DB로 바로 값이 나가기 때문에 영속성 컨텍스트와 DB의 엔티티가 다를 수 있다. 따라서 이 둘을 동기화 해주어야 한다. 추천하는 방법은 아래 두 가지다.

     

    1. Bulk 연산을 가장 먼저한다.

    Bulk 연산을 가장 먼저하면, 영속성 컨텍스트에는 어떠한 엔티티도 저장되지 않는다. 따라서 Bulk 연산 후, 연산을 해야할 필요가 있으면 DB에서 엔티티를 불러와 영속성 컨텍스트에 영속화 시킨다. 즉, DB와 영속성 컨텍스트의 엔티티 상태가 동기화 된다. 

     

    2. Bulk 연산을 한 후, 영속성 컨텍스트를 초기화 해준다.

    연산 순서가 여의치 않을 경우, Bulk 연산 후 영속성 컨텍스트를 초기화 해주는 방법도 고려할 수 있다. Bulk 연산 후, em.clear()로 영속성 컨텍스트를 초기화해준다. 이후에 필요한 값은 DB에서 다시 한번 불러올 것이기 때문에 DB와 영속성 컨텍스트의 엔티티 상태가 동일한 것이 보장된다. 

    'Spring > JPA' 카테고리의 다른 글

    JPA : PK 생성 전략  (0) 2022.05.23
    JPA : JPQL과 영속성 컨텍스트  (0) 2022.02.23
    JPA : Collection과 JPA 동작 방식  (1) 2022.02.23
    JPA : 2차 캐시  (0) 2022.02.23
    JPA : 트랜잭션 격리 수준과 JPA의 락  (0) 2022.02.23

    댓글

    Designed by JB FACTORY