From 14a9a60a67105baa2d64825a8c6f4ca4feaa769a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=95=88=ED=99=8D=EC=A0=9C?= Date: Wed, 15 Jan 2025 16:52:31 +0900 Subject: [PATCH] =?UTF-8?q?MATE-153=20:=20[!BUGFIX]=20=EA=B5=BF=EC=A6=88?= =?UTF-8?q?=EA=B1=B0=EB=9E=98=20=EC=B1=84=ED=8C=85=20=EC=A0=80=EC=9E=A5=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EB=B0=8F=20MongoDB=20=EC=8B=9C=EA=B0=84?= =?UTF-8?q?=20=EC=84=A4=EC=A0=95=20=EC=98=A4=EB=A5=98=20=ED=95=B4=EA=B2=B0?= =?UTF-8?q?=20(#137)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * MATE-153 : [!BUGFIX] 굿즈거래 시스템 메시지 저장 오류 해결 * MATE-153 : [FEAT] LocalDateTime 을 KST Date 타입으로 바꿔주는 컨버터 클래스 구현 * MATE-153 : [CHORE] validator 패키지 위치 변경 * MATE-153 : [FEAT] MongoConfig 클래스 컨버터 설정 추가 --- .../mate/common/config/MongoConfig.java | 19 ++++++++++++-- .../mate/common/config/WebMvcConfig.java | 2 +- .../DateToLocalDateTimeKstConverter.java | 26 +++++++++++++++++++ .../LocalDateTimeToDateKstConverter.java | 25 ++++++++++++++++++ .../{ => util}/validator/EnumValidator.java | 2 +- .../{ => util}/validator/ValidEnum.java | 2 +- .../{ => util}/validator/ValidPageable.java | 2 +- .../ValidPageableArgumentResolver.java | 2 +- .../controller/GoodsChatRoomController.java | 2 +- .../service/GoodsChatMessageService.java | 2 +- .../controller/GoodsPostController.java | 2 +- .../dto/request/GoodsPostRequest.java | 2 +- .../dto/request/GoodsReviewRequest.java | 2 +- .../controller/MateChatRoomController.java | 2 +- .../controller/MatePostController.java | 2 +- .../dto/request/MatePostCreateRequest.java | 2 +- .../dto/request/MatePostSearchRequest.java | 2 +- .../dto/request/MatePostStatusRequest.java | 2 +- .../dto/request/MatePostUpdateRequest.java | 2 +- .../dto/request/MateReviewCreateRequest.java | 2 +- .../member/controller/FollowController.java | 2 +- .../member/controller/ProfileController.java | 2 +- 22 files changed, 87 insertions(+), 21 deletions(-) create mode 100644 src/main/java/com/example/mate/common/util/converter/DateToLocalDateTimeKstConverter.java create mode 100644 src/main/java/com/example/mate/common/util/converter/LocalDateTimeToDateKstConverter.java rename src/main/java/com/example/mate/common/{ => util}/validator/EnumValidator.java (94%) rename src/main/java/com/example/mate/common/{ => util}/validator/ValidEnum.java (93%) rename src/main/java/com/example/mate/common/{ => util}/validator/ValidPageable.java (93%) rename src/main/java/com/example/mate/common/{ => util}/validator/ValidPageableArgumentResolver.java (98%) diff --git a/src/main/java/com/example/mate/common/config/MongoConfig.java b/src/main/java/com/example/mate/common/config/MongoConfig.java index 4f40807d..825422d3 100644 --- a/src/main/java/com/example/mate/common/config/MongoConfig.java +++ b/src/main/java/com/example/mate/common/config/MongoConfig.java @@ -1,5 +1,8 @@ package com.example.mate.common.config; +import com.example.mate.common.util.converter.DateToLocalDateTimeKstConverter; +import com.example.mate.common.util.converter.LocalDateTimeToDateKstConverter; +import java.util.List; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.mongodb.MongoDatabaseFactory; @@ -7,18 +10,30 @@ import org.springframework.data.mongodb.core.convert.DefaultDbRefResolver; import org.springframework.data.mongodb.core.convert.DefaultMongoTypeMapper; import org.springframework.data.mongodb.core.convert.MappingMongoConverter; +import org.springframework.data.mongodb.core.convert.MongoCustomConversions; import org.springframework.data.mongodb.core.mapping.MongoMappingContext; @Configuration public class MongoConfig { @Bean - public MappingMongoConverter mappingMongoConverter(MongoDatabaseFactory mongoDatabaseFactory, - MongoMappingContext mongoMappingContext) { + public MappingMongoConverter mappingMongoConverter( + MongoDatabaseFactory mongoDatabaseFactory, + MongoMappingContext mongoMappingContext, + LocalDateTimeToDateKstConverter dateKstConverter, + DateToLocalDateTimeKstConverter localDateTimeKstConverter + ) { DbRefResolver dbRefResolver = new DefaultDbRefResolver(mongoDatabaseFactory); MappingMongoConverter converter = new MappingMongoConverter(dbRefResolver, mongoMappingContext); + + // "_class" 타입을 저장하지 않도록 설정 converter.setTypeMapper(new DefaultMongoTypeMapper(null)); + // MongoDB KST 변환 컨버터 설정 + converter.setCustomConversions(new MongoCustomConversions( + List.of(localDateTimeKstConverter, dateKstConverter) + )); + return converter; } } diff --git a/src/main/java/com/example/mate/common/config/WebMvcConfig.java b/src/main/java/com/example/mate/common/config/WebMvcConfig.java index 49532ab8..14adfea5 100644 --- a/src/main/java/com/example/mate/common/config/WebMvcConfig.java +++ b/src/main/java/com/example/mate/common/config/WebMvcConfig.java @@ -1,6 +1,6 @@ package com.example.mate.common.config; -import com.example.mate.common.validator.ValidPageableArgumentResolver; +import com.example.mate.common.util.validator.ValidPageableArgumentResolver; import org.springframework.context.annotation.Configuration; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; diff --git a/src/main/java/com/example/mate/common/util/converter/DateToLocalDateTimeKstConverter.java b/src/main/java/com/example/mate/common/util/converter/DateToLocalDateTimeKstConverter.java new file mode 100644 index 00000000..d743b588 --- /dev/null +++ b/src/main/java/com/example/mate/common/util/converter/DateToLocalDateTimeKstConverter.java @@ -0,0 +1,26 @@ +package com.example.mate.common.util.converter; + +import java.time.LocalDateTime; +import java.time.ZoneId; +import java.util.Date; +import org.springframework.core.convert.converter.Converter; +import org.springframework.data.convert.ReadingConverter; +import org.springframework.stereotype.Component; + +@Component +@ReadingConverter +public class DateToLocalDateTimeKstConverter implements Converter { + + private static final int KST_OFFSET_HOURS = 9; + + @Override + public LocalDateTime convert(Date source) { + return convertToKst(source); + } + + // KST 로 변환하기 위해 9시간을 빼줌 + private LocalDateTime convertToKst(Date date) { + LocalDateTime localDateTime = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); + return localDateTime.minusHours(KST_OFFSET_HOURS); + } +} diff --git a/src/main/java/com/example/mate/common/util/converter/LocalDateTimeToDateKstConverter.java b/src/main/java/com/example/mate/common/util/converter/LocalDateTimeToDateKstConverter.java new file mode 100644 index 00000000..2075cf76 --- /dev/null +++ b/src/main/java/com/example/mate/common/util/converter/LocalDateTimeToDateKstConverter.java @@ -0,0 +1,25 @@ +package com.example.mate.common.util.converter; + +import java.sql.Timestamp; +import java.time.LocalDateTime; +import java.util.Date; +import org.springframework.core.convert.converter.Converter; +import org.springframework.data.convert.WritingConverter; +import org.springframework.stereotype.Component; + +@Component +@WritingConverter +public class LocalDateTimeToDateKstConverter implements Converter { + + private static final int KST_OFFSET_HOURS = 9; + + @Override + public Date convert(LocalDateTime source) { + return convertToKst(source); + } + + // KST 로 변환하기 위해 9시간을 더함 + private Date convertToKst(LocalDateTime localDateTime) { + return Timestamp.valueOf(localDateTime.plusHours(KST_OFFSET_HOURS)); + } +} diff --git a/src/main/java/com/example/mate/common/validator/EnumValidator.java b/src/main/java/com/example/mate/common/util/validator/EnumValidator.java similarity index 94% rename from src/main/java/com/example/mate/common/validator/EnumValidator.java rename to src/main/java/com/example/mate/common/util/validator/EnumValidator.java index c526b6b6..8710d633 100644 --- a/src/main/java/com/example/mate/common/validator/EnumValidator.java +++ b/src/main/java/com/example/mate/common/util/validator/EnumValidator.java @@ -1,4 +1,4 @@ -package com.example.mate.common.validator; +package com.example.mate.common.util.validator; import jakarta.validation.ConstraintValidator; import jakarta.validation.ConstraintValidatorContext; diff --git a/src/main/java/com/example/mate/common/validator/ValidEnum.java b/src/main/java/com/example/mate/common/util/validator/ValidEnum.java similarity index 93% rename from src/main/java/com/example/mate/common/validator/ValidEnum.java rename to src/main/java/com/example/mate/common/util/validator/ValidEnum.java index f713fa74..bdd5b2bb 100644 --- a/src/main/java/com/example/mate/common/validator/ValidEnum.java +++ b/src/main/java/com/example/mate/common/util/validator/ValidEnum.java @@ -1,4 +1,4 @@ -package com.example.mate.common.validator; +package com.example.mate.common.util.validator; import jakarta.validation.Constraint; import jakarta.validation.Payload; diff --git a/src/main/java/com/example/mate/common/validator/ValidPageable.java b/src/main/java/com/example/mate/common/util/validator/ValidPageable.java similarity index 93% rename from src/main/java/com/example/mate/common/validator/ValidPageable.java rename to src/main/java/com/example/mate/common/util/validator/ValidPageable.java index 1fc1391e..af1120df 100644 --- a/src/main/java/com/example/mate/common/validator/ValidPageable.java +++ b/src/main/java/com/example/mate/common/util/validator/ValidPageable.java @@ -1,4 +1,4 @@ -package com.example.mate.common.validator; +package com.example.mate.common.util.validator; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; diff --git a/src/main/java/com/example/mate/common/validator/ValidPageableArgumentResolver.java b/src/main/java/com/example/mate/common/util/validator/ValidPageableArgumentResolver.java similarity index 98% rename from src/main/java/com/example/mate/common/validator/ValidPageableArgumentResolver.java rename to src/main/java/com/example/mate/common/util/validator/ValidPageableArgumentResolver.java index 9e194f44..a7684603 100644 --- a/src/main/java/com/example/mate/common/validator/ValidPageableArgumentResolver.java +++ b/src/main/java/com/example/mate/common/util/validator/ValidPageableArgumentResolver.java @@ -1,4 +1,4 @@ -package com.example.mate.common.validator; +package com.example.mate.common.util.validator; import org.springframework.core.MethodParameter; import org.springframework.data.domain.PageRequest; diff --git a/src/main/java/com/example/mate/domain/goodsChat/controller/GoodsChatRoomController.java b/src/main/java/com/example/mate/domain/goodsChat/controller/GoodsChatRoomController.java index 724f8520..16a64a6e 100644 --- a/src/main/java/com/example/mate/domain/goodsChat/controller/GoodsChatRoomController.java +++ b/src/main/java/com/example/mate/domain/goodsChat/controller/GoodsChatRoomController.java @@ -3,7 +3,7 @@ import com.example.mate.common.response.ApiResponse; import com.example.mate.common.response.PageResponse; import com.example.mate.common.security.auth.AuthMember; -import com.example.mate.common.validator.ValidPageable; +import com.example.mate.common.util.validator.ValidPageable; import com.example.mate.domain.goodsChat.dto.response.GoodsChatMessageResponse; import com.example.mate.domain.goodsChat.dto.response.GoodsChatRoomResponse; import com.example.mate.domain.goodsChat.dto.response.GoodsChatRoomSummaryResponse; diff --git a/src/main/java/com/example/mate/domain/goodsChat/service/GoodsChatMessageService.java b/src/main/java/com/example/mate/domain/goodsChat/service/GoodsChatMessageService.java index 8016dda8..c519b25f 100644 --- a/src/main/java/com/example/mate/domain/goodsChat/service/GoodsChatMessageService.java +++ b/src/main/java/com/example/mate/domain/goodsChat/service/GoodsChatMessageService.java @@ -56,7 +56,7 @@ public void sendChatEventMessage(GoodsChatEvent event) { case ENTER -> message += MEMBER_ENTER_MESSAGE; case LEAVE -> message += MEMBER_LEAVE_MESSAGE; } - GoodsChatMessage chatMessage = createChatMessage(member.getId(), chatRoomId, message, event.type()); + GoodsChatMessage chatMessage = createChatMessage(chatRoomId, member.getId(), message, event.type()); // 채팅 데이터 저장 & 최신 채팅 내역 업데이트 GoodsChatMessage savedMessage = messageRepository.save(chatMessage); diff --git a/src/main/java/com/example/mate/domain/goodsPost/controller/GoodsPostController.java b/src/main/java/com/example/mate/domain/goodsPost/controller/GoodsPostController.java index e00d600c..5a26ff64 100644 --- a/src/main/java/com/example/mate/domain/goodsPost/controller/GoodsPostController.java +++ b/src/main/java/com/example/mate/domain/goodsPost/controller/GoodsPostController.java @@ -3,7 +3,7 @@ import com.example.mate.common.response.ApiResponse; import com.example.mate.common.response.PageResponse; import com.example.mate.common.security.auth.AuthMember; -import com.example.mate.common.validator.ValidPageable; +import com.example.mate.common.util.validator.ValidPageable; import com.example.mate.domain.goodsPost.dto.request.GoodsPostRequest; import com.example.mate.domain.goodsPost.dto.response.GoodsPostResponse; import com.example.mate.domain.goodsPost.dto.response.GoodsPostSummaryResponse; diff --git a/src/main/java/com/example/mate/domain/goodsPost/dto/request/GoodsPostRequest.java b/src/main/java/com/example/mate/domain/goodsPost/dto/request/GoodsPostRequest.java index bcfe2c53..c40b87d9 100644 --- a/src/main/java/com/example/mate/domain/goodsPost/dto/request/GoodsPostRequest.java +++ b/src/main/java/com/example/mate/domain/goodsPost/dto/request/GoodsPostRequest.java @@ -1,6 +1,6 @@ package com.example.mate.domain.goodsPost.dto.request; -import com.example.mate.common.validator.ValidEnum; +import com.example.mate.common.util.validator.ValidEnum; import com.example.mate.domain.goodsPost.dto.response.LocationInfo; import com.example.mate.domain.goodsPost.entity.Category; import com.example.mate.domain.goodsPost.entity.GoodsPost; diff --git a/src/main/java/com/example/mate/domain/goodsReview/dto/request/GoodsReviewRequest.java b/src/main/java/com/example/mate/domain/goodsReview/dto/request/GoodsReviewRequest.java index 13a30514..18f983d6 100644 --- a/src/main/java/com/example/mate/domain/goodsReview/dto/request/GoodsReviewRequest.java +++ b/src/main/java/com/example/mate/domain/goodsReview/dto/request/GoodsReviewRequest.java @@ -1,6 +1,6 @@ package com.example.mate.domain.goodsReview.dto.request; -import com.example.mate.common.validator.ValidEnum; +import com.example.mate.common.util.validator.ValidEnum; import com.example.mate.domain.constant.Rating; import com.example.mate.domain.goodsPost.entity.GoodsPost; import com.example.mate.domain.goodsReview.entity.GoodsReview; diff --git a/src/main/java/com/example/mate/domain/mateChat/controller/MateChatRoomController.java b/src/main/java/com/example/mate/domain/mateChat/controller/MateChatRoomController.java index 684743ba..080c3833 100644 --- a/src/main/java/com/example/mate/domain/mateChat/controller/MateChatRoomController.java +++ b/src/main/java/com/example/mate/domain/mateChat/controller/MateChatRoomController.java @@ -3,7 +3,7 @@ import com.example.mate.common.response.ApiResponse; import com.example.mate.common.response.PageResponse; import com.example.mate.common.security.auth.AuthMember; -import com.example.mate.common.validator.ValidPageable; +import com.example.mate.common.util.validator.ValidPageable; import com.example.mate.domain.mateChat.dto.response.MateChatMessageResponse; import com.example.mate.domain.mateChat.dto.response.MateChatRoomListResponse; import com.example.mate.domain.mateChat.dto.response.MateChatRoomResponse; diff --git a/src/main/java/com/example/mate/domain/matePost/controller/MatePostController.java b/src/main/java/com/example/mate/domain/matePost/controller/MatePostController.java index 8c79fe0f..2a1ba945 100644 --- a/src/main/java/com/example/mate/domain/matePost/controller/MatePostController.java +++ b/src/main/java/com/example/mate/domain/matePost/controller/MatePostController.java @@ -3,7 +3,7 @@ import com.example.mate.common.response.ApiResponse; import com.example.mate.common.response.PageResponse; import com.example.mate.common.security.auth.AuthMember; -import com.example.mate.common.validator.ValidPageable; +import com.example.mate.common.util.validator.ValidPageable; import com.example.mate.domain.constant.Gender; import com.example.mate.domain.matePost.dto.request.*; import com.example.mate.domain.matePost.dto.response.*; diff --git a/src/main/java/com/example/mate/domain/matePost/dto/request/MatePostCreateRequest.java b/src/main/java/com/example/mate/domain/matePost/dto/request/MatePostCreateRequest.java index 8a8e8eff..f436f891 100644 --- a/src/main/java/com/example/mate/domain/matePost/dto/request/MatePostCreateRequest.java +++ b/src/main/java/com/example/mate/domain/matePost/dto/request/MatePostCreateRequest.java @@ -1,6 +1,6 @@ package com.example.mate.domain.matePost.dto.request; -import com.example.mate.common.validator.ValidEnum; +import com.example.mate.common.util.validator.ValidEnum; import com.example.mate.domain.constant.Gender; import com.example.mate.domain.matePost.entity.Age; import com.example.mate.domain.matePost.entity.TransportType; diff --git a/src/main/java/com/example/mate/domain/matePost/dto/request/MatePostSearchRequest.java b/src/main/java/com/example/mate/domain/matePost/dto/request/MatePostSearchRequest.java index e0c1292b..4307395f 100644 --- a/src/main/java/com/example/mate/domain/matePost/dto/request/MatePostSearchRequest.java +++ b/src/main/java/com/example/mate/domain/matePost/dto/request/MatePostSearchRequest.java @@ -1,6 +1,6 @@ package com.example.mate.domain.matePost.dto.request; -import com.example.mate.common.validator.ValidEnum; +import com.example.mate.common.util.validator.ValidEnum; import com.example.mate.domain.constant.Gender; import com.example.mate.domain.matePost.entity.Age; import com.example.mate.domain.matePost.entity.SortType; diff --git a/src/main/java/com/example/mate/domain/matePost/dto/request/MatePostStatusRequest.java b/src/main/java/com/example/mate/domain/matePost/dto/request/MatePostStatusRequest.java index 801e5c64..8641b615 100644 --- a/src/main/java/com/example/mate/domain/matePost/dto/request/MatePostStatusRequest.java +++ b/src/main/java/com/example/mate/domain/matePost/dto/request/MatePostStatusRequest.java @@ -1,6 +1,6 @@ package com.example.mate.domain.matePost.dto.request; -import com.example.mate.common.validator.ValidEnum; +import com.example.mate.common.util.validator.ValidEnum; import com.example.mate.domain.matePost.entity.Status; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; diff --git a/src/main/java/com/example/mate/domain/matePost/dto/request/MatePostUpdateRequest.java b/src/main/java/com/example/mate/domain/matePost/dto/request/MatePostUpdateRequest.java index 44b4cc11..42cedc1d 100644 --- a/src/main/java/com/example/mate/domain/matePost/dto/request/MatePostUpdateRequest.java +++ b/src/main/java/com/example/mate/domain/matePost/dto/request/MatePostUpdateRequest.java @@ -1,6 +1,6 @@ package com.example.mate.domain.matePost.dto.request; -import com.example.mate.common.validator.ValidEnum; +import com.example.mate.common.util.validator.ValidEnum; import com.example.mate.domain.constant.Gender; import com.example.mate.domain.matePost.entity.Age; import com.example.mate.domain.matePost.entity.TransportType; diff --git a/src/main/java/com/example/mate/domain/mateReview/dto/request/MateReviewCreateRequest.java b/src/main/java/com/example/mate/domain/mateReview/dto/request/MateReviewCreateRequest.java index 91888383..5b7e05f7 100644 --- a/src/main/java/com/example/mate/domain/mateReview/dto/request/MateReviewCreateRequest.java +++ b/src/main/java/com/example/mate/domain/mateReview/dto/request/MateReviewCreateRequest.java @@ -1,6 +1,6 @@ package com.example.mate.domain.mateReview.dto.request; -import com.example.mate.common.validator.ValidEnum; +import com.example.mate.common.util.validator.ValidEnum; import com.example.mate.domain.constant.Rating; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; diff --git a/src/main/java/com/example/mate/domain/member/controller/FollowController.java b/src/main/java/com/example/mate/domain/member/controller/FollowController.java index 08048be8..5d13b04b 100644 --- a/src/main/java/com/example/mate/domain/member/controller/FollowController.java +++ b/src/main/java/com/example/mate/domain/member/controller/FollowController.java @@ -3,7 +3,7 @@ import com.example.mate.common.response.ApiResponse; import com.example.mate.common.response.PageResponse; import com.example.mate.common.security.auth.AuthMember; -import com.example.mate.common.validator.ValidPageable; +import com.example.mate.common.util.validator.ValidPageable; import com.example.mate.domain.member.dto.response.MemberSummaryResponse; import com.example.mate.domain.member.service.FollowService; import io.swagger.v3.oas.annotations.Operation; diff --git a/src/main/java/com/example/mate/domain/member/controller/ProfileController.java b/src/main/java/com/example/mate/domain/member/controller/ProfileController.java index 1f762909..70fad769 100644 --- a/src/main/java/com/example/mate/domain/member/controller/ProfileController.java +++ b/src/main/java/com/example/mate/domain/member/controller/ProfileController.java @@ -5,7 +5,7 @@ import com.example.mate.common.response.ApiResponse; import com.example.mate.common.response.PageResponse; import com.example.mate.common.security.auth.AuthMember; -import com.example.mate.common.validator.ValidPageable; +import com.example.mate.common.util.validator.ValidPageable; import com.example.mate.domain.goodsPost.dto.response.GoodsPostSummaryResponse; import com.example.mate.domain.matePost.dto.response.MatePostSummaryResponse; import com.example.mate.domain.member.dto.response.MyGoodsRecordResponse;