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가 있다.
다음에 캐시에 대해서 깊게 공부 해봐야겠다.
'프로그래밍 > MyBatis' 카테고리의 다른 글
[MyBatis] Interceptor로 생성일(CreatedDate) 자동 입력하기, Auditing (0) | 2024.02.01 |
---|