Spring Cache Anotation ๐ŸŒ€

Lzhtkยท2025๋…„ 8์›” 26์ผ

์˜ค๋Š˜์€ Spring Cache์—์„œ ์ž์ฃผ ์“ฐ์ด๋Š” 3๋Œ€ ์–ด๋…ธํ…Œ์ด์…˜์ธ @Cacheable, @CachePut, @CacheEvict์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž โ—

Spring Cache๋Š” ๋ฉ”์„œ๋“œ์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์ž๋™์œผ๋กœ ์บ์‹œ์— ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๊ฐฑ์‹ ํ•˜๊ฑฐ๋‚˜ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์„ ์–ธ์  ์บ์‹ฑ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค. ์˜ค๋Š˜์€ ๊ทธ ํ•ต์‹ฌ ์–ด๋…ธํ…Œ์ด์…˜์ธ @Cacheable, @CachePut, @CacheEvict์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž


1 . ๐Ÿ’ฒ @Cacheable์ด๋ž€?

  • ์บ์‹œ์— ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ์œผ๋ฉด DB๋‚˜ API ํ˜ธ์ถœ ์—†์ด ์บ์‹œ์—์„œ ๋ฐ”๋กœ ๊บผ๋‚ด์˜ค๋Š” ๋ฐฉ์‹์ด๋‹ค.
  • ์ฆ‰, ์ด๋ฏธ ์กด์žฌํ•˜๋ฉด ์บ์‹œ์—์„œ ๊ฐ€์ ธ์˜ค๊ณ  ์—†์œผ๋ฉด ์‹คํ–‰ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œ์— ์ €์žฅํ•œ๋‹ค๋Š” ๊ฐœ๋…์ด๋‹ค.
  • ์ฃผ๋กœ ์กฐํšŒ( READ ) ์„ฑ๊ฒฉ์ด ๊ฐ•ํ•œ ๋ฉ”์„œ๋“œ์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋œ๋‹ค.

ํ•ต์‹ฌ ํ‚ค์›Œ๋“œ : ์กฐํšŒ ์ตœ์ ํ™”

@Cacheable(value = "books", key = "#id")
public Book findBookById(Long id) {
	log.info("DB ์กฐํšŒ ์‹คํ–‰!");
    return bookRepository.findById(id).orElseThrow();
}
  • ์ฒซ ํ˜ธ์ถœ ์‹œ์—๋Š” DB์—์„œ ๊ฐ€์ ธ์˜ค๊ณ  ์บ์‹œ์— ์ €์žฅ
  • ๊ทธ ๋‹ค์Œ ํ˜ธ์ถœ๋ถ€ํ„ฐ๋Š” DB๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ์บ์‹œ์—์„œ ๋ฐ˜ํ™˜ ( ๋กœ๊ทธ๊ฐ€ ์ฐํžˆ์ง€ ์•Š๋Š”๋‹ค. )

2 . ๐Ÿ“ @CachePut์ด๋ž€?

  • ์บ์‹œ๋ฅผ ๋ฌด์กฐ๊ฑด ๊ฐฑ์‹ ( update )ํ•œ๋‹ค.
  • ๋ฉ”์„œ๋“œ๋Š” ํ•ญ์ƒ ์‹คํ–‰๋˜๊ณ , ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ์บ์‹œ์— ๋ฐ˜์˜๋œ๋‹ค.
  • ์ฃผ๋กœ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ( update ) ์ž‘์—… ์ดํ›„ ์บ์‹œ๋ฅผ ์ตœ์‹  ์ƒํƒœ๋กœ ์œ ์ง€ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

ํ•ต์‹ฌ ํ‚ค์›Œ๋“œ : ์บ์‹œ ๋™๊ธฐํ™”

@CachePut(value = "books", key = "#book.id")
public Book updateBook(Book book) {
	log.info("DB ์ˆ˜์ • + ์บ์‹œ ๊ฐฑ์‹  ์‹คํ–‰!");
    return bookRepository.save(book);
}
  • DB์— ๋ฐ˜์˜๋œ ์ตœ์‹  ๋ฐ์ดํ„ฐ๋ฅผ ๊ณง ๋ฐ”๋กœ ์บ์‹œ์—๋„ ๋ฎ์–ด์จ์„œ ์กฐํšŒ ์‹œ ์˜ค๋ž˜๋œ ์บ์‹œ๊ฐ€ ๋ฐ˜ํ™˜๋˜๋Š” ๋ฌธ์ œ๋ฅผ ์˜ˆ๋ฐฉ !

