티스토리 뷰
캐시에 대해서는 두 번이나 정리한 적이 있으므로, 오늘은 바로 본론으로 들어간다.
2022.12.11 - [Development/Technical Interview] - [면접 준비 - Java?]Primary Memory
2023.01.14 - [Development/Database] - [Redis]캐시(Cache), 그리고 레디스(Redis)
m1맥북을 쓰는 나는 구글링을 해서 아무리 따라해도 내장 레디스가 말을 듣지 않는다.
짜증스럽다기보다 거기에 쏟고 있는 시간이 아까워서 그냥 맥북에 레디스를 설치하고 돌리기로 했다.
dependencies {
...
implementation 'org.springframework.boot:spring-boot-starter-data-redis' // Redis
}
레디스를 캐싱에 사용하려면 지난 번에 설정한 RedisConfig파일에 추가 설정이 필요하다.
2023.01.18 - [Development/Database] - [Redis]레디스(Redis), StringRedisTemplate 튜토리얼
@EnableCaching
@Configuration
public class RedisConfig {
...
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(redisHost, redisPort);
}
@Bean
public RedisCacheManager redisCacheManager() {
RedisCacheConfiguration redisCacheConfig = RedisCacheConfiguration
.defaultCacheConfig()
.disableCachingNullValues()
.serializeKeysWith(RedisSerializationContext
.SerializationPair
.fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(RedisSerializationContext
.SerializationPair
.fromSerializer(new GenericJackson2JsonRedisSerializer()));
Map<String, RedisCacheConfiguration> cacheConfiguration = new HashMap<>();
cacheConfiguration.put(FEED_LIST, redisCacheConfig.entryTtl(Duration.ofMinutes(3)));
cacheConfiguration.put(COMMENT_LIST, redisCacheConfig.entryTtl(Duration.ofMinutes(3)));
return RedisCacheManager.RedisCacheManagerBuilder
.fromConnectionFactory(redisConnectionFactory())
.cacheDefaults(redisCacheConfig)
.build();
}
}
@EnableCaching 애너테이션도 추가된 것을 확인할 수 있다.
캐시 설정 맵에 키로 쓰이는 값은 확장성을 위해 파일을 따로 분리해서 만들어 두었다.
public class CacheConstant {
public static final String NEWEST_FEEDS = "newestFeeds";
public static final String FEED_COMMENTS = "commentList";
}
계속해서 application.yml에 추가되는 내용이다.
spring:
cache:
type: redis
...
마지막으로 실행파일에도 애너테이션을 추가해 준다.
@EnableAsync
@EnableCaching
@EnableJpaAuditing
@SpringBootApplication(exclude = SecurityAutoConfiguration.class)
public class BackApplication {
public static void main(String[] args) {
SpringApplication.run(BackApplication.class, args);
}
}
여기까지 해준 후에 캐싱을 이용할 비즈니스 로직, 혹은 핸들러 메서드에 아래와 같이 애너테이션을 달아주면 된다.
@Cacheable(key = "#feedId", value = FEED_COMMENTS)
public Page<Comment> getFeedComments(Long feedId, int page) {
PageRequest pageRequest = PageRequest.of(page - 1, 10);
return commentQueryRepository.findFeedComment(feedId, pageRequest);
}
캐시는 키-값 형식으로 저장되기 때문에 위와 같이 키를 지정해 줄 수 있으며,
이외에도 cacheManager 속성을 이용한 캐시 매니저 지정,
unless와 condition을 이용한 캐시 저장 조건 설정등을 추가할 수 있다.
또한 캐싱을 이용하는 애너테이션은 두 가지가 더 있는데, 각각 아래와 같다.
- @CachePut - 결과를 캐시에 저장 및 갱신하지만 조회 시에 사용하지는 않는다.
- @CacheEvict - 저장된 캐시를 제거할 때 사용된다.
만들고 있는 앱이 캐싱을 사용할 일이 많지는 않아서 사용에 제약이 있지만 레디스와 조금 더 친해진 기분이 든다.
'Development > Database' 카테고리의 다른 글
[Database]Inner Join, Outer Join, 그리고 (0) | 2023.03.16 |
---|---|
[Data]자바에도 있네, 데이터 분석 툴. Tablesaw (0) | 2023.02.17 |
[ES]Elastic Search, Lucene, 그리고 (2) | 2023.02.15 |
[Redis]레디스(Redis), StringRedisTemplate 튜토리얼 (2) | 2023.01.18 |
[Redis]캐시(Cache), 그리고 레디스(Redis) (2) | 2023.01.14 |
[데이터베이스]관계형 데이터베이스의 ERD (2) | 2022.08.07 |
- Total
- Today
- Yesterday
- Python
- 지지
- 남미
- 백준
- java
- 칼이사
- a6000
- 여행
- 면접 준비
- RX100M5
- 세모
- 스프링
- BOJ
- spring
- Algorithm
- 유럽여행
- 맛집
- 알고리즘
- 리스트
- 동적계획법
- 중남미
- 유럽
- 파이썬
- Backjoon
- 자바
- 세계일주
- 기술면접
- 세계여행
- 야경
- 스트림
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |