📌 사용 계기

Redis 만료시간 설정을 사용해서 저장해 놓은 reflesh token을 일정 시간이 지나면 자동으로 삭제할 필요가 있었다. 사용할 수 있는 가장 기본적인 예시로 방법을 정리

 

📍공통적으로 사용한 Redis Configuration

@EnableRedisRepositories
@Configuration
public class RedisConfig {

    @Bean
    public RedisConnectionFactory redisConnectionFactory() {
        LettuceConnectionFactory lettuceConnectionFactory = new LettuceConnectionFactory();
        return lettuceConnectionFactory;
    }

    @Bean
    public RedisTemplate<?, ?> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<byte[], byte[]> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(connectionFactory);
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        return redisTemplate;
    }
}

 

 

📌 1) Redis Template Set 설정 방법

: Strings (기본적인 key-value)자료구조로 저장하며, 저장하는 오퍼레이션 실행시 만료시간을 설정하는 방법. 

 

📍저장 객체

@RedisHash(value = "redis")
public class RedisTemplateEntity {
    private String email;
    private String testText;
}

 

📍Repository

@Repository
@RequiredArgsConstructor
public class RedisTemplateRepository {
    private final RedisTemplate<String, String> redisTemplate;
    private long expireTime = 60;

    public String saveValue (String email, String testText) {
    	// Point!TimeUnit을 통해 만료시간 단위 변경 가능
        redisTemplate.opsForValue().set(email, testText, expireTime, TimeUnit.MINUTES);
        return redisTemplate.opsForValue().get(email);
    }

    public void deleteValue (String email) {
        redisTemplate.delete(email);
    }
}

 

📍사용

// 사용 테스트만을 위한 컨트롤러라 서비스로 나누지 않음
@RestController
@RequiredArgsConstructor
public class RedisTemplateController {

    private final RedisTemplateRepository redisTemplateRepository;

    // 저장
    @PostMapping("/testValue")
    public String saveTestValue (@RequestBody RedisTemplateDto redisTemplateDto){
        return redisTemplateRepository.saveValue(redisTemplateDto.getEmail(), redisTemplateDto.getTestText());
    }

    // 수정 : Redis는 같은 key값의 데이터를 쓰게되면 기존 데이터위에 덮어쓰게됨. 그래서 save나 update나 방식이 동일
    @PostMapping("/testValue/{email}")
    public String updateTestValue (@RequestParam String email, @RequestBody RedisTemplateDto redisTemplateDto){
        return redisTemplateRepository.saveValue(email, redisTemplateDto.getTestText());
    }

    // 삭제
    @DeleteMapping("/testValue/{email}")
    public void deleteTestValue (@RequestParam String email) {
        redisTemplateRepository.deleteValue(email);
    }
}

 

 

📌 2) Crud Repository 설정 방법

: 저장하는 객체 자체에 만료시간을 설정해주는 방법. 객체 @RedisHash 어노테이션에 timeToLive 만료시간을 설정

 

📍저장 객체

@Getter
@RedisHash(value = "REDIS_USE", timeToLive = 5*60L) // Point! 기본 초단위
public class RedisCrudUseEntity {
    @Id
    private Long id;
    private String testText;

    @Builder
    public RedisCrudUseEntity(Long id, String testText) {
        this.id = id;
        this.testText = testText;
    }
}

 

📍Repository

@Repository
public interface RedisCrudUseRepository extends CrudRepository<RedisCrudUseEntity, Long> {
}

 

📍사용

// 사용 테스트만을 위한 컨트롤러라 서비스로 나누지 않음
@RestController
@RequiredArgsConstructor
public class RedisCrudUseController {
    private final RedisCrudUseRepository redisCrudUseRepository;

    // 저장
    @PostMapping("/redisCrudUse")
    public void saveRedisCrudUse (@RequestBody RedisCrudUseDto redisCrudUseDto) {
        RedisCrudUseEntity redisCrudUseEntity = RedisCrudUseEntity.builder()
            .id(redisCrudUseDto.getId())
            .testText(redisCrudUseDto.getTestText())
            .build();
        redisCrudUseRepository.save(redisCrudUseEntity);
    }

    // 수정 : Redis는 같은 key값의 데이터를 쓰게되면 기존 데이터위에 덮어쓰게됨. 그래서 save나 update나 방식이 동일
    @PostMapping("/redisCrudUse/{id}")
    public void updateRedisCrudUse (@PathVariable Long id, @RequestBody RedisCrudUseDto redisCrudUseDto) {

        RedisCrudUseEntity redisCrudUseEntity = RedisCrudUseEntity.builder()
                .id(id)
                .testText(redisCrudUseDto.getTestText())
                .build();
        redisCrudUseRepository.save(redisCrudUseEntity);
    }

    // 삭제
    @DeleteMapping("/redisCrudUse/{id}")
    public void deleteRedisCrudUse (@PathVariable Long id) {

        redisCrudUseRepository.deleteById(id);
    }
}

 


➕ 실습 레포지토리

 

GitHub - littlezero48/Study-TIL: Tody I learned

Tody I learned. Contribute to littlezero48/Study-TIL development by creating an account on GitHub.

github.com

 

'Database > Redis' 카테고리의 다른 글

Redis] Redis Repository를 Bean으로 생성 안되는 문제  (0) 2023.01.13

 

📌 Error Message

 

Error creating bean with name 'gameStartSetRepository2' defined in com.example.namoldak.repository.GameStartSetRepository2 defined in @EnableRedisRepositories declared on RedisRepositoriesRegistrar.EnableRedisRepositoriesConfiguration: Invocation of init method failed; nested exception is org.springframework.data.mapping.MappingException: Entity com.example.login.entity. Token requires to have an explicit id field. Did you forget to provide one using @Id?

 

 

📍문제 상황

 

Redis Repository를 Bean 으로 등록이 안되면서 실행이 안되는 에러가 발생!!

 

 

📍원인 

 

아래처럼 레디스에 저장해야할 객체 안에서 Id의 어노테이션의 임포트를 하는 데 잘못 임포트해서 생긴 것!

 

 

📍 해결 

 

위에 보면 javax.persistence.Id; 가 임포트 되어 있는 데 이건 JpaRepository에서 사용했던 거고

CrudRepository를 사용할 거면 org.springframework.data.annotation 을 임포트하면 해결된다!

 

'Database > Redis' 카테고리의 다른 글

Redis] 만료 시간 설정  (0) 2023.01.27

+ Recent posts