Spring/Spring Data

[Spring] Spring에 Redis를 사용하는 방법

Woong이 2024. 3. 28. 03:00
반응형

개요


개인 프로젝트에서 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으로 등록해야 한다.

  1. RedisConnectionFactory - Redis connection을 제공하는 팩토리 클래스
    • JedisConnectionFactory와 LettusConnectionFactory 중 하나를 선택해야 한다. 되도록 Lettus를 사용하도록 하자. (참고: Jedis 보다 Lettus를 쓰자)
  2. 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

 

반응형