기타/관리

Redis 를 사용하여 성능 최적화

펭귄힝 2024. 6. 1. 17:25

 

오늘은 스프링 애플리케이션에 Redis 의 캐싱 기능을 적용하여 보다 빠른 응답 속도를 내도록 만들어보겠다.

 

 

 

0. Redis 설치

로컬 PC 에서 Redis 를 설치하고 테스트할 것이다.

 

https://github.com/microsoftarchive/redis/releases

 

Releases · microsoftarchive/redis

Redis is an in-memory database that persists on disk. The data model is key-value, but many different kind of values are supported: Strings, Lists, Sets, Sorted Sets, Hashes - microsoftarchive/redis

github.com

 

위 링크에 접속해서 사진에 보이는 파일을 다운로드 받고 압축을 풀어준다.

 

 

 

 

 

 

그럼 이런 파일들이 보일텐데, 우리는 Redis 서버를 먼저 열어주어야 하기 때문에 서버 파일을 실행시켜준다.

 

(여기서 클라이언트 파일은 Redis 서버에 명령을 보낼 수 있는 실행 파일이다.)

 

 

 

 

 

 

위와 같이 뜬다면 서버가 6379번 포트로 잘 열린 것이다.

 

 

 

 

 

1. 애플리케이션에 Redis 설정 추가

 

 

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

 

redis 를 사용하기 위한 의존성을 추가해준다.

 

 

 

 

 

 

application.properties 파일에 redis 서버의 주소와 포트를 추가해준다.

(필자는 운영 체제의 hosts 파일을 수정해서 redis 접속 시 127.0.0.1 로 접속하도록 해주었다.)

 

 

 

 

 

 

 

별도의 Redis 설정 파일을 만들고 빈으로 등록해준다.

 

 

 

 

 

 

캐싱을 적용할 객체에 위와 같이 어노테이션을 적용해준다.

 

@RedisHash 에서 value 는 레디스 서버의 keyspace 값을 나타내고 timeToLive 옵션은 캐시의 유효 시간을 나타낸다.

└ 캐시 유효 시간은 60초로 설정해주었다.

keyspace 라는 것은 관련있는 key 들의 집합이라고 보면 된다.

 

@Id 어노테이션은 key의 역할을 한다. (여기서 @Id 는 스프링 프레임워크의 @Id 를 써주어야 한다.)

 

해당 객체가 Redis 서버에 저장되게 된다면 search_result::<query 값> 형태로 저장되게 된다.

 

 

 

 

 

 

CrudRepository 를 상속받은 별도의 Redis 리포지토리를 만들어준다.

 

이 리포지토리는 캐싱 객체를 redis 서버로부터 저장하거나 가져오는 역할을 수행해준다.

 

 

 

 

 

2. Redis 적용

 

 

이제 원래 메서드를 수정해서 캐싱을 적용해보자.

 

 

 

 

 

 

처음 요청이 들어오면 redis 서버에서 반환할 객체를 찾고 존재한다면 객체를 바로 반환하고 존재하지 않는다면 일반적인 로직대로 수행한 후, 반환되는 시점에 캐시로 저장되게 해주었다.

 

 

 

 

 

API 에 대해 처음 호출했을 때 13ms 가 나온다.

 

 

 

 

 

 

두번째 호출에서 5ms 가 나오면서 8ms 가 감소한 것을 확인할 수 있다.

 

 

 

 

 

3. 어노테이션 사용해서 코드 리팩터링

캐시 어노테이션을 사용해서 기존 코드를 짧게 만들어보자.

 

 

스프링 메인 메서드를 실행하는 부분에 @EnableCaching 어노테이션을 달아서 캐싱 어노테이션을 활성화해준다.

 

 

 

 

 

 

기존 Redis 설정 파일에서 redisCacheManager 를 추가해준다. RedisRepository 를 대신해서 캐시 객체의 직렬화/역직렬화 과정을 수행해준다.

 

 

 

 

 

기존 코드를 위와 같이 변경해준다.

 

이렇게하면 Cache 리포지토리를 이용하지 않고도 한 줄만으로 아까와 같은 캐싱 기능을 적용할 수 있다.

 

 

 

참고 자료

더보기

https://why-dev.tistory.com/265

 

[Redis] Redis를 Cache로 사용하기

| Cache란? 용어 What? why? How? Cache 임시로 데이터를 저장하는 공간 성능 향상 - Look aside Cache, Write Back - Memcahced, Redis API 1. Cache의 배경과 목적 - 파레토의 법칙에 따르면, 80%의 결과는 20%의 원인에 의

why-dev.tistory.com

 

https://hyeri0903.tistory.com/237

 

[Spring] 스프링 캐시 알아보기 (@Cacheable, @CachePut, @CacheEvict)

스프링 캐시 캐시란? 자주 사용되는 데이터를 저장하는 공간을 의미합니다. 자주 사용되는 데이터를 매번 요청 때마다 생성하여 응답하는 것 보다는 생성된 데이터를 저장해놓고 똑같은 요청이

hyeri0903.tistory.com

 

https://summer-jin.tistory.com/91

 

<Redis> 레디스 설치 / redis 사용하기 / nosql / window 로컬에 레디스 서버 열어두기

레디스를 사용하게 된 배경 -우리의 플랫폼에서 회원가입을 할때 크리에이터라는 등급으로 회원가입을 하려면 이메일인증을 받아야 한다. 이 이메일 인증 과정이 1. 처음 회원가입 양식을 작성

summer-jin.tistory.com

 

https://khdscor.tistory.com/99

 

Springboot: redis를 통해 캐시 기능 간단 적용

들어가기 이 글에서는 간단하게 Springboot에 Redis를 적용하여 캐시 기능을 구현하는 과정을 설명할 것이다. Redis에 대한 기본적인 내용은 https://khdscor.tistory.com/98를 참고하길 바란다. springboot with red

khdscor.tistory.com

 

https://developer-nyong.tistory.com/21

 

[Spring Boot, Database] Spring Boot + Redis 제대로 활용하기(2)

저번 포스팅에서는 레디스라는 데이터베이스 자체에 대해서 자세히 알아보았다. 이번 포스팅에서는 스프링 부트에서 레디스를 사용하는 법을 알아보자. Spring Boot에서 레디스 설정하기 스프링

developer-nyong.tistory.com