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.service.OrderSender;
import lombok.NoArgsConstructor;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
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;
@Slf4j
@@ -23,23 +18,18 @@ public class OrderListener {
private OrderSender orderSender;
@PostUpdate
@Transactional(propagation = Propagation.REQUIRES_NEW)
void postUpdate(Order order) {
OrderStatus orderStatus = order.getOrderStatus();
if (orderStatus == OrderStatus.ORDER) {
// TODO: 2022/03/10 Kafka 알림 전송
log.info("[OrderListener] {}", OrderStatus.ORDER.name());
try{
orderSender.orderPlaced(OrderSender.KafkaSendOrderDto.createPrimitiveField(order));
}catch (Exception ex){
order.fail();
throw new OrderException(ex.getMessage());
}
} else if (orderStatus == OrderStatus.PLACED) {
log.info("[OrderListener] {}", OrderStatus.PLACED.name());
}

View File

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

View File

@@ -1,10 +1,6 @@
package com.justpickup.orderservice.domain.order.service;
import com.justpickup.orderservice.domain.order.dto.FetchOrderDto;
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.dto.*;
import com.justpickup.orderservice.domain.order.entity.OrderStatus;
import com.justpickup.orderservice.domain.orderItem.dto.OrderItemDto;
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.entity.OrderItem;
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.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
@@ -19,7 +22,10 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;
import static java.util.stream.Collectors.toList;
@@ -31,7 +37,8 @@ public class OrderServiceImpl implements OrderService {
private final OrderRepository orderRepository;
private final OrderRepositoryCustom orderRepositoryCustom;
private final OrderSender orderSender;
private final StoreClient storeClient;
@Override
public OrderMainDto findOrderMain(OrderSearchCondition condition, Long storeId) {
@@ -75,7 +82,7 @@ public class OrderServiceImpl implements OrderService {
@Override
@Transactional
public void addItemToBasket(OrderItemDto orderItemDto,Long storeId, Long userId) {
public void addItemToBasket(OrderItemDto orderItemDto, Long storeId, Long userId) {
//orderItemOption Entity를 생성한다.
List<OrderItemOption> orderItemOptions = orderItemDto.getOrderItemOptionDtoList()
@@ -105,21 +112,48 @@ public class OrderServiceImpl implements OrderService {
public FetchOrderDto fetchOrder(Long userId) {
Order order = orderRepositoryCustom.fetchOrder(userId)
.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
@Transactional
public void saveOrder(Long userId) {
Order order = orderRepository.findByUserIdAndOrderStatus(userId, OrderStatus.PENDING)
orderRepository.findByUserIdAndOrderStatus(userId, OrderStatus.PENDING)
.orElseThrow(() -> new OrderException("장바구니 정보를 찾을 수 없습니다."))
.setOrderStatus(OrderStatus.PLACED);
try{
orderSender.orderPlaced(OrderSender.KafkaSendOrderDto.createPrimitiveField(order));
}catch (Exception ex){
throw new OrderException(ex.getMessage());
}
.order();
}
@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.PathVariable;
@FeignClient(name = "STORE-SERVICE", url = "127.0.0.1:8001/store-service")
import java.util.List;
@FeignClient("store-service")
public interface StoreClient {
@GetMapping("/item/{itemId}")
Result<GetItemResponse> getItem(@PathVariable("itemId") Long itemId);
@GetMapping("/store/{storeId}")
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:
application:
name: order-servcie
name: order-service
config:
import: optional:configserver:http://127.0.0.1:8888
cloud:
@@ -46,7 +46,3 @@ decorator.datasource.p6spy:
kafka:
host: 127.0.0.1
port: 9092
#feign key
token:
feign: eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJmZWlnbiIsImV4cCI6MTE2NDY5NzY4NzAsImlhdCI6MTY0Njk3Njg3MH0.5x4Nx7oMnpF0_kZpbZsiB1u9eEbQ4IKIhJlEsa3D22cjZjvTHKz57GCz0sgXb_olhSNIVv9xF41A29-XYiFeBQ