Venue(공연장)가 루트 애그리거트이고 그 하위에 Seat(좌석)라는 엔티티가 존재
여기서 DDD에 입각하여 Seat 엔티티에 대한 모든 처리를 루트 애그리거트를 통해서 하던 중, 다른 부분에선 문제가 없었는데 공연장을 삭제할 때, 공연장에 딸려있는 모든 좌석을 하나하나 softDelete를 하려니까 삭제마다, 좌석의 갯수만큼 update 쿼리가 나가는 걸 확인했음 .
물론 공연장의 삭제가 그렇게 빈번하게 일어나지는 않을것이라고 보여지지만, 만약 공연장의 크기가 더 커지거나, 해당 작업이 반복적으로 일어나게 된다면, 너무 비효율적인 처리가 되는 것 같아서, 고민하다 삭제의 경우는 일괄적으로 처리하는 거기 때문에, 영속성 컨텍스트를 거치지 않고 바로 DB에 update 쿼리를 날리는 방식으로 진행.
@Modifying
@Query("UPDATE Seat s SET s.isDelete = true, s.deletedBy = :username WHERE s.venue = (SELECT v FROM Venue v WHERE v.id = :venueId)")
void softDeleteWithVenueId(UUID venueId, String username);
이 벌크쿼리를 위해 SeatRepository를 작성하는게 괜찮은 방법인가에 대해서는 조금 더 생각해봐야 되겠지만, 수많은 쿼리를 한줄로 줄일 수 있다는 장점 때문에, trade-off를 고려해 이런 방식을 적용.