일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 제네릭
- ci/cd
- B+TREE
- JAVA8
- nonclustered index
- GithubActions
- backend
- Redis
- springboot
- method area
- Jenkins
- 리팩터링
- 주문
- 재고 시스템
- JDK14
- 부하테스트
- JPA
- 카카오 화재
- 트랜잭션
- Metaspace
- Spring Data Redis
- 지연로딩
- 공변
- 상태패턴
- CaffeineCache
- 웹캐시
- lazyloading
- 동시성
- Ehcache
- java
- Today
- Total
NDM
[JPA] Delete와 DeleteById의 차이점에 대해 알아보자 본문
목차
- Delete
- DeleteById
- 둘의 차이점
https://ndm-tech.tistory.com/7
Hibernate에서 6.0버전부터 Save()메소드를 Deprecated처리하고, persist() 사용을 권장한다고 발표했다.
- 이를 통해 영속성 컨텍스트의 내부 동작 원리에 대해 이해해야 한다는 것.
- Spring Data Jpa는 단순히 JPA의 기능을 편하게 제공하기 위한 것일 뿐, 그 내부가 어떻게 이루어져 있는지는 스스로 공부해야 한다는 것을 다시한번 느낄 수 있었다.
이러한 이유로 Save() 메소드를 분석해 본 것 처럼, Delete와 DeleteById에 대해서 알아보고자 한다.
Delete
내부 코드는 이렇게 되어 있다. SImpleJpaRepository에 가면 볼 수 있다.
딱히 특별할 것은 없어 보인다.
보통 findXX메소드는 entity를 가져오고, getXX메소드는 내부적으로 reference()메소드를 이용해서 프록시 객체를 가져오는데 entity나 프록시나 갖고있는 Id는 같으므로 크게 신경 쓰지 않아도 될 것 같다.
DeleteById
내부 코드는 이렇게 되어 있다. 역시 SImpleJpaRepository에 가면 볼 수 있다.
몇가지 눈에 띄는점이 있다.
- 내부적으로는 delete()를 사용하고 있다.
- findById()를 반드시 한 번 호출한다.
- Delete()에서 em.find()를 호출하기 때문에 그렇게 되면 select가 두 번 나가는 것이 아니냐? 라고 생각할 수 있지만 영속화 된 데이터가 같기 때문에 한 번만 나간다.
- Exception객체와 메세지가 정해져 있다.
차이점
delete()만 단독으로 사용하는 경우보다 findById + Delete로 사용하는 경우
그리고 deleteById로 한번에 쓰는 경우로 나뉜다고 한다. 그럼 여기서 두 가지 의문점이 생긴다.
- 왜 delete()만 사용하는 경우는 거의 없는가?
- delete()의 파라미터는 엔티티 그 자체다. 클라이언트로부터 엔티티객체를 직접 전달받을 일은 거의 없다고 생각한다. id정도만 받아서 엔티티를 찾고, 그걸 삭제하는 과정을 거칠수밖에 없다.
- findById + delete와 DeleteById, 둘은 무엇이 다른가?
성능상의 차이점은 거의 없다고 봐도 무방하다. 참고한 블로그나 코드를 다시한번 봐도
고정된 Exception객체를 사용해야 한다는 것, 커스텀 메세지가 정해져있다는 것 외에는 딱히 차이점을 찾을 수 없었다.
개인적으로는 findById()가 Optional로 객체를 받아오기 때문에 직접 서비스 로직에서 호출할 시 에러 메세지를 도메인에 맞게 설정해줄 수 있어 findById + delete를 선호한다.
Delete와 DeleteById의 차이점은 Save의 Persist와 Merge의 차이점보다 그 중요성이 떨어지는 것이 사실이다.
몰라도 크게 무리가 없고 면접에서도 질문하지 않을 것 같은것도 사실이다.
하지만 Hibernate가 Save()를 Deprecated시킨 이유가 JPA의 기본 메소드에 대해 제발 알고 써라 라는 느낌을 받았기 때문에 무심코 지나갈 수 있는 주제에 대해 한번 포스팅 해 보았다.
출처
https://hwanchang.tistory.com/7
'JPA' 카테고리의 다른 글
[JPA] Hibernate 6 : Save() 메소드 Deprecated (0) | 2022.06.11 |
---|---|
[JPA] Spring Data Jpa의 Save와 Update (0) | 2022.05.24 |