Contents

[Mastering Spring 5.0] 6.8 캐싱

μŠ€ν”„λ§ 5.0 λ§ˆμŠ€ν„° μŠ€ν„°λ””
μŠ€ν”„λ§ 5.0 λ§ˆμŠ€ν„° μŠ€ν„°λ”” ν•™μŠ΅ λ‚΄μš© μ •λ¦¬μž…λ‹ˆλ‹€.

캐싱

  • 캐싱은 λ§Žμ€ μ‹œκ°„μ΄λ‚˜ 연산이 ν•„μš”ν•œ 일데 λŒ€ν•œ κ²°κ³Όλ₯Ό μ €μž₯ν•΄ λ‘λŠ” 것 이라고 ν•  수 μžˆλ‹€.
  • μ„œλΉ„μŠ€μ˜ 데이터 캐싱은 μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ„±λŠ₯κ³Ό ν™•μž₯성을 ν–₯μƒμ‹œν‚€λŠ”λ° μ€‘μš”ν•œ 역할을 ν•œλ‹€.
  • μŠ€ν”„λ§μ€ μ–΄λ…Έν…Œμ΄μ…˜μ— κΈ°λ°˜μ„ λ‘” 캐싱 좔상화λ₯Ό μ œκ³΅ν•œλ‹€.
  • JSR-107(JCahce) κ΅¬ν˜„μ²΄ 듀은 λͺ¨λ‘ μ§€μ›ν•œλ‹€.
  • EhCache, Hazelcast, Infinispan, Couchbase, Redis 등이 기본적으둜 μžλ™μ„€μ •μ— ν¬ν•¨λ˜μ–΄ μžˆλ‹€.

μŠ€ν”„λ§ λΆ€νŠΈ ν”„λ‘œμ νŠΈμ— 캐싱 μ μš©ν•˜κΈ°

μ˜μ‘΄μ„± μΆ”κ°€

spring-boot-starter-cache λ₯Ό pom.xml λ˜λŠ” build.gradle 에 μΆ”κ°€ν•œλ‹€. 이 의쑴λͺ¨λ“ˆμ„ μΆ”κ°€ν•˜λ©΄ JSR-107 및 μŠ€ν”„λ§ 캐싱 μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•˜λŠ”λ° ν•„μš”ν•œ μ˜μ‘΄μ„±μ΄ 생긴닀.

pom.xml

1
2
3
4
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-cache</artifactId>
</dependency>

build.gradle

1
implementation('org.springframework.boot:spring-boot-starter-cache')

캐싱 ν™œμ„±ν™”

1
2
3
@EnableCaching // μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ 캐싱을 κ°€λŠ₯ν•˜κ²Œ μ„€μ •ν•œλ‹€. 
@SpringBootApplication
public class Chapter06Application {

데이터 μΊμ‹±ν•˜κΈ°

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
@Cacheable("todos")
public List<Todo> retrieveTodos(String user) {
    List<Todo> filteredTodos = new ArrayList<Todo>();
    for (Todo todo : todos) {
        if (todo.getUser().equals(user)) {
            filteredTodos.add(todo);
        }
    }
    return filteredTodos;
}

@Cacheable(cacheNames = "todos", condition = "#user.length < 10")
public Todo retrieveTodo(int id) {
    for (Todo todo : todos) {
        if (todo.getId() == id) {
            return todo;
        }
    }
    return null;
}
  • @CachePut : 데이터λ₯Ό μΊμ‹œμ— λͺ…μ‹œμ μœΌλ‘œ μΆ”κ°€ν•˜λŠ”λ° μ‚¬μš©λœλ‹€.
  • @CacheEvict : μΊμ‹œμ—μ„œ 였래된 데이터λ₯Ό μ œκ±°ν•˜λŠ”λ° μ‚¬μš©λœλ‹€.
  • @Caching : μ—¬λŸ¬ 개의 μ€‘μ²©λœ @Cacheable, @Cacheput, @CacheEvict μ–΄λ…Έν…Œμ΄μ…˜μ„ λ™μΌν•œ λ©”μ„œλ“œμ—μ„œ μ‚¬μš©ν•  수 μžˆλ‹€.

JSR-107 캐싱 μ–΄λ…Έν…Œμ΄μ…˜

  • JSR-107 의 λͺ©ν‘œλŠ” 캐싱 μ–΄λ…Έν…Œμ΄μ…˜μ„ ν‘œμ€€ν™” ν•˜λŠ”κ²ƒ.
  • μŠ€ν”„λ§ 캐싱 μ–΄λ…Έν…Œμ΄μ…˜κ³Ό JSR-107 이 μ œκ³΅ν•˜λŠ” κΈ°λŠ₯은 μœ μ‚¬ν•˜λ‹€.
  • λ™μΌν•œ ν”„λ‘œμ νŠΈμ—μ„œ λ‘˜λ‹€ μ‚¬μš©ν•΄μ„œλŠ” μ•ˆλœλ‹€.

μ£Όμš” JSR-107 μ–΄λ…Έν…Œμ΄μ…˜

  • @CacheResult : @Cacheable κ³Ό μœ μ‚¬ν•˜λ‹€.
  • @CacheRemove : @CacheEvit 와 μœ μ‚¬ν•˜λ‹€. @CacheRemove λŠ” μ˜ˆμ™Έκ°€ λ°œμƒν•œ 경우 쑰건뢀 제거λ₯Ό μ§€μ›ν•œλ‹€.
  • @CacheRemoveAll : @CacheEvict 와 μœ μ‚¬ (allEntries = true) μΊμ‹œμ—μ„œ λͺ¨λ“  ν•­λͺ©μ„ μ œκ±°ν•˜λŠ”λ° μ‚¬μš©λœλ‹€.