[main-project] 0311

박채은·2023년 3월 11일

Project

목록 보기
7/21

Delete

발단

게시글을 수정하는 경우에, 이미 존재하는 URL을 삭제하고 다시 전달받은 URL을 추가해주는 방식으로 구현하기로 했다.
(이미 존재하는 URL와 새롭게 전달받은 URL를 하나하나 비교하는 방법이 더 비효율적일 거라 생각했기 때문에)

이때 해당 post의 url을 모두 찾아내어 삭제해야하는데 어떤 방식을 사용하는 것이 효율적일지에 대해 고민하게 되었다.

  1. JpaRepository에서 제공하는 delete 메소드를 사용 - deleteAllByPrfPostId
  2. @Query를 사용하여 직접 delete 쿼리를 작성

결론

블로그에서 그 주제에 대해서 매우 잘 작성해주셨다.

1번보다 2번이 훨씬 효율적이라는 것을 알게 되었고, 쿼리문이 출력되는 것을 자세히 보지 않았었는데 이번 기회로 쿼리가 어떤 방식으로 작동되는지 자세히 봐야겠다는 생각도 들었다.


🚨 이슈트랙킹

Not supported for DML operations

✔️ ERROR
org.hibernate.hql.internal.QueryExecutionRequestException: Not supported for DML operations [delete from com.seb006.server.url.entity.Urls u where u.prfPost.id = :postId]

  • update 와 쿼리에는 @Modifying @Transactional 어노테이션 두개를 붙혀줘야 한다.

https://stackoverflow.com/questions/44022076/jparepository-not-supported-for-dml-operations-delete-query
https://stackoverflow.com/questions/10220262/updating-boolean-value-in-spring-data-jpa-using-query-with-hibernate

  • JPA @Query를 사용해 update, delete 시에는 @Modifying@Transactional 어노테이션을 추가해주어야 한다.
  • @Modifying 어노테이션은 해당 쿼리가 수정 쿼리임을 spring에 알려주고 DML 작업을 허용하게 해준다.
  • 하지만 왜 @Transactional 도 필수적으로 붙여야하는 건지는 모르겠다.(더 구글링해보기)

0개의 댓글