em.persist(entity) 하면 엔티티가 영속성 컨텍스트에 저장 ⇒ 영속 상태persist() 하면 JPA가 ‘얘는 내가 책임지고 관리할게!’ 상태가 되는 것1️⃣ 1차 캐시(First-level Cache)
Member member1 = em.find(Member.class, 1L); // DB 조회
Member member2 = em.find(Member.class, 1L); // DB 안 가고 메모리에서 가져옴2️⃣ 변경 감지(Dirty Checking)
Member member = em.find(Member.class, 1L);
member.setName("변경된 이름"); // 그냥 setter만 호출
em.getTransaction().commit(); // commit할 때 UPDATE 쿼리 자동 생성update()를 부르지 않아도 DB에 반영3️⃣ 동일성(identity) 보장
4️⃣ 플러시(Flush)
commit()할 때 자동으로 flush 됨em.flush()1️⃣ 비영속(Transient)
Member member = new Member(); // 비영속 상태
new로만 만들었을 때, 아직 아무런 관리도 안 되고 있는 상태2️⃣ 영속(Persistent)
em.persist(member); // 영속 상태
em.persist(member);를 호출하면 영속성 컨텍스트에 등록됨 ⇒ JPA가 관리 시작3️⃣ 준영속(Detached)
em.detach(member) : 특정 엔티티만 관리 끊기em.clear() : 영속성 컨텍스트를 통째로 초기화em.close() : EntityManager 자체를 닫아버리기4️⃣ 삭제(Removed)
em.remove(member); 하면 삭제 상태가 됨member 객체가 "삭제 예정" 표시가 붙는다고 보면 됨persist()를 직접 쓰는 경우 → 거의 없음save() 메서드를 호출하는 것만으로 내부에서 자동으로 persist()나 merge()가 처리됨memberRepository.save(member); detach()를 직접 쓰는 경우 → 매우 드묾detach()는 일부러 객체를 영속성 컨텍스트에서 분리하고 싶을 때 쓰는데, 일반적인 CRUD에서는 잘 안 씀