반응형
@Configuration // 이 클래스가 Spring의 설정 클래스임을 나타냄
@EnableCaching // 캐싱 기능을 활성화
public class CacheConfig {
@Bean // Spring 컨테이너에 등록될 Bean을 정의
public RedisCacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
// Jackson2JsonRedisSerializer 사용
// Redis에 저장될 객체를 JSON 형식으로 직렬화하기 위한 직렬화기 생성
Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
// RedisCacheConfiguration 설정
// 기본 캐시 설정을 가져와 TTL 및 직렬화기 설정
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofMinutes(10)) // TTL 10분 설정 (10분 후 캐시 만료)
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(serializer)) // 값 직렬화기 설정
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer())); // 키 직렬화기 설정
// RedisCacheManager를 생성하여 반환
return RedisCacheManager.builder(redisConnectionFactory) // RedisConnectionFactory를 사용하여 매니저 빌드
.cacheDefaults(config) // 기본 캐시 설정 적용
.build(); // 매니저 빌드 완료
}
}
TeamserviceImpl
//팀 내 명함 조회
@Override
@Cacheable(value = "teamAlbumCache", key = "#teamAlbumId")
public List<PrivateAlbumResponseDto> getTeamAlbumList(Long teamAlbumId, int page) {
log.info("Fetching data from the database for teamAlbumId: {}, page: {}", teamAlbumId, page);
int size = 12;
log.info("teamalbumpageeee " );
Pageable pageable = PageRequest.of(page, size, Sort.by("businesscard.cardId").descending());
Page<TeamAlbumDetail> teamAlbumPage = teamAlbumDetailRepository.findByTeamAlbum_TeamAlbumId(teamAlbumId, pageable);
log.info("teamalbumpageeee " + teamAlbumPage);
List<PrivateAlbumResponseDto> dtos = teamAlbumPage.stream()
.map(bc -> bc.getBusinesscard())
.map(teamsMapper::toDto).toList();
return dtos;
}
TeamsController
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "팀 내 명함 조회 redis caching"),
@ApiResponse(responseCode = "404", description = "팀 내 명함 없음")
})
@GetMapping("/teams/list/{team_album_id}/{page}")
public ResponseEntity<?> getTeamAlbumList(
@PathVariable("team_album_id")Long teamAlbumId,
@PathVariable("page")int page){
log.info("cacheeeeee");
List<PrivateAlbumResponseDto> dtos = teamsService.getTeamAlbumList(teamAlbumId, page);
return ResponseEntity.ok().body(MessageUtils.success(dtos));
}
redis cahing 을 사용하여 디비에 접근하지 않고 빠르게 팀 명함 조회 가능하도록 했습니다
ttl 과 cacheEvict 어노테이션을 활용해 캐시 내용 업데이트를 하게끔 했습니다.