Skip to content

Commit aca3215

Browse files
committed
[250619] 상품도메인 - 주문오케스트레이터에서 발행한 이벤트 소비 / imageRepository 오류 수정/ 카프카설정 변경
1 parent ae41c66 commit aca3215

File tree

6 files changed

+85
-12
lines changed

6 files changed

+85
-12
lines changed

src/main/java/com/ecommerce/config/KafkaConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public class KafkaConfig {
2727
private static final String ORDER_EVENTS_TOPIC = "order-events";
2828
private static final String PAYMENT_EVENTS_TOPIC = "payment-events";
2929
private static final String DELIVERY_EVENTS_TOPIC = "delivery-events";
30-
@Value("${spring.kafka.bootstrap-server}")
30+
@Value("${spring.kafka.bootstrap-servers[0]}")
3131
private String bootStrapServers;
3232
@Value("${spring.kafka.consumer.group-id:ecommerce-service}")
3333
private String defaultGroupId;

src/main/java/com/ecommerce/product/dto/request/StockDeductRequest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
package com.ecommerce.product.dto.request;
22

3+
import lombok.AllArgsConstructor;
34
import lombok.Getter;
45
import lombok.NoArgsConstructor;
5-
import lombok.NonNull;
66

7-
import java.math.BigDecimal;
87
import java.util.UUID;
98

109
@Getter
1110
@NoArgsConstructor
11+
@AllArgsConstructor
1212
public class StockDeductRequest {
1313

1414
private UUID productUUID;
Lines changed: 74 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,77 @@
11
package com.ecommerce.product.event;
22

3+
import com.ecommerce.product.dto.request.StockDeductRequest;
4+
import com.ecommerce.product.productService.ProductService;
5+
import com.ecommerce.proto.StockDeductEvent;
6+
import com.ecommerce.proto.StockRestoredEvent;
7+
import com.google.protobuf.InvalidProtocolBufferException;
8+
import lombok.RequiredArgsConstructor;
9+
import lombok.extern.slf4j.Slf4j;
10+
import org.apache.kafka.clients.consumer.ConsumerRecord;
11+
import org.springframework.kafka.annotation.KafkaListener;
12+
import org.springframework.kafka.support.Acknowledgment;
13+
import org.springframework.stereotype.Service;
14+
15+
import java.util.List;
16+
import java.util.UUID;
17+
import java.util.stream.Collectors;
18+
19+
@Slf4j
20+
@Service
21+
@RequiredArgsConstructor
322
public class ActiveStockEventConsumer {
4-
}
23+
24+
private final ProductService productService;
25+
26+
@KafkaListener(topics = "order-event", groupId = "product-service")
27+
public void consumeOrderEvents(ConsumerRecord<String, byte[]> record, Acknowledgment ack) {
28+
try {
29+
String key = record.key();
30+
byte[] value = record.value();
31+
log.info("Payment consume: order key={}", key);
32+
if ("stock.deduction.request".equals(key)) {
33+
operateStockDeduction(value);
34+
} else if ("stock.restore.request".equals(key)) {
35+
operateStockRestoration(value);
36+
}
37+
ack.acknowledge();
38+
} catch (Exception e) {
39+
log.error("Stock error : consume order event {}", e.getMessage());
40+
}
41+
}
42+
43+
private void operateStockDeduction(byte[] value) {
44+
try {
45+
StockDeductEvent deductEvent = StockDeductEvent.parseFrom(value);
46+
UUID orderUUID = UUID.fromString(deductEvent.getOrderUuid());
47+
48+
List<StockDeductRequest> deductReqLit = deductEvent.getItemsList().stream()
49+
.map(item -> new StockDeductRequest(UUID.fromString(item.getProductUuid()), item.getDeductQuantity()))
50+
.collect(Collectors.toList());
51+
productService.deductStocks(deductReqLit, orderUUID);
52+
53+
} catch (InvalidProtocolBufferException e) {
54+
log.error("Parsing deduction error: {}", e.getMessage());
55+
} catch (RuntimeException e) {
56+
log.error("Stock deduction error: {}", e.getMessage());
57+
}
58+
}
59+
60+
private void operateStockRestoration(byte[] value) {
61+
try {
62+
StockRestoredEvent restoreEvent = StockRestoredEvent.parseFrom(value);
63+
UUID orderUUID = UUID.fromString(restoreEvent.getOrderUuid());
64+
65+
List<StockDeductRequest> restoreReqList = restoreEvent.getItemsList().stream()
66+
.map(item -> new StockDeductRequest(UUID.fromString(item.getProductUuid()), item.getRestoredQuantity()))
67+
.collect(Collectors.toList());
68+
productService.restoreStocks(restoreReqList, orderUUID);
69+
70+
} catch (InvalidProtocolBufferException e) {
71+
log.error("Parsing restoration error: {}", e.getMessage());
72+
} catch (RuntimeException e) {
73+
log.error("Stock restoration error: {}", e.getMessage());
74+
}
75+
}
76+
77+
}

src/main/java/com/ecommerce/product/productRepository/ProductImageRepository.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@
88

99
public interface ProductImageRepository extends JpaRepository<ProductImage, Long> {
1010

11-
List<ProductImage> findByProductNotDeleted(Product product);
11+
List<ProductImage> findByProductAndIsDeletedFalse(Product product);
1212

1313
}

src/main/java/com/ecommerce/product/productService/ProductService.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public Product modifyProduct(String sellerId, String productId, ProductModifyReq
8484
.orElseThrow(() -> new IllegalArgumentException("Cannot find products"));
8585

8686
// 기존 이미지 소프트 딜리트 처리
87-
List<ProductImage> images = imageRepository.findByProductNotDeleted(product);
87+
List<ProductImage> images = imageRepository.findByProductAndIsDeletedFalse(product);
8888
images.forEach(ProductImage::softDelete);
8989

9090
// 새 이미지들 저장
@@ -184,7 +184,7 @@ public StockDeductResult deductStock(UUID productUUID, int quantity, UUID orderU
184184
}
185185
}
186186

187-
// 여러 상품 재고 차감
187+
// 여러 상품 재고 차감(벌크+Dirty check)
188188
public void deductStocks(List<StockDeductRequest> requests, UUID orderUUID) {
189189
List<StockDeductResult> results = new ArrayList<>();
190190

@@ -196,7 +196,7 @@ public void deductStocks(List<StockDeductRequest> requests, UUID orderUUID) {
196196
Map<UUID, Product> productMap = products.stream()
197197
.collect(Collectors.toMap(Product::getProductUUID, Function.identity()));
198198

199-
for(StockDeductRequest request : requests) {
199+
for (StockDeductRequest request : requests) {
200200
Product product = productMap.get(request.getProductUUID());
201201

202202
boolean deductSucceed = product.deductStock(request.getQuantity());
@@ -230,7 +230,7 @@ public void restoreStock(UUID orderUUID, UUID productUUID, int quantity) {
230230

231231
eventPublisher.publishStockRestored(orderUUID, productUUID, quantity, product.getStockQuantity());
232232

233-
}catch (Exception e) {
233+
} catch (Exception e) {
234234
log.error("Fail to restore stock: productUUID={}, error={}", productUUID, e.getMessage());
235235
throw new RuntimeException("Fail to restore stock");
236236
}

src/main/resources/application.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@ spring:
77
username: root
88
password: User#1234
99
jpa:
10-
generate-ddl: false
10+
generate-ddl: true
1111
hibernate:
12-
ddl-auto: none
12+
ddl-auto: update
1313
show_sql: true
1414
format_sql: true
1515
use_sql_comments: true
1616
kafka:
1717
bootstrap-servers:
18-
- localhost:9093
18+
- localhost:9092
1919
consumer:
2020
group-id: integration-test-group
2121
auto-offset-reset: earliest

0 commit comments

Comments
 (0)