3 . ๐Ÿงน @CacheEvict๋ž€?

  • ์บ์‹œ๋ฅผ ์‚ญ์ œ( ๋ฌดํšจํ™” ) ํ•œ๋‹ค.
  • ๋ฐ์ดํ„ฐ๊ฐ€ ์‚ญ์ œ๋˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ๋  ๋•Œ, ๊ธฐ์กด ์บ์‹œ๋ฅผ ์ง€์›Œ์ฃผ๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
  • allEntries = true ์˜ต์…˜์„ ์ฃผ๋ฉด ํ•ด๋‹น ์บ์‹œ ์˜์—ญ ์ „์ฒด๋ฅผ ๋น„์šธ ์ˆ˜๋„ ์žˆ๋‹ค.

ํ•ต์‹ฌ ํ‚ค์›Œ๋“œ : ์บ์‹œ ์ •๋ฆฌ

@CacheEvict(value = "books", key = "#id")
public void deleteBook(Long id) {
    log.info("DB ์‚ญ์ œ + ์บ์‹œ ๋ฌดํšจํ™” ์‹คํ–‰!");
    bookRepository.deleteById(id);
}
  • ํŠน์ • ID์— ๋Œ€ํ•œ ์บ์‹œ๋งŒ ์ œ๊ฑฐ ๊ฐ€๋Šฅ
  • or ํ•„์š”์‹œ ์ „์ฒด ์บ์‹œ ๋‚ ๋ฆฌ๊ธฐ๋„ ๊ฐ€๋Šฅ

4 . ๐Ÿ‘ฉ๐Ÿปโ€๐Ÿซ ์–ธ์ œ ์–ด๋–ค ์–ด๋…ธํ…Œ์ด์…˜์„ ์‚ฌ์šฉํ•ด์•ผํ• ๊นŒ?

  • @Cacheable -> ์กฐํšŒ ์„ฑ๋Šฅ ์ตœ์ ํ™” ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ ( ex. ๋„์„œ ์ƒ์„ธ ์กฐํšŒ, ์ธ๊ธฐ ๊ธ€ ๋ชฉ๋ก )
  • @CachePut -> DB์— ์ €์žฅ/์ˆ˜์ • ํ›„ ์บ์‹œ๊นŒ์ง€ ์ตœ์‹ ํ™”๊ฐ€ ํ•„์š”ํ•œ ๋ฉ”์„œ๋“œ ( ex. ๊ฒŒ์‹œ๊ธ€ ์ˆ˜์ •, ์‚ฌ์šฉ์ž ํ”„๋กœํ•„ ๋ณ€๊ฒฝ )
  • @CacheEvict -> ๋ฐ์ดํ„ฐ ์‚ญ์ œ๋‚˜ ๋ณ€๊ฒฝ ์‹œ ๋‚ก์€ ์บ์‹œ๋ฅผ ๋น„์›Œ์•ผํ•˜๋Š” ๊ฒฝ์šฐ ( ex. ๊ฒŒ์‹œ๊ธ€ ์‚ญ์ œ, ์•Œ๋ฆผ ์‚ญ์ œ )

5 . ๋งˆ๋ฌด๋ฆฌ ๐Ÿ”š

Spring Cache๋Š” ๋‹จ์ˆœํ•ด ๋ณด์ด์ง€๋งŒ,
์˜ฌ๋ฐ”๋ฅธ ์บ์‹œ ์ „๋žต์„ ์„ธ์šฐ์ง€ ์•Š์œผ๋ฉด ์˜ค๋ž˜๋œ ๋ฐ์ดํ„ฐ ์ œ๊ณต์ด๋‚˜ ๋ถˆํ•„์š”ํ•œ ์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.
์˜ค๋Š˜ ์•Œ์•„๋ณธ @Cachealbe, @CachePut, @CacheEvict์˜ ์—ญํ• ๊ณผ ์ƒํ™ฉ์„ ์ž˜ ๊ตฌ๋ถ„ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์กฐํšŒ ์„ฑ๋Šฅ์„ ๋†’์ด๋ฉด์„œ๋„ ํ•ญ์ƒ ์ตœ์‹  ์ƒํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด์žฅํ•˜๋Š” ์Šค๋งˆํŠธํ•œ ์บ์‹ฑ ์ „๋žต์„ ์„ธ์šธ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค ๐Ÿ’ฏ

0๊ฐœ์˜ ๋Œ“๊ธ€