일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- Kubernetes
- kotlin coroutine
- Java
- Spring
- kotlin
- Linux
- kotlin spring
- kotlin querydsl
- Pinpoint
- CKA 기출문제
- APM
- CloudWatch
- PETERICA
- 정보처리기사실기 기출문제
- aws
- CKA
- 티스토리챌린지
- 공부
- AWS EKS
- Elasticsearch
- 정보처리기사 실기 기출문제
- IntelliJ
- MySQL
- 코틀린 코루틴의 정석
- minikube
- 기록으로 실력을 쌓자
- mysql 튜닝
- 정보처리기사 실기
- AI
- 오블완
- Today
- Total
피터의 개발이야기
[Spring] @Cacheable 사용법 본문
ㅁ 들어가며
ㅇ 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
ㄴ 자동구성이 가능한 캐싱
'Programming > Spring' 카테고리의 다른 글
[Spring] JIB으로 JAVA 애플리케이션 컨테이너화하기 (2) | 2024.11.15 |
---|---|
[Spring] RestTemplate의 Connection Timeout 설정과 에러 패턴 (0) | 2024.11.14 |
[Spring] Hadoop- Hive 컨넥션 유지 방법, @Scheduled (0) | 2024.10.28 |
[Spring] embedded Tomcat을 사용할 때 메모리가 누적 경우 (0) | 2024.10.22 |
[Spring] @Async를 활용한 비동기 처리 (0) | 2024.10.10 |