1. Docker Compose 로 Redis 실행하기
1-1. 환경 구성하기
docker-compose.yml
version: "3.9"
services:
redis:
image: redis:latest
container_name: ${REDIS_NAME}
ports:
- ${REDIS_PORT}:6379
healthcheck:
test: [ "CMD", "redis-cli", "ping" ]
interval: 5s
retries: 10
volumes:
- redis-vl:/var/lib/redis
volumes:
redis-vl:
driver: local
${변수} 부분은 환경 변수입니다.
노출되면 안 되는 중요 정보들 또는 자주 바뀌는 정보는 환경변수로 관리합니다.
.env
같은 경로에 .env 파일을 생성하고 아래와 같이 작성합니다.
REDIS_NAME=geumsapa-redis
REDIS_PORT=6379
1-2. 실행하기
docker compose up -d
docker
1-3. 접속하기
redis-cli
docker exec -it [container id] redis-cli
docker ps를 통해 continaer id를 확인한 후 명령어에 넣어줍니다.
Redis Insight
GUI로는 Redis Insight를 이용할 수 있습니다.
아래 사이트에서 다운받을 수 있습니다.
Redis Insight
DO MORE WITH YOUR DATA Visualize, optimize, and troubleshoot with Redis Insight Redis Insight is our free graphical interface for analyzing Redis data across all operating systems and Redis deployments with the help of our AI assistant, Redis Copilot. L
redis.io
실행시킨 후 Host, Post 등의 접속 정보를 입력합니다.
2. Spring Boot에서 Redis 설정하기
의존성 추가하기
build.gradle
implementation 'org.springframework.boot:spring-boot-starter-data-redis:3.3.5'
https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis
호스트와 포트 번호 설정하기
application.yml
Spring Boot 3.2 이상 일 경우
spring:
data:
redis:
host: localhost
port: ${REDIS_PORT}
Spring Boot 3.2 미만 일 경우
spring:
redis:
host: localhost
port: ${REDIS_PORT}
Configuration 추가
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
@Configuration
public class RedisConfig {
@Value("${spring.data.redis.host}")
private String host;
@Value("${spring.data.redis.port}")
private int port;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(host, port);
}
}
- Spring Data Redis는 Redis DB와의 연결을 위해 자바 Redis 오픈소스 라이브러리인 Lettuce 와 Jedis 를 활용합니다.
(Lettuce는 비동기로 동작해 Jedis에 비해 성능이 좋기도 해, Lettuce 사용을 권장한다고 합니다.) - Redis의 설정 정보를 Configuration Class에서 application.yml에 설정한 값을 @Value 어노테이션으로 주입합니다.
- RedisConnectionFactory는 Redis DB와 연결하는 역할을 합니다.
Redis 데이터 접근하기
Spring Data Redis가 제공하는 Redis의 데이터에 접근하는 방법에는 RedisTemplate 과 RedisRepositories 가 있습니다.
RedisRepositories 먼저 적용해보았습니다. 후에 RedisTemplate 적용해볼 때 추가로 작성하겠습니다 :)
RedisRepositories
RedisRepositories를 이용하면 간단하게 Domain Entity Object를 Redis Hash 변환하여 저장할 수 있습니다.
Spring Data JPA에서 Repository를 사용하는 것과 비슷합니다.
유의 사항
- Redis 2.8.0 이상의 버전에서 사용할 수 있습니다.
- 트랜젝션을 지원하지 않으므로 만약 트랜잭션을 적용하고 싶다면 RedisTemplate 을 사용해야 합니다.
Entity
import jakarta.persistence.Column;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash;
@Getter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@RedisHash(value = "refresh-token", timeToLive = 30 * 24 * 60 * 60 * 1000L)
public class RefreshToken {
@Id
@Column(unique = true, nullable = false)
private String username;
@Column(nullable = false)
private String token;
public void setToken(String token) {
this.token = token;
}
}
- Redis 에 저장할 자료구조인 Entity 객체를 정의합니다.
- 일반적인 Entity 객체 선언 후 @RedisHash 를 붙이면 됩니다.
- value : Redis 의 keyspace 값으로 사용됩니다.
- timeToLive : 만료시간을 seconds 단위로 설정할 수 있습니다. 기본값은 만료시간이 없는 -1L 입니다.
- 일반적인 Entity 객체 선언 후 @RedisHash 를 붙이면 됩니다.
- @Id 어노테이션이 붙은 필드가 Redis Key 값이 되며, 따로 설정하지 않으면 랜덤값이 설정됩니다.
- javax.persistence.Id 대신 org.springframework.data.annotation.Id 을 임포트 해야함에 유의합니다.
- keyspace 와 합쳐져서 레디스에 저장된 최종 키 값은 keyspace:id 가 됩니다.
Repository
import com.yhkim.domain.auth.entity.RefreshToken;
import org.springframework.data.repository.CrudRepository;
public interface RefreshTokenRepository extends CrudRepository<RefreshToken, String> {
}
- CrudRepository 를 상속받아 Repository 클래스를 추가합니다.
- 이 때 Id는 String 타입으로 지정합니다.
Test
import com.yhkim.domain.auth.entity.RefreshToken;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.data.redis.DataRedisTest;
import org.springframework.test.context.TestPropertySource;
import static org.junit.jupiter.api.Assertions.assertEquals;
@DataRedisTest
@TestPropertySource(properties = {
"spring.data.redis.host=localhost",
"spring.data.redis.port=6379"
})
class RefreshTokenRepositoryTest {
@Autowired
private RefreshTokenRepository refreshTokenRepository;
@Test
@DisplayName("Redis 저장 테스트")
void test() {
RefreshToken refreshToken = RefreshToken.builder().username("test").token("testtoken").build();
refreshTokenRepository.save(refreshToken);
RefreshToken refreshToken2 = RefreshToken.builder().username("test2").token("testtoken2").build();
refreshTokenRepository.save(refreshToken2);
assertEquals("testtoken", refreshTokenRepository.findById("test").get().getToken());
assertEquals("testtoken2", refreshTokenRepository.findById("test2").get().getToken());
}
}
- 다른 글들은 @SpringBootTest를 이용해서 테스트하였지만, 저는 이미 RDBMS나 gRPC 등의 설정이 많이 되어있는 프로젝트에서 진행하였기에 Redis만 테스트하고자 @DataRedisTest를 이용하여 테스트하였습니다.
- @TestPropertySource를 사용하여 테스트에 필요한 Redis 설정을 직접 지정해주었습니다.
정리
Spring Boot에서 Redis 설정을 해보았습니다.
다음 글에서는 이를 이용해서 Refresh Token을 저장해보고, RDBMS와 성능을 비교해보겠습니다.
참고
https://velog.io/@gingaminga/Docker-compose%EB%A1%9C-Redis-%EC%8B%A4%ED%96%89%ED%95%98%EA%B8%B0
Docker compose로 Redis 실행하기
Docker로 쉽게 Redis를 구동시키자!
velog.io
https://bcp0109.tistory.com/328
Spring Boot 에서 Redis 사용하기
1. Overview Spring Boot 에서 spring-data-redis 라이브러리를 활용해서 Redis 를 사용하는 방법을 알아봅니다. Redis 에 대한 개념과 로컬 설치 방법은 Redis 설치 및 명령어 글을 확인해주세요. 2. Java 의 Redis Cl
bcp0109.tistory.com
https://programmingiraffe.tistory.com/171
[Redis] Spring Boot에 Redis 연동하기 + RedisTemplate, RedisRepository
Spring에서 지원하는 Spring Data Redis를 통해서 Redis의 DB와 연동할 수 있다. Spring Data Redis를 활용하면 설정과 Redis의 데이터에 접근하는 것을 손쉽게 할 수 있다. Redis를 Window에 설치하는 과정과 Redis
programmingiraffe.tistory.com
https://bcp0109.tistory.com/329
RedisRepository 가 Bean 으로 등록되지 않는 이슈
해결하고 나니 굉장히 사소한 실수였습니다. Error creating bean with name 'tokenRedisRepository' defined in TokenRedisRepository defined in @EnableRedisRepositories declared on RedisRepositoriesRegistrar.EnableRedisRepositoriesConfiguration
bcp0109.tistory.com
'프레임워크 > Spring Boot' 카테고리의 다른 글
[Spring Boot] 멀티모듈에서 .env 파일이 로드되지 않는 문제 해결하기 (1) | 2024.09.04 |
---|---|
[Spring Boot] application 설정 파일에서 민감한 정보 숨기기 (application.properties, application.yml) (1) | 2024.08.15 |
[Spring Boot] 프로젝트 초기 설정하기 (Spring Boot, DB, Git) (0) | 2024.07.25 |
[Spring Boot] 멀티 모듈 프로젝트에 BeanDefinitionOverrideException 에러 해결 (0) | 2024.06.19 |
[Spring Boot] ExceptionResolver으로 예외 처리하기 (0) | 2024.05.21 |