티스토리 뷰

반응형

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 쿼리가 나가지 않는 것을 확인할 수 있다.

반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크