코딩/sparta TIL

스프링에서 캐시 저장하는 방법

americanoallday 2025. 5. 19. 21:27

@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. 테스트 흐름

  1. /api/v2/boards/search?keyword=java 요청
  2. @Cacheable 메서드 실행됨
  3. → 결과가 boardSearchCache[java] 키로 저장됨
  4. 다음에 같은 요청 오면 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 설명도 도와줄게. 더 궁금한 거 있어?