Notice
Recent Posts
Recent Comments
Link
🌱 → 🌳
Spring에서 Redis로 캐싱처리 본문
728x90
- UT를 통해 데이터 베이스에 요청이 가장 많이 들어오는 Service에 데이터를 빠르게 조회할 수 있도록 Server side caching을 적용하여 성능을 향상 시켰습니다.
- @Cacheable을 사용해서 서비스에서 가장 조회가 많이 생기는 공고 조회 로직을 Redis를 이용하여 캐싱처리
// 레디스 캐시
@Bean
public RedisCacheManager redisCacheManager() {
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration
.defaultCacheConfig()
.disableCachingNullValues()
.serializeValuesWith(
RedisSerializationContext.SerializationPair
.fromSerializer(new GenericJackson2JsonRedisSerializer(objectMapper))
);
return RedisCacheManager.RedisCacheManagerBuilder
.fromConnectionFactory(redisConnectionFactory())
.cacheDefaults(redisCacheConfiguration)
.build();
}
// domain.study.service.StudySearchService
// 캐시 키 생성
public String generateCacheKey(String keyword, int pageIndex, int pageCount, String sortedType, UserDetailsImpl userDetails, CompanyDetailsImpl companyDetails) {
String userId = userDetails != null ? String.valueOf(userDetails.getUser().getId()) : "null";
String companyId = companyDetails != null ? String.valueOf(companyDetails.getCompany().getId()) : "null";
return "CustomKey [" + keyword + "," + pageIndex + "," + pageCount + "," + sortedType + "," + userId + "," + companyId + "]";
}
캐싱 적용 전
캐싱 적용 후
RedisTemplate (low level)
RedisTemplate은 Redis와 상호작용하도록 높은 수준으로 추상화를 제공하는 클래스로 다양한 Redis 연산, 예외 변환, 트랜잭션, 직렬화 커스텀 기능을 제공한다.
- Redis 트랜잭션 기능: Redis는 싱글 쓰레드, Atomic한 자료구조로 RaceCondition을 피할 수 있다. Redis 트랜잭션 기능 좀 더 큰 단위로 그러한 Atomic한 여러 명령어들을 한 묶음으로 묶어주는 기능이다. MULTI → commands → EXEC/DISCARD
Redis Config
ConnectionFactory는 lettuce로 설정한 다음 RedisTemplate 빈을 등록해준다.
Serializer
- JdkSerializationRedisSerializer: 디폴트로 등록되어있는 Serializer이다.
- StringRedisSerializer: String 값을 정상적으로 읽어서 저장한다. 그러나 엔티티나 VO같은 타입은 cast 할 수 없다.
- Jackson2JsonRedisSerializer(classType.class): classType 값을 json 형태로 저장한다. 특정 클래스(classType)에게만 직속되어있다는 단점이 있다.
- GenericJackson2JsonRedisSerializer: 모든 classType을 json 형태로 저장할 수 있는 범용적인 Jackson2JsonRedisSerializer이다. 캐싱에 클래스 타입도 저장된다는 단점이 있지만 RedisTemplate을 이용해 다양한 타입 객체를 캐싱할 때 사용하기에 좋다
728x90
'Server > Java & Spring' 카테고리의 다른 글
[Java] 객체지향 프로그래밍(OOP) (0) | 2023.05.31 |
---|---|
[Spring boot] properties 사용시 "Could not resolve placeholder" 오류 발생 (2) | 2023.05.28 |
[Spring] save() vs saveAndFlush() (0) | 2023.03.22 |
[Spring] IoC, DI란? (0) | 2023.03.22 |
[Spring] 의존성 주입(Dependency Injection)에서 final 키워드를 사용하는 이유 (0) | 2023.03.22 |