티스토리 뷰
캐시에 대해서는 두 번이나 정리한 적이 있으므로, 오늘은 바로 본론으로 들어간다.
2022.12.11 - [Development/Technical Interview] - [면접 준비 - Java?]Primary Memory
[면접 준비 - Java?]Primary Memory
어제오늘 JVM의 메모리 구조를 공부하다가 속도와 용량, 일처리 속도의 최적화에 대해 조금 더 알고 싶어서 찾아보게 되었다. 당연하게도 관련 자료가 매우 많고 논문까지 쌓여있는(...) 수준이라
gnidinger.tistory.com
2023.01.14 - [Development/Database] - [Redis]캐시(Cache), 그리고 레디스(Redis)
[Redis]캐시(Cache), 그리고 레디스(Redis)
Cache 전에 메모리에 대한 개념을 정리할 때, 캐시에 대해 적은 적이 있다. 쉽게 말하자면 캐시란 CPU와 메인 메모리 사이의 속도차에 의해 발생하는 병목현상을 줄이기 위해 존재한다. 이를 위해 C
gnidinger.tistory.com
m1맥북을 쓰는 나는 구글링을 해서 아무리 따라해도 내장 레디스가 말을 듣지 않는다.
짜증스럽다기보다 거기에 쏟고 있는 시간이 아까워서 그냥 맥북에 레디스를 설치하고 돌리기로 했다.
dependencies {
...
implementation 'org.springframework.boot:spring-boot-starter-data-redis' // Redis
}
레디스를 캐싱에 사용하려면 지난 번에 설정한 RedisConfig파일에 추가 설정이 필요하다.
2023.01.18 - [Development/Database] - [Redis]레디스(Redis), StringRedisTemplate 튜토리얼
[Redis]레디스(Redis), StringRedisTemplate 튜토리얼
지난 글에 적었듯이 레디스는 다양한 자료형을 지원한다. 해서 조금씩 공부하면서 현재 진행 중인 프로젝트의 캐싱이나 채팅방, 인증번호 저장 등을 모조리 레디스를 사용하도록 교체할 꿈을
gnidinger.tistory.com
@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
- 중남미
- java
- 세계여행
- 유럽여행
- RX100M5
- 파이썬
- 알고리즘
- a6000
- 면접 준비
- spring
- 기술면접
- 지지
- Algorithm
- 야경
- 리스트
- Backjoon
- 칼이사
- 자바
- 세모
- 맛집
- 남미
- 유럽
- 세계일주
- 동적계획법
- 스프링
- 여행
- 스트림
- BOJ
- Python
- 백준
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |