티스토리 뷰

728x90
반응형

캐시에 대해서는 두 번이나 정리한 적이 있으므로, 오늘은 바로 본론으로 들어간다.

 

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 - 저장된 캐시를 제거할 때 사용된다.

만들고 있는 앱이 캐싱을 사용할 일이 많지는 않아서 사용에 제약이 있지만 레디스와 조금 더 친해진 기분이 든다.

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/06   »
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
글 보관함