강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

Jaeik Lee님의 프로필 이미지
Jaeik Lee

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

2편 추가 자료

JPA Delete 동작이 궁금합니다.

작성

·

1.2K

0

안녕하세요.

좋은 강의를 제공해주신 덕분에 JPA를 열심히 공부하고 있습니다.

JPA 사용 중에 궁금한 점이 있는데요

delete동작 방식을 보니, em.find로 entity를 조회 후에 em.remove순으로 query가 동작하고 있습니다.

Mysql에서 null인 값을 조건절로 삭제해봐도 에러는 발생하지 않는데, JPA만의 특별한 이유가 있을까요?

두 번째로 궁금한 점도 있습니다ㅎㅎ

JPA에서는 foreign key 제약조건을 위반하지 않기 위해서 모든 sql이 아래의 순서로 동작한다고 합니다.

1. Insert, in the order they were performed

2. Updates

3. Deletion of collection elements

4. Insertion of collection elements

5. Deletes, in the order they were performed

위의 조건으로 인해 하나의 transaction안에서 unique key걸린 값을 remove후 save하면 duplicate error가 발생하는데요.

혹시 이것도 JPA만의 특별한 이유가 있는지 너무너무 궁금합니다!

답변 1

1

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. Jaeik Lee님

delete동작 방식을 보니, em.find로 entity를 조회 후에 em.remove순으로 query가 동작하고 있습니다.

-> delete는 스프링 데이터 JPA가 제공하는 기능을 말씀하시는 것 같네요^^ JPA는 엔티티를 제거할 때 기본으로 remove 메서드를 제공합니다. 이 메서드는 엔티티를 파라미터로 받습니다. 그래서 JPA를 추상화한 스프링 데이터 JPA에서 엔티티를 찾아서 remove를 호출합니다. 이렇게 엔티티가 있어야 @PreRemove 같은 이벤트를 받고, Cascade 같은 기능이 동작하기 때문에 JPA는 엔티티를 조회해서 remove를 호출하게 설계되어 있습니다.

두번째 질문

-> 저도 이 부분은 정확히 모르겠지만, 말씀하신데로 foreign key 제약조건을 피하는 방법을 가장 우선시하게 설계했을 것 같습니다. 하나의 트랜잭션 안에서 unique key 걸린 값을 remove 하고 save 하는 문제는 중간에 flush를 호출하면 간단하게 해결할 수 있습니다^^

감사합니다.

Jaeik Lee님의 프로필 이미지
Jaeik Lee

작성한 질문수

질문하기