diff --git a/src/main/java/com/pcb/audy/domain/pin/service/PinService.java b/src/main/java/com/pcb/audy/domain/pin/service/PinService.java index 170e786..07b5588 100644 --- a/src/main/java/com/pcb/audy/domain/pin/service/PinService.java +++ b/src/main/java/com/pcb/audy/domain/pin/service/PinService.java @@ -34,7 +34,7 @@ public PinSaveRes savePin(Long courseId, PinSaveReq pinSaveReq) { String sequence = lexoRankUtil.getLexoRank(courseId, size); PinRedisRes pinRedisRes = PinServiceMapper.INSTANCE.toPinRedisRes(pinSaveReq, courseId, sequence); - redisProvider.set(getKey(courseId, pinRedisRes.getPinId()), pinRedisRes, PIN_EXPIRE_TIME); + redisProvider.setPin(getKey(courseId, pinRedisRes.getPinId()), pinRedisRes, PIN_EXPIRE_TIME); return PinServiceMapper.INSTANCE.toPinSaveRes(pinRedisRes); } @@ -55,7 +55,7 @@ public PinOrderUpdateRes updatePinOrder(Long courseId, PinOrderUpdateReq pinOrde .sequence(sequence) .build(); - redisProvider.set(key, updatedPinRedisRes, PIN_EXPIRE_TIME); + redisProvider.setPin(key, updatedPinRedisRes, PIN_EXPIRE_TIME); return PinServiceMapper.INSTANCE.toPinOrderUpdateRes(pinOrderUpdateReq); } @@ -75,7 +75,7 @@ public PinNameUpdateRes updatePinName(Long courseId, PinNameUpdateReq pinNameUpd .address(prevPin.getAddress()) .sequence(prevPin.getSequence()) .build(); - redisProvider.set(key, updatedPin, PIN_EXPIRE_TIME); + redisProvider.setPin(key, updatedPin, PIN_EXPIRE_TIME); return PinServiceMapper.INSTANCE.toPinNameUpdateRes(updatedPin); } diff --git a/src/main/java/com/pcb/audy/domain/pin/service/PinServiceMapper.java b/src/main/java/com/pcb/audy/domain/pin/service/PinServiceMapper.java index 1fde901..022c427 100644 --- a/src/main/java/com/pcb/audy/domain/pin/service/PinServiceMapper.java +++ b/src/main/java/com/pcb/audy/domain/pin/service/PinServiceMapper.java @@ -3,6 +3,7 @@ import com.pcb.audy.domain.pin.dto.request.PinOrderUpdateReq; import com.pcb.audy.domain.pin.dto.request.PinSaveReq; import com.pcb.audy.domain.pin.dto.response.*; +import java.util.List; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.factory.Mappers; @@ -18,6 +19,10 @@ public interface PinServiceMapper { PinSaveRes toPinSaveRes(PinRedisRes pinRedisRes); + PinGetRes toPinGetRes(PinRedisRes pinRedisRes); + + List toPinGetResList(List pinList); + PinNameUpdateRes toPinNameUpdateRes(PinRedisRes pinRedisRes); PinOrderUpdateRes toPinOrderUpdateRes(PinOrderUpdateReq pinOrderUpdateReq); diff --git a/src/main/java/com/pcb/audy/global/redis/RedisConfig.java b/src/main/java/com/pcb/audy/global/redis/RedisConfig.java index 5045f86..1b5b469 100644 --- a/src/main/java/com/pcb/audy/global/redis/RedisConfig.java +++ b/src/main/java/com/pcb/audy/global/redis/RedisConfig.java @@ -1,5 +1,6 @@ package com.pcb.audy.global.redis; +import com.pcb.audy.domain.pin.dto.response.PinRedisRes; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -30,4 +31,14 @@ public RedisTemplate redisTemplate() { redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(Object.class)); return redisTemplate; } + + @Bean + public RedisTemplate pinRedisTemplate( + RedisConnectionFactory connectionFactory) { + RedisTemplate pinRedisTemplate = new RedisTemplate<>(); + pinRedisTemplate.setConnectionFactory(connectionFactory); + pinRedisTemplate.setKeySerializer(new StringRedisSerializer()); + pinRedisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(PinRedisRes.class)); + return pinRedisTemplate; + } } diff --git a/src/main/java/com/pcb/audy/global/redis/RedisProvider.java b/src/main/java/com/pcb/audy/global/redis/RedisProvider.java index ff94271..2ef0994 100644 --- a/src/main/java/com/pcb/audy/global/redis/RedisProvider.java +++ b/src/main/java/com/pcb/audy/global/redis/RedisProvider.java @@ -19,8 +19,25 @@ @RequiredArgsConstructor public class RedisProvider { private final RedisTemplate redisTemplate; + private final RedisTemplate redisPinTemplate; private final long PIN_EXPIRE_TIME = Integer.MAX_VALUE; + public List getPinsByPattern(String pattern) { + Set keys = redisPinTemplate.keys(pattern); + if (CollectionUtils.isEmpty(keys)) { + return List.of(); + } + return redisPinTemplate.opsForValue().multiGet(keys); + } + + public void setPin(String key, PinRedisRes o, long expireTime) { + if (hasKey(key)) { + delete(key); + } + redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<>(PinRedisRes.class)); + redisTemplate.opsForValue().set(key, o, Duration.ofMillis(expireTime)); + } + public Object get(String key) { return redisTemplate.opsForValue().get(key); } diff --git a/src/main/java/com/pcb/audy/global/util/LexoRankUtil.java b/src/main/java/com/pcb/audy/global/util/LexoRankUtil.java index ae1064c..b7c94f6 100644 --- a/src/main/java/com/pcb/audy/global/util/LexoRankUtil.java +++ b/src/main/java/com/pcb/audy/global/util/LexoRankUtil.java @@ -1,10 +1,10 @@ package com.pcb.audy.global.util; -import com.fasterxml.jackson.databind.ObjectMapper; import com.github.pravin.raha.lexorank4j.LexoRank; import com.pcb.audy.domain.pin.dto.response.PinGetRes; +import com.pcb.audy.domain.pin.dto.response.PinRedisRes; +import com.pcb.audy.domain.pin.service.PinServiceMapper; import com.pcb.audy.global.redis.RedisProvider; -import java.util.ArrayList; import java.util.Collections; import java.util.List; import lombok.RequiredArgsConstructor; @@ -18,7 +18,6 @@ public class LexoRankUtil { private final RedisProvider redisProvider; - private final ObjectMapper objectMapper; public String getLexoRank(Long courseId, int order) { // 어떤 코스에(courseId), 몇 번째 순서에(order), 어떤 핀을 넣을 것인가(target) @@ -43,19 +42,12 @@ public String getLexoRank(Long courseId, int order) { public List sortByLexoRank(Long courseId) { String pattern = courseId + ":*"; - List redisData = redisProvider.getByPattern(pattern); + List redisData = redisProvider.getPinsByPattern(pattern); if (redisData == null) { return List.of(); } - - List pinResList = new ArrayList<>(); - for (Object pin : redisData) { - PinGetRes pinRedisRes = objectMapper.convertValue(pin, PinGetRes.class); - pinResList.add(pinRedisRes); - } - - Collections.sort(pinResList); - return pinResList; + Collections.sort(redisData); + return PinServiceMapper.INSTANCE.toPinGetResList(redisData); } } diff --git a/src/test/java/com/pcb/audy/domain/pin/service/PinServiceTest.java b/src/test/java/com/pcb/audy/domain/pin/service/PinServiceTest.java index e71fe39..e1c20ff 100644 --- a/src/test/java/com/pcb/audy/domain/pin/service/PinServiceTest.java +++ b/src/test/java/com/pcb/audy/domain/pin/service/PinServiceTest.java @@ -79,7 +79,7 @@ class PinServiceTest implements PinTest { // then verify(redisProvider).get(any()); verify(objectMapper).convertValue(any(), eq(PinRedisRes.class)); - verify(redisProvider).set(any(), any(), anyLong()); + verify(redisProvider).setPin(any(), any(), anyLong()); assertThat(pinNameUpdateRes.getPinName()).isEqualTo(TEST_UPDATED_PIN_NAME); }