작성
·
6.3K
1
안녕하세요 선생님
JPA Repository에서 save메서드 호출 이후 바로 user id를 가지고 올 수 있는 이유가 너무 궁금하여 질문글을 올렸습니다.
User entity를 생성한 후 아래와 같이 테스트를 진행해 보았습니다.
아래는 저의 테스트코드입니다.
user 객체를 생성,
user 객체에서 id 확인 db에 들어가기 전이기 때문에 id가 당연히 없을 것으로 예상
user 객체를 저장
user 객체에서 id 확인, db에서 다시 조회를 하지 않았기 때문에 id가 없을 것으로 예상하였지만 id가 존재
아래와 같은 결과를 얻을 수 있었습니다.
JPARepository의 save method는 아래와 같았습니다.
1. save를 했을 때 바로 insert query 발생하는 이유
-> save 메서드를 살펴보면 @Transactional annotation이 존재하고,
save 메서드 종료시 em.flush 발생으로 인해 바로 query가 발생하는 것으로 생각함.
2. user.getId를 받아올 수 있는 이유는 뭘까
user.getId를 받아올 수 있는 경우는 db에 저장을 완료하고, db에 있는 user 정보를 다시 조회했을 때 받아올 것이라고 생각한 것과 달리,
save 메서드를 실행하자마자 db 저장 내용이 바로 반영이 된 것을 확인할 수 있었습니다.
따로 select query문이 발생하지 않은 것으로 보아, db 조회는 없었다는 것을 알 수 있습니다.
persistcontext와 dirty check에 의해서 이러한 현상이 발생한 것이라고 추측은 하고 있습니다만 이게 어떻게 가능한 일인지 궁금합니다.
제 User entity는 아래와 같습니다.
id의 생성시점은 user entity를 db에 저장하는 시점에 생성되는 것이라고 생각하는데,
(쓰기 지연 SQL 저장소에서 flush 이후에 id값이 생성될 것이라고 생각함)
생성 이후에는 db에서 user를 다시 가져오고 있지 않습니다.
변경감지로 user id가 생성된 것인지,
JPA repositoy에서 save 메서드 이후에 entity를 return 해 주기 때문인지 궁금합니다.
3. EntityManager의 생명주기는 Transactional의 생명주기와 동일하며, PersistContext의 생명주기는 EntityManagerFactory의 생명주기와 동일하게 Application loading 시점과 WAS가 종료되는 시점에 생성과 사멸을 한다고 볼 수 있는 것일까요?
4. 위와 동일한 맥락으로
저의 테스트 코드에서의 영속성 컨텍스트와
JPA Repository의 save 메서드 내의 영속성 컨텍스트는
동일한 영속성 컨텍스트라고 보면 될까요?
답변 1
2
안녕하세요. Hi y님
이 부분은 스프링 데이터 JPA와는 무관합니다.
영속성 컨텍스트에 엔티티를 관리하려면 그 순간 바로 PK인 ID가 필요합니다.
PK인 ID를 기준으로 영속성 컨텍스트가 관리되기 때문이지요.
그래서 영속성 컨텍스트는 그래서 em.persist()를 호출하는 순간에 바로 PK인 ID를 획득하게 됩니다.
그리고 해당 ID를 엔티티의 PK ID에 넣어둡니다.
감사합니다.