https://wildeveloperetrain.tistory.com/21
인메모리 데이터 저장소 Redis 기본 개념에 대한 포스팅입니다.
Spring Boot Redis 사용 방법 (RedisTemplate, RedisRepository)
* Redis 설치 이후 진행과정입니다.
Spring Boot에서는 Spring Date Redis를 통해 Lettuce, Jedis라는 두 가지 오픈소스 Java 라이브러리를 사용할 수 있습니다.
Lettuce는 별도의 설정 없이 사용할 수 있으며 Jedis를 사용하고자 하시면 별도의 의존성을 필요로 합니다.
* 해당 포스팅은 Lettuce를 통해 Redis를 사용하는 과정을 담고 있습니다.
// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis
implementation group: 'org.springframework.boot', name: 'spring-boot-starter-data-redis', version: '2.4.10'
Gradle 의존성 추가
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.4.10</version>
</dependency>
Maven 의존성 추가
Spring Data Redis는 Redis에 두 가지 접근 방식을 제공합니다.
하나는 RedisTemplate을 이용한 방식이며, 다른 하나는 RedisRepository를 이용한 방식입니다.
두 방식 모두 Redis에 접근하기 위해서는 Redis 저장소와 연결하는 과정이 필요합니다.
이 과정을 위해 'package org.springframework.data.redis.connection;' 패키지의 RedisConnectionFactory 인터페이스를 사용합니다.
@RequiredArgsConstructor
@Configuration
@EnableRedisRepositories
public class RedisRepositoryConfig {
private final RedisProperties redisProperties;
// lettuce
@Bean
public RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(redisProperties.getHost(), redisProperties.getPort());
}
@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;
}
}
RedisConnectionFactory 인터페이스를 통해 LettuceConnectionFactory를 생성하여 반환합니다.
setKeySerializer, setValueSerializer 설정해주는 이유는 RedisTemplate를 사용할 때 Spring - Redis 간 데이터 직렬화, 역직렬화 시 사용하는 방식이 Jdk 직렬화 방식이기 때문입니다. 동작에는 문제가 없지만 redis-cli을 통해 직접 데이터를 보려고 할 때 알아볼 수 없는 형태로 출력되기 때문에 적용한 설정입니다.
# Redis
spring.redis.host=localhost
spring.redis.port=6379
그리고 RedisProperties를 통해서 properties에 저장한 host, port를 가지고 와서 연결합니다.
host, port외에 옵션들
변수 | 기본값 | 설명 |
spring.redis.database | 0 | 커넥션 팩토리에 사용되는 데이터베이스 인덱스 |
spring.redis.host | localhost | 레디스 서버 호스트 |
spring.redis.password | 레디스 서버 로그인 패스워드 | |
spring.redis.pool.max-active | 8 | pool에 할당될 수 있는 커넥션 최대수 (음수로 하면 무제한) |
spring.redis.pool.max-idle | 8 | pool의 "idle" 커넥션 최대수 (음수로 하면 무제한) |
spring.redis.pool.max-wait | -1 | pool이 바닥났을 때 예외 발생 전, 커넥션 할당 차단 최대 시간 (단위 밀리세컨드, 음수는 무제한 차단) |
spring.redis.pool.min-idle | 0 | 풀에서 관리하는 idle 커넥션의 쵀소수 대상 (양수일 때만 유효) |
spring.redis.port | 6379 | 레디스 서버 포트 |
spring.redis.sentinel.master | 레디스 서버 이름 | |
spring.redis.sentinel.nodes | 호스트: 포트 쌍 목록 (콤마로 구분) | |
spring.redis.timeout | 0 | 커넥션 타임아웃 (단위 밀리세컨드) |
- 참고 사이트
https://zetawiki.com/wiki/%EC%8A%A4%ED%94%84%EB%A7%81_REDIS_%ED%94%84%EB%A1%9C%ED%8D%BC%ED%8B%B0
직접적인 Redis 사용법 중, 첫 번째 RedisTemplate을 이용한 사용법입니다.
String refreshToken = jwtTokenProvider.createRefreshToken();
ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
valueOperations.set(rRTKey + user.getIdx(), refreshToken);
log.info("redis RT : {}", valueOperations.get(rRTKey + user.getIdx()));
Service 단에서 사용하였고, RedisTemplate을 생성자 주입 방식으로 추가하여 사용하였습니다.
* 프로젝트에서 로그인 시 RefreshToken을 cache 서버인 Redis에 저장할 용도로 사용하였고, 'rRTKey'라는 값은 따로 정의하여 가져온 String 값입니다.
Redis는 여러 자료 구조를 가지고 있고, 사용하는 자료 구조에 따라 적절한 메서드를 사용할 수 있습니다.
메서드 | 설명 |
opsForValue | Strings를 쉽게 Serialize / Deserialize 해주는 interface |
opsForList | List를 쉽게 Serialize / Deserialize 해주는 interface |
opsForSet | Set을 쉽게 Serialize / Deserialize 해주는 interface |
opsForZSet | ZSet을 쉽게 Serialize / Deserialize 해주는 interface |
opsForHash | Hash를 쉽게 Serialize / Deserialize 해주는 interface |
예시에서는 String 자료 구조를 사용하였기 때문에 opsForValue() 메서드를 사용하였습니다.
set을 통해 key, value 값을 저장하고, get(key)를 통해 저장한 value 값을 가지고 올 수 있습니다.
다음으로 RedisRepository를 사용한 객체 저장방법입니다.
@Getter
@Setter
@RedisHash("member")
public class Member {
@Id
private String id;
private String name;
private int age;
public Member(String name, int age) {
this.name = name;
this.age = age;
}
}
Redis를 통해 저장할 Member Class입니다.
@RedisHash 어노테이션을 통해 설정한 값을 Redis의 key 값 prefix로 사용합니다.
@Id 어노테이션은 JPA와 동일한 역할을 수행합니다. "member:{id}"의 위치에 자동으로 generate 값이 들어갑니다.
public interface MemberRedisRepository extends CrudRepository<Member, String> {
}
다음으로 CrudRepository를 extends 한 Repository를 생성합니다.
@RequiredArgsConstructor
@Service
public class MemberService {
private final MemberRedisRepository memberRedisRepository;
public void addMember() {
Member member = new Member("jan", 99);
memberRedisRepository.save(member);
}
}
repository의 save 메서드를 사용하면 hmset, hset이 호출되어 해당 객체가 저장됩니다.
hgetall key 명령어를 통해 service 단에서 저장한 member 객체가 레디스 서버에 저장된 것을 확인할 수 있습니다.
참고 사이트
https://do-study.tistory.com/111
https://sabarada.tistory.com/105
https://docs.spring.io/spring-data/data-redis/docs/current/reference/html/#reference
'Programming > Spring Boot' 카테고리의 다른 글
Spring Boot 프로젝트 외부 경로 파일 접근하기 addResourceHandlers (0) | 2021.08.30 |
---|---|
Spring Boot Logging 이란? (log4j, logback, log4j2) (0) | 2021.08.25 |
IntelliJ 개발환경 꾸미기 Plugins 소개 (Meterial Theme UI, Progress Bar 외) (0) | 2021.08.19 |
@Component 와 @Bean, @Autowired 어노테이션 알아보기 (0) | 2021.08.18 |
Spring Boot Validation 적용하는 법, @Valid 작동 안되는 이유 (2) | 2021.08.16 |