Spring

[Spring] Spring Cache(์Šคํ”„๋ง ์บ์‹œ)๋ž€?

DAHLIA CHOI 2024. 2. 19. 13:58

 

๐Ÿ”Ž Spring Cache๋ž€?

์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋งค๋ฒˆ ์š”์ฒญํ•  ๋•Œ๋งˆ๋‹ค ์ƒ์„ฑํ•˜์—ฌ ์‘๋‹ตํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค๋Š” ์ƒ์„ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด ๋†“๊ณ  ๋˜‘๊ฐ™์€ ์š”์ฒญ์ด ์™”์„ ๋•Œ ๋กœ์ง์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ด ์ฃผ์–ด ๋น ๋ฅธ ๊ฒ€์ƒ‰์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

  • ๋กœ์ปฌ ์บ์‹œ์ด๊ธฐ ๋•Œ๋ฌธ์— application๊ฐ„ ๊ณต์œ ๊ฐ€ ๋˜์ง€ ์•Š๊ณ  ์„œ๋ฒ„๋ฅผ ๋Œ ๋•Œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚ ์•„๊ฐ€๋ฏ€๋กœ ๊ณ„์† ์œ ์ง€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด redis ๊ฐ™์€ ์™ธ๋ถ€ ์ €์žฅ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

 

์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๊ณณ

  • ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌ๋˜๋Š” ๊ฐ’์ด ๋™์ผํ•  ๋•Œ
  • ๋นˆ๋ฒˆํ•˜๊ฒŒ ํ˜ธ์ถœ๋  ๋•Œ
  • ํ•œ ๋ฒˆ ์ฒ˜๋ฆฌํ•  ๋•Œ ๋งŽ์€ ์„œ๋ฒ„ ๋ฆฌ์†Œ์Šค๋ฅผ ์š”๊ตฌํ•  ๋•Œ

 

์‚ฌ์šฉํ•˜์ง€ ๋ง์•„์•ผ ํ•  ๊ณณ

  • ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ •ํ™•์„ฑ์„ ์š”๊ตฌํ•˜๋Š” ๊ฒฝ์šฐ
  • ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ

 

์Šคํ”„๋ง ์„ค์ •

implementation 'org.springframework.boot:spring-boot-starter-cache

 

์–ด๋…ธํ…Œ์ด์…˜

์–ด๋…ธํ…Œ์ด์…˜ ์„ค๋ช…
@EnableCache Spring Boot Cache๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ‘์บ์‹œ ํ™œ์„ฑํ™”’๋ฅผ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜
@CacheConfig ์บ์‹œ ์ •๋ณด๋ฅผ ‘ํด๋ž˜์Šค ๋‹จ์œ„’๋กœ ์‚ฌ์šฉํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ์–ด๋…ธํ…Œ์ด์…˜
@Cacheable ์บ์‹œ ์ •๋ณด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ‘์ €์žฅ’ํ•˜๊ฑฐ๋‚˜ ‘์กฐํšŒ’ํ•ด์˜ค๋Š” ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜
@CachePut ์บ์‹œ ์ •๋ณด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์ƒ์— ‘์ €์žฅ’ํ•˜๋ฉฐ ์กด์žฌ ์‹œ ๊ฐฑ์‹ ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜
@CacheEvict ์บ์‹œ ์ •๋ณด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์ƒ์— ‘์‚ญ์ œ’ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜
@Caching ์—ฌ๋Ÿฌ ๊ฐœ์˜ ‘์บ์‹œ ์–ด๋…ธํ…Œ์ด์…˜’์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์–ด๋…ธํ…Œ์ด์…˜

 

 

@Cacheable, @CachePut, @CacheEvict

@Cacheable(cacheNames = "memberCache", key = "#key")
public Member getCacheData(final String key) {
	log.info("ํ•ด๋‹น key์— ๋Œ€ํ•œ ์บ์‹œ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ๋กœ๊ทธ๊ฐ€ ์ฐํžŒ๋‹ค.");
	return Member;
}

@CachePut(cacheNames = "memberCache", key = "#key")
public Member updateCacheData(final String key, final String value) {
	log.info("ํ•ด๋‹น key์— ๋Œ€ํ•œ ์บ์‹œ๊ฐ€ ์—†๋ฐ์ดํŠธ ๋˜๋Š” ๊ฒฝ์šฐ ๋กœ๊ทธ๊ฐ€ ์ฐํžŒ๋‹ค.");
	Member member = new Member();
	member.setValue(value);
	member.setExpirationDate(LocalDateTime.now().plusDays(1));
	return member;
}

@CacheEvict(cacheNames = "memberCache", key = "#key")
public boolean expireCacheData(final String key) {
	log.info("ํ•ด๋‹น key์— ๋Œ€ํ•œ ์บ์‹œ๋ฅผ ์ง€์šธ ๊ฒฝ์šฐ ๋กœ๊ทธ๊ฐ€ ์ฐํžŒ๋‹ค.");
	return true;
}

 

@Cacheable(cacheNames = "memberCache", key = "#key")

ํ•ด๋‹น key์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด getCacheData๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ๊ธฐ์กด ๋ฐ์ดํ„ฐ๊ฐ€ return ๋œ๋‹ค. ๋ฉ”์„œ๋“œ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋กœ๊ทธ๋„ ์ฐํžˆ์ง€ ์•Š๋Š”๋‹ค.

 

 

  @Cacheable("memberCacheStore")
  public Member cacheable(String date) {
    log.info("cache ์ €์žฅ");
    return member;
  }

  @Cacheable(value = "memberCacheStore", key = "#member.name")
  public Member cacheableByKey(Member member) {
		log.info("cache ์ €์žฅ(key ์ง€์ •)");
    return member;
  }

  @Cacheable(value = "memberCacheStore", key = "#member.name", condition = "#member.name.length() > 5")
  public Member cacheableWithCondition(Member member) {
		log.info("์กฐ๊ฑด๋ถ€ cache ์ €์žฅ");
    return member;
  }
  • spEL(Spring Expression Language) ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ String , Integer, Long ๊ฐ™์€ ๊ฐ’์€ #๋ณ€์ˆ˜๋ช… ํ˜•ํƒœ๋กœ ์‚ฌ์šฉ๋˜๊ณ , ๊ฐ์ฒด ์•ˆ์— ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” #๊ฐ์ฒด๋ช….๋ฉค๋ฒ„๋ช… ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

@CachePut vs @Cacheable

@CachePut๊ณผ @Cacheable์€ ์œ ์‚ฌํ•˜๊ฒŒ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์บ์‹œ์— ์ €์žฅํ•˜์ง€๋งŒ, @Cacheable์€ ์บ์‹œ ์ •๋ณด๋ฅผ ์กฐํšŒํ•˜๋Š” ๋ฐ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๊ณ  @CachePut์€ ์บ์‹œ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š”๋ฐ ์ฃผ๋กœ ์‚ฌ์šฉ๋œ๋‹ค.

  • @CachePut์€ ๋ฌด์กฐ๊ฑด ๋ฉ”์„œ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜๊ณ , @Cacheable์€ ์บ์‹œ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ์—๋งŒ ์‹คํ–‰ํ•˜๊ฒŒ ๋œ๋‹ค.