@Cacheable을 쓰면 Spring이 자동으로 캐시에 저장하고 꺼내는 것까지 가능.
🔍 1. 기본 개념
@Cacheable
- 처음 호출되면 메서드 실행 결과를 캐시에 저장
- 다음에 같은 파라미터로 호출하면 캐시에서 바로 리턴
캐시 저장 위치
- 기본은 JVM 메모리 (Local Cache)
- 설정만 바꾸면 Redis 같은 Remote Cache로도 변경 가능
👉 Spring에서 @Cacheable 을 쓸 때
- 캐시 저장소(Cache Store) 로 뭘 쓸지 정할 수 있어요.
기본값: Local Memory
- 서버 내부 Heap 공간에 저장됨
- 서버가 꺼지면 날아감
- 서버 인스턴스 여러 개일 때 서버끼리 공유 안됨
Redis로 변경: Remote Cache
- 캐시 저장소를 Redis로 바꾸는 것
- 서버 여러 대에서도 공유되는 캐시 저장 가능
- 더 안정적이고 영속성 있음 (TTL 설정도 자유로움)
✅ 2. 코드 예시
@Service
@RequiredArgsConstructor
public class BoardSearchService {
private final BoardRepository boardRepository;
@Cacheable(value = "boardSearchCache", key = "#keyword")
public Page<Board> search(String keyword, Pageable pageable) {
return boardRepository.findByTitleContaining(keyword, pageable);
}
}
설명:
- value = "boardSearchCache" → 캐시 이름
- key = "#keyword" → 캐시 키가 keyword 값
- 첫 호출: DB에서 조회 후 결과를 캐시에 저장
- 두 번째부터: 같은 키워드면 캐시에서 바로 리턴
🧪 3. 테스트 흐름
- /api/v2/boards/search?keyword=java 요청
- → @Cacheable 메서드 실행됨
- → 결과가 boardSearchCache[java] 키로 저장됨
- 다음에 같은 요청 오면 DB 조회 없이 캐시에서 꺼냄
⚙️ 4. 설정 추가
1. 의존성
implementation 'org.springframework.boot:spring-boot-starter-cache'
2. 캐시 활성화
@SpringBootApplication
@EnableCaching
public class YourApp {
public static void main(String[] args) {
SpringApplication.run(YourApp.class, args);
}
}
⚠️ 5. 주의사항
항목 | 설명 |
캐시 키 | @Cacheable(key = "#keyword")로 지정 안 하면 파라미터 전체로 해시됨 |
null 리턴 | 기본 설정에서는 null도 캐시 안됨 |
캐시 삭제 | 변경사항 반영 위해 @CacheEvict 사용해야 함 |
만료 시간 | Local Cache는 기본 설정으로 TTL 없음 (관리 필요) |
🔁 6. 캐시 무효화 예시 (변경 시)
@CacheEvict(value = "boardSearchCache", allEntries = true)
public void createBoard(Board board) {
boardRepository.save(board);
}
검색 대상이 변경되면 기존 캐시 무효화 시켜줘야 함!
📌 보너스: 캐시 저장 구조
Cache 이름: boardSearchCache
└─ Key: "java"
└─ Value: Page<Board> 객체 (검색 결과)
필요하면 Redis에 캐시 저장하도록 설정 바꾸는 법이나, @CachePut 설명도 도와줄게. 더 궁금한 거 있어?
'코딩 > sparta TIL' 카테고리의 다른 글
스프링 심화 Cache 과제 하면서 궁금한것들 (2) | 2025.05.21 |
---|---|
터미널로 Redis 조회 방법 (0) | 2025.05.21 |
DB vs 캐시, 로컬 캐시 vs 리모트 캐시 차이 (0) | 2025.05.19 |
TIL 60 : Docker란 2 (0) | 2025.05.19 |
TIL 59 : Docker 란 (1) | 2025.05.19 |