프로그래밍/MyBatis

[MyBatis] 우연히 알게된 마이바티스의 캐시 Cache

jeongseop 2024. 2. 12. 22:35

MyBatis를 사용하여 만든 프로젝트를 Jdbc Template으로 변경하고 있는 와중에

 

잘 성공하던 테스트 하나가 실패했다.

 

대충 시나리오를 설명하자면

MemberService.findById 는

1. MemberRepository.findById 를 호출하여 Member를 찾고

2. ReserveRepository.findByMemberId 를 호출 하여 List<Reserve>를 찾고

3. Member의 List<Reserve>를 채워서 반환해준다.

 

그런데 테스트에서 MemberService.findById 를 호출 후, 다른 함수에서 MemberRepository.findById 를 호출하고

 

Member.getReserve로 List<Reserve>를 조회하고 있었다.

 

당연히 MemberRepository.findById는 Member에 List<Reserve>는 비어 있었을 것인데

 

MyBatis로 만든 프로젝트에서는 이 테스트가 성공하고 있었다.

 

그 이유는 Mybatis의 캐시(Cache) 기능 때문이었다.(JPA의 1차 캐시와 비슷한 기능이 있는걸 몰랐네)

 

성능을 향상 시키기 위해서 쿼리의 결과를 키-값으로 저장하는데, Member의 컬렉션도 채워 진 채로 캐시에 저장되고 있어서

 

MemberRepository.findById를 호출해도 컬렉션이 채워져 있었던 것이다.

 

대충 예상은 했는데 같은 SQL로 조회하지 않은 컬렉션까지 채워지는건 생각도 못했다.

 

(잘못된 내용 일 수도 있음, 댓글로 의견 부탁드립니다.)

 

Mybatis의 캐시는 무조건 적으로 활성화 되는 Local Session Cache, Mapper namespace 단위로 Cache 되는

 

Second Level Cache가 있다.

 

다음에 캐시에 대해서 깊게 공부 해봐야겠다.