Cache, Redis

seul·2022년 11월 25일
0

공부

목록 보기
3/13

잘 모르는 개념은 싹 정리해서 읽고 또 읽어야 하는데,
맥북 메모장에만 적혀 있으면 언제 읽나요?

지금 읽으려고 적습니다.
입사 초기에 너무나도 생소했던 Cache~

📫 Cache

사용 위치

  • 적절한 사용: 클라이언트에게 전달되는 값이 동일하거나, 빈번하게 호출되거나, 처리 시 많은 서버 리소스를 요구할 때
  • 부적절한 사용: 실시간으로 정확성을 요구하거나, 빈번하게 데이터 변경이 일어날 때

Spring Boot 기본 Cache 사용 설정

  • 스프링부트는 캐시 기능을 제공해줌
  • 어플리케이션을 실행하면 어플리케이션이 살아있는 동안 캐시 공간을 사용함 -> 메모리 차지함
  • 어플리케이션이 캐시 데이터는 없어짐 -> 보완책: redis 사용 (또는 Encache, ConcurrentMap... 이건 더 알아보기)

캐시 어노테이션

@EnableCahing

어플리케이션, 클래스 등에 붙이는 어노테이션
어노테이션이 붙은 부분에 캐싱 기능이 활성화 되도록 한다

@Cacheable

캐시를 저장, 조회
캐시에 데이터가 없으면 기존의 로직을 실행한 뒤 캐시에 데이터를 저장
캐시에 데이터가 있으면 그 데이터를 리턴

(사용 예시 추가하기)

value

필수 속성

key

선택 속성
메소드에 파라미터가 없으면 0이라는 디폴트 값을 key로 생성
만약 파라미터가 여러 개면 파라미터들의 hash code 값을 조합하여 키 생성
여러 개의 파라미터 중 1개의 키 값으로 지정하고 싶다면 별도로 지정해주면 된다 (ex. key = "#bookId")

unless

unless="#result == null"

null 값이 캐쉬 처리 되지 않도록 하기 위해

@CachePut

캐시에 값을 저장하는 용도
조회 시 저장된 캐시 내용을 사용하지 않고, 항상 메서드의 로직을 실행
(메서드의 흐름 최적화보다는 캐시 생성에 사용해야 함)

@CacheEvict

실행 시 캐시 내용 제거
동작할 때 영향을 끼치는 하나 이상의 캐시를 지정해야 함
key 값을 적용할 경우, 같은 key 값을 가진 캐시만 제거

beforeInvocation (= true)

메서드 시작 전에 캐시를 비우는 작업을 수행함
삭제는 메서드가 성공적으로 완료되면 수행함 -> 캐시 되어서 메서드가 실행되지 않거나 예외가 발생하면 실행되지 않아서 항상 제거를 원하면 해당 옵션 쓰기

allEntries (= true)

한 지역의 전체 캐시를 지워야 할 때
value로 지정된 모든 것을 지우는 듯? (key에 관계 없이)

더 깊게 이해하려면: https://javaiyagi.tistory.com/352

@Caching

캐시의 어노테이션을 여러 개 지정해야 하는 경우가 있을 때 감싸서 사용한다

@Caching(evict = @CacheEvict(), put = @CachePut())

참고 url: https://blog.outsider.ne.kr/1094

🔑 Redis 적용 방법 (까먹어서 추후 보완 예정)

(참고: https://kim-oriental.tistory.com/28)

Redis

key-value 구조의 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 데이터베이스 관리 시스템

적용 방법

  1. 우선, 로컬에 설치해야 함
  2. build.gradle에 spring-boot-starter-data-redis를 추가하고 빌드
  3. application.yml에 spring: redis:로 host, post 설정

각종.. 어쩌구

  • 캐싱할 응답 값이 String이 아니라 Json 같은 형태라면 Serializer 에러가 발생함
    -> CacheManager 설정을 해줌
    -> json 포맷 지원을 위한 Jackson2JsonRedisSerializer 또는 GenericJackson2JsonRedisSerializer로 변경

  • RedisCacheConfiguration > defaultCacheConfig > serializeValueWith(ReidsSerializationContext.SerializationPair.fromSelializer(new Generic 어쩌고)) -> 이런 식으로 값 수정
    -> entryTtl 캐시 수명 설정

@EnableRedisRepositories

추가 예정

@Configuration

추가 예정

profile
자존감은 일상의 성실함으로부터 온다

0개의 댓글