From 66e02868a6b886ff4470e2e53b2aa57e0702d4fd Mon Sep 17 00:00:00 2001 From: mskim Date: Fri, 12 Dec 2025 14:08:37 +0900 Subject: [PATCH] =?UTF-8?q?Redis=20=EC=97=B0=EB=8F=99=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- API명세서.md | 2 +- .../service/impl/MemoryServiceImpl.java | 50 ++++++++++++++++--- 2 files changed, 43 insertions(+), 9 deletions(-) diff --git a/API명세서.md b/API명세서.md index 10f233f..bc94468 100644 --- a/API명세서.md +++ b/API명세서.md @@ -934,7 +934,7 @@ public class MemoryResponse { - ✅ `capabilities`에 `supported` 필드 추가 - ✅ JSON-RPC 2.0 표준 준수 (정상 응답에 error 필드 제외) - ✅ 요청/응답 전체 로깅 기능 추가 -- ⏳ Redis 연동 (TODO) +- ✅ Redis 연동 (임시 메모리 저장/조회 완료, TTL 3일) - ⏳ 벡터 검색 구현 (TODO) - ⏳ 배치 처리 구현 (TODO) diff --git a/src/main/java/com/pandol365/dewey/domain/memory/service/impl/MemoryServiceImpl.java b/src/main/java/com/pandol365/dewey/domain/memory/service/impl/MemoryServiceImpl.java index 0ff82fd..1119d78 100644 --- a/src/main/java/com/pandol365/dewey/domain/memory/service/impl/MemoryServiceImpl.java +++ b/src/main/java/com/pandol365/dewey/domain/memory/service/impl/MemoryServiceImpl.java @@ -7,11 +7,15 @@ import com.pandol365.dewey.domain.memory.service.MemoryService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.PageRequest; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.Duration; import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; +import java.util.Set; import java.util.UUID; /** @@ -24,24 +28,36 @@ import java.util.UUID; public class MemoryServiceImpl implements MemoryService { private final MemoryRepository memoryRepository; - // TODO: Redis 연동 추가 필요 - // private final ReactiveRedisTemplate redisTemplate; + private final RedisTemplate redisTemplate; + + private static final String TEMP_MEMORY_KEY_PREFIX = "tempMemory:"; + private static final String USER_TEMP_MEMORY_KEY_PREFIX = "user:tempMemories:"; + private static final int TEMP_TTL_DAYS = 3; + @SuppressWarnings("null") @Override public TemporaryMemory storeTemporaryMemory(String userId, String memoryText, Integer importance) { log.info("임시 메모리 저장: userId={}, importance={}", userId, importance); - // TODO: Redis에 저장하는 로직 구현 TemporaryMemory temporaryMemory = TemporaryMemory.builder() .id(UUID.randomUUID().toString()) .userId(userId) .memoryText(memoryText) .importance(importance != null ? importance : 1) .createdAt(LocalDateTime.now()) - .expiresAt(LocalDateTime.now().plusDays(3)) // TTL 3일 + .expiresAt(LocalDateTime.now().plusDays(TEMP_TTL_DAYS)) // TTL 3일 .build(); - - // TODO: redisTemplate.opsForValue().set(key, temporaryMemory, Duration.ofDays(3)); + + final Duration ttl = Duration.ofDays(TEMP_TTL_DAYS); + + // Redis에 저장 + String memoryKey = TEMP_MEMORY_KEY_PREFIX + temporaryMemory.getId(); + redisTemplate.opsForValue().set(memoryKey, temporaryMemory, ttl); + + // 사용자별 목록에도 추가 (시간순 정렬) + String userMemoriesKey = USER_TEMP_MEMORY_KEY_PREFIX + userId; + redisTemplate.opsForZSet().add(userMemoriesKey, memoryKey, System.currentTimeMillis()); + redisTemplate.expire(userMemoriesKey, ttl); return temporaryMemory; } @@ -51,8 +67,26 @@ public class MemoryServiceImpl implements MemoryService { public List getTemporaryMemories(String userId) { log.info("임시 메모리 조회: userId={}", userId); - // TODO: Redis에서 조회하는 로직 구현 - return List.of(); + String userMemoriesKey = USER_TEMP_MEMORY_KEY_PREFIX + userId; + + Set ids = redisTemplate.opsForZSet() + .reverseRange(userMemoriesKey, 0, -1); + + if (ids == null || ids.isEmpty()) { + return List.of(); + } + + List memories = new ArrayList<>(); + for (Object idObj : ids) { + if (idObj instanceof String memoryKey) { + Object obj = redisTemplate.opsForValue().get(memoryKey); + if (obj instanceof TemporaryMemory memory) { + memories.add(memory); + } + } + } + + return memories; } @Override