자기소개페이지만들기

9. redis를 이용한 간단한 캐싱 적용 해보기

이글에서는 자기소개프로젝트에 간단하게 redis를 적용해서 캐싱하는 것을 적용할려고 합니다.

 

2021-05-14

프론트 엔드 서버에서 레디스를 도커로 실행한 부분을 백엔드로 이동하면서

도커를 통한 레디스 설치 내용을 추가하였습니다.

 

도커가 설치되어있다는 가정아래에

redis 이미지를 풀받고

docker pull redis

백그라운드로 6379 포트를 터널링하여 레디스를 컨테이너로 실행시킵니다. 

docker run --name introredis -d -p 6379:6379 redis

해당 컨테이너에 redis-cli로 컨테이너에 접근하면 redis 문법을 통해서 데이터를 확인할 수 있씁니다.

docker exec -it redis_demoweb redis-cli

 

자기소개 프로젝트를 보면 실질적으로 프론트엔드에서 값을 넘겨 받는 데이터는 대표로 선택된 값 만이기 때문에

 

대표값이 변경되지않으면 해당 값만 지속적으로 조회하게 됩니다.

 

리액트에서 axios를 통해 선택된 대표값을 불러온다.

매번 메인페이지를 새로고침할때마다 동일한 member의 값을 조회하게 되기 때문에 이 값을 redis를 이용해서 캐싱하여서 캐쉬가 있으면 캐쉬를 없으면 db에서 조회하도록 해보겠습니다.

 

실제 캐싱에 있어서 어떤 값을 캐싱할 것인가 그리고 redis의 경우 어떤 컬렉션을 사용할 것인가 등과 문법(명령)?과 같이 공부해야하는 내용이 많은데 이는 redis 카테고리에서 다루도록 하겠습니다.

 

1. redis 의존성을 추가

<gradle>

implementation 'org.springframework.boot:spring-boot-starter-data-redis'

<maven>

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

 

2. redis 정보 셋팅

저의 경우 application-redis.yml을 만들어서 값을 아래와 같이 셋팅하였습니다.

(사실 저는 aws ec2에서 도커를 통해서 redis를 실행시켰습니다. 관련해서는 redis 카테고리에서 포스팅 하겠습니다.)

 

위와 같이 셋팅한 뒤 application.yml에서 해당 설정을 포함하도록 설정합니다.

 

3. Config 설정

메인 어플리케이션 클래스에 @EnableCaching 적용

해당 어노테이션을 통해서 저희는 

@Cacheable : 캐시 생성

@CacheEvict : 캐시 삭제
@CachePut : 캐시 업데이트
@Caching : 메서드에 적용할 캐시 작업 그룹 정의

- 여러개의 @CacheEvict 혹은 @CachePut 을 하나의 메소드에 걸어야할 때 사용
@CacheConfig : 클래스 레벨에서 캐시 관련 설정 공유

어노테이션을 사용할 수 있게 되었습니다.

RedisTemplate

Redis는 RedisTemplate을 통해서 Redis 서버와 통신을 합니다. 위와 같이 설정해줍니다.

RedisTemplate은 Redis module 을 스프링에서 제공함을 통해서 사용자가 좀 더 쉽게 쓸수 있도록 다양한 기능들을 제공합니다. 높은 수준의 추상화를 통해서, 오퍼레이션들을 제공합니다.

(serializer들을 말그대로 직렬화 셋팅으로 이해하시면 됩니다. 해당 셋팅에 맞춰서 직렬화가 이루어 집니다.)

 

redisConnectionFactory

redisConnectionFactory는 redis와 connection을 생성해주는 객체입니다.

여기서 두 개의 인자가 필요한대, 처음은 host의 주소, 두번째는 포트 번호입니다.

 

Spring CacheManager타입의 CacheManager를 빈으로 등록해주면 Spring에서는 캐싱을 할 때 로컬 캐시에 저장하지 않고 redis에 저장하게 됩니다. 위와 같이 redisCacheManager를 등록

redisCacheConfiguration를 보면 제거 entryTtl이라는 부분이 있는데 이게 유효시간으로 설정한 시간이 지나면 해당 캐시가 사라지게 됩니다.

 

4.service or controller에 캐쉬 설정

캐시를 적용하고자하는 service나 controller에 @Cacheable을 통해서 캐쉬를 설정하였습니다.

설정후 서버를 실행시킨 뒤 해당 service를 타는 요청을 보내게 되면 한번반 log가 나오고 그뒤로는 나오지않습니다. 해당 서비스를 타지않고 redis로부터 캐쉬를 받아서 리턴한다는 것을 알 수 있습니다.

redis에 저장되는 것을 보면

@Cacheable에서 설정한 value::key값으로 key가 정해지고

get을 통해서 object를 확인 할 수 있습니다.

 

경험한 이슈

test에서 운영 redis가 아닌 springboot embeded redis를 사용하면서

embeded redis의 port와 test코드의 랜덤 포트의 동일하게 되었을때 테스트가 실패

 

관련 트러블 슈팅 정리 블로그

jojoldu.tistory.com/297

 

[Redis] SpringBoot Data Redis 로컬/통합 테스트 환경 구축하기

안녕하세요? 이번 시간엔 SpringBoot Data Redis 로컬 테스트 예제를 진행해보려고 합니다. 모든 코드는 Github에 있기 때문에 함께 보시면 더 이해하기 쉬우실 것 같습니다. (공부한 내용을 정리하는 Git

jojoldu.tistory.com

 

redis에 대한 보다 더 자세한 이야기는 redis 카테고리에서 다루도록 하겠습니다.