Persistence Cache / 패스트캠퍼스 챌린지 12일차

망고쥬스·2021년 11월 12일
0

Entity Manager Test

@SpringBootTest
public class EntityManagerTest{
	@Autowired
	private EntityManager entityManager;
    
	@Test
	void entityManagerTest(){
		System.out.println(entityManager.createQuery("select u from User u").getResultList());
		
	}
    

EntityManger같은 경우에는 캐시를 가지고 있다.
Save()를 실행시키면 DB에 바로 반영이 되지 않고 영속성 개체에 저장이 되고 DB로 넘어가게 된다.

@Test
void cacheFindTest(){
	System.out.println(userRepository.findById(1L).get());
	System.out.println(userRepository.findByEmail("martin@fastcampus.com");
	System.out.println(userRepository.findByEmail("martin@fastcampus.com");
    

Select 쿼리가 3번 돌아가게 된다.

이때 @Transcational 로 하나의 트랜잭션으로 처리를 해주고

@SpringBootTest
**@Transactional
public class EntityManagerTest{
	@Autowired
	private EntityManager entityManager;
    
	@Test
	void entityManagerTest(){
		System.out.println(entityManager.createQuery("select u from User u").getResultList());
		
	}
    

Select 쿼리는 한번 실행, 결과물은 3번 출력된다.
즉 조회시에 영속성 컨텍스트내에 존재하는 Entity Cache에서 직접 처리한 것을 알 수 있다.
따로 Cache설정을 하지 않았지만 영속성 컨텍스트 내에서 자동으로 Entity에 대해 cache처리되는것을 jpa의 1차 캐시라고 이야기한다.

1차 캐시는 Map의 형태로 만들어진다, key는 id값 value는 해당 entity가 들어가있다
해서 id로 조회하게 되면 영속성 컨텍스트 내에 존재하는 1차 캐시에 entity가 있는지 확인, 있으면 db조회 없이 바로 리턴
반대로 entity가 없으면 db에 직접 조회하고 결과값을 cache에 넣고 리턴을 해주게 된다.

중요한건 @Transcational 처리를 해줌으로서 캐시를 통해 조회가 되는게 아닌 id값에 영속성 속성이 적용되어 있기 때문에 cache에서 가져온것.

userRepository.deleteById(1L);
select쿼리로 조회가 한 번 진행한 뒤 delete를 진행하게 된다.
jpa내부적으로 id에 대한 조회가 비번하기 때문에 하나의 트랜잭션 안에서 동작할 경우 1차 캐시를 사용해 성능저하를 방지하도록 설정되어 있다.
delete 쿼리 처리시 @Transactional이 선언되어 있을 경우 DB반영하는 시간을 최대한 늦추기 때문에 delete가 이루어지지 않는다.


#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는Java/Spring웹개발마스터초격차패키지Online

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

https://bit.ly/3FVdhDa

profile
#newbieDeveloper #since 2021.04.06

0개의 댓글