티스토리 뷰

1. Cache란 ?

한번 읽은 데이터를 임시로 저장하고 필요에 따라 전송,갱신,삭제하는 기술

 

2. Cach를 쓰는 이유?

보통 데이터를 서버의 메모리에 저장하게되어 디스크에서 정보를 얻어오는 것보다 훨씬 빠른 I/O 성능을 얻을 수 있다

하지만 서버가 다운되거나 재부팅되는 경우 사라지는 휘발성의 성격을 가지고 있음으로 정보를 임시적으로 보관하고 그 정보에 빠르게 접근하기 위한 용도로 사용된다

  • 서버간 불필요한 트래픽을 줄일 수 있다
  • 웹어플리케이션 서버의 부하를 감소시킬 수 있다
  • 어플리케이션의 빠른 처리성능(조회)를 확보할 수 있다

3. Cache를 상요할 때 주의할 점

캐싱하려는 정보, 캐싱 정보의 유효기간(TTL-Time To Live), 캐싱정보의 갱신시점

무작정 많은 정보를 캐싱하는 것이 좋은  것이 아니다. Cache로 적용할까를 따져보고 위에 대한 캐싱전략을 세우는 것이 중요


1. 스프링부트에서 제공하는 캐싱 라이브러리

 

스프링부트에서는 캐싱을 위해 다음과 같은 Third-Party Cache 라이브러리를 제공한다 

  • Redis
  • Embedded Redis - 내장 Redis 또한 제공
  • Caffeine
  • EnCache
  • Hazlecate
  • Infinispan

Redis 사용법은 매우 간단하다 라이브러리 추가 후 properties 파일에 사용하려는 redis의 host 와 port 를 명시해주면 끝

spring.cache.type=redis
spring.redis.host=localhost
spring.redis.port=6379

 

2. 캐시를 사용하기 위한 어노테이션 - 스프링부트 참 착해유? 

 

  • @EnableCaching - 애플리케이션 클래스에 추가하여 캐시 사용을 알린다
  • @Cacheable / @CachePut - 캐시등록
    • Cacheable은 캐시가 있으면 캐시의 정보를 가져오고, 없으면 등록한다
    • CachePut은 무조건 캐시에 저장한다 
  • @CacheEvict - 캐시삭제

@EnableCaching을 제외한 나머지 어노테이션들은 일반 메소드에 붙여 사용이 가능하다

보통 서비스와 컨트롤러 메소드에서 많이 사용한다 컨트롤러 메소드에 적용을 하면 파라미터의 값이 Redis의 키값으로 자동지정된다

- > spEL(Spring Expression Language) 지원 : 캐시의 키 값과 조건들을 메소드의 인자객체와 반환객체의 항목들로 동적 구성 가능 

value , ket, unless 등의 어노테이션 옵션으로 특정 조건에 따른 캐시적용여부도 설정이 가능하다 

 

어노테이션 사용 예제 

 @Cacheable(value = CacheKey.MEMBER, key="#email", cacheManager="cacheManager")
    public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
        System.out.println("loadUserByUsername is Running");
        Member member = memberRepository.findByEmail(email).orElseThrow(MemberNotFoundException::new);

        return new User(member.getEmail(), member.getPwd(),makeGrantedAuthority(member.getRole()));
    }

나는 스프링 시큐리티에서 매 요청시 DB에서 사용자 정보를 조회하여 User 객체를 만드는 부분에서 Cache 기능을 사용하였다 

 

RedisCacheConfig.java

import java.time.Duration;
import java.util.HashMap;
import java.util.Map;

@Configuration
@EnableCaching
public class RedisCacheConfig {

    @Bean(name = "cacheManager")
    public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {

        RedisCacheConfiguration configuration = RedisCacheConfiguration.defaultCacheConfig()
                .disableCachingNullValues() // null value 캐시안함
                .entryTtl(Duration.ofSeconds(CacheKey.DEFAULT_EXPIRE_SEC)) // 캐시의 기본 유효시간 설정(TTL)
                .computePrefixWith(CacheKeyPrefix.simple())
                .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))  //redis 캐시 키 값 저장방식 - StringRedisSerializer
                .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));// redis 캐시 정보값 저장방식 - GenericJackson2JsonRedisSerializer - json 문자열

        Map<String, RedisCacheConfiguration> cacheConfigurations = new HashMap<>();
        cacheConfigurations.put(CacheKey.MEMBER, RedisCacheConfiguration.defaultCacheConfig()
                .entryTtl(Duration.ofSeconds(CacheKey.MEMBER_EXPIRE_SEC)));

        return RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(connectionFactory).cacheDefaults(configuration)
                .withInitialCacheConfigurations(cacheConfigurations).build();

    }
}

 

Configuration 설정을 하여 캐시의 TTL 적용 및 직렬화 방식을 설정할 수 있다 

CachingConfigurerSupport 클래스를 상속받아 cacheManager 메소드를 오버라이딩 하여 CacheManager를 정의 할 수 있고 나처럼 cacheManager 메소드를 만들어 내부에서 설정을 해주고 빈으로 등록하여도 사용이 가능하다

CacheKey는 추후에 사용자 정보가 아닌 다른 정보들을 저장하기 위해 만들어놓았다 

 

참고블로그

Embedded Rdis 참고블로그

캐싱 처리를 위해 기본적인 가볍게 알아보았는데 추후에 CacheManager와 로깅처리에 대해 더 알아봐야겠다

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