작성
·
196
2
1. persist는 해당 객체를 영속화 시키면서 지연sql 저장소에 insert문을 준비시켜 놓는다.
2. find는 1차 캐시에 없다면(영속화 되어있는 것이 없다면) db에서 select문을 통해 가져온다. 만약 있다면, 그 값을 return 해준다.
3. set을 통한 수정은 find 절차 이후에 그것의 내용을 바꾸는데, 이 때에 find 절차에서 기존의 값을 스냅샷을 저장해놓기 때문에 이 둘을 비교해서 update 유무를 판별하고 바뀐경우에는 update문을 한다.
이렇게 받아들였는데 맞는지 궁금합니다! 그리고 질문이 있습니다!
1. find 를 통해 db에 sql문을 전송할 때에는 persist 와 같이 지연 sql 저장소를 이용하는 것인지, 그것이 아니라면 어떤식의 절차를 거치는지 궁금합니다.
2. remove의 경우 find를 통해 대상을 remove 하는데 어떤식으로 동작을 하는지 궁금합니다.
3. Member mem=new Member(); mm.setid/name으로 set 시킨 후 persist를 한 뒤에 이 mem을 그대로 setId(다른값) 을 해서 commit 을 하였더니 insert 문이 나오고 update 문이 나오고 제가 의도했던대로 마지막 setId값이 db에 저장이 된 것을 확인하였습니다. 하지만 sql문이 2개가 나오는걸 봐서 insert를 먼저 처음에 설정했던 값으로 insert를 하고 update로 다시 재차 바꿔준 것이 맞는지 궁금합니다.
인프런에서 이전에 한 번의 유료강의를 들어봤었고, 아예 로드맵으로 구매한 적은 처음입니다! 취준중이라 통장이 확 비었지만 너무 만족스러운 강의입니다 ㅎㅎ 이렇게 캠을 킨 강의도 처음이고 그 부분도 너무 좋고 설명도 너무 잘하시고 집중도 잘되고 너무 믿음직스럽고... 친한 형 같은 느낌이어서 더 좋은 것 같습니다! 열심히 듣겠습니다!!
답변 2
2
안녕하세요. kangsy763님^^
친한 형 같은 느낌이라니 더 좋네요 ㅋㅋ
우선 앞서 말씀해주신 1,2,3번은 받아들인 내용이 맞습니다.
추가로 질문해주신 부분을 답해드릴께요.
1. find 를 통해 db에 sql문을 전송할 때에는 persist 와 같이 지연 sql 저장소를 이용하는 것인지, 그것이 아니라면 어떤식의 절차를 거치는지 궁금합니다.
-> 이때는 별도의 복잡한 메커니즘이 있는 것이 아니라, JPA가 데이터베이스 커넥션(jdbc)을 통해서 직접 SQL을 날리고 DB에서 데이터를 조회한다고 이해하시면 됩니다.
2. remove의 경우 find를 통해 대상을 remove 하는데 어떤식으로 동작을 하는지 궁금합니다.
-> 이 부분도 지연SQL 저장소와 유사한 메커니즘으로 동작합니다.
3. Member mem=new Member(); mm.setid/name으로 set 시킨 후 persist를 한 뒤에 이 mem을 그대로 setId(다른값) 을 해서 commit 을 하였더니 insert 문이 나오고 update 문이 나오고 제가 의도했던대로 마지막 setId값이 db에 저장이 된 것을 확인하였습니다. 하지만 sql문이 2개가 나오는걸 봐서 insert를 먼저 처음에 설정했던 값으로 insert를 하고 update로 다시 재차 바꿔준 것이 맞는지 궁금합니다.
-> persist를 하면서 쓰기지연 저장소에 SQL이 쌓이고, 엔티티도 영속화 됩니다. 이 시점에 스냅샷이 만들어지지요. 이후에 값이 변경되었기 때문에 변경감지(Dirty Checking)에 의해서 변경을 인지하고, 다시 update가 호출됩니다.
좋은 하루 되시고, 끝까지 응원할께요. 화이팅^^!
1