2022/jpa

day02[순수jpa, entity]

yanii 2022. 11. 15. 23:56

 

entity manager : entity 관리

요청 하나당 entity를 만들어줌.

요청2개 -> entity 2개 만듦.

각각의 entity가 jdbc를 쓴다.

jpa의 구현체가 hibernate > hibernate는 sqlsession 사용 > sqlsession에서는 jdbc를 사용 !

open session은 쓰면 사용자가 선택한 메소드에 따라서 select ~ delete까지 메소드를 적절하게 써준다.

if) select 사용 시, jdbc를 통해서 preparestatement로 execute가 될 것임.

exectuequery, executeupdate : 알맞는 메소드 진행될 것임.

 

entity manager는 persistenceContext 영역을 사용함.

persistenceContext 영역: entity를 관리하는 영역, 영속 컨텍스트

application context 영역: 자바 빈 컨테이너를 관리함.

 

entity manager안에 persistenceContext가 있다.

entity manager가 메모리에 할당되면 자기가 가진 영역 중에서 persistenceContext영역을 할당함.

이 영역에 등록시키는 메소드가 persist()이다.

insert > persist("엔티티") > "엔티티"가 persistenceContext안에 들어가게 된다. > 영속 컨텍스트

 

@PersistenceContext //jpa가 관리함. 영속컨텍스트를 만들어라는 어노테이션.

 

entityManager.persist(); //영속 컨텍스트에 등록

 

영속성 컨텍스트에 등록하는 이유?

flush() : 안에 있는 것을 비워주면서 목적지까지 도달하는 것 > 영속성 컨텍스트에 있는 내용을 쿼리로 내보낸다는 느낌.

persist() : insert라기보다 영속성 컨텍스트에 등록만 해주는 느낌으로 봐야 함. flush가 되어야 insert가 됨.

 

@Transactional : begin, commit 해주는 애, 트랜잭션에 대한 환경을 구축해줌.

@Rollback(false) : 단위테스트에만 사용 가능, 자동롤백 방지

 

Optional.ofNullable()  : 널인지 검사하는거

Assertions.assertThat : 알트+엔터 > add static import 엔터 > assertThat만 써도 됨.

 

persist() : 1차 캐시에 등록됨.

1차 캐시에 기억해놓고 엔티티를 관리함. 캐시 안에 있으면 select를 또 안함.(성능 최적화)

 

entityManager.flush(); //먼저 쿼리 내보내기//1차 캐시에 기억된 상태, 실무에서 사용할 수도 있음.

entityManager.clear(); //캐시 비우기//실무에서 거의 사용할 일 없음.

 

 

더티체킹

 

/*순서 메모*/ 꼼꼼히
엔티티2개 선언

1차 캐시 저장
INSERT
1ck(1차캐시삭제)
... 순서 메모하기...

 

영속상태:persistence영역에 있으면
비영속상태:persistence영역에 없으면, detach()

오류가 detach가 뜨면 비영속상태임을 알고 있자!

 

커밋 시 플러시가 자동 호출된다.

 

@PersistenceContext //주입하는게 아니라 주입받는 것!

 

 

 

 

 

 

Optional.ofNullable((null이 아닐 때 들어가는 것.).orElseGet())

orElse() : 내가 정해놓은 객체를 넣어주고, null일 때 여기에 있는 내용이 들어감.

orElseGet() : Supplier라서 람다식 사용 가능, 참조형으로 new를 쓸 수 있음.

!!NPE방어!!