Redis Spring에 적용하기

김두현·2024년 2월 14일
7

Spring

목록 보기
13/13
post-thumbnail

📍Redis 사용 목적

Redis는 메모리에 데이터를 저장하기 때문에, 디스크에 데이터를 저장하는 Database보다 빠른 조회 성능을 가지게 된다.
출처:나무위키

다양한 활용 방법이 존재하지만, 주로 조회 빈도가 높은 DTO를 Caching하는 데 쓰인다.

본 포스팅을 통해 Redis 설치부터 간단한 Spring Boot 프로그램에 적용하는 실습을 진행해보자. 완성된 코드는 Github에 업로드 해두었다.


📍Redis 설치

Redis는 "서버"이므로, Gradle 의존성 추가 외에 추가적인 설치가 필요하다.
필자와 같이 mac 유저라면, homebrew 설치부터 진행해야 한다.

homebrew를 설치했다면, 터미널에서 아래 명령어를 통해 redis를 설치한다.

설치가 완료되면, 아래 명령어를 통해 서버를 시작하자.

설치가 잘 되었다면 다음 화면을 볼 수 있을 것이다.

이제 서버를 백그라운드로 실행한 후, client 모드로 서버에 접근하자.
기본 포트인 6379가 확인된다면 성공이다.

이제 Spring으로 넘어가자! Redis Client 모드는 이후에 사용할 것이므로 그대로 두자.


📍Spring Boot Redis 설정

build.gradle

우선, gradle 의존성을 추가한다.

application.yml

필자는 Redis Caching Server와 MySQL Server를 설정했다.
앞서 언급한 Redis의 기본 포트인 6379를 적용했음을 알 수 있다.

RedisConfig.java

이제 Spring Application을 Redis Server에 연결하자.

참고로 Lettuce는 Redis의 Client Library이다.
Redis랑 발음이 비슷해서 Lettuce로 지었다고 한다. ㅋㅋㅋㅋㅋㅋㅋ

이로써, Redis 적용을 위한 준비 과정을 마쳤다!


📍Entity, DTO 구현

아직 Server에 저장할 데이터가 없으므로, 아주 간단하게 구현해보자.

Member.java

MemberRequestDto.java

name만 입력받는 회원가입 요청 DTO를 생성했다.
toEntity는 DTO를 Entity로 변환하는 converter 역할을 수행한다.

❗️ MemberResponseDto.java

이 부분이 핵심이니 유의하자.

Redis Server에는 Entity가 아닌 Client에게 전송할 DTO를 저장한다.

  • @RedisHash를 통해 Caching할 DTO를 지정한다.
    • value : Key의 접두사이다. redisKey가 100이라면, Redis Server에는 member:100으로 저장된다.
    • timeToLive : Redis Server 내에서의 만료 시간을 지정한다. 아래는 20초로 지정한 모습이다.
  • @Id : Redis Server에서 해당 DTO를 해싱할 Key를 지정한다.

    ❗️import org.springframework.data.annotation.Id;를 해야한다. Entity의 @Id와 다르다!

    또한, 필자는 Entity의 id 값을 redisKey로 부여했다.
    Service layer에서 효과적으로 Caching Data를 찾기 위해선,

    Entity와 DTO가 고유한 값을 공유하고 있는 것이 좋다!

위 DTO들을 바탕으로, 회원가입 후 조회하는 프로그램을 작성해보자.


📍RedisRepository 생성

Redis 구현 방법은 두 가지로 나뉜다.
1. RedisTemplate 이용
2. Repository 이용

2번의 경우, 흔히 사용하는 JpaRepository 구현 방법과 매우 유사해 해당 방식을 택하였다.
그러면 이제 Redis Server에 접근할 RedisRepository를 만들자.

MemberRedisRepository.java


📍Service 구현

MemberService.java

  • save() : 회원가입 요청을 처리해 Redis Server와 MySQL Server에 모두 저장하는 Logic을 구현한다.
  • findMember() : Redis Server에 Cache 되어있는지 확인하고, 없다면 MySQL Server에서 가져오는 Logic을 구현한다.

MemberServiceImpl.java

간단한 코드이므로 설명은 생략한다.


📍Controller 구현

MemberController.java

조회 API에서 성능 비교를 위해 시간을 측정한 모습이다.


📍Cache 결과 확인 및 성능 비교

기존에 연결해둔 Swagger를 통해 Post 요청을 진행 후, 곧바로(timeToLive 만료 전!) Get 요청을 해보았다.

[만료 전] Redis Server의 모든 Key 조회

keys * 명령어를 통해 모든 redis key를 조회한 결과, id가 1인 DTO가 접두사와 함께 잘 저장되어있음을 알 수 있다.
참고로 member만 있는 것은 namespace다.

[만료 전] Cache 확인

만료되기 전이므로 Redis Server에서 Dto를 가져왔고, 이때 소요시간은 7ms이다.

[만료 후] Redis Server의 모든 Key 조회

동일하게 모든 key를 조회한 결과, 만료 시간을 초과하여 namespace만 존재하는 것이 확인된다.

[만료 후] Cache 확인

Caching Data가 존재하지 않아 DB에서 select query를 통해 조회하는 모습이다.
이때 소요시간은 58ms이다.


조회 성능이 8배 이상 차이남을 확인할 수 있다.

간단한 Redis 튜토리얼을 진행해봤다.
Caching Data는 조회 빈도가 높고 수정 빈도가 낮을 때 효과가 극대화되므로, 적용 여부에 대해 반드시 고민한 후 적용하도록 하자.


참고 자료

https://github.com/Around-Hub-Studio/AroundHub_SpringBoot


💕오류 지적 및 피드백은 언제든 환영입니다. 복제시 출처 남겨주세요!💕
💕좋아요와 댓글은 큰 힘이 됩니다.💕
profile
I AM WHO I AM

4개의 댓글

comment-user-thumbnail
2024년 2월 19일

너무 좋은 포스팅입니다 !!

1개의 답글
comment-user-thumbnail
2024년 2월 27일

혹시 Dto를 레디스에 저장해서 사용한 게
그냥 조회 성능 테스트를 위해서인 걸까요?
아니면 다른 이유가 있을까요?

1개의 답글