Backend/Database
[JPA] 1차 캐싱을 직접 확인해보자
mopil
2024. 10. 12. 17:08
반응형
JPA 영속성 컨텍스트가 제공하는 기능 중 하나인 '1차 캐싱' 기능을 눈으로 직접 확인해 보자
@Service
class FirstService(
private val userRepository: UserRepository,
) {
@Transactional
fun callFirst() {
var user = userRepository.findById(1).get()
println("first call user = $user")
user = userRepository.findById(1).get()
println("second call user = $user")
user = userRepository.findById(1).get()
println("third call user = $user")
}
}
리포지토리에서 동일한 User를 총 3번 호출했다.
1차 캐싱 덕에 쿼리는 1번만 나가고 2,3번째 조회는 쿼리를 안 보내고 영속성 컨텍스트에서 바로 가져오는 것을 확인할 수 있다.
이는 다른 트랜잭셔널로 묶인 서비스를 주입받아 호출하는 경우도 적용된다.
즉, 최상위 트랜잭션이 종료될 때까지 유지된다.
@Service
class FirstService(
private val userRepository: UserRepository,
private val secondService: SecondService
) {
@Transactional
fun callFirst() {
val user = userRepository.findById(1).get()
println("first call user = $user")
secondService.callSecond()
}
}
@Service
class SecondService(
private val userRepository: UserRepository
) {
@Transactional
fun callSecond() {
val user = userRepository.findById(1).get()
println("second call user = $user")
}
}
FisrtService에서 SecondService를 주입받아 동일한 유저를 2번 리포지토리에서 가져오는 간단한 로직이다.
호출해보면 second call user 이전에는 select 쿼리가 나가지 않는 것을 확인할 수 있다.
반응형