refactor(order-service): order-service listener

- save order시 jpa의 listener을 이용하여 kafka 전송
This commit is contained in:
hoon7566
2022-03-15 11:40:08 +09:00
parent 47491f3245
commit a811d122fc
8 changed files with 75 additions and 34 deletions

View File

@@ -3,15 +3,10 @@ package com.justpickup.orderservice.domain.order.entity;
import com.justpickup.orderservice.domain.order.exception.OrderException; import com.justpickup.orderservice.domain.order.exception.OrderException;
import com.justpickup.orderservice.domain.order.service.OrderSender; import com.justpickup.orderservice.domain.order.service.OrderSender;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.EntityManager;
import javax.persistence.PostUpdate; import javax.persistence.PostUpdate;
@Slf4j @Slf4j
@@ -23,23 +18,18 @@ public class OrderListener {
private OrderSender orderSender; private OrderSender orderSender;
@PostUpdate @PostUpdate
@Transactional(propagation = Propagation.REQUIRES_NEW)
void postUpdate(Order order) { void postUpdate(Order order) {
OrderStatus orderStatus = order.getOrderStatus(); OrderStatus orderStatus = order.getOrderStatus();
if (orderStatus == OrderStatus.ORDER) { if (orderStatus == OrderStatus.ORDER) {
// TODO: 2022/03/10 Kafka 알림 전송 // TODO: 2022/03/10 Kafka 알림 전송
log.info("[OrderListener] {}", OrderStatus.ORDER.name()); log.info("[OrderListener] {}", OrderStatus.ORDER.name());
try{ try{
orderSender.orderPlaced(OrderSender.KafkaSendOrderDto.createPrimitiveField(order)); orderSender.orderPlaced(OrderSender.KafkaSendOrderDto.createPrimitiveField(order));
}catch (Exception ex){ }catch (Exception ex){
order.fail(); order.fail();
throw new OrderException(ex.getMessage()); throw new OrderException(ex.getMessage());
} }
} else if (orderStatus == OrderStatus.PLACED) { } else if (orderStatus == OrderStatus.PLACED) {
log.info("[OrderListener] {}", OrderStatus.PLACED.name()); log.info("[OrderListener] {}", OrderStatus.PLACED.name());
} }

View File

@@ -31,7 +31,7 @@ public class OrderSender {
@Data @Data
@AllArgsConstructor @AllArgsConstructor
@Builder @Builder
static class KafkaSendOrderDto{ public static class KafkaSendOrderDto{
private Long id; private Long id;
private Long userId; private Long userId;

View File

@@ -1,10 +1,6 @@
package com.justpickup.orderservice.domain.order.service; package com.justpickup.orderservice.domain.order.service;
import com.justpickup.orderservice.domain.order.dto.FetchOrderDto; import com.justpickup.orderservice.domain.order.dto.*;
import com.justpickup.orderservice.domain.order.dto.OrderDto;
import com.justpickup.orderservice.domain.order.dto.OrderMainDto;
import com.justpickup.orderservice.domain.order.dto.OrderSearchCondition;
import com.justpickup.orderservice.domain.order.dto.PrevOrderSearch;
import com.justpickup.orderservice.domain.order.entity.OrderStatus; import com.justpickup.orderservice.domain.order.entity.OrderStatus;
import com.justpickup.orderservice.domain.orderItem.dto.OrderItemDto; import com.justpickup.orderservice.domain.orderItem.dto.OrderItemDto;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;

View File

@@ -9,6 +9,9 @@ import com.justpickup.orderservice.domain.order.repository.OrderRepositoryCustom
import com.justpickup.orderservice.domain.orderItem.dto.OrderItemDto; import com.justpickup.orderservice.domain.orderItem.dto.OrderItemDto;
import com.justpickup.orderservice.domain.orderItem.entity.OrderItem; import com.justpickup.orderservice.domain.orderItem.entity.OrderItem;
import com.justpickup.orderservice.domain.orderItemOption.entity.OrderItemOption; import com.justpickup.orderservice.domain.orderItemOption.entity.OrderItemOption;
import com.justpickup.orderservice.global.client.store.GetItemResponse;
import com.justpickup.orderservice.global.client.store.GetStoreReseponse;
import com.justpickup.orderservice.global.client.store.StoreClient;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
@@ -19,7 +22,10 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.stream.Collectors;
import static java.util.stream.Collectors.toList; import static java.util.stream.Collectors.toList;
@@ -31,7 +37,8 @@ public class OrderServiceImpl implements OrderService {
private final OrderRepository orderRepository; private final OrderRepository orderRepository;
private final OrderRepositoryCustom orderRepositoryCustom; private final OrderRepositoryCustom orderRepositoryCustom;
private final OrderSender orderSender;
private final StoreClient storeClient;
@Override @Override
public OrderMainDto findOrderMain(OrderSearchCondition condition, Long storeId) { public OrderMainDto findOrderMain(OrderSearchCondition condition, Long storeId) {
@@ -75,7 +82,7 @@ public class OrderServiceImpl implements OrderService {
@Override @Override
@Transactional @Transactional
public void addItemToBasket(OrderItemDto orderItemDto,Long storeId, Long userId) { public void addItemToBasket(OrderItemDto orderItemDto, Long storeId, Long userId) {
//orderItemOption Entity를 생성한다. //orderItemOption Entity를 생성한다.
List<OrderItemOption> orderItemOptions = orderItemDto.getOrderItemOptionDtoList() List<OrderItemOption> orderItemOptions = orderItemDto.getOrderItemOptionDtoList()
@@ -105,21 +112,48 @@ public class OrderServiceImpl implements OrderService {
public FetchOrderDto fetchOrder(Long userId) { public FetchOrderDto fetchOrder(Long userId) {
Order order = orderRepositoryCustom.fetchOrder(userId) Order order = orderRepositoryCustom.fetchOrder(userId)
.orElseThrow(() -> new OrderException("장바구니 정보를 찾을 수 없습니다.")); .orElseThrow(() -> new OrderException("장바구니 정보를 찾을 수 없습니다."));
GetStoreReseponse store = storeClient.getStore(String.valueOf(order.getStoreId())).getData();
return new FetchOrderDto(order); Map<Long, GetItemResponse> itemMap = storeClient.getItemAndItemOptions(order.getOrderItems().stream()
.map(OrderItem::getItemId)
.filter(Objects::nonNull)
.collect(Collectors.toUnmodifiableList())
).getData()
.stream().collect(
Collectors.toMap(
GetItemResponse::getId
,getItemResponse->getItemResponse
,(t, t2) -> t
)
);
List<FetchOrderDto.OrderItemDto> orderItemDtoList = order.getOrderItems()
.stream().map(orderItem ->
new FetchOrderDto.OrderItemDto(
itemMap.get(orderItem.getItemId())
,orderItem))
.collect(Collectors.toList());
FetchOrderDto fetchOrderDto = FetchOrderDto.builder()
.userId(order.getUserId())
.orderPrice(order.getOrderPrice())
.storeName(store.getName())
.orderItemDtoList(orderItemDtoList)
.build();
return fetchOrderDto;
} }
@Override @Override
@Transactional @Transactional
public void saveOrder(Long userId) { public void saveOrder(Long userId) {
Order order = orderRepository.findByUserIdAndOrderStatus(userId, OrderStatus.PENDING)
orderRepository.findByUserIdAndOrderStatus(userId, OrderStatus.PENDING)
.orElseThrow(() -> new OrderException("장바구니 정보를 찾을 수 없습니다.")) .orElseThrow(() -> new OrderException("장바구니 정보를 찾을 수 없습니다."))
.setOrderStatus(OrderStatus.PLACED); .order();
try{
orderSender.orderPlaced(OrderSender.KafkaSendOrderDto.createPrimitiveField(order));
}catch (Exception ex){
throw new OrderException(ex.getMessage());
}
} }
@Override @Override

View File

@@ -0,0 +1,14 @@
package com.justpickup.orderservice.global.client.store;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class GetStoreReseponse {
private Long id;
private String name;
private String phoneNumber;
}

View File

@@ -0,0 +1,5 @@
package com.justpickup.orderservice.global.client.store;
public enum OptionType {
REQUIRED, OTHER
}

View File

@@ -5,9 +5,15 @@ import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(name = "STORE-SERVICE", url = "127.0.0.1:8001/store-service") import java.util.List;
@FeignClient("store-service")
public interface StoreClient { public interface StoreClient {
@GetMapping("/item/{itemId}") @GetMapping("/store/{storeId}")
Result<GetItemResponse> getItem(@PathVariable("itemId") Long itemId); Result<GetStoreReseponse> getStore(@PathVariable(value = "storeId") String storeId);
@GetMapping("/api/customer/items/{itemId}")
Result<List<GetItemResponse>> getItemAndItemOptions(@PathVariable(value = "itemId") List<Long> itemIds);
} }

View File

@@ -3,7 +3,7 @@ server:
spring: spring:
application: application:
name: order-servcie name: order-service
config: config:
import: optional:configserver:http://127.0.0.1:8888 import: optional:configserver:http://127.0.0.1:8888
cloud: cloud:
@@ -46,7 +46,3 @@ decorator.datasource.p6spy:
kafka: kafka:
host: 127.0.0.1 host: 127.0.0.1
port: 9092 port: 9092
#feign key
token:
feign: eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJmZWlnbiIsImV4cCI6MTE2NDY5NzY4NzAsImlhdCI6MTY0Njk3Njg3MH0.5x4Nx7oMnpF0_kZpbZsiB1u9eEbQ4IKIhJlEsa3D22cjZjvTHKz57GCz0sgXb_olhSNIVv9xF41A29-XYiFeBQ