개요
개인 프로젝트에서 Refresh Token 정보를 In-memory DB로 저장하기로 결정하였다. 이 글에서는 Spring에서 Redis를 사용하는 방법을 알아보고, 프로젝트에 어떻게 적용시켰는지 설명하려고 한다.
Spring Data Redis
Spring Data Redis는 Spring Data JPA 처럼 Spring Data 프로젝트에 속한 모듈 중 하나이다. 개발자는 Spring Data Redis가 제공하는 여러 기능들을 활용해 Redis에 데이터를 쉽게 관리할 수 있다.
사용 방법
Spring Data Redis를 사용하기 위해서는 먼저 아래와 같이 dependency를 추가해야 한다 (gradle 기준).
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
}
그 다음, Redis 기능을 사용할 수 있는 두 가지 방법 중 하나를 선택할 수 있다.
방법 1. RedisTemplate
RedisTemplate을 Spring Bean으로 등록해 사용하는 방법이다.
먼저, application.yml(혹은 application.properties)에 아래와 같이 설정을 추가해야 한다.
spring:
data:
redis:
host: [Redis 서버 호스트명]
port: [PORT]
그 후, Configuartion 클래스를 생성해 필요한 기능을 Bean으로 등록해야 한다.
- RedisConnectionFactory - Redis connection을 제공하는 팩토리 클래스
- JedisConnectionFactory와 LettusConnectionFactory 중 하나를 선택해야 한다. 되도록 Lettus를 사용하도록 하자. (참고: Jedis 보다 Lettus를 쓰자)
- RedisTemplate
@Configuration
public class RedisConfig {
@Value("${spring.data.redis.host}")
String host;
@Value("${spring.data.redis.port}")
String port;
@Bean
RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(host, port);
}
@Bean
RedisTemplate<?, ?> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<?, ?> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
return redisTemplate;
}
}
이제 위에서 Bean으로 등록한 RedisTemplate을 원하는 곳에 주입시킨 후 사용이 가능하다.
@RequiredArgsConstructor
public class TestRedisService {
private final RedisTemplate<String, String> redisTemplate;
public void save(String key, String value) {
redisTemplate.opsForValue().set(key, value);
}
public void find(String key) {
redisTemplate.opsForValue().get(key);
}
}
사실, Spring boot 2.0 부터는 RedisConnectionFactory, RedisTemplate, StringTemplater가 자동으로 Spring Bean으로 되어 위와 같이 따로 등록하지 않아도 사용할 수 있다.
그리고 application.yml 파일에 host와 port를 설정하지 않아도, 기본으로 host는 localhost, port는 6379로 설정해준다.
RedisTemplate에는 serializer를 설정해주는데 설정하지 않는다면 직접 redis-cli로 데이터 확인이 어렵다.
방법 2. RedisRepository
RedisTemplate이 아닌, Spring Data가 제공하는 CrudRepository 인터페이스를 사용하는 방법이다.
먼저, 아래와 같이 Redis Entity 코드를 작성한다.
- @RedisHash - 지정한 객체를 Redis cash에 저장될 수 있도록 만든다.
- @Id - JPA에서와 같이 식별자를 지정하는 용도로 사용된다.
- @Indexed - 지정한 필드를 secondary index로 설정한다.
- @TimeToLive - 해당 entitiy의 유효기한을 설정한다. 위에서는 필드에 적용했지만, 클래스에 적용도 가능하다.
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@RedisHash(value = "refresh_token")
public class RefreshToken {
@Id
private String id;
@Indexed
private String memberId;
@Indexed
private String refreshToken;
@TimeToLive
private Long expiration;
@Builder
public RefreshToken(String memberId, String refreshToken) {
this.memberId = memberId;
this.refreshToken = refreshToken;
this.expiration = REFRESH_TOKEN_DURATION.duration();
}
public void updateRefreshToken(String refreshToken) {
this.refreshToken = refreshToken;
this.expiration = REFRESH_TOKEN_DURATION.duration();
}
}
그 다음, Entity에 해당하는 Repository 인터페이스를 생성한다.
public interface RefreshTokenRepository extends CrudRepository<RefreshToken, String> {
...
}
이제 해당 Repository를 사용하고자 하는 곳에 주입시키고 사용할 수 있다. CrudRepository를 상속받은 repository이기 때문에, Spring Data JPA를 사용하는 방법과 같다.
@RequiredArgsConstructor
@Service
public class RefreshTokenService {
private final RefreshTokenRepository refreshTokenRepository;
public void save(RefreshToken refreshToken) {
refreshTokenRepository.save(refreshToken);
}
public RefreshToken find(Long id) {
return refreshTokenRepository.findById(id);
}
}
참고
Redis :: Spring Data Redis
The Redis support provides several components.For most tasks, the high-level abstractions and support services are the best choice.Note that, at any point, you can move between layers.For example, you can get a low-level connection (or even the native libr
docs.spring.io
Jedis 보다 Lettuce 를 쓰자
Java의 Redis Client는 크게 2가지가 있습니다. Jedis Lettuce 둘 모두 몇천개의 Star를 가질만큼 유명한 오픈소스입니다. 이번 시간에는 둘 중 어떤것을 사용해야할지에 대해 성능 테스트 결과를 공유하
jojoldu.tistory.com
'Spring > Spring Data' 카테고리의 다른 글
[Spring / Redis] RedisTemplate vs RedisRepository - 성능 비교 테스트 (0) | 2024.04.17 |
---|
개요
개인 프로젝트에서 Refresh Token 정보를 In-memory DB로 저장하기로 결정하였다. 이 글에서는 Spring에서 Redis를 사용하는 방법을 알아보고, 프로젝트에 어떻게 적용시켰는지 설명하려고 한다.
Spring Data Redis
Spring Data Redis는 Spring Data JPA 처럼 Spring Data 프로젝트에 속한 모듈 중 하나이다. 개발자는 Spring Data Redis가 제공하는 여러 기능들을 활용해 Redis에 데이터를 쉽게 관리할 수 있다.
사용 방법
Spring Data Redis를 사용하기 위해서는 먼저 아래와 같이 dependency를 추가해야 한다 (gradle 기준).
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
}
그 다음, Redis 기능을 사용할 수 있는 두 가지 방법 중 하나를 선택할 수 있다.
방법 1. RedisTemplate
RedisTemplate을 Spring Bean으로 등록해 사용하는 방법이다.
먼저, application.yml(혹은 application.properties)에 아래와 같이 설정을 추가해야 한다.
spring:
data:
redis:
host: [Redis 서버 호스트명]
port: [PORT]
그 후, Configuartion 클래스를 생성해 필요한 기능을 Bean으로 등록해야 한다.
- RedisConnectionFactory - Redis connection을 제공하는 팩토리 클래스
- JedisConnectionFactory와 LettusConnectionFactory 중 하나를 선택해야 한다. 되도록 Lettus를 사용하도록 하자. (참고: Jedis 보다 Lettus를 쓰자)
- RedisTemplate
@Configuration
public class RedisConfig {
@Value("${spring.data.redis.host}")
String host;
@Value("${spring.data.redis.port}")
String port;
@Bean
RedisConnectionFactory redisConnectionFactory() {
return new LettuceConnectionFactory(host, port);
}
@Bean
RedisTemplate<?, ?> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<?, ?> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
return redisTemplate;
}
}
이제 위에서 Bean으로 등록한 RedisTemplate을 원하는 곳에 주입시킨 후 사용이 가능하다.
@RequiredArgsConstructor
public class TestRedisService {
private final RedisTemplate<String, String> redisTemplate;
public void save(String key, String value) {
redisTemplate.opsForValue().set(key, value);
}
public void find(String key) {
redisTemplate.opsForValue().get(key);
}
}
사실, Spring boot 2.0 부터는 RedisConnectionFactory, RedisTemplate, StringTemplater가 자동으로 Spring Bean으로 되어 위와 같이 따로 등록하지 않아도 사용할 수 있다.
그리고 application.yml 파일에 host와 port를 설정하지 않아도, 기본으로 host는 localhost, port는 6379로 설정해준다.
RedisTemplate에는 serializer를 설정해주는데 설정하지 않는다면 직접 redis-cli로 데이터 확인이 어렵다.
방법 2. RedisRepository
RedisTemplate이 아닌, Spring Data가 제공하는 CrudRepository 인터페이스를 사용하는 방법이다.
먼저, 아래와 같이 Redis Entity 코드를 작성한다.
- @RedisHash - 지정한 객체를 Redis cash에 저장될 수 있도록 만든다.
- @Id - JPA에서와 같이 식별자를 지정하는 용도로 사용된다.
- @Indexed - 지정한 필드를 secondary index로 설정한다.
- @TimeToLive - 해당 entitiy의 유효기한을 설정한다. 위에서는 필드에 적용했지만, 클래스에 적용도 가능하다.
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@RedisHash(value = "refresh_token")
public class RefreshToken {
@Id
private String id;
@Indexed
private String memberId;
@Indexed
private String refreshToken;
@TimeToLive
private Long expiration;
@Builder
public RefreshToken(String memberId, String refreshToken) {
this.memberId = memberId;
this.refreshToken = refreshToken;
this.expiration = REFRESH_TOKEN_DURATION.duration();
}
public void updateRefreshToken(String refreshToken) {
this.refreshToken = refreshToken;
this.expiration = REFRESH_TOKEN_DURATION.duration();
}
}
그 다음, Entity에 해당하는 Repository 인터페이스를 생성한다.
public interface RefreshTokenRepository extends CrudRepository<RefreshToken, String> {
...
}
이제 해당 Repository를 사용하고자 하는 곳에 주입시키고 사용할 수 있다. CrudRepository를 상속받은 repository이기 때문에, Spring Data JPA를 사용하는 방법과 같다.
@RequiredArgsConstructor
@Service
public class RefreshTokenService {
private final RefreshTokenRepository refreshTokenRepository;
public void save(RefreshToken refreshToken) {
refreshTokenRepository.save(refreshToken);
}
public RefreshToken find(Long id) {
return refreshTokenRepository.findById(id);
}
}
참고
Redis :: Spring Data Redis
The Redis support provides several components.For most tasks, the high-level abstractions and support services are the best choice.Note that, at any point, you can move between layers.For example, you can get a low-level connection (or even the native libr
docs.spring.io
Jedis 보다 Lettuce 를 쓰자
Java의 Redis Client는 크게 2가지가 있습니다. Jedis Lettuce 둘 모두 몇천개의 Star를 가질만큼 유명한 오픈소스입니다. 이번 시간에는 둘 중 어떤것을 사용해야할지에 대해 성능 테스트 결과를 공유하
jojoldu.tistory.com
'Spring > Spring Data' 카테고리의 다른 글
[Spring / Redis] RedisTemplate vs RedisRepository - 성능 비교 테스트 (0) | 2024.04.17 |
---|