본문 바로가기
공부/Spring

[Spring][Redis] 스프링 부트 RedisRepository 사용법

by 웅대 2023. 7. 15.
728x90
반응형

https://growth-coder.tistory.com/228

 

[Spring][Redis] 스프링 부트에서 redis 연동 및 RedisTemplate 사용법

이번 포스팅에서는 스프링 부트에서 redis와 연동하고 값을 저장해보려고 한다. 먼저 스프링 부트에 redis 관련된 의존성을 추가해준다. 만약 기존 진행 중인 프로젝트에 적용한다면 build.gradle에

growth-coder.tistory.com

위 링크의 RedisTemplate에 대한 설명을 보고 오는 것을 추천드립니다.

 

이전 포스팅에서 RedisTemplate을 사용하여 redis에 값을 저장해보았다.

 

단순 value를 저장한다고 하면 RedisTemplate을 통해 쉽게 저장할 수 있다.

 

그런데 단순 value가 아닌 복잡한 도메인 객체를 저장할 때는 RedisTemplate 보다는 RedisRepository를 사용하여 쉽게 구현할 수 있다.

 

먼저 엔티티를 만들어보자. 나는 다음과 같은 엔티티를 만들었다.

@RedisHash("token")
@AllArgsConstructor
public class Token {
    @Id
    private Long id;
    private String accessToken;
    private String refreshToken;
}

@RedisHash 어노테이션의 경우 key 중복을 방지하기 위함이다.

 

만약 Long 타입의 아이디를 key로 사용하는 두 개의 엔티티가 있을 때 key가 중복될 수 있기 때문에 @RedisHash를 통해 구분해주는 것이다.

 

만약 token의 id를 1로 지정해두고 저장한다면 실제 redis에는 "token:1"과 같은 형태로 key 값이 저장 된다. 

 

다음은 설정 파일이다. spring.redis.host와 spring.redis.port는 application.properties에 등록되어 있다.

 

RedisRepository를 사용하기 위해 @EnabledRedisRepositories 어노테이션을 붙여준다.

@Configuration
@EnableRedisRepositories
public class RedisConfiguration {
    @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<?, ?> redisTemplate(RedisConnectionFactory redisConnectionFactory) {

        RedisTemplate<String, String> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        return template;
    }
}

이제 CRUDRepository를 상속받은 인터페이스를 생성한다. 기본 CRUD 기능이 이미 구현되어있고 기본 생성 및 조회만 테스트 해 볼 예정이므로 따로 메소드를 작성하지는 않는다. 

@Repository
public interface TokenRepository extends CrudRepository<Token, Long> {
    
}

사용할 때는 TokenRepository를 주입받아서 사용하면 된다. 

 

저장은 save(entity), 아이디로 조회는 findById(id)를 사용하면 된다.

@Component
@RequiredArgsConstructor
public class JwtUtil {
    private final TokenRepository tokenRepository;
    
    public String createRefreshToken(Long id) {
	.
        .
        .
        Token token1 = new Token(id, "access", token);
        tokenRepository.save(token1);
	.
        .
       	.
    }
    public boolean validateRefreshToken(String refreshToken) {
    	.
    	.
        .
        String storedRefreshToken = tokenRepository.findById(pk).get().toString();
        System.out.println("storedRefreshToken = " + storedRefreshToken);
    	.
    	.
        .
    }

}

 

728x90
반응형

댓글