๐ 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์ ์บ์ ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ง ์คํํ๊ฒ ๋๋ค.