diff --git a/.github/workflows/be-cd.yml b/.github/workflows/be-cd.yml index a490f330..5b2decaa 100644 --- a/.github/workflows/be-cd.yml +++ b/.github/workflows/be-cd.yml @@ -4,6 +4,7 @@ on: push: branches: - be + - refactor/UNI-255-v3 jobs: uniro-ci: diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/admin/service/AdminService.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/admin/service/AdminService.java index dde40a24..c1b41779 100644 --- a/uniro_backend/src/main/java/com/softeer5/uniro_backend/admin/service/AdminService.java +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/admin/service/AdminService.java @@ -12,7 +12,7 @@ import com.softeer5.uniro_backend.common.exception.custom.AdminException; import com.softeer5.uniro_backend.common.exception.custom.RouteException; import com.softeer5.uniro_backend.common.exception.custom.UnivException; -import com.softeer5.uniro_backend.common.redis.RedisService; +import com.softeer5.uniro_backend.external.redis.RedisService; import com.softeer5.uniro_backend.map.dto.response.AllRoutesInfo; import com.softeer5.uniro_backend.map.dto.response.GetChangedRoutesByRevisionResDTO; import com.softeer5.uniro_backend.map.dto.response.GetRiskRoutesResDTO; diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/config/RedisConfig.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/config/RedisConfig.java new file mode 100644 index 00000000..49d3ad92 --- /dev/null +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/config/RedisConfig.java @@ -0,0 +1,46 @@ +package com.softeer5.uniro_backend.common.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +import com.alibaba.fastjson2.support.spring6.data.redis.FastJsonRedisSerializer; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.softeer5.uniro_backend.map.service.vo.LightRoutes; + +@Configuration +public class RedisConfig { + + @Bean + public RedisTemplate redisTemplate(LettuceConnectionFactory connectionFactory) { + RedisTemplate template = new RedisTemplate<>(); + template.setConnectionFactory(connectionFactory); + + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.registerModule(new JavaTimeModule()); + objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); // ISO-8601 형식 + objectMapper.activateDefaultTyping(objectMapper.getPolymorphicTypeValidator(), + ObjectMapper.DefaultTyping.NON_FINAL); // 타입 정보 추가 + + StringRedisSerializer stringSerializer = new StringRedisSerializer(); + GenericJackson2JsonRedisSerializer jsonSerializer = new GenericJackson2JsonRedisSerializer(objectMapper); + + // Key serializer 설정 + template.setKeySerializer(stringSerializer); + template.setHashKeySerializer(stringSerializer); + + // Value serializer 설정 + template.setValueSerializer(jsonSerializer); + template.setHashValueSerializer(jsonSerializer); + + template.afterPropertiesSet(); + return template; + } +} diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/config/WebMvcConfig.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/config/WebMvcConfig.java index c9b44377..258be1ec 100644 --- a/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/config/WebMvcConfig.java +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/config/WebMvcConfig.java @@ -7,6 +7,7 @@ import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; +import org.springframework.http.converter.ByteArrayHttpMessageConverter; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; @@ -35,22 +36,23 @@ public WebMvcConfig(AdminInterceptor adminInterceptor, JwtInterceptor jwtInterce @Override public void configureMessageConverters(List> converters) { + // 기존 FastJson 컨버터 설정 FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter(); - //custom configuration... FastJsonConfig config = new FastJsonConfig(); config.setDateFormat("yyyy-MM-dd HH:mm:ss"); config.setReaderFeatures(JSONReader.Feature.FieldBased, JSONReader.Feature.SupportArrayToBean); config.setWriterFeatures(JSONWriter.Feature.WriteMapNullValue, JSONWriter.Feature.PrettyFormat); converter.setFastJsonConfig(config); converter.setDefaultCharset(StandardCharsets.UTF_8); - converter.setSupportedMediaTypes(List.of( - MediaType.APPLICATION_JSON, // application/json 지원 + MediaType.APPLICATION_JSON, new MediaType("application", "json", StandardCharsets.UTF_8), new MediaType("application", "openmetrics-text", StandardCharsets.UTF_8) )); converters.add(0, converter); + converters.add(1, new ByteArrayHttpMessageConverter()); + converters.forEach(c -> log.info("✔ {}", c.getClass().getName())); } diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/redis/RedisConfig.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/redis/RedisConfig.java deleted file mode 100644 index d8c9758f..00000000 --- a/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/redis/RedisConfig.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.softeer5.uniro_backend.common.redis; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; -import org.springframework.data.redis.connection.RedisConnectionFactory; -import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.serializer.StringRedisSerializer; - -import com.alibaba.fastjson2.support.spring6.data.redis.FastJsonRedisSerializer; -import com.softeer5.uniro_backend.map.service.vo.LightRoutes; - -@Configuration -public class RedisConfig { - - @Bean - public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) { - RedisTemplate template = new RedisTemplate<>(); - template.setConnectionFactory(connectionFactory); - - // 키는 String, 값은 FastJson으로 변환된 JSON 문자열 저장 - StringRedisSerializer serializer = new StringRedisSerializer(); - FastJsonRedisSerializer fastJsonRedisSerializer = new FastJsonRedisSerializer<>(LightRoutes.class); - - template.setKeySerializer(serializer); - template.setValueSerializer(fastJsonRedisSerializer); - - return template; - } -} diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/redis/RedisService.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/external/redis/RedisService.java similarity index 96% rename from uniro_backend/src/main/java/com/softeer5/uniro_backend/common/redis/RedisService.java rename to uniro_backend/src/main/java/com/softeer5/uniro_backend/external/redis/RedisService.java index 659ccf89..68481051 100644 --- a/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/redis/RedisService.java +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/external/redis/RedisService.java @@ -1,4 +1,4 @@ -package com.softeer5.uniro_backend.common.redis; +package com.softeer5.uniro_backend.external.redis; import java.time.Duration; import java.util.HashMap; diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/map/controller/MapController.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/map/controller/MapController.java index 81d07900..ccf3a18f 100644 --- a/uniro_backend/src/main/java/com/softeer5/uniro_backend/map/controller/MapController.java +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/map/controller/MapController.java @@ -1,5 +1,6 @@ package com.softeer5.uniro_backend.map.controller; +import com.fasterxml.jackson.databind.ObjectMapper; import com.softeer5.uniro_backend.admin.service.AdminService; import com.softeer5.uniro_backend.map.dto.request.CreateBuildingRouteReqDTO; import com.softeer5.uniro_backend.map.dto.request.CreateRoutesReqDTO; @@ -14,16 +15,20 @@ import com.softeer5.uniro_backend.map.service.MapService; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; + import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import java.util.List; @RequiredArgsConstructor @RestController +@Slf4j public class MapController implements MapApi { private final MapService mapService; private final AdminService adminService; + private final ObjectMapper objectMapper; @GetMapping("/{univId}/routes-local") public ResponseEntity getAllRoutesAndNodesByLocalCache(@PathVariable("univId") Long univId){ @@ -35,7 +40,24 @@ public ResponseEntity getAllRoutesAndNodesByLocalCache(@Path @GetMapping("/{univId}/routes") public ResponseEntity getAllRoutesAndNodes(@PathVariable("univId") Long univId){ GetAllRoutesResDTO allRoutes = mapService.getAllRoutes(univId); - return ResponseEntity.ok().body(allRoutes); + + ResponseEntity body = ResponseEntity.ok().body(allRoutes); + + long duration = 0; + try{ + long startTime = System.nanoTime(); + String json = objectMapper.writeValueAsString(body); // JSON 직렬화 + long endTime = System.nanoTime(); + + duration = (endTime - startTime) / 1_000_000; // ms 단위 변환 + } + catch (Exception e){ + + } + + log.info("🧪🧪🧪🧪🧪Serialization Time: {} ms", duration); + + return body; } @Override diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/map/service/MapService.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/map/service/MapService.java index aae4c27c..e080419f 100644 --- a/uniro_backend/src/main/java/com/softeer5/uniro_backend/map/service/MapService.java +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/map/service/MapService.java @@ -17,7 +17,7 @@ import com.softeer5.uniro_backend.common.exception.custom.NodeException; import com.softeer5.uniro_backend.common.exception.custom.RouteCalculationException; import com.softeer5.uniro_backend.common.exception.custom.RouteException; -import com.softeer5.uniro_backend.common.redis.RedisService; +import com.softeer5.uniro_backend.external.redis.RedisService; import com.softeer5.uniro_backend.external.MapClient; import com.softeer5.uniro_backend.map.dto.request.CreateRoutesReqDTO; import com.softeer5.uniro_backend.map.entity.Node;