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를 이용할 수 있습니다.
아래 사이트에서 다운받을 수 있습니다.
실행시킨 후 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
https://bcp0109.tistory.com/328
https://programmingiraffe.tistory.com/171
https://bcp0109.tistory.com/329
'프레임워크 > 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 |