• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

1차캐시와 SQL 쓰기지연 저장소에 저장되는 시점이 궁금합니다.

23.04.14 21:37 작성 조회수 404

0

[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]
섹션3을 듣고 나서 영속성 컨텍스트에 대해서 이해가 되지 않아서 질문드립니다.

스크린샷 2023-04-14 오후 8.03.24.png

/* 비영속 /
Member member = new Member();
member.setId(101L);
member.setName("HelloJPA");

/ 영속 /
em.persist(member);
Member findMember = em.find(Member.class, 101L);

/ 변경 감지 */
findMember.setName("HelloJPA dirty checking");

tx.commit();

영속성 컨텍스트의 동작원리에 대해 이해하려다 보니 이상한? 코드가 작성되었는데 양해 부탁드립니다.

  • Member 객체를 persist하면 영속성 컨텍스트에 저장되고 em.find를 하면 그 객체를 다시 가져오게 이때 영속성 컨텍스트에 저장된 객체는 1개

  • 그 객체의 value를 다시 변경하면 dirty checking에 의해 1차캐시에 저장된 객체에 반영

     

  • 로그를 확인했을 때 commit 시점에 insert쿼리와 update쿼리가 둘다 나감. 트랜잭션이 commit되는 시점에 sql 쓰기지연 저장소에서 insert문 하나만 나갈 것으로 예상했는데 둘다 나가서 의아

질문 드립니다.

도중에 flush되는 시점이 없고 sql쓰기지연저장소에 쌓이는 시점 때문인거 같긴한데, 변경감지해서 쓰기지연저장소에 쌓이는 시점이 commit할 때가 아닌건가요? 아니라면 어느시점에 쌓이는 건지 궁금합니다. 또한 그래서 1차캐시가 sql 쓰기지연 저장소와 동기화가 되지 않는다고 이해하면 될까요?

실제로 이렇게 코드가 작성되지는 않겠지만 영속성 컨텍스트가 어떤 메커니즘으로 작동하는지 궁금해서 여쭤봅니다. 강의 너무 잘듣고 있어요.!! 감사합니다.

답변 1

답변을 작성해보세요.

0

y2gcoder님의 프로필

y2gcoder

2023.04.16

안녕하세요, lij468 님. 공식 서포터즈 y2gcoder 입니다.

쓰기지연 SQL 저장소에서 하는 일은 말 그대로 SQL 쓰기를 커밋 시점까지 지연하는 일을 합니다. 말씀하신 그대로 커밋 시점에 모아두었던 쿼리들을 DB로 전송하는 기능을 하는 것이라고 이해하시는게 좋을 것 같습니다. 말씀하신 것처럼 Insert + Update 쿼리를 통합해주는 기능과는 다른 기능입니다. 그 점 빼고는 이해하신 부분에서 벗어나지 않으실 것 같습니다:)

감사합니다.