From f1c02d0173f4a1083d80e0407e5e9fc91758cd0c Mon Sep 17 00:00:00 2001 From: mikekks Date: Fri, 21 Feb 2025 00:00:01 +0900 Subject: [PATCH 1/5] =?UTF-8?q?[UNI-255]=20fix:=20FastJson=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20=ED=94=84?= =?UTF-8?q?=EB=A1=9C=EB=A9=94=ED=85=8C=EC=9A=B0=EC=8A=A4=20=EC=98=A4?= =?UTF-8?q?=EB=A5=98=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../uniro_backend/common/config/WebMvcConfig.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) 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())); } From accb1ff1acba3c43cd91fc180464dc12a8eaeb11 Mon Sep 17 00:00:00 2001 From: mikekks Date: Fri, 21 Feb 2025 00:08:09 +0900 Subject: [PATCH 2/5] [UNI-255] test cd --- .github/workflows/be-cd.yml | 1 + 1 file changed, 1 insertion(+) 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: From 080efb0679bd4e3ed5509acc8f5edd7b72c72014 Mon Sep 17 00:00:00 2001 From: mikekks Date: Fri, 21 Feb 2025 00:12:08 +0900 Subject: [PATCH 3/5] =?UTF-8?q?[UNI-255]=20test=EB=A5=BC=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20=EC=9E=84=EC=8B=9C=20=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/service/AdminService.java | 2 +- .../common/redis/RedisConfig.java | 30 ------------ .../external/redis/RedisConfig.java | 46 +++++++++++++++++++ .../redis/RedisService.java | 2 +- .../uniro_backend/map/service/MapService.java | 2 +- 5 files changed, 49 insertions(+), 33 deletions(-) delete mode 100644 uniro_backend/src/main/java/com/softeer5/uniro_backend/common/redis/RedisConfig.java create mode 100644 uniro_backend/src/main/java/com/softeer5/uniro_backend/external/redis/RedisConfig.java rename uniro_backend/src/main/java/com/softeer5/uniro_backend/{common => external}/redis/RedisService.java (96%) 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/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/external/redis/RedisConfig.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/external/redis/RedisConfig.java new file mode 100644 index 00000000..5093292b --- /dev/null +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/external/redis/RedisConfig.java @@ -0,0 +1,46 @@ +package com.softeer5.uniro_backend.external.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.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/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/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; From 4b01281fe8e1cc7c8379d45f25f8b525bead8ee8 Mon Sep 17 00:00:00 2001 From: mikekks Date: Fri, 21 Feb 2025 00:16:42 +0900 Subject: [PATCH 4/5] =?UTF-8?q?[UNI-255]=20test=EB=A5=BC=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20=EC=9E=84=EC=8B=9C=20=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{external/redis => common/config}/RedisConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename uniro_backend/src/main/java/com/softeer5/uniro_backend/{external/redis => common/config}/RedisConfig.java (97%) diff --git a/uniro_backend/src/main/java/com/softeer5/uniro_backend/external/redis/RedisConfig.java b/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/config/RedisConfig.java similarity index 97% rename from uniro_backend/src/main/java/com/softeer5/uniro_backend/external/redis/RedisConfig.java rename to uniro_backend/src/main/java/com/softeer5/uniro_backend/common/config/RedisConfig.java index 5093292b..49d3ad92 100644 --- a/uniro_backend/src/main/java/com/softeer5/uniro_backend/external/redis/RedisConfig.java +++ b/uniro_backend/src/main/java/com/softeer5/uniro_backend/common/config/RedisConfig.java @@ -1,4 +1,4 @@ -package com.softeer5.uniro_backend.external.redis; +package com.softeer5.uniro_backend.common.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; From 00d8e337baf7dbb8b5285a54e96439513fd84e66 Mon Sep 17 00:00:00 2001 From: mikekks Date: Fri, 21 Feb 2025 01:17:39 +0900 Subject: [PATCH 5/5] =?UTF-8?q?[UNI-255]=20test=EB=A5=BC=20=EC=9C=84?= =?UTF-8?q?=ED=95=9C=20=EC=9E=84=EC=8B=9C=20=EC=BB=A4=EB=B0=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../map/controller/MapController.java | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) 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