0. 들어가기 전
https://jinhos-devlog.tistory.com/entry/Database-Redis%EB%9E%80
1. Redis 설치하기
Homebrew를 통해서 간단히 설치할 수 있다.
brew install redis
2. Redis 실행하기
Homebrew를 통해서 Redis를 설치했다면, 해당 명령어로 Redis를 실행시킬 수 있다.
brew services start redis
* 나중에 끄려면 해당 명령어를 사용하자.
brew services stop redis
3. SpringBoot에서 Redis 설정하기
3-1. 의존성 추가하기
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
3-2. application.yml 파일
AWS 리눅스 os 환경이 아닌, 로컬에서 레디스를 사용할 거라면
localhost, 기본포트인 6379로 설정해준다.
spring:
redis:
host: localhost
port: 6379
4. RedisConfig 작성
@Configuration
public class RedisConfig {
@Value("${spring.redis.host}")
private String redisHost;
@Value("${spring.redis.port}")
private int redisPort;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(redisHost, redisPort);
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory());
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
return redisTemplate;
}
}
스프링 애플리케이션에서 Redis를 사용하기 위한 Config 파일을 작성해줘야 한다.
- 스프링 어플리케이션과 Redis를 연동시키기 위해 빈을 등록해준다!
@Value 어노테이션을 사용하여 주입한 프로퍼티 값은 이전에 application.yml에서 설정된 값이다.
자바의 Redis Client 라이브러리에는 Jedis와 Lettuce가 있다.
정확히는 모르겠지만, 보통 성능 측면에서 좋은 Lettuce로 RedisConnectionFactory를 통해 Redis와 연결한다고 한다.
redisTemplate() 메서드는 RedisTemplate 객체를 생성하고 구성한다.
이때 Redis 연결 팩토리를 설정하고, 키와 값을 직렬화하기 위한 직렬화기(serializer)를 설정한다.
일반적으로 문자열로 된 키와 값에 대해서는 StringRedisSerializer를 사용한다.
RedisTemplate에는 serializer를 설정해주는데 설정하지 않는 다면 직접 redis-cli로 데이터 확인이 어렵다.
redis-cli는 Redis Command Line Interface의 약자로, Redis 서버와 상호 작용하기 위한 명령 줄 도구이다.
이 도구를 사용하면 터미널에서 Redis 서버에 연결하여 데이터를 조회, 수정, 삭제하는 등의 작업을 수행할 수 있다.
5. Redis를 Spring에서 사용하는 2가지 방법
5-1. crudrepository방식
마치, JpaRepository를 사용하는 것 처럼 사용한다고 생각하면 편하다.
1) 엔티티 작성
(보통 JWT RefreshToken을 많이 레디스에 저장하기 때문에 예시를 들어본다.)
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@Builder
@RedisHash(value = "refresh_token")
public class RefreshToken {
@Id
private String authId;
@Indexed
private String token;
private String role;
@TimeToLive
private long ttl;
public RefreshToken update(String token, long ttl) {
this.token = token;
this.ttl = ttl;
return this;
}
}
주요 어노테이션을 알아보자.
- @Id : 키(key) 값. 우리가 엔티티 작성할 때 흔히 쓰는 어노테이션이다. 식별자로 사용!
- @RedisHash(value = " ") : 설정한 값을 Redis의 key 값 prefix로 사용한다.
- @Indexed : 값으로 검색을 할 때 인덱스로 사용!
- @TimeToLive : 유효시간 설정(second 단위)
2) RefreshTokenRepository
public interface RefreshTokenRepository extends CrudRepository<RefreshToken, String> {
Optional<RefreshToken> findByToken(String token);
Optional<RefreshToken> findByAuthId(String authId);
}
@Id 또는 @Indexed 어노테이션을 적용한 filed들만 findBy~ 구문을 사용할 수 있다.
5-2. 템플릿 사용하기 (주로 사용)
1) RedisUtil
@Component
public class RedisUtil {
private final RedisTemplate<String, Object> redisTemplate;
public RedisUtil(RedisTemplate<String, Object> redisTemplate) {
this.redisTemplate = redisTemplate;
}
public void save(String key, Object val, Long time, TimeUnit timeUnit) {
redisTemplate.opsForValue().set(key, val, time, timeUnit);
}
public boolean hasKey(String key) {
return Boolean.TRUE.equals(redisTemplate.hasKey(key));
}
public Object get(String key) {
return redisTemplate.opsForValue().get(key);
}
public boolean delete(String key) {
return Boolean.TRUE.equals(redisTemplate.delete(key));
}
}
레디스 템플릿은 사용하는 자료구조마다 제공하는 메서드가 다르다.
Object를 만들어서 레디스의 자료구조 타입에 맞는 메소드를 사용하자.
메서드명 | Redis 타입 |
opsForValue | String |
opsForList | List |
opsForSet | Set |
opsForZSet | Sorted Set |
opsForHash | Hash |
데이터를 저장할 때 만료 시간 지정할 시에는 해당 시간의 단위까지 지정해주자.
다음과 같은 방식으로 시간을 정의해주면 된다.
redisUtil.save(
principalDetails.getUsername(),
refreshToken,
refreshExpMs,
TimeUnit.MILLISECONDS
);