캐싱: Caching
cache는 데이터나 값을 복사해놓는 임시 기억 장치입니다. cache에 값을 복사해놓음으로서 속도가 느린 장치로의 접근 횟수를 줄일 수 있습니다. 예를 들어, 속도가 느린 장치인 DB에 접근하기 전에 속도가 빠른 redis를 먼저 읽음으로 성능 향상을 꾀할 수 있습니다.
캐싱 전략
Cache-Aside (Lazy Loading)
- 가장 일반적으로 많이 사용하는 캐싱 전략으로 항상 cache를 먼저 체크하고, 없으면 원본에서 데이터를 읽고 cache에 저장합니다.
- 캐싱이 필요한 데이터를 지정하여 해당 데이터들만 캐싱할 수 있고, 원본 데이터가 있기 때문에 Cache Miss가 있어도 치명적이지 않습니다.
- 항상 cache를 먼저 체크하기 때문에 최초 접근이 느립니다. 또한 cache에 데이터가 있는 경우 원본 데이터가 업데이트 되어 있더라도 캐싱되어 있는 데이터를 가져옵니다. 때문에 주기적으로 업데이트를 해주어야 하는데, 업데이트 주기가 일정하지 않아서 cache가 최신 데이터가 아닐 수 있다는 단점이 있습니다.
Write-Through
- 데이터를 write할 때 항상 cache를 업데이트하여 최신 상태를 유지하는 전략입니다.
- write 할 때 항상 caching 하기 때문에 cache가 항상 동기화되어 있어 데이터가 최신입니다.
- 하지만 모든 데이터를 caching 하기 때문에 자주 사용하지 않는 데이터도 caching하고, 쓰기 지연이 발생합니다.
Write-Back
- 데이터를 Cache에서만 다루고, 일정 주기로 데이터를 원본에 업데이트 하는 방식입니다.
- 속도가 빠른 Cache에만 데이터를 쓰고 일정 주기마다 원본에 업데이트를 하기 때문에 작업이 많은 경우 DB 부하가 줄어들고 성능이 좋아집니다.
- 반면, Cache에만 데이터를 쓰기 때문에 원본에 업데이트를 하기 전 장애가 발생하면 데이터 유실의 위험이 있습니다.
Spring Boot에 Cache 구현
Cache를 직접 구현할 수도 있지만 Spring Boot에서 Cache를 제공해줍니다.
1. 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-cache'
위 의존성을 추가해주면 됩니다. 엄밀히 말하자면 위 의존성 내에 포함되어 있는 spring-context-support 가 Cache와 관련된 기능을 제공해줍니다.
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
위 spring-boot-starter-data-redis는 spring-context-support 모듈을 포함하고 있기 때문에 만약 이 의존성을 추가해주었다면 Spring Boot에서 제공하는 캐시 기능을 사용할 수 있습니다.
2. Configuration
@Configuration
@EnableCaching
public class CacheConfig {
}
@EnableCaching을 붙여주어 스프링부트 어플리케이션의 캐싱 기능을 활성화시켜줍니다.
추가적인 캐시 설정이 없다면 @EnableCaching을 SpringBootApplication에 추가해주어도 됩니다. 기본적인 캐시 사용 방법에 대해서 포스팅하고 있기 때문에 CacheConfig 내에 작성할 추가적인 캐시 설정은 추후 포스팅에서 하겠습니다.
3. Caching Annotation
@Cacheable
Cache-Aside 전략 이용, 캐시에 데이터가 존재하면 해당 데이터를 바로 가져오고, 만약 데이터가 없다면 로직 수행 후 데이터를 캐시에 저장합니다.
@Cacheable(value = "cacheValue", key = "#valueId")
public String getValue(String valueId) {
// ...
}
- value = "cacheValue": 캐시 데이터 저장 공간의 이름
- key = "#valueId": 파라미터 valueId을 key로 하여 데이터가 저장
@CachePut
캐시에 데이터가 존재하더라도, 항상 로직을 수행합니다. 주로 cache data가 자주 갱신되거나 최신 데이터를 요할 때 사용됩니다.
@CacheEvict
캐시에 있는 데이터를 삭제합니다.
// 모든 Cache 삭제
@CacheEvict(value = "cacheValue", allEntries = true)
// key 값에 대한 Cache 데이터 제외 하고 삭제
@CacheEvict(value = "cacheValue", key = "#id")
'Spring Boot' 카테고리의 다른 글
Spring Boot 로그(Log) 남기기, log4j2을 사용한 로깅 전략 (0) | 2024.03.22 |
---|---|
Spring Boot Custom Validation 어노테이션 만들기 (0) | 2023.12.13 |
Spring Boot Jsoup을 통한 웹 크롤링 (0) | 2023.12.12 |
Spring Boot Validation @NotNull, @NotEmpty, @NotBlank 차이점 (0) | 2023.10.24 |
SpringBoot에서 JUnit5로 효율적인 단위 테스트 작성하기, Assertions로 값 검증하기 (0) | 2023.10.04 |