Spring

1. 스프링 공부 / 2021-07-12

공대키메라 2021. 7. 12. 23:00
이 내용은 inflearn의 김영한 팀장의 spring jpa 강의 과정을 복습하려는 목적으로 만들었따.

 

9강. 플러시

 

음... 사실 앞에 내용들도 많은데

귀찮아서 정리를 안하다가

머리에 무언가를 남기려면 

이렇게 정리를 하면서 해야만 하기 때문에 귀찮음을 꾹 참고 한다 가즈아~~@!!!

그래서 플러시가 뭐임?

 

영속성 컨텍스트의 내용을 DB에 날려준다고 생각하면 된다

 

음~ 설명이 너무쉽네~

영속성 컨텍스트는 뭐지? 

 

https://velog.io/@neptunes032/JPA-%EC%98%81%EC%86%8D%EC%84%B1-%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8%EB%9E%80

 

JPA 영속성 컨텍스트란?

영속성 컨텐스트란 엔티티를 영구 저장하는 환경이라는 뜻이다. 엔티티 매니저를 통해 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.em.persist

velog.io

영속성 컨텍스트가 무엇인지 잘 설명해 놓은 블로그를 찾앗다!

 

퍼온 내용을 살펴보면....

영속성 컨텍스트란?

영속성 컨텐스트란 엔티티를 영구 저장하는 환경이라는 뜻이다. 애플리케이션과 데이터베이스 사이에서 객체를 보관하는 가상의 데이터베이스 같은 역할을 한다. 엔티티 매니저를 통해 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.

em.persist(member);

  • 엔티티 매니저를 사용해 회원 엔티티를 영속성 컨텍스트에 저장한다는 의미!

영속성 컨텍스트의 특징

  • 엔티티 매니저를 생성할 때 하나 만들어진다.
  • 엔티티 매니저를 통해서 영속성 컨텍스트에 접근하고 관리할 수 있다.

 

DB에 연결을 하고...

   EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");

   EntityManager em = emf.createEntityManager();

   EntityTransaction tx = em.getTransaction();
   tx.begin();

 

transaction 을 연결하고 여러 명령어를 날리게 되면

Member member1 = new Member(150L,"A");
Member member2 = new Member(151L,"B");

em.persist(member1); //지연쓰기로 우선 쌓임
em.persist(member2); //지연쓰기로 우선 쌓임
System.out.println("=============");
tx.commit(); // 위에 em.persist 로 쌓인 데이터를 한번에 -> flush!

이렇게 되면 데이터가 들어가는 것이다.

 

실제로 실행해 보면 System.out.println("===========") 처리한 것이 먼저 나오고 그다음에 쿼리가 실행되는 것을 확인할 수가 있다.

 

플러시가 발생하면....

 

- 변경 감지

- 수정된 엔티티 쓰기 지연으로 SQL 저장소에 등록

- 쓰기 지연 SQL 저장소의 쿼리를 데이터베이스에 전송(등록, 수정, 삭제 쿼리)

 

이러한 영속성 컨텍스트를 플러시 하는 방법으론...

 

- em.flush()

- 트랜잭션 커밋 => 플러시 자동 호출

- JPQL 쿼리 실행 => 플러시 자동 호출

 

 

Member member = new Member(200L, "member200");
em.persist(member);

em.flush();
System.out.println("=============");
tx.commit();

그러니까 원래는 commit을 해야 쿼리가 전부  날아가는데

그것을 강제적으로 em.flush()를 통해서 쿼리가 먼저 commit()하기 전에 실행되도록 조작이 가능!

 

실행된 결과

그러면 flush하면 1차 캐시는 지워지나? 

 

그렇지 않다!

 

오직 쓰기 지연 SQL 저장소에 쌓여있는 것들이 DB에 반영만 되는것임.

 

플러시에는 옵션도 존재하는데 

 

      em.setFlushMOde(FlushModeType.COMMIT)

 

위 처엄 flush를 어떻게 할 것인지 설정도 가능

 

FlushModeType.AUTO   => 커밋이나 쿼리를 실행할 때 플러시(기본값)

FlushModeType.COMIIT => 커밋할 때만 플러시

 

사실 크게 도움 안된다고 한다 ㅋㅋㅋㅋ

그냥 가급적 기본 세팅인 AUTO를 추천한다고 한다. 

 

그래서 플러시는?