ํ–ฅํ•ด99

STEP 13.์ฝ˜์„œํŠธ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ +์บ์‹ฑ ์ „๋žต (ํ–ฅํ•ด99 ๋ฐฑ์—”๋“œ 5๊ธฐ)

dev_0hoon 2024. 7. 31. 22:42

 ๐Ÿคท ์ฝ˜์„œํŠธ ์˜ˆ์•ฝ ํ”„๋กœ๊ทธ๋žจ

์ผ๋ฐ˜์ ์œผ๋กœ ์ฝ˜์„œํŠธ๋ฅผ ์˜ˆ์•ฝํ•  ๋•Œ์—๋Š” '์ธ๊ธฐ๊ฐ€์ˆ˜'์˜ 'ํŒฌ'๋“ค์ด ๋ชฐ๋ฆฌ๊ฒŒ ๋˜๋ฉฐ ํŠธ๋ž˜ํ”ฝ์ด ๋ฐœ์ƒํ•œ๋‹ค. ๊ณง ์„œ๋ฒ„๊ฐ€ ๋ถ€ํ•˜๋ฅผ ๋ฐ›๊ฒŒ ๋œ๋‹ค. ์ ์€ ๋ถ€ํ•˜๋กœ ํŠธ๋ž˜ํ”ฝ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ• ์ค‘ ์‚ฌ์šฉ 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:ํ‹ฐ์Šคํ† ๋ฆฌ]

 

 

๐Ÿคท์บ์‹ฑ์˜ ๋ฌธ์ œ์ 

  • ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ - ํ™œ์„ฑํ™”๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ธ์Šคํ„ด์Šค์— ๋ฐ์ดํ„ฐ๋ฅผ ์˜ฌ๋ ค ์บ์‹ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋ฏ€๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ์œผ๋กœ ์ธํ•ด ๋น„์ •์ƒ ์ข…๋ฃŒ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Œ
  • ๋ถ„์‚ฐ ํ™˜๊ฒฝ ๋ฌธ์ œ - ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค ๊ฐ„์— ๋ฐ์ดํ„ฐ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ

ํ–ฅํ”Œ99 ๋ฐœ์ œ

 

> ์ด๋Ÿฐ ๊ฒฝ์šฐ ์บ์‹ฑ ์„œ๋ฒ„๋ฅผ ์ด์šฉํ•˜์—ฌ ํ•ด๊ฒฐ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ํ›„์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ธ€๋กœ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ๋‹ค.