REGIONredisTemplate을 사용하여 userId에 대한 TTL을 설정하고 문자열 "withdrawal"을 값으로 저장하고 있습니다. 이것은 특정 키에 대한 TTL을 설정하는 데 사용되는 일반적인 방법 중 하나입니다. 이 코드는 Redis에서 사용자 ID(userId)를 키로 사용하고, 해당 키의 값으로 "withdrawal" 문자열을 저장하며, 그 키를 30일 동안 유지합니다. 이 방법은 잘 작동할 것으로 보입니다.package com.sparta.seoulmate.entity.redishash;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.springframework.data.redis.core.RedisHash;
import org.springframework.data.redis.core.RedisTemplate;
import java.util.concurrent.TimeUnit;
@RedisHash(value = "withdrawal")
@Getter
@AllArgsConstructor
public class Withdrawal {
private static final String WITHDRAWAL_KEY_PREFIX = "withdrawal:";
private RedisTemplate<String, String> redisTemplate;
public void saveWithdrawalInfo(String userId) {
String key = WITHDRAWAL_KEY_PREFIX + userId;
// 여기에서 회원 정보를 Redis에 저장
redisTemplate.opsForValue().set(key, "withdrawal");
// TTL 30일로 설정
redisTemplate.expire(key, 30, TimeUnit.DAYS);
}
}@TimeToLive 어노테이션을 사용하여 TTL을 설정하려는 것 같은데, 이 방법은 Spring Data Redis의 @TimeToLive 기능을 사용하는 방법입니다. 이 방법은 Redis의 EXPIRE 명령어를 내부적으로 사용하여 TTL을 설정합니다. 그러나 주의할 점은 @TimeToLive 어노테이션은 엔티티 클래스에 적용되어야 하며, 일반적으로 JPA Entity나 Spring Data Redis의 Repository에 사용됩니다. 만약 이 방법을 사용하려면 Withdrawal 클래스를 Redis Entity로 구성해야 합니다.package com.sparta.seoulmate.entity.redishash;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.springframework.data.redis.core.RedisHash;
import org.springframework.data.redis.core.TimeToLive;
@RedisHash(value = "withdrawal")
@Getter
@AllArgsConstructor
public class Withdrawal {
private static final String WITHDRAWAL_KEY_PREFIX = "withdrawal:";
private String userId;
@TimeToLive
private Long expiration; // TTL 설정
public Withdrawal(String userId) {
this.userId = userId;
this.expiration = 30L * 24 * 60 * 60; // 30일 동안 유지
}
}@RedisHash(value = "withdrawal") 어노테이션은 Redis에서 이 클래스가 해시로 저장되어야 함을 나타냅니다.@TimeToLive 어노테이션은 데이터의 TTL(Time To Live)을 설정하는 데 사용됩니다. 이 어노테이션을 사용하면 데이터가 저장될 때 TTL이 설정되며, TTL이 만료되면 데이터가 Redis에서 자동으로 삭제됩니다.expiration 필드는 TTL을 나타내며, 여기서는 30일 동안 유지됩니다.userId 필드는 Redis에 저장할 데이터의 키 역할을 합니다.@Scheduled 어노테이션을 사용Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2023-09-04T19:52:50.462+09:00 ERROR 6708 --- [ main] o.s.boot.SpringApplication : Application run failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'userController' defined in fileWithdrawal 엔티티 클래스에 @Id 필드가 누락되어 발생Withdrawal 클래스에 @Id 어노테이션을 추가하여 userId 필드를 엔티티의 주요 키로 지정@Id // userId를 엔티티의 주요 키로 지정
private String userId;Withdrawal 엔티티에 TTL을 설정하면 해당 데이터는 TTL이 만료되면 Redis에서는 삭제되지만, 이를 트리거하는 코드는 따로 작성할 필요가 없습니다. Redis는 내부적으로 스캔 작업을 수행하여 만료된 데이터를 삭제합니다. @Column
private boolean withdrawalRequested;this.withdrawalRequested에서 booleanValue() 메서드를 호출할 때 발생withdrawalRequested 프로퍼티가 null인 상태에서 해당 프로퍼티에 접근하려고 시도할 때 발생public boolean isWithdrawalRequested() {
return withdrawalRequested != null && withdrawalRequested;
}withdrawalRequested가 null이 아니고 true인 경우에만 true를 반환하며, 그 외의 경우에는 false를 반환합니다. 이렇게 하면 withdrawalRequested가 null인 경우에도 NullPointerException이 발생하지 않아야 합니다.withdrawalRequested 필드를 기본적으로 boolean(primitive type)으로 정의false가 할당withdrawalRequested 필드는 null 상태가 아니라 초기화되지 않았을 때 false로 간주되는데, 이런 경우에 해당 필드를 사용하면 NullPointerException이 발생withdrawalRequested가 null인지 체크하고, 그 후에 withdrawalRequested 값이 true인 경우에만 true를 반환하도록 하기withdrawalRequested 필드가 null이거나 false일 때는 항상 false가 반환되므로 NullPointerException 오류를 예방