스프링에서 캐시(Cache) 기능을 설정하고 사용하는 방법은?
_____A1: 스프링에서 캐시 기능을 사용하려면 먼저 애플리케이션 클래스나 설정 클래스에 `@EnableCaching` 애노테이션을 추가하여 캐시 기능을 활성화합니다.
```java
@Configuration
@EnableCaching
public class CacheConfig {
// 추가 캐시 설정 가능
}
```
Q2: 스프링에서 지원하는 캐시 구현체는 무엇이 있나요?
A2: 스프링은 추상화된 캐시 인터페이스(`CacheManager`)를 제공하여 다양한 캐시 구현체와 연동할 수 있습니다. 대표적으로는 다음과 같습니다.
- ConcurrentMapCache (기본 자바 메모리 캐시)
- EhCache
- Caffeine Cache
- Redis Cache
- Hazelcast
- Guava Cache 등
Q3: 스프링에서 캐시를 적용할 수 있는 주요 애노테이션은 무엇인가요?
A3: 대표적인 캐싱 애노테이션은 다음과 같습니다.
- `@Cacheable`: 메서드 실행 결과를 캐시에 저장하고, 같은 키로 호출 시 캐시된 결과를 반환
- `@CachePut`: 메서드를 실행하고 결과를 캐시에 저장 (기존 캐시 덮어쓰기)
- `@CacheEvict`: 캐시에서 특정 키나 모든 데이터를 삭제
- `@Caching`: 여러 캐시 애노테이션을 한 번에 사용할 때 묶는 용도
Q4: `@Cacheable` 애노테이션은 어떻게 사용하나요?
A4: 예를 들어, 다음 코드는 `findUser` 메서드의 결과를 `users`라는 캐시 이름 아래 저장하고, 같은 인자일 경우 캐시된 데이터를 반환합니다.
```java
@Cacheable(value = "users", key = " userId")
public User findUser(Long userId) {
// DB에서 사용자 조회 로직
}
```
- `value` 또는 `cacheNames`: 캐시 저장소의 이름 지정
- `key`: 캐시 키 지정, SpEL 표현식 사용 가능 (기본적으로 메서드 파라미터를 키로 사용)
Q5: 캐시 갱신 시 `@CachePut` 애노테이션은 어떻게 쓰이나요?
A5: `@CachePut`은 메서드를 항상 실행하고 그 결과를 지정된 캐시에 저장합니다. 캐시를 갱신하고 싶을 때 유용합니다.
```java
@CachePut(value = "users", key = " user.id")
public User updateUser(User user) {
// 사용자 정보 수정 로직
return user;
}
```
Q6: 캐시를 특정 조건에 따라 삭제하려면 어떻게 하나요?
```java
@CacheEvict(value = "users", key = " userId")
public void deleteUser(Long userId) {
// 사용자 삭제 로직
}
@CacheEvict(value = "users", allEntries = true)
public void clearAllUsersCache() {
// 모든 users 캐시 초기화
}
```
Q7: 캐시 키를 직접 지정하지 않으면 어떻게 되나요?
A7: 기본적으로 메서드 파라미터를 조합하여 캐시 키를 생성합니다. 복합 키가 필요하면 `key` 속성에서 SpEL로 직접 지정할 수 있습니다.
예: `key = " user.id + '_' + type"`
Q8: 캐시 만료(시간제한) 설정은 어떻게 하나요?
A8: 스프링 캐시 추상화 단에서는 만료 정책을 직접 지원하지 않으므로, 사용하는 캐시 구현체에 따라 설정합니다.
- EhCache, Caffeine, Redis 등에서 TTL(time-to-live)을 설정
- 예를 들어, Redis 캐시 사용 시 Redis 설정 또는 RedisCacheManager 빈에서 TTL 설정 가능
Q9: 캐시 매니저(`CacheManager`)를 커스터마이징하려면 어떻게 하나요?
A9: 직접 `CacheManager` 빈을 등록해 캐시 구현체별 설정을 세밀하게 구성할 수 있습니다.
예: Caffeine 캐시 매니저 등록
```java
@Bean
public CacheManager cacheManager() {
CaffeineCacheManager cacheManager = new CaffeineCacheManager("users", "products");
cacheManager.setCaffeine(Caffeine.newBuilder().expireAfterWrite(10, TimeUnit.MINUTES));
return cacheManager;
}
```
Q10: 스프링에서 캐시 기능을 테스트할 때 유의점은?
A10: 캐시 동작을 테스트하려면 캐시가 활성화된 상태에서 메서드를 호출하고, 캐시 옵션에 따른 동작(조회, 갱신, 삭제)이 의도대로 수행되는지 확인해야 합니다. 프로파일별 캐시 설정이나 Mock 캐시 사용도 고려할 수 있습니다.
---
요약:
1. `@EnableCaching`으로 캐시 활성화
2. `@Cacheable`, `@CachePut`, `@CacheEvict`, `@Caching`애노테이션 활용
3. 구현체(예: Redis, EhCache)별로 캐시 만료 등 세부 설정 가능
4. `CacheManager` 빈으로 캐시 정책 커스터마이징
5. 캐시 키는 기본 파라미터, 필요시 SpEL로 직접 지정
이와 같이 스프링 프레임워크는 간편하게 캐시 기능을 설정하고 활용할 수 있도록 추상화와 다양한 애노테이션을 제공합니다.
캐시는 데이터베이스 조회나 복잡한 계산 결과를 메모리에 저장하여 성능을 향상시키는 데 유용합니다.
스프링은 다양한 캐시 구현체를 지원하며, 이를 쉽게 설정하고 사용할 수 있습니다.
1. 의존성 추가스프링 부트 프로젝트를 사용하고 있다면, `spring-boot-starter-cache` 의존성을 `pom.xml`에 추가합니다.
```xml
2. 캐시 설정캐시를 사용하기 위해서는 먼저 캐시를 활성화해야 합니다.
`@EnableCaching` 애너테이션을 사용하여 캐시 기능을 활성화합니다.
일반적으로 `@SpringBootApplication`이 있는 메인 클래스에 추가합니다.
```javaimport org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cache.annotation.EnableCaching;@SpringBootApplication@EnableCachingpublic class MyApplication { public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); }}```
3. 캐시 구현체 선택스프링은 여러 캐시 구현체를 지원합니다.
기본적으로는 ConcurrentHashMap을 사용하지만, Ehcache, Caffeine, Redis 등 다양한 캐시 구현체를 사용할 수 있습니다.
이 예제에서는 Caffeine을 사용해 보겠습니다.
Caffeine을 사용하기 위해서는 다음 의존성을 추가합니다.
```xml
4. 캐시 설정Caffeine 캐시를 설정하기 위해 `CacheManager`를 빈으로 등록합니다.
아래는 Caffeine 캐시 설정의 예입니다.
```javaimport com.github.benmanes.caffeine.cache.Caffeine;import org.springframework.cache.CacheManager;import org.springframework.cache.annotation.EnableCaching;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import java.util.concurrent.TimeUnit;@Configuration@EnableCachingpublic class CacheConfig { @Bean public CacheManager cacheManager() { return new CaffeineCacheManager("items"); }}```
5. 캐시 사용이제 캐시를 사용할 수 있습니다.
메서드에 `@Cacheable`, `@CachePut`, `@CacheEvict` 애너테이션을 사용하여 캐시를 적용할 수 있습니다.
- `@Cacheable`: 메서드 결과를 캐시에 저장합니다.
- `@CachePut`: 메서드 실행 결과를 캐시에 저장합니다.
항상 메서드를 실행합니다.
- `@CacheEvict`: 캐시에서 데이터를 제거합니다.
아래는 `@Cacheable`을 사용하는 예제입니다.
```javaimport org.springframework.cache.annotation.Cacheable;import org.springframework.stereotype.Service;@Servicepublic class ItemService { @Cacheable("items") public Item getItemById(Long id) { // 데이터베이스에서 아이템을 조회하는 로직 return fetchItemFromDatabase(id); } private Item fetchItemFromDatabase(Long id) { // 실제 데이터베이스 조회 로직 return new Item(id, "Item Name"); }}```
6. 캐시 무효화캐시를 무효화하려면 `@CacheEvict`를 사용합니다.
예를 들어, 아이템을 삭제하는 메서드에서 캐시를 무효화할 수 있습니다.
```javaimport org.springframework.cache.annotation.CacheEvict;import org.springframework.stereotype.Service;@Servicepublic class ItemService { @CacheEvict(value = "items", key = "#id") public void deleteItem(Long id) { // 데이터베이스에서 아이템 삭제 로직 }}```
7. 캐시 설정 확인캐시가 잘 작동하는지 확인하기 위해 로그를 추가하거나, 메서드 호출 시 캐시가 사용되는지 확인할 수 있습니다.
결론스프링에서 캐시 기능을 설정하고 사용하는 방법에 대해 알아보았습니다.
캐시를 적절히 활용하면 애플리케이션의 성능을 크게 향상시킬 수 있습니다.
다양한 캐시 구현체와 설정 옵션을 활용하여 최적의 성능을 이끌어내세요.
작성자:
ㅁㅁ [비회원]
| 작성일자: 1년 전
2024-08-26 08:20:38
조회수: 227 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 227 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.