STEP 13.์ฝ์ํธ ํธ๋ํฝ ์ฒ๋ฆฌ +์บ์ฑ ์ ๋ต (ํฅํด99 ๋ฐฑ์๋ 5๊ธฐ)
๐คท ์ฝ์ํธ ์์ฝ ํ๋ก๊ทธ๋จ
์ผ๋ฐ์ ์ผ๋ก ์ฝ์ํธ๋ฅผ ์์ฝํ ๋์๋ '์ธ๊ธฐ๊ฐ์'์ 'ํฌ'๋ค์ด ๋ชฐ๋ฆฌ๊ฒ ๋๋ฉฐ ํธ๋ํฝ์ด ๋ฐ์ํ๋ค. ๊ณง ์๋ฒ๊ฐ ๋ถํ๋ฅผ ๋ฐ๊ฒ ๋๋ค. ์ ์ ๋ถํ๋ก ํธ๋ํฝ์ ์ฒ๋ฆฌํ๊ธฐ ์ํ ๋ฐฉ๋ฒ ์ค ์ฌ์ฉ Caching ์ ๋ต์ด ์๋ค.
Caching
๋ฐ์ดํฐ๋ฅผ ์์๋ก ๋ณต์ฌํด๋๋ Storage ๊ณ์ธต์ ์ ๋ถํ๋ก API ์๋ต์ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉ
์ฝ์ํธ ์์ฝํ๋ก๊ทธ๋จ์
- ์ฝ์ํธ ์ผ์ ์กฐํ
- ์ข์ ์กฐํ
- ์ข์ ์์ฝ
- ๊ฒฐ์
์ด 4๊ฐ์ ํต์ฌ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์๋ค.
์บ์ฑ์ ๋ณดํต ๋ฉ์๋ ๋จ์๋ก ์์ฑ๋๋ค. ์์ฃผ ๋ณํ๊ฐ ์ผ์ด๋์ง ์๋, ํ์ง๋ง ๋ง์ ์ฌ์ฉ์๋ค์ด ์ฐพ๋ ๋ถ๋ถ์ ์บ์ฑํ๋ ๊ฒ์ด ์ณ๋ค.
๋ง์ฝ ์ฌ์ฉ์๊ฐ ์์ฃผ ์ฐพ๋ ์ ๋ณด๋ฅผ ์บ์ฑํ๋ฉด, ์๋ก ๋ค๋ฅธ ์ ๋ณด๋ฅผ ๋ณด๋ฉฐ ํผ๋์ด ์ผ์ด๋ ๊ฒ์ด๋ค.
์ด๊ณณ์์ Caching์ผ๋ก ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ ์กฐํ ๋ถ๋ถ์ ๋ณผ ์ ์๋ค.
- ์ฝ์ํธ ์ผ์ ์กฐํ : ์ฝ์ํธ์ ์ค์ ์ ๋ณด๊ฐ ๋ณ๊ฒฝ๋์ง ์๋ ํ ์ ๋ณด๊ฐ ๋ฐ๋์ง ์๋๋ค. ์์ฝ์ ์ํด ์ฌ์ฉ์๋ค์ด ์์ฃผ ์ฐพ๋๋ค.
- > ์บ์ฑ ์ฌ์ฉ ์ ํฉ
- ์ข์ ์กฐํ: ํฐ์ผํ ์ด ์์๋๋ฉด ์ฌ์ฉ์๋ค์ด ์์ฝ์ ํ ๋๋ง๋ค ์ ๋ณด๊ฐ ์์ฃผ ๋ฐ๋๋ค.
- > ์บ์ฑ ์ฌ์ฉ ๋ถ์ ํฉ
Cache ์ฌ์ฉ ๋ฐฉ๋ฒ (spring boot ์์)
@Cacheable
@Cacheable("bestSeller")
public Book getBestSeller(String bookNo) {
}
// ํ์ง๋ง ์ฌ๋ฌ ๊ฐ์ ํ๋ผ๋ฏธํฐ ์ค์์๋ 1๊ฐ์ ํค ๊ฐ์ผ๋ก ์ง์ ํ๊ณ ์ถ์ ๊ฒฝ์ฐ๋ ์๋ค.
// ๊ทธ๋ฌํ ๊ฒฝ์ฐ์๋ ๋ค์๊ณผ ๊ฐ์ด key ๊ฐ์ ๋ณ๋๋ก ์ง์ ํด์ฃผ๋ฉด ๋๋ค.
@Cacheable(value = "bestSeller", key = "#bookNo")
public Book getBestSeller(String bookNo, User user, Date dateTime) {
}
// key๊ฐ์ ์ง์ ์๋ SpEL์ด ์ฌ์ฉ๋๋ค.
// ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ง์ฝ ํ๋ผ๋ฏธํฐ๊ฐ ๊ฐ์ฒด๋ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ์ ์์ฑ์ ์ ๊ทผํ๋ฉด ๋๋ค.
@Cacheable(value = "bestSeller", key = "#book.bookNo")
public Book getBestSeller(Book book, User user, Date dateTime) {
}
//key๊ฐ์ ์ง์ ์๋ SpEL์ด ์ฌ์ฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ง์ฝ ํ๋ผ๋ฏธํฐ๊ฐ ๊ฐ์ฒด๋ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํ์ ์์ฑ์ ์ ๊ทผํ๋ฉด ๋๋ค.
@Cacheable(value = "bestSeller", key = "#book.bookNo")
public Book getBestSeller(Book book, User user, Date dateTime) {
}
//๋ง์ฝ ํ๋ผ๋ฏธํฐ ๊ฐ์ด ํน์ ์กฐ๊ฑด์ธ ๊ฒฝ์ฐ์๋ง ์บ์๋ฅผ ์ ์ฉํ๊ธฐ๋ฅผ ์ํ๋ค๋ฉด condition์ ์ด์ฉํ๋ฉด ๋๋ค.
@Cacheable(value = "bestSeller", key = "#book.bookNo", condition = "#user.type == 'ADMIN'")
public Book getBestSeller(Book book, User user, Date dateTime) {
}
์ถ์ฒ: https://mangkyu.tistory.com/179 [MangKyu's Diary:ํฐ์คํ ๋ฆฌ]
@Cacheable์ ์บ์๋ฅผ ์ฌ์ฉํ๊ณ ์ถ์ ๋ฉ์๋ ๋จ์๋ก ์์์ ๋ฃ๋๋ค. value๋ ์ด๋ฆ์ด ๋๋ฉฐ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค. ํ์ง๋ง ์บ์๊ฐ ๋ ํ์ ์๋ก์ด ์ ๋ณด๋ก ์์ ์ด ๋๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผ ํ ๊น?
@CacheEvict
์บ์๋ ์ ์ ํ ์์ ์ ์ ๊ฑฐ๋์ด์ผ ํ๋๋ฐ, ๋ง์ฝ ๊ฐ์ด ๋ฌ๋ผ์ง๋ค๋ฉด ์บ์๋ฅผ ์ ๊ฑฐํด์ผ ํ ๊ฒ์ด๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ชป๋ ๊ฒฐ๊ณผ๊ฐ ๋ฐํ๋๋ค. ์บ์๋ฅผ ์ ๊ฑฐํ๋ ๋ฐฉ๋ฒ์ ํฌ๊ฒ ๋ค์์ 2๊ฐ์ง๊ฐ ์๋ค.
- ์ผ์ ํ ์ฃผ๊ธฐ๋ก ์บ์๋ฅผ ์ ๊ฑฐ
- ๊ฐ์ด ๋ณํ ๋ ์บ์๋ฅผ ์ ๊ฑฐ
// @CacheEvict์ ์บ์ ์ด๋ฆ์ ๋ฃ์ด์ฃผ๋ฉด ๋ฉ์๋๊ฐ ์คํ๋ญ ๋ ์บ์์ ๋ด์ฉ์ด ์ ๊ฑฐ๋๋ค.
// ๋ง์ฝ bestSeller๋ผ๋ ์ด๋ฆ์ ์บ์๋ฅผ ์ด๊ธฐํํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์์ฑํด์ค ์ ์๋ค.
@CacheEvict(value = "bestSeller")
public void clearBestSeller() {
}
// @CacheEvict๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฉ์๋์ ํค์ ํด๋นํ๋ ์บ์๋ง ์ ๊ฑฐํ๋ค.
// ๋ง์ฝ ๋ค์๊ณผ ๊ฐ์ ๋ฉ์๋์ @CacheEvict๋ฅผ ์ ์ฉํ๋ค๋ฉด bookNo์ ๊ฐ์ ํค ๊ฐ์ ๊ฐ์ง ์บ์๋ง ์ ๊ฑฐ๋๋ค
@CacheEvict(value = "book", key = "#book.bookNo")
public void updateBook(Book book) {
}
// ๋ง์ฝ ์บ์์ ์ ์ฅ๋ ๊ฐ์ ๋ชจ๋ ์ ๊ฑฐํ ํ์๊ฐ ์๋ฐ๋ฉด allEntires ์์ฑ์ true๋ก ์ง์ ํด์ฃผ๋ฉด ๋๋ค.
@CacheEvict(value = "bestSeller", allEntires = true)
public void clearBestSeller() {
}
์ถ์ฒ: https://mangkyu.tistory.com/179 [MangKyu's Diary:ํฐ์คํ ๋ฆฌ]
๐คท์บ์ฑ์ ๋ฌธ์ ์
- ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ - ํ์ฑํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ธ์คํด์ค์ ๋ฐ์ดํฐ๋ฅผ ์ฌ๋ ค ์บ์ฑํ๋ ๋ฐฉ๋ฒ์ด๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ์ผ๋ก ์ธํด ๋น์ ์ ์ข ๋ฃ๋ก ์ด์ด์ง ์ ์์
- ๋ถ์ฐ ํ๊ฒฝ ๋ฌธ์ - ๋ถ์ฐ ํ๊ฒฝ์์ ์๋ก ๋ค๋ฅธ ์๋ฒ ์ธ์คํด์ค ๊ฐ์ ๋ฐ์ดํฐ ๋ถ์ผ์น ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์
> ์ด๋ฐ ๊ฒฝ์ฐ ์บ์ฑ ์๋ฒ๋ฅผ ์ด์ฉํ์ฌ ํด๊ฒฐ์ด ๊ฐ๋ฅํ๋ค. ํ์ ์ ์ฉํ ์ ์๋ค๋ฉด ๊ธ๋ก ์์ฑํ๊ณ ์ถ๋ค.