작성
·
3.1K
0
안녕하세요 수업을 듣다 궁금한 게 생겨 질문합니다!!
detach와 remove 메서드를 비교하면서 헷갈리는 부분이 생겨났습니다!!
원래는 persist가 호출된 시점에 SQL 쓰기지연 저장소에 insert 쿼리가 저장되는 것으로 이해했지만 detach()가 호출됐을 때 insert문이 나가지 않는 것을 보고 저는 persist가 호출됐을 때 SQL 쓰기지연 저장소에 insert 쿼리가 저장되는 것이 아니라 flush를 호출할 때 1차 캐시에서의 변경사항(스냅샷 비교 또는 새로운 엔티티 등록)으로 인해 insert 쿼리가 나가는 것이 아닌가로 생각했습니다.
하지만 remove를 호출했을 때 insert문이 나가고 delete문이 따로 나가는 것을 보고 헷갈리기 시작했습니다. 만약 변경 감지 기능이라는 것이 기존의 1차 캐시에 저장된 엔티티와 스냅샷을 비교하여 다른 부분을 update 쿼리를 자동으로 실행해주는 기능이라 생각한다면 위의 remove 실행 시 DB로 보내진 쿼리가 이해가 됩니다. 새로 등록한 것과 삭제하는 것은 스냅샷으로 비교할 수 없기 때문에 persist나 remove 호출 시점에 따로 SQL 쓰기지연 저장소에 쿼리를 저장할 수 밖에 없다라고 생각하기 때문입니다. 하지만 이렇게 생각했을 경우 위의 detach 실행 시 쿼리가 이해가 안됩니다.. 제가 어디서 헷갈리고 있는 걸까요??
답변 1
1
안녕하세요. rlarkddnr1686님
detach가 일어나면 해당 엔티티를 영속성 컨텍스트에서 완전히 제거해버립니다. 따라서 변경감지가 동작할 이유가 없겠지요?
persist 직후에 remove가 발생하게 되면 엔티티를 삭제 상태로 체크해둡니다. 그래서 플러시 시점에 insert, delete가 발생합니다.
감사합니다.
항상 친절한 답변 감사드립니다.