From 2122bd5d5907748c2b22ec1bec085631f7225be3 Mon Sep 17 00:00:00 2001 From: Kim-Dong-Jun99 Date: Fri, 5 Jan 2024 21:17:39 +0900 Subject: [PATCH 1/4] =?UTF-8?q?Feat:=20STOMP=20API=20=EB=AA=85=EC=84=B8=20?= =?UTF-8?q?=ED=98=95=EC=8B=9D=EC=9C=BC=EB=A1=9C=20service,=20controller=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .http/NaverMap.http | 2 +- .http/Trip.http | 123 +++++++++++++++++- .../tentenstomp/TenTenStompApplication.java | 2 + .../tentenstomp/config/AsyncConfig.java | 8 ++ .../trip/controller/TripController.java | 38 +++--- .../trip/controller/TripItemController.java | 31 +++++ .../trip/dto/request/MemberConnectMsg.java | 6 + .../trip/dto/request/MemberDisconnectMsg.java | 6 + .../trip/dto/request/TripItemAddMsg.java | 19 +++ .../dto/request/TripItemOrderUpdateMsg.java | 14 ++ .../dto/request/TripItemPriceUpdateMsg.java | 6 + .../request/TripItemVisitDateUpdateMsg.java | 4 + .../dto/request/TripMemberRequestMsg.java | 11 -- .../trip/dto/request/TripPlaceRequestMsg.java | 8 -- .../trip/dto/request/TripRequestMsg.java | 11 -- ...InfoRequestMsg.java => TripUpdateMsg.java} | 3 +- ...pInfoResponseMsg.java => TripInfoMsg.java} | 2 +- .../trip/dto/response/TripItemInfoMsg.java | 16 +++ .../domain/trip/dto/response/TripItemMsg.java | 8 ++ .../trip/dto/response/TripMemberInfoMsg.java | 8 ++ .../trip/dto/response/TripMemberMsg.java | 8 ++ .../dto/response/TripMemberResponseMsg.java | 61 --------- .../trip/dto/response/TripPathInfoMsg.java} | 10 +- .../domain/trip/dto/response/TripPathMsg.java | 8 ++ .../dto/response/TripPlaceResponseMsg.java | 37 ------ .../trip/dto/response/TripResponseMsg.java | 10 -- .../tentenstomp/domain/trip/entity/Trip.java | 35 ++--- .../domain/trip/service/TripItemService.java | 38 ++++++ .../domain/trip/service/TripService.java | 80 ++++++------ .../tentenstomp/global/aspect/UtilAspect.java | 22 ++++ .../common/annotation/GetExecutionTime.java | 11 ++ .../common/constant/EndPointConstant.java | 8 ++ .../global/component/NaverMapComponent.java | 30 +++-- .../global/component/OdsayComponent.java | 14 +- .../global/component/PathComponent.java | 47 +++++-- .../component/controller/PathController.java | 32 ----- .../dto/request/PathCalculateRequest.java | 6 + .../dto/request/TempPathCalculateRequest.java | 8 -- .../component/dto/request/TripPlace.java | 11 ++ .../component/dto/response/PathInfo.java | 8 -- .../publisher}/RedisPublisher.java | 6 +- .../global/response/GlobalStompResponse.java | 21 +++ .../subscriber}/RedisSubscriber.java | 13 +- .../global/util/RedisChannelUtil.java | 46 +++++++ 44 files changed, 584 insertions(+), 312 deletions(-) create mode 100644 src/main/java/org/tenten/tentenstomp/config/AsyncConfig.java create mode 100644 src/main/java/org/tenten/tentenstomp/domain/trip/controller/TripItemController.java create mode 100644 src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/MemberConnectMsg.java create mode 100644 src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/MemberDisconnectMsg.java create mode 100644 src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripItemAddMsg.java create mode 100644 src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripItemOrderUpdateMsg.java create mode 100644 src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripItemPriceUpdateMsg.java create mode 100644 src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripItemVisitDateUpdateMsg.java delete mode 100644 src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripMemberRequestMsg.java delete mode 100644 src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripPlaceRequestMsg.java delete mode 100644 src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripRequestMsg.java rename src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/{TripInfoRequestMsg.java => TripUpdateMsg.java} (85%) rename src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/{TripInfoResponseMsg.java => TripInfoMsg.java} (89%) create mode 100644 src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripItemInfoMsg.java create mode 100644 src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripItemMsg.java create mode 100644 src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripMemberInfoMsg.java create mode 100644 src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripMemberMsg.java delete mode 100644 src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripMemberResponseMsg.java rename src/main/java/org/tenten/tentenstomp/{global/component/dto/response/TripPathInfo.java => domain/trip/dto/response/TripPathInfoMsg.java} (57%) create mode 100644 src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripPathMsg.java delete mode 100644 src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripPlaceResponseMsg.java delete mode 100644 src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripResponseMsg.java create mode 100644 src/main/java/org/tenten/tentenstomp/domain/trip/service/TripItemService.java create mode 100644 src/main/java/org/tenten/tentenstomp/global/aspect/UtilAspect.java create mode 100644 src/main/java/org/tenten/tentenstomp/global/common/annotation/GetExecutionTime.java create mode 100644 src/main/java/org/tenten/tentenstomp/global/common/constant/EndPointConstant.java delete mode 100644 src/main/java/org/tenten/tentenstomp/global/component/controller/PathController.java create mode 100644 src/main/java/org/tenten/tentenstomp/global/component/dto/request/PathCalculateRequest.java delete mode 100644 src/main/java/org/tenten/tentenstomp/global/component/dto/request/TempPathCalculateRequest.java create mode 100644 src/main/java/org/tenten/tentenstomp/global/component/dto/request/TripPlace.java delete mode 100644 src/main/java/org/tenten/tentenstomp/global/component/dto/response/PathInfo.java rename src/main/java/org/tenten/tentenstomp/{domain/trip/pubsub => global/publisher}/RedisPublisher.java (67%) create mode 100644 src/main/java/org/tenten/tentenstomp/global/response/GlobalStompResponse.java rename src/main/java/org/tenten/tentenstomp/{domain/trip/pubsub => global/subscriber}/RedisSubscriber.java (67%) create mode 100644 src/main/java/org/tenten/tentenstomp/global/util/RedisChannelUtil.java diff --git a/.http/NaverMap.http b/.http/NaverMap.http index 9e7760b..2f8a54f 100644 --- a/.http/NaverMap.http +++ b/.http/NaverMap.http @@ -1,5 +1,5 @@ ### 주소 좌표값 변환 api -GET https://naveropenapi.apigw.ntruss.com/map-geocode/v2/geocode?query=부산 +GET https://naveropenapi.apigw.ntruss.com/map-geocode/v2/geocode?query=강남대로 396 X-NCP-APIGW-API-KEY-ID: {{naver-map-client-id}} X-NCP-APIGW-API-KEY: {{naver-map-client-secret}} diff --git a/.http/Trip.http b/.http/Trip.http index cae88b7..98841e0 100644 --- a/.http/Trip.http +++ b/.http/Trip.http @@ -3,7 +3,7 @@ GET https://api.weplanplans.site/trips Content-Type: application/json { - "endPoint" : "/trip", + "endPoint" : "/place", "tripId": 1, "visitDate": "2024-01-03", "tripEditMessage" : { @@ -18,6 +18,125 @@ Content-Type: application/json "budget": 10000 }, "tripMemberMessage": null, - "tripPlaceMessage": null + "tripPlaceMessage": { + "places": [ + { + "tripItemId": 1, + "seqNum": 1, + "transportation": "CAR", + "visitDate": "2023-12-31", + "estimatePrice": 10000, + "longitude": "127.1051573", + "latitude": "37.3718141" + }, + { + "tripItemId": 2, + "seqNum": 2, + "transportation": "CAR", + "visitDate": "2023-12-31", + "estimatePrice": 10000, + "longitude": "126.9271941", + "latitude": "37.5266691" + }, + { + "tripItemId": 3, + "seqNum": 3, + "transportation": "PUBLIC_TRANSPORTATION", + "visitDate": "2023-12-31", + "estimatePrice": 10000, + "longitude": "127.0283079", + "latitude": "37.4981647" + }, + { + "tripItemId": 4, + "seqNum": 4, + "transportation": "CAR", + "visitDate": "2023-12-31", + "estimatePrice": 10000, + "longitude": "127.1051573", + "latitude": "37.3718141" + }, + { + "tripItemId": 5, + "seqNum": 5, + "transportation": "CAR", + "visitDate": "2023-12-31", + "estimatePrice": 10000, + "longitude": "127.0283079", + "latitude": "37.4981647" + } + ] + } +} + +### test +POST http://localhost:8080/trips +Content-Type: application/json + +{ + "endPoint" : "/place", + "tripId": 1, + "visitDate": "2024-01-03", + "tripEditMessage" : { + "tripId": 1, + "startDate": "2024-01-03", + "endDate" : "2024-01-05", + "numberOfPeople": 2, + "tripName": "success", + "tripStatus": "BEFORE", + "area": "서울", + "subarea": "강남구", + "budget": 10000 + }, + "tripMemberMessage": null, + "tripPlaceMessage": { + "places": [ + { + "tripItemId": 1, + "seqNum": 1, + "transportation": "CAR", + "visitDate": "2023-12-31", + "estimatePrice": 10000, + "longitude": "127.1051573", + "latitude": "37.3718141" + }, + { + "tripItemId": 2, + "seqNum": 2, + "transportation": "CAR", + "visitDate": "2023-12-31", + "estimatePrice": 10000, + "longitude": "126.9271941", + "latitude": "37.5266691" + }, + { + "tripItemId": 3, + "seqNum": 3, + "transportation": "PUBLIC_TRANSPORTATION", + "visitDate": "2023-12-31", + "estimatePrice": 10000, + "longitude": "127.0283079", + "latitude": "37.4981647" + }, + { + "tripItemId": 4, + "seqNum": 4, + "transportation": "CAR", + "visitDate": "2023-12-31", + "estimatePrice": 10000, + "longitude": "127.1051573", + "latitude": "37.3718141" + }, + { + "tripItemId": 5, + "seqNum": 5, + "transportation": "CAR", + "visitDate": "2023-12-31", + "estimatePrice": 10000, + "longitude": "127.0283079", + "latitude": "37.4981647" + } + ] + } } diff --git a/src/main/java/org/tenten/tentenstomp/TenTenStompApplication.java b/src/main/java/org/tenten/tentenstomp/TenTenStompApplication.java index 284278c..df44b8a 100644 --- a/src/main/java/org/tenten/tentenstomp/TenTenStompApplication.java +++ b/src/main/java/org/tenten/tentenstomp/TenTenStompApplication.java @@ -3,9 +3,11 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +import org.springframework.scheduling.annotation.EnableAsync; @EnableJpaAuditing @SpringBootApplication +@EnableAsync public class TenTenStompApplication { public static void main(String[] args) { diff --git a/src/main/java/org/tenten/tentenstomp/config/AsyncConfig.java b/src/main/java/org/tenten/tentenstomp/config/AsyncConfig.java new file mode 100644 index 0000000..52275b3 --- /dev/null +++ b/src/main/java/org/tenten/tentenstomp/config/AsyncConfig.java @@ -0,0 +1,8 @@ +package org.tenten.tentenstomp.config; + +import org.springframework.context.annotation.Configuration; + +@Configuration +public class AsyncConfig { + +} diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/controller/TripController.java b/src/main/java/org/tenten/tentenstomp/domain/trip/controller/TripController.java index 274057e..ad35dde 100644 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/controller/TripController.java +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/controller/TripController.java @@ -5,8 +5,7 @@ import org.springframework.messaging.handler.annotation.MessageMapping; import org.springframework.messaging.handler.annotation.Payload; import org.springframework.web.bind.annotation.RestController; -import org.tenten.tentenstomp.domain.trip.dto.request.TripRequestMsg; -import org.tenten.tentenstomp.domain.trip.pubsub.RedisPublisher; +import org.tenten.tentenstomp.domain.trip.dto.request.*; import org.tenten.tentenstomp.domain.trip.service.TripService; @RestController @@ -14,29 +13,30 @@ public class TripController { private final TripService tripService; - private final RedisPublisher redisPublisher; - -// @PostMapping("/trip") -// public Long createPlan(@RequestBody TripCreateRequest request) { -// // 여행 계획을 데이터베이스에 저장하고, 고유한 ID를 생성합니다. -// return tripService.save(request); -// } + @MessageMapping("/trips/{tripId}/info") + public void editPlan(@DestinationVariable String tripId, @Payload TripUpdateMsg tripUpdateMsg) { + tripService.updateTrip(tripId, tripUpdateMsg); + } + @MessageMapping("/trips/{tripId}/addTripItems") + public void addTripItem(@DestinationVariable String tripId, @Payload TripItemAddMsg tripItemAddMsg) { + tripService.addTripItem(tripId, tripItemAddMsg); + } - @MessageMapping("/trips/{tripId}/info") - public void editPlan(@DestinationVariable String tripId, @Payload TripRequestMsg requestMsg) { - // 여행 계획을 데이터베이스에 업데이트하고, 업데이트된 계획을 반환합니다. - tripService.updateTrip(tripId, requestMsg); + @MessageMapping("/trips/{tripId}/updateTripItemOrder") + public void updateTripItemOrder(@DestinationVariable String tripId, @Payload TripItemOrderUpdateMsg orderUpdateMsg) { + tripService.updateTripItemOrder(tripId, orderUpdateMsg); } - @MessageMapping("/trips/{tripId}/member") - public void editMember(@DestinationVariable String tripId, @Payload TripRequestMsg requestMsg) { - tripService.updateMember(tripId, requestMsg); + @MessageMapping("/trips/{tripId}/connectMember") + public void connectMember(@DestinationVariable String tripId, @Payload MemberConnectMsg memberConnectMsg) { + tripService.connectMember(tripId, memberConnectMsg); } - @MessageMapping("/trips/{tripId}/place") - public void editPlace(@DestinationVariable String tripId, @Payload TripRequestMsg requestMsg) { - tripService.updatePlace(tripId, requestMsg); + @MessageMapping("/trips/{tripId}/disconnectMember") + public void disconnectMember(@DestinationVariable String tripId, @Payload MemberDisconnectMsg memberDisconnectMsg) { + tripService.disconnectMember(tripId, memberDisconnectMsg); } + } diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/controller/TripItemController.java b/src/main/java/org/tenten/tentenstomp/domain/trip/controller/TripItemController.java new file mode 100644 index 0000000..ae4a0f5 --- /dev/null +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/controller/TripItemController.java @@ -0,0 +1,31 @@ +package org.tenten.tentenstomp.domain.trip.controller; + +import lombok.RequiredArgsConstructor; +import org.springframework.messaging.handler.annotation.DestinationVariable; +import org.springframework.messaging.handler.annotation.MessageMapping; +import org.springframework.messaging.handler.annotation.Payload; +import org.springframework.web.bind.annotation.RestController; +import org.tenten.tentenstomp.domain.trip.dto.request.TripItemPriceUpdateMsg; +import org.tenten.tentenstomp.domain.trip.dto.request.TripItemVisitDateUpdateMsg; +import org.tenten.tentenstomp.domain.trip.service.TripItemService; + +@RestController +@RequiredArgsConstructor +public class TripItemController { + private final TripItemService tripItemService; + + @MessageMapping("/tripItems/{tripItemId}/updatePrice") + public void updateTripItemPrice(@DestinationVariable String tripItemId, @Payload TripItemPriceUpdateMsg priceUpdateMsg) { + tripItemService.updateTripItemPrice(tripItemId, priceUpdateMsg); + } + + @MessageMapping("/tripItems/{tripItemId}/updateVisitDate") + public void updateTripItemVisitDate(@DestinationVariable String tripItemId, @Payload TripItemVisitDateUpdateMsg visitDateUpdateMsg) { + tripItemService.updateTripItemVisitDate(tripItemId, visitDateUpdateMsg); + } + + @MessageMapping("/tripItems/{tripItemId}/deleteItem") + public void deleteTripItem(@DestinationVariable String tripItemId) { + tripItemService.deleteTripItem(tripItemId); + } +} diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/MemberConnectMsg.java b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/MemberConnectMsg.java new file mode 100644 index 0000000..492f2c5 --- /dev/null +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/MemberConnectMsg.java @@ -0,0 +1,6 @@ +package org.tenten.tentenstomp.domain.trip.dto.request; + +public record MemberConnectMsg( + Long memberId +) { +} diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/MemberDisconnectMsg.java b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/MemberDisconnectMsg.java new file mode 100644 index 0000000..38bc862 --- /dev/null +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/MemberDisconnectMsg.java @@ -0,0 +1,6 @@ +package org.tenten.tentenstomp.domain.trip.dto.request; + +public record MemberDisconnectMsg( + Long memberId +) { +} diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripItemAddMsg.java b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripItemAddMsg.java new file mode 100644 index 0000000..cd5f1cf --- /dev/null +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripItemAddMsg.java @@ -0,0 +1,19 @@ +package org.tenten.tentenstomp.domain.trip.dto.request; + +import org.tenten.tentenstomp.global.common.enums.Transportation; + +import java.util.List; + +public record TripItemAddMsg( + List newTripItems +) { + public record TripItemCreateRequest( + Long tourItemId, + Transportation transportation, + Long seqNum, + String visitDate, + Long price + ) { + + } +} diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripItemOrderUpdateMsg.java b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripItemOrderUpdateMsg.java new file mode 100644 index 0000000..6ad9a92 --- /dev/null +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripItemOrderUpdateMsg.java @@ -0,0 +1,14 @@ +package org.tenten.tentenstomp.domain.trip.dto.request; + +import java.util.List; + +public record TripItemOrderUpdateMsg( + String visitDate, + List tripItemOrder + +) { + public record OrderInfo( + Long tripItemId, + Long seqNum + ){} +} diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripItemPriceUpdateMsg.java b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripItemPriceUpdateMsg.java new file mode 100644 index 0000000..9ff3804 --- /dev/null +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripItemPriceUpdateMsg.java @@ -0,0 +1,6 @@ +package org.tenten.tentenstomp.domain.trip.dto.request; + +public record TripItemPriceUpdateMsg( + Long price +) { +} diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripItemVisitDateUpdateMsg.java b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripItemVisitDateUpdateMsg.java new file mode 100644 index 0000000..7803314 --- /dev/null +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripItemVisitDateUpdateMsg.java @@ -0,0 +1,4 @@ +package org.tenten.tentenstomp.domain.trip.dto.request; + +public record TripItemVisitDateUpdateMsg() { +} diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripMemberRequestMsg.java b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripMemberRequestMsg.java deleted file mode 100644 index 482e093..0000000 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripMemberRequestMsg.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.tenten.tentenstomp.domain.trip.dto.request; - -import org.tenten.tentenstomp.domain.trip.dto.response.TripMemberResponseMsg; -import org.tenten.tentenstomp.domain.trip.dto.response.TripMemberResponseMsg.TripLikedItem.TripLikedItemPreference; - -import java.util.List; - -public record TripMemberRequestMsg( - List tripLikedItemPreferences -) { -} diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripPlaceRequestMsg.java b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripPlaceRequestMsg.java deleted file mode 100644 index bb46fcf..0000000 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripPlaceRequestMsg.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.tenten.tentenstomp.domain.trip.dto.request; - -import org.tenten.tentenstomp.domain.trip.dto.response.TripPlaceResponseMsg.TripPlace; - -import java.util.List; - -public record TripPlaceRequestMsg(List places) { -} diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripRequestMsg.java b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripRequestMsg.java deleted file mode 100644 index 05ca9fd..0000000 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripRequestMsg.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.tenten.tentenstomp.domain.trip.dto.request; - -public record TripRequestMsg( - Long tripId, - String visitDate, - String endPoint, - TripInfoRequestMsg tripInfoMessage, - TripPlaceRequestMsg tripPlaceMessage, - TripMemberRequestMsg tripMemberMessage -) { -} diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripInfoRequestMsg.java b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripUpdateMsg.java similarity index 85% rename from src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripInfoRequestMsg.java rename to src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripUpdateMsg.java index e5438ad..db9b139 100644 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripInfoRequestMsg.java +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripUpdateMsg.java @@ -2,8 +2,7 @@ import org.tenten.tentenstomp.global.common.enums.TripStatus; -public record TripInfoRequestMsg( - Long tripId, +public record TripUpdateMsg( String startDate, String endDate, Long numberOfPeople, diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripInfoResponseMsg.java b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripInfoMsg.java similarity index 89% rename from src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripInfoResponseMsg.java rename to src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripInfoMsg.java index 2b996b3..95cb2bc 100644 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripInfoResponseMsg.java +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripInfoMsg.java @@ -2,7 +2,7 @@ import org.tenten.tentenstomp.global.common.enums.TripStatus; -public record TripInfoResponseMsg( +public record TripInfoMsg( Long tripId, String startDate, String endDate, diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripItemInfoMsg.java b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripItemInfoMsg.java new file mode 100644 index 0000000..aeca812 --- /dev/null +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripItemInfoMsg.java @@ -0,0 +1,16 @@ +package org.tenten.tentenstomp.domain.trip.dto.response; + +import org.tenten.tentenstomp.global.common.enums.Transportation; + +public record TripItemInfoMsg( + Long tripItemId, + Long tourItemId, + String name, + String thumbnailUrl, + String category, + Transportation transportation, + Long seqNum, + String visitDate, + Long price +) { +} diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripItemMsg.java b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripItemMsg.java new file mode 100644 index 0000000..ec150cf --- /dev/null +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripItemMsg.java @@ -0,0 +1,8 @@ +package org.tenten.tentenstomp.domain.trip.dto.response; + +import java.util.List; + +public record TripItemMsg( + List tripItems +) { +} diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripMemberInfoMsg.java b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripMemberInfoMsg.java new file mode 100644 index 0000000..fb7c0e8 --- /dev/null +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripMemberInfoMsg.java @@ -0,0 +1,8 @@ +package org.tenten.tentenstomp.domain.trip.dto.response; + +public record TripMemberInfoMsg( + Long memberId, + String name, + String thumbnailUrl +) { +} diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripMemberMsg.java b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripMemberMsg.java new file mode 100644 index 0000000..6d559d3 --- /dev/null +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripMemberMsg.java @@ -0,0 +1,8 @@ +package org.tenten.tentenstomp.domain.trip.dto.response; + +import java.util.List; + +public record TripMemberMsg( + List connectedMembers +) { +} diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripMemberResponseMsg.java b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripMemberResponseMsg.java deleted file mode 100644 index 2ed0282..0000000 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripMemberResponseMsg.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.tenten.tentenstomp.domain.trip.dto.response; - -import org.tenten.tentenstomp.domain.member.entity.Survey; - -import java.util.List; -import java.util.Map; - -public record TripMemberResponseMsg( - List connectedMembers, // 논의후 삭제 가능, 왜냐면, ws만 쓸때는 커넥션을 맺을 때, 해제할 때 호출되는 메소드가 있었는데, 현재 구조에서는 확실치 않음, - TripFavor tripFavor, - List tripLikedItems -) { - public record ConnectMemberMessage( - Long memberId, - String name, - String thumbnailUrl - ) { - - } - - public record TripFavor( - List memberSurveyResults, - MemberFavorStatistic favorStatistic - - ) { - - public record MemberSurveyResult( - Long memberId, - Survey survey - ) { - - } - - public record MemberFavorStatistic( - Map planning, - Map activeHours, - Map accommodations, - Map foods, - Map tripStyle - ) { - - } - } - - public record TripLikedItem( - Long tripLikedItemId, - String thumbnailImageUrl, - String tourItemName, - Long tourItemId, - List tripLikedItemPreferences - ) { - public record TripLikedItemPreference( - Long memberId, - Boolean liked, - Boolean disliked - ) { - - } - - } -} diff --git a/src/main/java/org/tenten/tentenstomp/global/component/dto/response/TripPathInfo.java b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripPathInfoMsg.java similarity index 57% rename from src/main/java/org/tenten/tentenstomp/global/component/dto/response/TripPathInfo.java rename to src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripPathInfoMsg.java index 11ed2ad..daa826b 100644 --- a/src/main/java/org/tenten/tentenstomp/global/component/dto/response/TripPathInfo.java +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripPathInfoMsg.java @@ -1,8 +1,8 @@ -package org.tenten.tentenstomp.global.component.dto.response; +package org.tenten.tentenstomp.domain.trip.dto.response; import org.tenten.tentenstomp.global.common.enums.Transportation; -public record TripPathInfo( +public record TripPathInfoMsg( Long fromSeqNum, Long toSeqNum, String fromLongitude, @@ -11,5 +11,11 @@ public record TripPathInfo( String toLatitude, Transportation transportation, PathInfo pathInfo + ) { + public record PathInfo( + Long price, + Double totalDistance, + Long totalTime + ){} } diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripPathMsg.java b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripPathMsg.java new file mode 100644 index 0000000..5aabf2e --- /dev/null +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripPathMsg.java @@ -0,0 +1,8 @@ +package org.tenten.tentenstomp.domain.trip.dto.response; + +import java.util.List; + +public record TripPathMsg( + List paths +) { +} diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripPlaceResponseMsg.java b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripPlaceResponseMsg.java deleted file mode 100644 index 813f3f7..0000000 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripPlaceResponseMsg.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.tenten.tentenstomp.domain.trip.dto.response; - -import org.tenten.tentenstomp.global.common.enums.Transportation; -import org.tenten.tentenstomp.global.component.dto.response.PathInfo; - -import java.util.List; - -public record TripPlaceResponseMsg( - List places, - List paths -) { - public record TripPlace( - Long tripItemId, - Long seqNum, - Transportation transportation, - String visitDate, - Long budget, - String longitude, - String latitude - - ) { - - } - - public record TripPath( - Long fromSeqNum, - Long toSeqNum, - String fromLongitude, - String fromLatitude, - String toLongitude, - String toLatitude, - Transportation transportation, - PathInfo pathInfo - ) { - - } -} \ No newline at end of file diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripResponseMsg.java b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripResponseMsg.java deleted file mode 100644 index f059969..0000000 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripResponseMsg.java +++ /dev/null @@ -1,10 +0,0 @@ -package org.tenten.tentenstomp.domain.trip.dto.response; - -public record TripResponseMsg( - Long tripId, - String visitDate, - String endPoint, - TripInfoResponseMsg tripInfoMessage, - TripMemberResponseMsg tripMemberMessage, - TripPlaceResponseMsg tripPlaceMessage) { -} diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/entity/Trip.java b/src/main/java/org/tenten/tentenstomp/domain/trip/entity/Trip.java index f2bb478..2475d81 100644 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/entity/Trip.java +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/entity/Trip.java @@ -5,9 +5,8 @@ import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; -import org.tenten.tentenstomp.domain.trip.dto.request.TripRequestMsg; -import org.tenten.tentenstomp.domain.trip.dto.response.TripInfoResponseMsg; -import org.tenten.tentenstomp.domain.trip.dto.response.TripResponseMsg; +import org.tenten.tentenstomp.domain.trip.dto.request.TripUpdateMsg; +import org.tenten.tentenstomp.domain.trip.dto.response.TripInfoMsg; import org.tenten.tentenstomp.global.common.BaseTimeEntity; import org.tenten.tentenstomp.global.common.enums.TripStatus; @@ -52,25 +51,17 @@ public class Trip extends BaseTimeEntity { @OneToMany(mappedBy = "trip", fetch = LAZY, cascade = REMOVE) private final List tripLikedItems = new ArrayList<>(); - public TripResponseMsg changeTripInfo(TripRequestMsg request) { - this.startDate = LocalDate.parse(request.tripInfoMessage().startDate()); - this.endDate = LocalDate.parse(request.tripInfoMessage().endDate()); - this.numberOfPeople = request.tripInfoMessage().numberOfPeople(); - this.tripName = request.tripInfoMessage().tripName(); - this.tripStatus = request.tripInfoMessage().tripStatus(); - this.area = request.tripInfoMessage().area(); - this.subarea = request.tripInfoMessage().subarea(); - this.budget = request.tripInfoMessage().budget(); + public TripInfoMsg changeTripInfo(TripUpdateMsg request) { + this.startDate = LocalDate.parse(request.startDate()); + this.endDate = LocalDate.parse(request.endDate()); + this.numberOfPeople = request.numberOfPeople(); + this.tripName = request.tripName(); + this.tripStatus = request.tripStatus(); + this.area = request.area(); + this.subarea = request.subarea(); + this.budget = request.budget(); - return new TripResponseMsg( - request.tripId(), request.visitDate(), request.endPoint(), - new TripInfoResponseMsg( - request.tripId(), request.tripInfoMessage().startDate(), - request.tripInfoMessage().endDate(), request.tripInfoMessage().numberOfPeople(), - request.tripInfoMessage().tripName(), request.tripInfoMessage().tripStatus(), - request.tripInfoMessage().area(), request.tripInfoMessage().subarea(), - request.tripInfoMessage().budget() - ), null, null - ); + return new TripInfoMsg(this.getId(), request.startDate(), request.endDate(), this.getNumberOfPeople(), this.getTripName(), this.getTripStatus(), + this.getArea(), this.getSubarea(), this.getBudget()); } } \ No newline at end of file diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripItemService.java b/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripItemService.java new file mode 100644 index 0000000..32805a4 --- /dev/null +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripItemService.java @@ -0,0 +1,38 @@ +package org.tenten.tentenstomp.domain.trip.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.data.redis.listener.ChannelTopic; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.tenten.tentenstomp.domain.trip.dto.request.TripItemPriceUpdateMsg; +import org.tenten.tentenstomp.domain.trip.dto.request.TripItemVisitDateUpdateMsg; +import org.tenten.tentenstomp.domain.trip.repository.TripItemRepository; +import org.tenten.tentenstomp.global.publisher.RedisPublisher; +import org.tenten.tentenstomp.global.util.RedisChannelUtil; + +import static org.tenten.tentenstomp.global.common.constant.EndPointConstant.TRIP_ITEM; + +@Service +@RequiredArgsConstructor +public class TripItemService { + private final TripItemRepository tripItemRepository; + private final RedisChannelUtil redisChannelUtil; + private final RedisPublisher redisPublisher; + @Transactional + public void updateTripItemPrice(String tripItemId, TripItemPriceUpdateMsg priceUpdateMsg) { + // TODO : /sub/{tripId}/tripItems/{visitDate} + + } + @Transactional + public void updateTripItemVisitDate(String tripItemId, TripItemVisitDateUpdateMsg visitDateUpdateMsg) { + // TODO : /sub/{tripId}/tripItems/{oldVisitDate} + // TODO : /sub/{tripId}/tripItems/{newVisitDate} + // TODO : /sub/{tripId}/path/{oldVisitDate} + // TODO : /sub/{tripId}/path/{newVisitDate} + } + @Transactional + public void deleteTripItem(String tripItemId) { + // TODO : /sub/{tripId}/tripItems/{visitDate} + // TODO : /sub/{tripId}/path/{visitDate} + } +} diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripService.java b/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripService.java index 8fd9b4e..e684e61 100644 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripService.java +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripService.java @@ -2,69 +2,75 @@ import lombok.RequiredArgsConstructor; import org.springframework.data.redis.listener.ChannelTopic; -import org.springframework.data.redis.listener.RedisMessageListenerContainer; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.tenten.tentenstomp.domain.trip.dto.request.TripRequestMsg; -import org.tenten.tentenstomp.domain.trip.dto.response.TripResponseMsg; +import org.tenten.tentenstomp.domain.trip.dto.request.*; +import org.tenten.tentenstomp.domain.trip.dto.response.TripInfoMsg; import org.tenten.tentenstomp.domain.trip.entity.Trip; -import org.tenten.tentenstomp.domain.trip.pubsub.RedisPublisher; -import org.tenten.tentenstomp.domain.trip.pubsub.RedisSubscriber; import org.tenten.tentenstomp.domain.trip.repository.TripItemRepository; +import org.tenten.tentenstomp.global.common.constant.EndPointConstant; +import org.tenten.tentenstomp.global.publisher.RedisPublisher; import org.tenten.tentenstomp.domain.trip.repository.TripRepository; +import org.tenten.tentenstomp.global.response.GlobalStompResponse; +import org.tenten.tentenstomp.global.util.RedisChannelUtil; import java.util.HashMap; import java.util.HashSet; import java.util.Map; +import static org.tenten.tentenstomp.global.common.constant.EndPointConstant.*; + @Service @RequiredArgsConstructor public class TripService { private final TripRepository tripRepository; + private final RedisChannelUtil redisChannelUtil; private final TripItemRepository tripItemRepository; private final RedisPublisher redisPublisher; - private final RedisMessageListenerContainer redisMessageListenerContainer; - private final RedisSubscriber redisSubscriber; - private final Map channelTopicMap = new HashMap<>(); - private final Map> connectedMemberMap = new HashMap<>(); -// @Transactional -// public Long save(TripCreateRequest request) { -// -// return null; -// } + private final Map> connectedMemberMap = new HashMap<>(); +// private final PathComponent pathComponent; @Transactional - public void updateTrip(String tripId, TripRequestMsg request) { + public void updateTrip(String tripId, TripUpdateMsg tripUpdateMsg) { Trip trip = tripRepository.getReferenceById(Long.parseLong(tripId)); - ChannelTopic topic = getChannelTopic(tripId, request.endPoint()); - TripResponseMsg tripResponseMsg = trip.changeTripInfo(request); + ChannelTopic topic = redisChannelUtil.getChannelTopic(tripId, TRIP_INFO); + + TripInfoMsg tripResponseMsg = trip.changeTripInfo(tripUpdateMsg); tripRepository.save(trip); - redisPublisher.publish(topic, tripResponseMsg); // 해당 여정의 토픽을 찾아야함, + redisPublisher.publish(topic, GlobalStompResponse.ok(tripResponseMsg)); // 해당 여정의 토픽을 찾아야함, } + @Transactional + public void addTripItem(String tripId, TripItemAddMsg tripItemAddMsg) { + Trip trip = tripRepository.getReferenceById(Long.parseLong(tripId)); + ChannelTopic tripItemTopic = redisChannelUtil.getChannelTopic(tripId, tripItemAddMsg.newTripItems().get(0).visitDate(), TRIP_ITEM); + ChannelTopic pathTopic = redisChannelUtil.getChannelTopic(tripId, tripItemAddMsg.newTripItems().get(0).visitDate(), PATH); - private ChannelTopic getChannelTopic(String tripId, String endPoint) { - String channelName = tripId + endPoint; - if (!channelTopicMap.containsKey(channelName)) { - ChannelTopic newTopic = new ChannelTopic(channelName); - channelTopicMap.put(channelName, newTopic); - redisMessageListenerContainer.addMessageListener(redisSubscriber, newTopic); - } - return channelTopicMap.get(channelName); - } + // TODO : /sub/{tripId}/tripItems/{visitDate} + // TODO : /sub/{tripId}/path/{visitDate} - @Transactional - public void updateMember(String tripId, TripRequestMsg request) { - ChannelTopic topic = getChannelTopic(tripId, request.endPoint()); - TripResponseMsg tripResponseMsg = new TripResponseMsg(request.tripId(), request.visitDate(), request.endPoint(), null, null, null); - redisPublisher.publish(topic, tripResponseMsg); // 해당 여정의 토픽을 찾아야함, } - @Transactional - public void updatePlace(String tripId, TripRequestMsg request) { - ChannelTopic topic = getChannelTopic(tripId, request.endPoint()); - TripResponseMsg tripResponseMsg = new TripResponseMsg(request.tripId(), request.visitDate(), request.endPoint(), null, null, null); - redisPublisher.publish(topic, tripResponseMsg); // 해당 여정의 토픽을 찾 + public void updateTripItemOrder(String tripId, TripItemOrderUpdateMsg orderUpdateMsg) { + // TODO : /sub/{tripId}/tripItems/{visitDate} + // TODO : /sub/{tripId}/path/{visitDate} + ChannelTopic tripItemTopic = redisChannelUtil.getChannelTopic(tripId, tripItemAddMsg.newTripItems().get(0).visitDate(), TRIP_ITEM); + ChannelTopic pathTopic = redisChannelUtil.getChannelTopic(tripId, tripItemAddMsg.newTripItems().get(0).visitDate(), PATH); + + + } + @Transactional(readOnly = true) + public void connectMember(String tripId, MemberConnectMsg memberConnectMsg) { + // TODO: /sub/{tripId}/connectedMember + ChannelTopic memberTopic = redisChannelUtil.getChannelTopic(tripId, MEMBER); } + @Transactional(readOnly = true) + public void disconnectMember(String tripId, MemberDisconnectMsg memberDisconnectMsg) { + // TODO: /sub/{tripId}/connectedMember + ChannelTopic memberTopic = redisChannelUtil.getChannelTopic(tripId, MEMBER); + } + + + } diff --git a/src/main/java/org/tenten/tentenstomp/global/aspect/UtilAspect.java b/src/main/java/org/tenten/tentenstomp/global/aspect/UtilAspect.java new file mode 100644 index 0000000..951c033 --- /dev/null +++ b/src/main/java/org/tenten/tentenstomp/global/aspect/UtilAspect.java @@ -0,0 +1,22 @@ +package org.tenten.tentenstomp.global.aspect; + +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.stereotype.Component; + +@Component +@Aspect +@Slf4j +public class UtilAspect { + + @Around("@annotation(org.tenten.tentenstomp.global.common.annotation.GetExecutionTime)") + public Object getExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable { + long startTime = System.currentTimeMillis(); + Object proceed = joinPoint.proceed(joinPoint.getArgs()); + log.info(joinPoint.getSignature().getName() + " execution time : " + ((System.currentTimeMillis() - startTime) / 1000.0)); + + return proceed; + } +} \ No newline at end of file diff --git a/src/main/java/org/tenten/tentenstomp/global/common/annotation/GetExecutionTime.java b/src/main/java/org/tenten/tentenstomp/global/common/annotation/GetExecutionTime.java new file mode 100644 index 0000000..f7a7f66 --- /dev/null +++ b/src/main/java/org/tenten/tentenstomp/global/common/annotation/GetExecutionTime.java @@ -0,0 +1,11 @@ +package org.tenten.tentenstomp.global.common.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +public @interface GetExecutionTime { +} diff --git a/src/main/java/org/tenten/tentenstomp/global/common/constant/EndPointConstant.java b/src/main/java/org/tenten/tentenstomp/global/common/constant/EndPointConstant.java new file mode 100644 index 0000000..c32cf2b --- /dev/null +++ b/src/main/java/org/tenten/tentenstomp/global/common/constant/EndPointConstant.java @@ -0,0 +1,8 @@ +package org.tenten.tentenstomp.global.common.constant; + +public class EndPointConstant { + public static final String TRIP_INFO = "info"; + public static final String TRIP_ITEM = "tripItems"; + public static final String PATH = "path"; + public static final String MEMBER = "connectedMember"; +} diff --git a/src/main/java/org/tenten/tentenstomp/global/component/NaverMapComponent.java b/src/main/java/org/tenten/tentenstomp/global/component/NaverMapComponent.java index 4aa45f3..354bc88 100644 --- a/src/main/java/org/tenten/tentenstomp/global/component/NaverMapComponent.java +++ b/src/main/java/org/tenten/tentenstomp/global/component/NaverMapComponent.java @@ -11,7 +11,7 @@ import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; -import org.tenten.tentenstomp.global.component.dto.response.PathInfo; +import org.tenten.tentenstomp.domain.trip.dto.response.TripPathInfoMsg; import org.tenten.tentenstomp.global.exception.GlobalException; import java.util.List; @@ -19,6 +19,7 @@ import static org.springframework.http.HttpMethod.GET; import static org.springframework.http.HttpStatus.CONFLICT; +import static org.tenten.tentenstomp.domain.trip.dto.response.TripPathInfoMsg.*; import static org.tenten.tentenstomp.global.common.constant.NaverMapConstant.NAVER_MAP_API_KEY_HEADER; import static org.tenten.tentenstomp.global.common.constant.NaverMapConstant.NAVER_MAP_CLIENT_ID_HEADER; @@ -34,15 +35,15 @@ public class NaverMapComponent { @Value("${naver-map.client_id}") private String clientId; public PathInfo calculatePathInfo(String fromLongitude, - String fromLatitude, - String toLongitude, - String toLatitude) { + String fromLatitude, + String toLongitude, + String toLatitude) { UriComponents uri = UriComponentsBuilder .fromUriString(BASE_URL) .queryParam("start", fromLongitude + "," + fromLatitude) .queryParam("goal",toLongitude+","+toLatitude) .build(); - log.info(uri.toUriString()); +// log.info(uri.toUriString()); HttpHeaders header = new HttpHeaders(); header.set(NAVER_MAP_CLIENT_ID_HEADER, clientId); header.set(NAVER_MAP_API_KEY_HEADER, apiKey); @@ -51,18 +52,18 @@ public PathInfo calculatePathInfo(String fromLongitude, try { Map map = objectMapper.readValue(response.getBody(), new TypeReference>() { }); - for (String key : map.keySet()) { - log.info("key : " + key); - } - log.info("code : " + map.get("code")); - log.info("msg : " + map.get("message")); +// for (String key : map.keySet()) { +// log.info("key : " + key); +// } +// log.info("code : " + map.get("code")); +// log.info("msg : " + map.get("message")); if (map.get("code").equals(0)) { Map routeMap = (Map) map.get("route"); List> traoptimalList = (List> ) routeMap.get("traoptimal"); Map traoptimal = traoptimalList.get(0); - for (String traKey : traoptimal.keySet()) { - log.info("tra key : "+traKey); - } +// for (String traKey : traoptimal.keySet()) { +// log.info("traoptimal key : "+traKey); +// } Map summary = (Map) traoptimal.get("summary"); Integer tollFare = (Integer) summary.get("tollFare"); Integer fuelPrice = (Integer) summary.get("fuelPrice"); @@ -73,7 +74,8 @@ public PathInfo calculatePathInfo(String fromLongitude, throw new GlobalException("자동차 경로를 조회할 수 없습니다.", CONFLICT); } } catch (JsonProcessingException e) { - throw new GlobalException("자동차 경로 응답 파일을 읽어오는 과정에서 오류가 발생했습니다.", CONFLICT); + log.info("자동차 경로 응답 파일을 읽어오는 과정에서 오류가 발생했습니다."); + return null; } catch (Exception e) { log.info(e.getMessage()); return null; diff --git a/src/main/java/org/tenten/tentenstomp/global/component/OdsayComponent.java b/src/main/java/org/tenten/tentenstomp/global/component/OdsayComponent.java index f5c8b5b..4c232d1 100644 --- a/src/main/java/org/tenten/tentenstomp/global/component/OdsayComponent.java +++ b/src/main/java/org/tenten/tentenstomp/global/component/OdsayComponent.java @@ -13,7 +13,8 @@ import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; -import org.tenten.tentenstomp.global.component.dto.response.PathInfo; +import org.tenten.tentenstomp.domain.trip.dto.response.TripPathInfoMsg; +import org.tenten.tentenstomp.domain.trip.dto.response.TripPathInfoMsg.PathInfo; import org.tenten.tentenstomp.global.exception.GlobalException; import java.util.List; @@ -32,9 +33,9 @@ public class OdsayComponent { private final ObjectMapper objectMapper; private final String BASE_URL = "https://api.odsay.com/v1/api/searchPubTransPathT"; public PathInfo calculatePathInfo(String fromLongitude, - String fromLatitude, - String toLongitude, - String toLatitude) { + String fromLatitude, + String toLongitude, + String toLatitude) { UriComponents uri = UriComponentsBuilder .fromUriString(BASE_URL) .queryParam("apiKey", apiKey) @@ -43,7 +44,7 @@ public PathInfo calculatePathInfo(String fromLongitude, .queryParam("EX", toLongitude) .queryParam("EY", toLatitude) .build(); - log.info(uri.toUriString()); +// log.info(uri.toUriString()); HttpHeaders header = new HttpHeaders(); HttpEntity request = new HttpEntity(header); ResponseEntity response = restTemplate.exchange(uri.toUri(), GET, request, String.class); @@ -63,7 +64,8 @@ public PathInfo calculatePathInfo(String fromLongitude, throw new GlobalException("대중교통 경로를 조회할 수 없습니다.", CONFLICT); } } catch (JsonProcessingException jsonProcessingException) { - throw new GlobalException("대중교통 경로 응답 파일을 읽어오는 과정에서 오류가 발생했습니다.", CONFLICT); + log.info("대중교통 경로 응답 파일을 읽어오는 과정에서 오류가 발생했습니다."); + return null; } catch (Exception e) { log.info(e.getMessage()); return null; diff --git a/src/main/java/org/tenten/tentenstomp/global/component/PathComponent.java b/src/main/java/org/tenten/tentenstomp/global/component/PathComponent.java index 8a9ee1d..48a6cea 100644 --- a/src/main/java/org/tenten/tentenstomp/global/component/PathComponent.java +++ b/src/main/java/org/tenten/tentenstomp/global/component/PathComponent.java @@ -1,24 +1,51 @@ package org.tenten.tentenstomp.global.component; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; -import org.tenten.tentenstomp.global.component.dto.request.TripPlaceUpdateRequest.TripPlaceInfo; -import org.tenten.tentenstomp.global.component.dto.response.PathInfo; -import org.tenten.tentenstomp.global.component.dto.response.TripPathInfo; +import org.tenten.tentenstomp.domain.trip.dto.response.TripPathInfoMsg; +import org.tenten.tentenstomp.domain.trip.dto.response.TripPathInfoMsg.PathInfo; +import org.tenten.tentenstomp.global.common.annotation.GetExecutionTime; +import org.tenten.tentenstomp.global.component.dto.request.TripPlace; +import org.tenten.tentenstomp.global.component.dto.request.PathCalculateRequest; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Stream; + +import static org.tenten.tentenstomp.global.common.enums.Transportation.CAR; @Component @RequiredArgsConstructor +@Slf4j public class PathComponent { private final OdsayComponent odsayComponent; private final NaverMapComponent naverMapComponent; - - public TripPathInfo calculatePathByCar(TripPlaceInfo fromPlace, TripPlaceInfo toPlace) { - PathInfo pathInfo = naverMapComponent.calculatePathInfo(fromPlace.longitude(), fromPlace.latitude(), toPlace.longitude(), toPlace.latitude()); - return new TripPathInfo(fromPlace.seqNum(), toPlace.seqNum(), fromPlace.longitude(), fromPlace.latitude(), toPlace.longitude(), toPlace.latitude(), toPlace.transportation(), pathInfo); + @Async + public TripPathInfoMsg calculatePath(TripPlace fromPlace, TripPlace toPlace) { + long startTime = System.currentTimeMillis(); + PathInfo pathInfo; + if (toPlace.transportation().equals(CAR)) { + pathInfo = naverMapComponent.calculatePathInfo(fromPlace.longitude(), fromPlace.latitude(), toPlace.longitude(), toPlace.latitude()); + } else { + pathInfo = odsayComponent.calculatePathInfo(fromPlace.longitude(), fromPlace.latitude(), toPlace.longitude(), toPlace.latitude()); + } + log.info("from "+fromPlace.seqNum()+" to "+toPlace.seqNum()+" executionTime : "+((System.currentTimeMillis() - startTime) / 1000.0)); + return new TripPathInfoMsg(fromPlace.seqNum(), toPlace.seqNum(), fromPlace.longitude(), fromPlace.latitude(), toPlace.longitude(), toPlace.latitude(), toPlace.transportation(), pathInfo); } + @GetExecutionTime + public List getTripPath(List tripPlaceList) { + List pathCalculateRequests = toPathCalculateRequest(tripPlaceList); + return pathCalculateRequests.stream().flatMap(pathCalculateRequest -> Stream.of(calculatePath(pathCalculateRequest.from(), pathCalculateRequest.to()))).toList(); + } + - public TripPathInfo calculatePathByPublicTransportation(TripPlaceInfo fromPlace, TripPlaceInfo toPlace) { - PathInfo pathInfo = odsayComponent.calculatePathInfo(fromPlace.longitude(), fromPlace.latitude(), toPlace.longitude(), toPlace.latitude()); - return new TripPathInfo(fromPlace.seqNum(), toPlace.seqNum(), fromPlace.longitude(), fromPlace.latitude(), toPlace.longitude(), toPlace.latitude(), toPlace.transportation(), pathInfo); + private List toPathCalculateRequest(List tripPlaceList) { + List pathCalculateRequests = new ArrayList<>(); + for (int i = 0; i + 1 < tripPlaceList.size(); i++) { + pathCalculateRequests.add(new PathCalculateRequest(tripPlaceList.get(i), tripPlaceList.get(i + 1))); + } + return pathCalculateRequests; } } diff --git a/src/main/java/org/tenten/tentenstomp/global/component/controller/PathController.java b/src/main/java/org/tenten/tentenstomp/global/component/controller/PathController.java deleted file mode 100644 index ad47c56..0000000 --- a/src/main/java/org/tenten/tentenstomp/global/component/controller/PathController.java +++ /dev/null @@ -1,32 +0,0 @@ -package org.tenten.tentenstomp.global.component.controller; - -import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import org.tenten.tentenstomp.global.common.constant.ResponseConstant; -import org.tenten.tentenstomp.global.component.PathComponent; -import org.tenten.tentenstomp.global.component.dto.request.TempPathCalculateRequest; -import org.tenten.tentenstomp.global.response.GlobalDataResponse; - -import static org.tenten.tentenstomp.global.common.constant.ResponseConstant.SUCCESS; - -@RestController -@RequiredArgsConstructor -@RequestMapping("/path") -public class PathController { - private final PathComponent pathComponent; - - @GetMapping("/car") - public ResponseEntity carPathTest(@RequestBody TempPathCalculateRequest calculateRequest) { - - return ResponseEntity.ok(GlobalDataResponse.ok(SUCCESS, pathComponent.calculatePathByCar(calculateRequest.from(), calculateRequest.to()))); - } - - @GetMapping("/public") - public ResponseEntity publicPathTest(@RequestBody TempPathCalculateRequest calculateRequest) { - return ResponseEntity.ok(GlobalDataResponse.ok(SUCCESS, pathComponent.calculatePathByPublicTransportation(calculateRequest.from(), calculateRequest.to()))); - } -} diff --git a/src/main/java/org/tenten/tentenstomp/global/component/dto/request/PathCalculateRequest.java b/src/main/java/org/tenten/tentenstomp/global/component/dto/request/PathCalculateRequest.java new file mode 100644 index 0000000..3c00383 --- /dev/null +++ b/src/main/java/org/tenten/tentenstomp/global/component/dto/request/PathCalculateRequest.java @@ -0,0 +1,6 @@ +package org.tenten.tentenstomp.global.component.dto.request; + +public record PathCalculateRequest(TripPlace from, + TripPlace to) { + +} diff --git a/src/main/java/org/tenten/tentenstomp/global/component/dto/request/TempPathCalculateRequest.java b/src/main/java/org/tenten/tentenstomp/global/component/dto/request/TempPathCalculateRequest.java deleted file mode 100644 index e161d28..0000000 --- a/src/main/java/org/tenten/tentenstomp/global/component/dto/request/TempPathCalculateRequest.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.tenten.tentenstomp.global.component.dto.request; - -import org.tenten.tentenstomp.global.component.dto.request.TripPlaceUpdateRequest.TripPlaceInfo; - -public record TempPathCalculateRequest(TripPlaceInfo from, - TripPlaceInfo to) { - -} diff --git a/src/main/java/org/tenten/tentenstomp/global/component/dto/request/TripPlace.java b/src/main/java/org/tenten/tentenstomp/global/component/dto/request/TripPlace.java new file mode 100644 index 0000000..a22f361 --- /dev/null +++ b/src/main/java/org/tenten/tentenstomp/global/component/dto/request/TripPlace.java @@ -0,0 +1,11 @@ +package org.tenten.tentenstomp.global.component.dto.request; + +import org.tenten.tentenstomp.global.common.enums.Transportation; + +public record TripPlace( + Long seqNum, + Transportation transportation, + String longitude, + String latitude +) { +} diff --git a/src/main/java/org/tenten/tentenstomp/global/component/dto/response/PathInfo.java b/src/main/java/org/tenten/tentenstomp/global/component/dto/response/PathInfo.java deleted file mode 100644 index a6d0b9f..0000000 --- a/src/main/java/org/tenten/tentenstomp/global/component/dto/response/PathInfo.java +++ /dev/null @@ -1,8 +0,0 @@ -package org.tenten.tentenstomp.global.component.dto.response; - -public record PathInfo( - Long totalTime, - Double totalDistance, - Long price -) { -} \ No newline at end of file diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/pubsub/RedisPublisher.java b/src/main/java/org/tenten/tentenstomp/global/publisher/RedisPublisher.java similarity index 67% rename from src/main/java/org/tenten/tentenstomp/domain/trip/pubsub/RedisPublisher.java rename to src/main/java/org/tenten/tentenstomp/global/publisher/RedisPublisher.java index 5d200ad..721442a 100644 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/pubsub/RedisPublisher.java +++ b/src/main/java/org/tenten/tentenstomp/global/publisher/RedisPublisher.java @@ -1,17 +1,17 @@ -package org.tenten.tentenstomp.domain.trip.pubsub; +package org.tenten.tentenstomp.global.publisher; import lombok.RequiredArgsConstructor; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.listener.ChannelTopic; import org.springframework.stereotype.Service; -import org.tenten.tentenstomp.domain.trip.dto.response.TripResponseMsg; +import org.tenten.tentenstomp.global.response.GlobalStompResponse; @RequiredArgsConstructor @Service public class RedisPublisher { private final RedisTemplate redisTemplate; - public void publish(ChannelTopic topic, TripResponseMsg message) { + public void publish(ChannelTopic topic, GlobalStompResponse message) { redisTemplate.convertAndSend(topic.getTopic(), message); } } diff --git a/src/main/java/org/tenten/tentenstomp/global/response/GlobalStompResponse.java b/src/main/java/org/tenten/tentenstomp/global/response/GlobalStompResponse.java new file mode 100644 index 0000000..caf9c88 --- /dev/null +++ b/src/main/java/org/tenten/tentenstomp/global/response/GlobalStompResponse.java @@ -0,0 +1,21 @@ +package org.tenten.tentenstomp.global.response; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.springframework.http.HttpStatus; +import org.tenten.tentenstomp.global.common.constant.ResponseConstant; + +import static org.tenten.tentenstomp.global.common.constant.ResponseConstant.SUCCESS; + +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class GlobalStompResponse { + private int status; + private String message; + private T data; + public static GlobalStompResponse ok(T data) { + return new GlobalStompResponse<>(HttpStatus.OK.value(), SUCCESS, data); + } +} diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/pubsub/RedisSubscriber.java b/src/main/java/org/tenten/tentenstomp/global/subscriber/RedisSubscriber.java similarity index 67% rename from src/main/java/org/tenten/tentenstomp/domain/trip/pubsub/RedisSubscriber.java rename to src/main/java/org/tenten/tentenstomp/global/subscriber/RedisSubscriber.java index a946316..a26580f 100644 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/pubsub/RedisSubscriber.java +++ b/src/main/java/org/tenten/tentenstomp/global/subscriber/RedisSubscriber.java @@ -1,4 +1,4 @@ -package org.tenten.tentenstomp.domain.trip.pubsub; +package org.tenten.tentenstomp.global.subscriber; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; @@ -8,7 +8,7 @@ import org.springframework.data.redis.core.RedisTemplate; import org.springframework.messaging.simp.SimpMessageSendingOperations; import org.springframework.stereotype.Service; -import org.tenten.tentenstomp.domain.trip.dto.response.TripResponseMsg; +import org.tenten.tentenstomp.global.response.GlobalStompResponse; @Slf4j @RequiredArgsConstructor @@ -24,12 +24,11 @@ public class RedisSubscriber implements MessageListener { @Override public void onMessage(Message message, byte[] pattern) { try { - // redis에서 발행된 데이터를 받아 deserialize String publishMessage = (String) redisTemplate.getStringSerializer().deserialize(message.getBody()); - // TripEditResponse 객채로 맵핑 - TripResponseMsg tripResponseMsg = objectMapper.readValue(publishMessage, TripResponseMsg.class); - // Websocket 구독자에게 메시지 Send - messagingTemplate.convertAndSend("/sub/trips/" + tripResponseMsg.tripId() + tripResponseMsg.endPoint(), tripResponseMsg); + String endPointUrl = (String) redisTemplate.getStringSerializer().deserialize(message.getChannel()); + log.info(endPointUrl); + GlobalStompResponse dataResponse = objectMapper.readValue(publishMessage, GlobalStompResponse.class); + messagingTemplate.convertAndSend("/sub"+endPointUrl, dataResponse); } catch (Exception e) { log.error(e.getMessage()); } diff --git a/src/main/java/org/tenten/tentenstomp/global/util/RedisChannelUtil.java b/src/main/java/org/tenten/tentenstomp/global/util/RedisChannelUtil.java new file mode 100644 index 0000000..009ed7e --- /dev/null +++ b/src/main/java/org/tenten/tentenstomp/global/util/RedisChannelUtil.java @@ -0,0 +1,46 @@ +package org.tenten.tentenstomp.global.util; + +import lombok.RequiredArgsConstructor; +import org.springframework.data.redis.listener.ChannelTopic; +import org.springframework.data.redis.listener.RedisMessageListenerContainer; +import org.springframework.stereotype.Component; +import org.tenten.tentenstomp.global.subscriber.RedisSubscriber; + +import java.util.HashMap; +import java.util.Map; + +@Component +@RequiredArgsConstructor +public class RedisChannelUtil { + private final RedisMessageListenerContainer redisMessageListenerContainer; + private final RedisSubscriber redisSubscriber; + private final Map channelTopicMap = new HashMap<>(); + + public ChannelTopic getChannelTopic(String tripId, String endPoint) { + String channelName = createChannelName(tripId, endPoint); + if (!channelTopicMap.containsKey(channelName)) { + ChannelTopic newTopic = new ChannelTopic(channelName); + channelTopicMap.put(channelName, newTopic); + redisMessageListenerContainer.addMessageListener(redisSubscriber, newTopic); + } + return channelTopicMap.get(channelName); + } + + public ChannelTopic getChannelTopic(String tripId, String visitDate, String endPoint) { + String channelName = createChannelName(tripId, visitDate, endPoint); + if (!channelTopicMap.containsKey(channelName)) { + ChannelTopic newTopic = new ChannelTopic(channelName); + channelTopicMap.put(channelName, newTopic); + redisMessageListenerContainer.addMessageListener(redisSubscriber, newTopic); + } + return channelTopicMap.get(channelName); + } + + private String createChannelName(String tripId, String endPoint) { + return "/" + tripId + "/" + endPoint; + } + + private String createChannelName(String tripId, String visitDate, String endPoint) { + return "/" + tripId + "/" + endPoint + "/" + visitDate; + } +} From 935c7f18080d942f2339ee0f81fd6cf45905c490 Mon Sep 17 00:00:00 2001 From: Kim-Dong-Jun99 Date: Sat, 6 Jan 2024 12:46:24 +0900 Subject: [PATCH 2/4] =?UTF-8?q?Refactor=20:=20=EB=B9=8C=EB=93=9C=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tenten/tentenstomp/domain/trip/service/TripService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripService.java b/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripService.java index e684e61..f70db55 100644 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripService.java +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripService.java @@ -55,8 +55,8 @@ public void addTripItem(String tripId, TripItemAddMsg tripItemAddMsg) { public void updateTripItemOrder(String tripId, TripItemOrderUpdateMsg orderUpdateMsg) { // TODO : /sub/{tripId}/tripItems/{visitDate} // TODO : /sub/{tripId}/path/{visitDate} - ChannelTopic tripItemTopic = redisChannelUtil.getChannelTopic(tripId, tripItemAddMsg.newTripItems().get(0).visitDate(), TRIP_ITEM); - ChannelTopic pathTopic = redisChannelUtil.getChannelTopic(tripId, tripItemAddMsg.newTripItems().get(0).visitDate(), PATH); + ChannelTopic tripItemTopic = redisChannelUtil.getChannelTopic(tripId, orderUpdateMsg.visitDate(), TRIP_ITEM); + ChannelTopic pathTopic = redisChannelUtil.getChannelTopic(tripId, orderUpdateMsg.visitDate(), PATH); } From a08faa5459034b220fe390a7679089b262d3fc1e Mon Sep 17 00:00:00 2001 From: Kim-Dong-Jun99 Date: Sun, 7 Jan 2024 01:49:38 +0900 Subject: [PATCH 3/4] =?UTF-8?q?Feat=20:=20=ED=8C=A8=ED=82=A4=EC=A7=80?= =?UTF-8?q?=EA=B5=AC=EC=A1=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tentenstomp/domain/trip/controller/TripController.java | 3 +-- .../tentenstomp/domain/trip/service/TripItemService.java | 7 +++---- .../tentenstomp/domain/trip/service/TripService.java | 5 +++-- .../{ => messaging/kafka}/consumer/KafkaConsumer.java | 2 +- .../{ => messaging/kafka}/producer/KafkaProducer.java | 2 +- .../{ => messaging/redis}/publisher/RedisPublisher.java | 2 +- .../{ => messaging/redis}/subscriber/RedisSubscriber.java | 2 +- .../tenten/tentenstomp/global/util/RedisChannelUtil.java | 2 +- 8 files changed, 12 insertions(+), 13 deletions(-) rename src/main/java/org/tenten/tentenstomp/global/{ => messaging/kafka}/consumer/KafkaConsumer.java (91%) rename src/main/java/org/tenten/tentenstomp/global/{ => messaging/kafka}/producer/KafkaProducer.java (84%) rename src/main/java/org/tenten/tentenstomp/global/{ => messaging/redis}/publisher/RedisPublisher.java (89%) rename src/main/java/org/tenten/tentenstomp/global/{ => messaging/redis}/subscriber/RedisSubscriber.java (95%) diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/controller/TripController.java b/src/main/java/org/tenten/tentenstomp/domain/trip/controller/TripController.java index a5ea377..7fe2912 100644 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/controller/TripController.java +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/controller/TripController.java @@ -7,7 +7,7 @@ import org.springframework.web.bind.annotation.RestController; import org.tenten.tentenstomp.domain.trip.dto.request.*; import org.tenten.tentenstomp.domain.trip.service.TripService; -import org.tenten.tentenstomp.global.producer.KafkaProducer; +import org.tenten.tentenstomp.global.messaging.kafka.producer.KafkaProducer; @RestController @RequiredArgsConstructor @@ -45,5 +45,4 @@ public void connectMember(@DestinationVariable String tripId, @Payload MemberCon public void disconnectMember(@DestinationVariable String tripId, @Payload MemberDisconnectMsg memberDisconnectMsg) { tripService.disconnectMember(tripId, memberDisconnectMsg); } - } diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripItemService.java b/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripItemService.java index 32805a4..bd89565 100644 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripItemService.java +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripItemService.java @@ -1,23 +1,22 @@ package org.tenten.tentenstomp.domain.trip.service; import lombok.RequiredArgsConstructor; -import org.springframework.data.redis.listener.ChannelTopic; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.tenten.tentenstomp.domain.trip.dto.request.TripItemPriceUpdateMsg; import org.tenten.tentenstomp.domain.trip.dto.request.TripItemVisitDateUpdateMsg; import org.tenten.tentenstomp.domain.trip.repository.TripItemRepository; -import org.tenten.tentenstomp.global.publisher.RedisPublisher; +import org.tenten.tentenstomp.global.messaging.kafka.producer.KafkaProducer; +import org.tenten.tentenstomp.global.messaging.redis.publisher.RedisPublisher; import org.tenten.tentenstomp.global.util.RedisChannelUtil; -import static org.tenten.tentenstomp.global.common.constant.EndPointConstant.TRIP_ITEM; - @Service @RequiredArgsConstructor public class TripItemService { private final TripItemRepository tripItemRepository; private final RedisChannelUtil redisChannelUtil; private final RedisPublisher redisPublisher; + private final KafkaProducer kafkaProducer; @Transactional public void updateTripItemPrice(String tripItemId, TripItemPriceUpdateMsg priceUpdateMsg) { // TODO : /sub/{tripId}/tripItems/{visitDate} diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripService.java b/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripService.java index f70db55..ffadb58 100644 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripService.java +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripService.java @@ -8,8 +8,8 @@ import org.tenten.tentenstomp.domain.trip.dto.response.TripInfoMsg; import org.tenten.tentenstomp.domain.trip.entity.Trip; import org.tenten.tentenstomp.domain.trip.repository.TripItemRepository; -import org.tenten.tentenstomp.global.common.constant.EndPointConstant; -import org.tenten.tentenstomp.global.publisher.RedisPublisher; +import org.tenten.tentenstomp.global.messaging.kafka.producer.KafkaProducer; +import org.tenten.tentenstomp.global.messaging.redis.publisher.RedisPublisher; import org.tenten.tentenstomp.domain.trip.repository.TripRepository; import org.tenten.tentenstomp.global.response.GlobalStompResponse; import org.tenten.tentenstomp.global.util.RedisChannelUtil; @@ -28,6 +28,7 @@ public class TripService { private final RedisChannelUtil redisChannelUtil; private final TripItemRepository tripItemRepository; private final RedisPublisher redisPublisher; + private final KafkaProducer kafkaProducer; private final Map> connectedMemberMap = new HashMap<>(); // private final PathComponent pathComponent; diff --git a/src/main/java/org/tenten/tentenstomp/global/consumer/KafkaConsumer.java b/src/main/java/org/tenten/tentenstomp/global/messaging/kafka/consumer/KafkaConsumer.java similarity index 91% rename from src/main/java/org/tenten/tentenstomp/global/consumer/KafkaConsumer.java rename to src/main/java/org/tenten/tentenstomp/global/messaging/kafka/consumer/KafkaConsumer.java index 2be53e3..f8abf64 100644 --- a/src/main/java/org/tenten/tentenstomp/global/consumer/KafkaConsumer.java +++ b/src/main/java/org/tenten/tentenstomp/global/messaging/kafka/consumer/KafkaConsumer.java @@ -1,4 +1,4 @@ -package org.tenten.tentenstomp.global.consumer; +package org.tenten.tentenstomp.global.messaging.kafka.consumer; import lombok.RequiredArgsConstructor; import org.apache.kafka.clients.consumer.ConsumerConfig; diff --git a/src/main/java/org/tenten/tentenstomp/global/producer/KafkaProducer.java b/src/main/java/org/tenten/tentenstomp/global/messaging/kafka/producer/KafkaProducer.java similarity index 84% rename from src/main/java/org/tenten/tentenstomp/global/producer/KafkaProducer.java rename to src/main/java/org/tenten/tentenstomp/global/messaging/kafka/producer/KafkaProducer.java index 5f5cf14..8045e2c 100644 --- a/src/main/java/org/tenten/tentenstomp/global/producer/KafkaProducer.java +++ b/src/main/java/org/tenten/tentenstomp/global/messaging/kafka/producer/KafkaProducer.java @@ -1,4 +1,4 @@ -package org.tenten.tentenstomp.global.producer; +package org.tenten.tentenstomp.global.messaging.kafka.producer; import lombok.RequiredArgsConstructor; import org.springframework.kafka.core.KafkaTemplate; diff --git a/src/main/java/org/tenten/tentenstomp/global/publisher/RedisPublisher.java b/src/main/java/org/tenten/tentenstomp/global/messaging/redis/publisher/RedisPublisher.java similarity index 89% rename from src/main/java/org/tenten/tentenstomp/global/publisher/RedisPublisher.java rename to src/main/java/org/tenten/tentenstomp/global/messaging/redis/publisher/RedisPublisher.java index 721442a..14469ec 100644 --- a/src/main/java/org/tenten/tentenstomp/global/publisher/RedisPublisher.java +++ b/src/main/java/org/tenten/tentenstomp/global/messaging/redis/publisher/RedisPublisher.java @@ -1,4 +1,4 @@ -package org.tenten.tentenstomp.global.publisher; +package org.tenten.tentenstomp.global.messaging.redis.publisher; import lombok.RequiredArgsConstructor; import org.springframework.data.redis.core.RedisTemplate; diff --git a/src/main/java/org/tenten/tentenstomp/global/subscriber/RedisSubscriber.java b/src/main/java/org/tenten/tentenstomp/global/messaging/redis/subscriber/RedisSubscriber.java similarity index 95% rename from src/main/java/org/tenten/tentenstomp/global/subscriber/RedisSubscriber.java rename to src/main/java/org/tenten/tentenstomp/global/messaging/redis/subscriber/RedisSubscriber.java index a26580f..19f9413 100644 --- a/src/main/java/org/tenten/tentenstomp/global/subscriber/RedisSubscriber.java +++ b/src/main/java/org/tenten/tentenstomp/global/messaging/redis/subscriber/RedisSubscriber.java @@ -1,4 +1,4 @@ -package org.tenten.tentenstomp.global.subscriber; +package org.tenten.tentenstomp.global.messaging.redis.subscriber; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/org/tenten/tentenstomp/global/util/RedisChannelUtil.java b/src/main/java/org/tenten/tentenstomp/global/util/RedisChannelUtil.java index 009ed7e..6c53692 100644 --- a/src/main/java/org/tenten/tentenstomp/global/util/RedisChannelUtil.java +++ b/src/main/java/org/tenten/tentenstomp/global/util/RedisChannelUtil.java @@ -4,7 +4,7 @@ import org.springframework.data.redis.listener.ChannelTopic; import org.springframework.data.redis.listener.RedisMessageListenerContainer; import org.springframework.stereotype.Component; -import org.tenten.tentenstomp.global.subscriber.RedisSubscriber; +import org.tenten.tentenstomp.global.messaging.redis.subscriber.RedisSubscriber; import java.util.HashMap; import java.util.Map; From fa850d50132e6010936dab2e954448fe5583497f Mon Sep 17 00:00:00 2001 From: Kim-Dong-Jun99 Date: Sun, 7 Jan 2024 19:05:37 +0900 Subject: [PATCH 4/4] =?UTF-8?q?Feat=20:=20Kafka=20Producer,=20Consumer=20?= =?UTF-8?q?=ED=98=95=EC=8B=9D=EC=9C=BC=EB=A1=9C=20=EC=84=9C=EB=B9=84?= =?UTF-8?q?=EC=8A=A4=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .http/Trip.http | 2 +- .../trip/dto/request/TripItemAddMsg.java | 2 +- .../request/TripItemVisitDateUpdateMsg.java | 4 +- .../domain/trip/dto/response/TripItemMsg.java | 3 + .../trip/dto/response/TripMemberMsg.java | 1 + .../domain/trip/dto/response/TripPathMsg.java | 3 + .../domain/trip/service/TripItemService.java | 66 +++++++++++++++++-- .../domain/trip/service/TripService.java | 61 ++++++++++++----- ...dPointConstant.java => TopicConstant.java} | 2 +- .../kafka/consumer/KafkaConsumer.java | 36 +++++++++- .../tentenstomp/global/util/TempUtil.java | 4 -- .../tentenstomp/global/util/TopicUtil.java | 18 +++++ 12 files changed, 171 insertions(+), 31 deletions(-) rename src/main/java/org/tenten/tentenstomp/global/common/constant/{EndPointConstant.java => TopicConstant.java} (89%) delete mode 100644 src/main/java/org/tenten/tentenstomp/global/util/TempUtil.java create mode 100644 src/main/java/org/tenten/tentenstomp/global/util/TopicUtil.java diff --git a/.http/Trip.http b/.http/Trip.http index 98841e0..644d2b7 100644 --- a/.http/Trip.http +++ b/.http/Trip.http @@ -14,7 +14,7 @@ Content-Type: application/json "tripName": "success", "tripStatus": "BEFORE", "area": "서울", - "subarea": "강남구", + "subarea": "송파구", "budget": 10000 }, "tripMemberMessage": null, diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripItemAddMsg.java b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripItemAddMsg.java index cd5f1cf..05369ad 100644 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripItemAddMsg.java +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripItemAddMsg.java @@ -5,13 +5,13 @@ import java.util.List; public record TripItemAddMsg( + String visitDate, List newTripItems ) { public record TripItemCreateRequest( Long tourItemId, Transportation transportation, Long seqNum, - String visitDate, Long price ) { diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripItemVisitDateUpdateMsg.java b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripItemVisitDateUpdateMsg.java index 7803314..e2e297c 100644 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripItemVisitDateUpdateMsg.java +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/request/TripItemVisitDateUpdateMsg.java @@ -1,4 +1,6 @@ package org.tenten.tentenstomp.domain.trip.dto.request; -public record TripItemVisitDateUpdateMsg() { +public record TripItemVisitDateUpdateMsg( + String visitDate +) { } diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripItemMsg.java b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripItemMsg.java index ec150cf..e8e30ff 100644 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripItemMsg.java +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripItemMsg.java @@ -1,8 +1,11 @@ package org.tenten.tentenstomp.domain.trip.dto.response; +import java.time.LocalDate; import java.util.List; public record TripItemMsg( + Long tripId, + String visitDate, List tripItems ) { } diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripMemberMsg.java b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripMemberMsg.java index 6d559d3..352f539 100644 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripMemberMsg.java +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripMemberMsg.java @@ -3,6 +3,7 @@ import java.util.List; public record TripMemberMsg( + Long tripId, List connectedMembers ) { } diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripPathMsg.java b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripPathMsg.java index 5aabf2e..2edc043 100644 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripPathMsg.java +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/dto/response/TripPathMsg.java @@ -1,8 +1,11 @@ package org.tenten.tentenstomp.domain.trip.dto.response; +import java.time.LocalDate; import java.util.List; public record TripPathMsg( + Long tripId, + String visitDate, List paths ) { } diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripItemService.java b/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripItemService.java index bd89565..ccbe97e 100644 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripItemService.java +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripItemService.java @@ -5,11 +5,21 @@ import org.springframework.transaction.annotation.Transactional; import org.tenten.tentenstomp.domain.trip.dto.request.TripItemPriceUpdateMsg; import org.tenten.tentenstomp.domain.trip.dto.request.TripItemVisitDateUpdateMsg; +import org.tenten.tentenstomp.domain.trip.dto.response.TripItemMsg; +import org.tenten.tentenstomp.domain.trip.dto.response.TripPathMsg; +import org.tenten.tentenstomp.domain.trip.entity.TripItem; import org.tenten.tentenstomp.domain.trip.repository.TripItemRepository; +import org.tenten.tentenstomp.global.exception.GlobalException; import org.tenten.tentenstomp.global.messaging.kafka.producer.KafkaProducer; import org.tenten.tentenstomp.global.messaging.redis.publisher.RedisPublisher; import org.tenten.tentenstomp.global.util.RedisChannelUtil; +import java.time.LocalDate; + +import static org.springframework.http.HttpStatus.NOT_FOUND; +import static org.tenten.tentenstomp.global.common.constant.TopicConstant.PATH; +import static org.tenten.tentenstomp.global.common.constant.TopicConstant.TRIP_ITEM; + @Service @RequiredArgsConstructor public class TripItemService { @@ -19,19 +29,61 @@ public class TripItemService { private final KafkaProducer kafkaProducer; @Transactional public void updateTripItemPrice(String tripItemId, TripItemPriceUpdateMsg priceUpdateMsg) { - // TODO : /sub/{tripId}/tripItems/{visitDate} + TripItem tripItem = tripItemRepository.findById(Long.parseLong(tripItemId)).orElseThrow(() -> new GlobalException("해당 아이디로 존재하는 tripItem이 없다 " + tripItemId, NOT_FOUND)); + /* + 비즈니스 로직 + */ + TripItemMsg tripItemMsg = new TripItemMsg( + tripItem.getTourItem().getId(), tripItem.getVisitDate().toString(), null + ); + + kafkaProducer.send(TRIP_ITEM, tripItemMsg); } @Transactional public void updateTripItemVisitDate(String tripItemId, TripItemVisitDateUpdateMsg visitDateUpdateMsg) { - // TODO : /sub/{tripId}/tripItems/{oldVisitDate} - // TODO : /sub/{tripId}/tripItems/{newVisitDate} - // TODO : /sub/{tripId}/path/{oldVisitDate} - // TODO : /sub/{tripId}/path/{newVisitDate} + TripItem tripItem = tripItemRepository.findById(Long.parseLong(tripItemId)).orElseThrow(() -> new GlobalException("해당 아이디로 존재하는 tripItem이 없다 " + tripItemId, NOT_FOUND)); + LocalDate pastDate = tripItem.getVisitDate(); + LocalDate newDate = LocalDate.parse(visitDateUpdateMsg.visitDate()); + /* + 비즈니스 로직 + */ + + TripItemMsg tripItemMsgToPastDate = new TripItemMsg( + tripItem.getTourItem().getId(), pastDate.toString(), null + ); + TripItemMsg tripItemMsgToNewDate = new TripItemMsg( + tripItem.getTourItem().getId(), newDate.toString(), null + ); + + TripPathMsg tripPathMsgToPastDate = new TripPathMsg( + tripItem.getTourItem().getId(), pastDate.toString(), null + ); + TripPathMsg tripPathMsgToNewDate = new TripPathMsg( + tripItem.getTourItem().getId(), newDate.toString(), null + ); + + kafkaProducer.send(TRIP_ITEM, tripItemMsgToPastDate); + kafkaProducer.send(TRIP_ITEM, tripItemMsgToNewDate); + kafkaProducer.send(PATH, tripPathMsgToPastDate); + kafkaProducer.send(PATH, tripPathMsgToNewDate); } @Transactional public void deleteTripItem(String tripItemId) { - // TODO : /sub/{tripId}/tripItems/{visitDate} - // TODO : /sub/{tripId}/path/{visitDate} + TripItem tripItem = tripItemRepository.findById(Long.parseLong(tripItemId)).orElseThrow(() -> new GlobalException("해당 아이디로 존재하는 tripItem이 없다 " + tripItemId, NOT_FOUND)); + LocalDate visitDate = tripItem.getVisitDate(); + /* + 비즈니스 로직 + */ + TripItemMsg tripItemMsg = new TripItemMsg( + Long.parseLong(tripItemId), visitDate.toString(), null + ); + TripPathMsg tripPathMsg = new TripPathMsg( + Long.parseLong(tripItemId), visitDate.toString(), null + ); + + kafkaProducer.send(TRIP_ITEM, tripItemMsg); + kafkaProducer.send(PATH, tripPathMsg); + } } diff --git a/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripService.java b/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripService.java index ffadb58..1cfaf1c 100644 --- a/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripService.java +++ b/src/main/java/org/tenten/tentenstomp/domain/trip/service/TripService.java @@ -6,6 +6,9 @@ import org.springframework.transaction.annotation.Transactional; import org.tenten.tentenstomp.domain.trip.dto.request.*; import org.tenten.tentenstomp.domain.trip.dto.response.TripInfoMsg; +import org.tenten.tentenstomp.domain.trip.dto.response.TripItemMsg; +import org.tenten.tentenstomp.domain.trip.dto.response.TripMemberMsg; +import org.tenten.tentenstomp.domain.trip.dto.response.TripPathMsg; import org.tenten.tentenstomp.domain.trip.entity.Trip; import org.tenten.tentenstomp.domain.trip.repository.TripItemRepository; import org.tenten.tentenstomp.global.messaging.kafka.producer.KafkaProducer; @@ -14,11 +17,12 @@ import org.tenten.tentenstomp.global.response.GlobalStompResponse; import org.tenten.tentenstomp.global.util.RedisChannelUtil; +import java.time.LocalDate; import java.util.HashMap; import java.util.HashSet; import java.util.Map; -import static org.tenten.tentenstomp.global.common.constant.EndPointConstant.*; +import static org.tenten.tentenstomp.global.common.constant.TopicConstant.*; @Service @RequiredArgsConstructor @@ -36,40 +40,67 @@ public class TripService { @Transactional public void updateTrip(String tripId, TripUpdateMsg tripUpdateMsg) { Trip trip = tripRepository.getReferenceById(Long.parseLong(tripId)); - ChannelTopic topic = redisChannelUtil.getChannelTopic(tripId, TRIP_INFO); TripInfoMsg tripResponseMsg = trip.changeTripInfo(tripUpdateMsg); tripRepository.save(trip); - redisPublisher.publish(topic, GlobalStompResponse.ok(tripResponseMsg)); // 해당 여정의 토픽을 찾아야함, + + kafkaProducer.send(TRIP_INFO, tripResponseMsg); } @Transactional public void addTripItem(String tripId, TripItemAddMsg tripItemAddMsg) { Trip trip = tripRepository.getReferenceById(Long.parseLong(tripId)); - ChannelTopic tripItemTopic = redisChannelUtil.getChannelTopic(tripId, tripItemAddMsg.newTripItems().get(0).visitDate(), TRIP_ITEM); - ChannelTopic pathTopic = redisChannelUtil.getChannelTopic(tripId, tripItemAddMsg.newTripItems().get(0).visitDate(), PATH); + /* + 비즈니스 로직 + */ - // TODO : /sub/{tripId}/tripItems/{visitDate} - // TODO : /sub/{tripId}/path/{visitDate} + TripItemMsg tripItemMsg = new TripItemMsg( + Long.parseLong(tripId), LocalDate.parse(tripItemAddMsg.visitDate()).toString(), null + ); + TripPathMsg tripPathMsg = new TripPathMsg( + Long.parseLong(tripId), LocalDate.parse(tripItemAddMsg.visitDate()).toString(), null + ); + kafkaProducer.send(TRIP_ITEM, tripItemMsg); + kafkaProducer.send(PATH, tripPathMsg); } @Transactional public void updateTripItemOrder(String tripId, TripItemOrderUpdateMsg orderUpdateMsg) { - // TODO : /sub/{tripId}/tripItems/{visitDate} - // TODO : /sub/{tripId}/path/{visitDate} - ChannelTopic tripItemTopic = redisChannelUtil.getChannelTopic(tripId, orderUpdateMsg.visitDate(), TRIP_ITEM); - ChannelTopic pathTopic = redisChannelUtil.getChannelTopic(tripId, orderUpdateMsg.visitDate(), PATH); + /* + 비즈니스 로직 + */ + TripItemMsg tripItemMsg = new TripItemMsg( + Long.parseLong(tripId), LocalDate.parse(orderUpdateMsg.visitDate()).toString(), null + ); + TripPathMsg tripPathMsg = new TripPathMsg( + Long.parseLong(tripId), LocalDate.parse(orderUpdateMsg.visitDate()).toString(), null + ); + kafkaProducer.send(TRIP_ITEM, tripItemMsg); + kafkaProducer.send(PATH, tripPathMsg); } + @Transactional(readOnly = true) public void connectMember(String tripId, MemberConnectMsg memberConnectMsg) { - // TODO: /sub/{tripId}/connectedMember - ChannelTopic memberTopic = redisChannelUtil.getChannelTopic(tripId, MEMBER); + /* + 비즈니스 로직 + */ + TripMemberMsg tripMemberMsg = new TripMemberMsg( + Long.parseLong(tripId), null + ); + + kafkaProducer.send(MEMBER, tripMemberMsg); } @Transactional(readOnly = true) public void disconnectMember(String tripId, MemberDisconnectMsg memberDisconnectMsg) { - // TODO: /sub/{tripId}/connectedMember - ChannelTopic memberTopic = redisChannelUtil.getChannelTopic(tripId, MEMBER); + /* + 비즈니스 로직 + */ + TripMemberMsg tripMemberMsg = new TripMemberMsg( + Long.parseLong(tripId), null + ); + + kafkaProducer.send(MEMBER, tripMemberMsg); } diff --git a/src/main/java/org/tenten/tentenstomp/global/common/constant/EndPointConstant.java b/src/main/java/org/tenten/tentenstomp/global/common/constant/TopicConstant.java similarity index 89% rename from src/main/java/org/tenten/tentenstomp/global/common/constant/EndPointConstant.java rename to src/main/java/org/tenten/tentenstomp/global/common/constant/TopicConstant.java index c32cf2b..289df3c 100644 --- a/src/main/java/org/tenten/tentenstomp/global/common/constant/EndPointConstant.java +++ b/src/main/java/org/tenten/tentenstomp/global/common/constant/TopicConstant.java @@ -1,6 +1,6 @@ package org.tenten.tentenstomp.global.common.constant; -public class EndPointConstant { +public class TopicConstant { public static final String TRIP_INFO = "info"; public static final String TRIP_ITEM = "tripItems"; public static final String PATH = "path"; diff --git a/src/main/java/org/tenten/tentenstomp/global/messaging/kafka/consumer/KafkaConsumer.java b/src/main/java/org/tenten/tentenstomp/global/messaging/kafka/consumer/KafkaConsumer.java index f8abf64..427965e 100644 --- a/src/main/java/org/tenten/tentenstomp/global/messaging/kafka/consumer/KafkaConsumer.java +++ b/src/main/java/org/tenten/tentenstomp/global/messaging/kafka/consumer/KafkaConsumer.java @@ -2,19 +2,53 @@ import lombok.RequiredArgsConstructor; import org.apache.kafka.clients.consumer.ConsumerConfig; +import org.apache.kafka.common.internals.Topic; import org.springframework.kafka.annotation.KafkaListener; import org.springframework.messaging.simp.SimpMessageSendingOperations; import org.springframework.stereotype.Service; import org.tenten.tentenstomp.domain.trip.dto.request.TripUpdateMsg; +import org.tenten.tentenstomp.domain.trip.dto.response.TripInfoMsg; +import org.tenten.tentenstomp.domain.trip.dto.response.TripItemMsg; +import org.tenten.tentenstomp.domain.trip.dto.response.TripMemberMsg; +import org.tenten.tentenstomp.domain.trip.dto.response.TripPathMsg; +import org.tenten.tentenstomp.global.common.constant.TopicConstant; +import org.tenten.tentenstomp.global.response.GlobalStompResponse; +import org.tenten.tentenstomp.global.util.TopicUtil; + +import java.time.LocalDate; + +import static org.apache.kafka.clients.consumer.ConsumerConfig.GROUP_ID_CONFIG; +import static org.tenten.tentenstomp.global.common.constant.TopicConstant.*; @Service @RequiredArgsConstructor public class KafkaConsumer { private final SimpMessageSendingOperations messagingTemplate; + private final TopicUtil topicUtil; - @KafkaListener(topics = "kafka", groupId = ConsumerConfig.GROUP_ID_CONFIG) + @KafkaListener(topics = "kafka", groupId = GROUP_ID_CONFIG) public void consumeTest(TripUpdateMsg data) { messagingTemplate.convertAndSend("/sub/kafka", data); } + + @KafkaListener(topics = TRIP_INFO, groupId = GROUP_ID_CONFIG) + public void updateTripInfo(TripInfoMsg tripInfoMsg) { + messagingTemplate.convertAndSend(topicUtil.topicToReturnEndPoint(tripInfoMsg.tripId(), TRIP_INFO), GlobalStompResponse.ok(tripInfoMsg)); + } + + @KafkaListener(topics = TRIP_ITEM, groupId = GROUP_ID_CONFIG) + public void updateTripItem(TripItemMsg tripItemMsg) { + messagingTemplate.convertAndSend(topicUtil.topicToReturnEndPoint(tripItemMsg.tripId(), TRIP_ITEM, LocalDate.parse(tripItemMsg.visitDate())), GlobalStompResponse.ok(tripItemMsg)); + } + + @KafkaListener(topics = PATH, groupId = GROUP_ID_CONFIG) + public void updateTripPath(TripPathMsg tripPathMsg) { + messagingTemplate.convertAndSend(topicUtil.topicToReturnEndPoint(tripPathMsg.tripId(), PATH, LocalDate.parse(tripPathMsg.visitDate())), GlobalStompResponse.ok(tripPathMsg)); + } + + @KafkaListener(topics = MEMBER, groupId = GROUP_ID_CONFIG) + public void updateConnectedTripMember(TripMemberMsg tripMemberMsg) { + messagingTemplate.convertAndSend(topicUtil.topicToReturnEndPoint(tripMemberMsg.tripId(), MEMBER), GlobalStompResponse.ok(tripMemberMsg)); + } } diff --git a/src/main/java/org/tenten/tentenstomp/global/util/TempUtil.java b/src/main/java/org/tenten/tentenstomp/global/util/TempUtil.java deleted file mode 100644 index 8f04284..0000000 --- a/src/main/java/org/tenten/tentenstomp/global/util/TempUtil.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.tenten.tentenstomp.global.util; - -public class TempUtil { -} diff --git a/src/main/java/org/tenten/tentenstomp/global/util/TopicUtil.java b/src/main/java/org/tenten/tentenstomp/global/util/TopicUtil.java new file mode 100644 index 0000000..f2867ae --- /dev/null +++ b/src/main/java/org/tenten/tentenstomp/global/util/TopicUtil.java @@ -0,0 +1,18 @@ +package org.tenten.tentenstomp.global.util; + +import org.springframework.stereotype.Component; + +import java.time.LocalDate; + +@Component +public class TopicUtil { + private final String BASE_URL = "/sub"; + + public String topicToReturnEndPoint(Long tripId, String endPoint, LocalDate visitDate) { + return BASE_URL + "/" + tripId + "/" + endPoint + "/" + visitDate; + } + + public String topicToReturnEndPoint(Long tripId, String endPoint) { + return BASE_URL + "/" + tripId + "/" + endPoint; + } +}