diff --git a/api/api-health-check/src/main/java/com/drinkhere/apihealthcheck/presentations/HealthCheckController.java b/api/api-health-check/src/main/java/com/drinkhere/apihealthcheck/presentations/HealthCheckController.java index 60a7e59..1d21aa7 100644 --- a/api/api-health-check/src/main/java/com/drinkhere/apihealthcheck/presentations/HealthCheckController.java +++ b/api/api-health-check/src/main/java/com/drinkhere/apihealthcheck/presentations/HealthCheckController.java @@ -20,8 +20,9 @@ public String healthCheck() { @GetMapping("/redis") public String redisConnectionCheck() { // Redis에서 'id1' 키로 값을 가져옵니다. - String value = redisUtil.getObjectByKey("id1", String.class); - +// String value = redisUtil.getObjectByKey("id1", String.class); + String value = (String) redisUtil.get("id1"); + System.out.println(value); // Redis에서 가져온 값이 있을 경우 반환, 없으면 기본 메시지 반환 if (value != null) { return value; diff --git a/infra/infra-redis/src/main/java/com/drinkhere/infraredis/config/JsonComponent.java b/infra/infra-redis/src/main/java/com/drinkhere/infraredis/config/JsonComponent.java deleted file mode 100644 index 435611b..0000000 --- a/infra/infra-redis/src/main/java/com/drinkhere/infraredis/config/JsonComponent.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.drinkhere.infraredis.config; - - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; -import jakarta.annotation.PostConstruct; -import org.springframework.stereotype.Component; - -@Component -public class JsonComponent { - - private ObjectMapper objectMapper; - - @PostConstruct - public void init() { - objectMapper = new ObjectMapper().registerModule(new JavaTimeModule()); - } - - public String objectToJson(Object obj) { - String jsonStr = ""; - try { - jsonStr = objectMapper.writeValueAsString(obj); - } catch (Exception e) { - new RuntimeException("ParsingException", e); - } - return jsonStr; - } - - public T jsonToObject(String json, Class clazz) { - T obj = null; - try { - // 단순 문자열을 처리할 수 있도록 readValue를 명시적으로 호출 - if (clazz == String.class) { - return clazz.cast(json); // 단순 문자열 그대로 반환 - } - obj = objectMapper.readValue(json, clazz); - } catch (Exception e) { - throw new RuntimeException("ConvertException", e); // 예외를 던져 문제를 추적 가능하게 만듦 - } - return obj; - } - -} \ No newline at end of file diff --git a/infra/infra-redis/src/main/java/com/drinkhere/infraredis/config/RedisCacheConfig.java b/infra/infra-redis/src/main/java/com/drinkhere/infraredis/config/RedisCacheConfig.java new file mode 100644 index 0000000..6054062 --- /dev/null +++ b/infra/infra-redis/src/main/java/com/drinkhere/infraredis/config/RedisCacheConfig.java @@ -0,0 +1,36 @@ +package com.drinkhere.infraredis.config; + +import org.springframework.cache.CacheManager; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.cache.RedisCacheConfiguration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.RedisSerializationContext; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +import java.time.Duration; + +@EnableCaching +@Configuration +public class RedisCacheConfig { + @Bean + public CacheManager oidcCacheManager(RedisConnectionFactory cf) { + RedisCacheConfiguration redisCacheConfiguration = + RedisCacheConfiguration.defaultCacheConfig() + .serializeKeysWith( + RedisSerializationContext.SerializationPair.fromSerializer( + new StringRedisSerializer())) + .serializeValuesWith( + RedisSerializationContext.SerializationPair.fromSerializer( + new GenericJackson2JsonRedisSerializer())) + // TTL 하루로 설정 + .entryTtl(Duration.ofDays(1L)); + + return RedisCacheManager.RedisCacheManagerBuilder.fromConnectionFactory(cf) + .cacheDefaults(redisCacheConfiguration) + .build(); + } +} \ No newline at end of file diff --git a/infra/infra-redis/src/main/java/com/drinkhere/infraredis/config/RedisConfig.java b/infra/infra-redis/src/main/java/com/drinkhere/infraredis/config/RedisConfig.java index 77d366e..bc8147e 100644 --- a/infra/infra-redis/src/main/java/com/drinkhere/infraredis/config/RedisConfig.java +++ b/infra/infra-redis/src/main/java/com/drinkhere/infraredis/config/RedisConfig.java @@ -1,32 +1,25 @@ package com.drinkhere.infraredis.config; import org.springframework.beans.factory.annotation.Value; -import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; -import org.springframework.data.redis.connection.RedisStandaloneConfiguration; import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.StringRedisSerializer; - @Configuration -@EnableCaching public class RedisConfig { - @Value("${spring.redis.host}") - private String host; + @Value("${spring.data.redis.host}") + private String redisHost; - @Value("${spring.redis.port}") - private int port; + @Value("${spring.data.redis.port}") + private int redisPort; @Bean public RedisConnectionFactory redisConnectionFactory() { - RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration(); - redisStandaloneConfiguration.setHostName(host); - redisStandaloneConfiguration.setPort(port); - return new LettuceConnectionFactory(redisStandaloneConfiguration); + return new LettuceConnectionFactory(redisHost, redisPort); } @Bean diff --git a/infra/infra-redis/src/main/java/com/drinkhere/infraredis/util/RedisUtil.java b/infra/infra-redis/src/main/java/com/drinkhere/infraredis/util/RedisUtil.java index b535ccc..6e75fb0 100644 --- a/infra/infra-redis/src/main/java/com/drinkhere/infraredis/util/RedisUtil.java +++ b/infra/infra-redis/src/main/java/com/drinkhere/infraredis/util/RedisUtil.java @@ -1,35 +1,48 @@ package com.drinkhere.infraredis.util; -import com.drinkhere.infraredis.config.JsonComponent; -import io.micrometer.common.util.StringUtils; import lombok.RequiredArgsConstructor; import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Component; +import java.util.List; +import java.util.Objects; import java.util.concurrent.TimeUnit; @RequiredArgsConstructor @Component public class RedisUtil { + private final RedisTemplate redisTemplate; - final RedisTemplate redisTemplate; - final JsonComponent jsonComponent; + public void saveAsValue(String key, Object val, Long time, TimeUnit timeUnit) { + redisTemplate.opsForValue().set(key, val, time, timeUnit); + } - public T getObjectByKey(String key, Class clazz) { - ValueOperations vop = redisTemplate.opsForValue(); + public void appendToRecentlyViewedAnnouncement(String key, String newValue) { + long RECENT_VIEWED_ANNOUNCEMENT_LIMIT = 20; - String jsonString = vop.get(key); - if (StringUtils.isNotEmpty(jsonString)) { - return jsonComponent.jsonToObject(jsonString, clazz); - } else { - return null; + Object mostRecentlyViewedValue = redisTemplate.opsForList().index(key, 0); + if (Objects.equals(mostRecentlyViewedValue, newValue)) { + return; + } + if (Objects.equals(redisTemplate.opsForList().size(key), RECENT_VIEWED_ANNOUNCEMENT_LIMIT)) { + redisTemplate.opsForList().rightPop(key); } + redisTemplate.opsForList().leftPush(key, newValue); + } + + public boolean hasKey(String key) { + return Boolean.TRUE.equals(redisTemplate.hasKey(key)); + } + + public Object get(String key) { + return redisTemplate.opsForValue().get(key); + } + + public List getList(String key) { + return redisTemplate.opsForList().range(key, 0, -1); } - public void setObjectByKey(String key, Object obj) { - ValueOperations vop = redisTemplate.opsForValue(); - vop.set(key, jsonComponent.objectToJson(obj)); - redisTemplate.expire(key, 7, TimeUnit.DAYS); + public boolean delete(String key) { + return Boolean.TRUE.equals(redisTemplate.delete(key)); } } \ No newline at end of file