[ 김영한 Querydsl #7 ] 벌크 연산, SQL Function 호출

김수호·2024년 6월 9일
0
post-thumbnail

JPA 의 변경감지는 기본적으로 개별 엔티티에 대해 건 단위로 발생한다.
그런데 개발을 하다보면 하나의 쿼리로 여러 데이터를 변경해야 하거나, 삭제해야 하는 경우가 있을 수 있다.

이때는 보통 다음과 같이 벌크 연산을 사용해서 처리한다.

벌크 연산

  • 쿼리 한번으로 대량 데이터 수정
    • 나이가 28세 보다 작은 회원에 대해서 username 을 "비회원" 으로 수정한다.
    • 참고) 기존 나이에서 1 더하기: set(member.age, member.age.add(1))
    • 참고) 기존 나이에서 1 빼기: set(member.age, member.age.add(-1))
    • 참고) 기존 나이에서 2 곱하기: set(member.age, member.age.multiply(2))
  • 쿼리 한번으로 대량 데이터 삭제
    • 나이가 18세보다 큰 회원을 삭제한다.
  • 주의) (벌크 연산 시) JPQL 배치와 마찬가지로 영속성 컨텍스트에 있는 엔티티를 무시하고 실행되기 때문에, 배치 쿼리를 실행하고 나면 영속성 컨텍스트를 초기화 하는 것이 안전하다.
    • 벌크 연산은 영속성 컨텍스트를 무시하고 DB에 쿼리를 바로 반영한다. 그래서 DB의 상태와 영속성 컨텍스트의 상태가 달라질 수 있다. 따라서 벌크 연산 이후에는 영속성 컨텍스트에 있는 내용을 flush() 해서 DB와 데이터를 동기화 하고, clear() 로 초기화 해주는게 좋다.
    • 참고) 벌크 연산 이후 DB에서 데이터를 조회했는데 대상 엔티티가 영속성 컨텍스트에 이미 있다면, 조회한 것은 무시된다. 엎어치지 않음 (영속성 컨텍스트 우선)

 

SQL function 호출하기

SQL의 함수를 사용할 때에는 Expressions 라는 것을 사용한다.

  • 참고) username 에서 member 라는 단어를 M 으로 바꿔서 조회
    • 위 예시의 경우는 ExpressionsstringTemplate() 메서드를 사용해서 DB의 함수를 사용하겠다는 것을 명시하고, 원하는 함수를 사용하면 된다.
  • 참고) Dialect 에 등록된 function 만 호출할 수 있다.

강의를 듣고 정리한 글입니다. 코드와 그림 등의 출처는 김영한 강사님께 있습니다.

profile
현실에서 한 발자국

0개의 댓글