관리 메뉴

피터의 개발이야기

[Spring] @Cacheable 사용법 본문

Programming/Spring

[Spring] @Cacheable 사용법

기록하는 백앤드개발자 2024. 11. 27. 07:04
반응형

ㅁ 들어가며

ㅇ Spring Boot의 @Cacheable 어노테이션은 애플리케이션의 성능을 향상시키기 위해 자주 사용되는 캐시 기능을 제공된다.

ㅇ 이 글에서는 @Cacheable의 사용법과 관련된 다양한 기능을 Kotlin 예제를 통해 살펴보다.

 

ㅁ Spring Cache Abstration이란?

 스프링은 캐시 추상화(Cache Abstraction)을 통해 사용자는 캐시 구현에 대해 신경 쓸 필요 없이 퍼블릭 인터페이스를 쉽게 캐싱 기능을  사용할 수 있는 편리한 캐싱 기능을 지원한다. 캐싱이 필요한 비즈니스 로직에서 EhCache, Redis 등 캐싱 인프라에 의존하지 않고 추상화된 퍼블릭 인터페이스로 캐싱을 할 수 있다. 인터페이스화 되면 EhCache로 사용 중에 Redis로 변경이 쉬워진다.

 자세한 설명은 Devkuma - Spring Framework > Spring Cache

 

ㅁ Spring Boot에서 캐시 설정하기

의존성 추가

dependencies {
    implementation("org.springframework.boot:spring-boot-starter-cache")
    implementation("com.github.ben-manes.caffeine:caffeine:3.1.8")
}

ㅇ Spring Boot에서 캐시를 사용하려면 spring-boot-starter-cache 의존성을 추가해야 한다.

ㅇ Caffeine 캐시와 같은 고성능 캐시 라이브러리를 사용할 수도 있다.

 

캐시 활성화

import org.springframework.cache.annotation.EnableCaching
import org.springframework.context.annotation.Configuration

@Configuration
@EnableCaching
class CacheConfig

ㅇ 캐시 기능을 활성화하려면 @EnableCaching 어노테이션을 사용

ㅇ 이 어노테이션은 Spring Boot 애플리케이션에서 캐시 기능을 사용할 수 있다.

 

ㅁ @Cacheable 어노테이션 사용법

기본 사용법

ㅇ @Cacheable 어노테이션은 메서드의 결과를 캐시에 저장하고, 동일한 인자로 호출될 때 캐시된 값을 반환한다.

import org.springframework.cache.annotation.Cacheable
import org.springframework.stereotype.Service

@Service
class BookService(private val bookRepository: BookRepository) {

    @Cacheable("books")
    fun findBookById(id: Long): Book {
        println("Fetching book from repository...")
        return bookRepository.findById(id)
    }
}

findBookById 메서드는 처음 호출될 때 데이터베이스에서 책 정보를 가져오고, 그 결과를 "books"라는 이름의 캐시에 저장한다.ㅇ 이후 동일한 ID로 호출되면 캐시된 데이터를 반환.

 

조건부 캐싱

ㅇ 캐싱을 특정 조건에 따라 적용할 수 있다.

condition 속성을 사용하면 특정 조건이 참일 때만 캐싱된다.

@Cacheable(value = ["books"], condition = "#id > 10")
fun findBookById(id: Long): Book {
    println("Fetching book from repository...")
    return bookRepository.findById(id)
}

위 예제에서는 ID가 10보다 큰 경우에만 캐싱이 적용됩니다.

 

캐싱 제외 조건

unless 속성을 사용하여 특정 조건이 참일 경우 캐싱을 방지할 수 있다.

@Cacheable(value = ["books"], unless = "#result == null")
fun findBookById(id: Long): Book? {
    println("Fetching book from repository...")
    return bookRepository.findById(id)
}

ㅇ 메서드의 반환값이 null인 경우, 해당 결과는 캐시에 저장되지 않음.

 

동적 키 사용

ㅇ 캐시에 저장할 때 동적인 키를 사용할 수 있다.

key 속성을 통해 SpEL(Spring Expression Language)을 이용하여 복잡한 키를 정의할 수 있다.

@Cacheable(value = ["books"], key = "#id + '_' + #title")
fun findBook(id: Long, title: String): Book {
    println("Fetching book from repository...")
    return bookRepository.findByIdAndTitle(id, title)
}

ㅇ 위 예제에서는 ID와 제목을 조합하여 고유한 키를 생성한다.

 

ㅁ 기타 관련 어노테이션

@CachePut

ㅇ @CachePut은 메서드가 실행될 때 결과를 갱신한다.

@CachePut(value = ["books"], key = "#book.id")
fun updateBook(book: Book): Book {
    println("Updating book in repository and cache...")
    return bookRepository.save(book)
}

 

@CacheEvict

ㅇ @CacheEvict는 특정 항목이나 모든 항목을 캐시에서 제거할 때 사용된다.

@CacheEvict(value = ["books"], allEntries = true)
fun clearAllBooks() {
    println("Clearing all books from cache...")
}

ㅇ "books" 캐시에 저장된 모든 데이터를 제거

 

ㅁ 마무리

 Spring Boot의 @Cacheable 어노테이션은 애플리케이션의 성능 최적화에 매우 유용한 도구하다. 다양한 속성들을 활용하여 조건부로 캐싱하거나, 특정 상황에서만 캐싱을 방지하는 등 세밀한 제어가 가능하다. 이러한 기능들을 적절히 활용하여 효과적인 캐싱 전략을 구축할 수 있다.

 

ㅁ 함께 보면 좋은 사이트

캐시 사용해보기 @Cacheable, @CacheEvict (Spring-boot)

Spring Boot With Caffeine Cache

  ㄴ 자동구성이 가능한 캐싱

Spring Cache, 제대로 사용하기

Devkuma - Spring Framework > Spring Cache

반응형
Comments