Skip to content

Commit ad301fb

Browse files
Merge pull request #10 from EarlyExpress/7-feature-결제-관련-서비스-구현
refactor(message): event 일관성 리팩토링
2 parents 25cc5c3 + 296125a commit ad301fb

15 files changed

Lines changed: 460 additions & 526 deletions

File tree

src/main/java/com/early_express/payment_service/domain/payment/application/service/PaymentService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import com.early_express.payment_service.domain.payment.domain.model.Payment;
66
import com.early_express.payment_service.domain.payment.domain.model.vo.*;
77
import com.early_express.payment_service.domain.payment.domain.repository.PaymentRepository;
8-
import com.early_express.payment_service.domain.payment.domain.client.TossPaymentsClient;
8+
import com.early_express.payment_service.domain.payment.infrastructure.client.toss.TossPaymentsClient;
99
import com.early_express.payment_service.domain.payment.infrastructure.client.toss.dto.TossCancelRequest;
1010
import com.early_express.payment_service.domain.payment.infrastructure.client.toss.dto.TossCancelResponse;
1111
import com.early_express.payment_service.domain.payment.infrastructure.client.toss.dto.TossPaymentVerifyResponse;

src/main/java/com/early_express/payment_service/domain/payment/domain/client/TossPaymentsClient.java renamed to src/main/java/com/early_express/payment_service/domain/payment/infrastructure/client/toss/TossPaymentsClient.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
package com.early_express.payment_service.domain.payment.domain.client;
1+
package com.early_express.payment_service.domain.payment.infrastructure.client.toss;
22

3-
import com.early_express.payment_service.domain.payment.infrastructure.client.toss.TossPaymentsClientConfig;
43
import com.early_express.payment_service.domain.payment.infrastructure.client.toss.dto.TossCancelRequest;
54
import com.early_express.payment_service.domain.payment.infrastructure.client.toss.dto.TossCancelResponse;
65
import com.early_express.payment_service.domain.payment.infrastructure.client.toss.dto.TossPaymentVerifyResponse;

src/main/java/com/early_express/payment_service/domain/payment/infrastructure/messaging/consumer/RefundRequestedEventConsumer.java

Lines changed: 0 additions & 78 deletions
This file was deleted.

src/main/java/com/early_express/payment_service/domain/payment/infrastructure/messaging/event/RefundRequestedEvent.java

Lines changed: 0 additions & 56 deletions
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package com.early_express.payment_service.domain.payment.infrastructure.messaging.order.consumer;
2+
3+
import com.early_express.payment_service.domain.payment.application.service.PaymentService;
4+
import com.early_express.payment_service.domain.payment.infrastructure.messaging.order.event.RefundRequestedEvent;
5+
import lombok.RequiredArgsConstructor;
6+
import lombok.extern.slf4j.Slf4j;
7+
import org.springframework.kafka.annotation.KafkaListener;
8+
import org.springframework.kafka.support.Acknowledgment;
9+
import org.springframework.kafka.support.KafkaHeaders;
10+
import org.springframework.messaging.handler.annotation.Header;
11+
import org.springframework.messaging.handler.annotation.Payload;
12+
import org.springframework.stereotype.Component;
13+
14+
/**
15+
* 환불 요청 이벤트 Consumer
16+
* Order Service에서 발행한 환불 요청을 수신하여 처리
17+
* Topic: refund-requested (토픽 분리 패턴)
18+
*/
19+
@Slf4j
20+
@Component
21+
@RequiredArgsConstructor
22+
public class RefundRequestedEventConsumer {
23+
24+
private final PaymentService paymentService;
25+
26+
/**
27+
* 환불 요청 이벤트 수신
28+
* Topic: refund-requested
29+
*/
30+
@KafkaListener(
31+
topics = "${spring.kafka.topic.refund-requested:refund-requested}",
32+
groupId = "${spring.kafka.consumer.group-id:payment-service-group}",
33+
containerFactory = "kafkaListenerContainerFactory"
34+
)
35+
public void handleRefundRequested(
36+
@Payload RefundRequestedEvent event,
37+
@Header(KafkaHeaders.RECEIVED_PARTITION) int partition,
38+
@Header(KafkaHeaders.OFFSET) long offset,
39+
Acknowledgment acknowledgment) {
40+
41+
log.info("환불 요청 이벤트 수신 - paymentId: {}, orderId: {}, partition: {}, offset: {}",
42+
event.getPaymentId(), event.getOrderId(), partition, offset);
43+
44+
try {
45+
// PaymentService의 cancelPayment 메서드 호출
46+
paymentService.cancelPayment(
47+
event.getPaymentId(),
48+
event.getOrderId(),
49+
event.getRefundReason()
50+
);
51+
52+
// 수동 커밋
53+
acknowledgment.acknowledge();
54+
55+
log.info("환불 요청 처리 완료 - paymentId: {}, orderId: {}",
56+
event.getPaymentId(), event.getOrderId());
57+
58+
} catch (Exception e) {
59+
log.error("환불 요청 처리 실패 - paymentId: {}, orderId: {}, error: {}",
60+
event.getPaymentId(), event.getOrderId(), e.getMessage(), e);
61+
62+
// 재시도를 위해 ACK 하지 않음
63+
throw e;
64+
}
65+
}
66+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package com.early_express.payment_service.domain.payment.infrastructure.messaging.order.event;
2+
3+
import com.early_express.payment_service.global.infrastructure.event.base.BaseEvent;
4+
import com.fasterxml.jackson.annotation.JsonFormat;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
import lombok.experimental.SuperBuilder;
8+
9+
import java.time.LocalDateTime;
10+
11+
/**
12+
* 환불 요청 이벤트 (Order Service → Payment Service)
13+
* 수신 전용 이벤트
14+
* Topic: refund-requested
15+
*/
16+
@Getter
17+
@SuperBuilder
18+
@NoArgsConstructor
19+
public class RefundRequestedEvent extends BaseEvent {
20+
21+
private String paymentId;
22+
private String orderId;
23+
private String refundReason;
24+
25+
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
26+
private LocalDateTime requestedAt;
27+
}

src/main/java/com/early_express/payment_service/domain/payment/infrastructure/messaging/event/PaymentRefundFailedEvent.java renamed to src/main/java/com/early_express/payment_service/domain/payment/infrastructure/messaging/payment/event/PaymentRefundFailedEvent.java

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
1-
package com.early_express.payment_service.domain.payment.infrastructure.messaging.event;
1+
package com.early_express.payment_service.domain.payment.infrastructure.messaging.payment.event;
22

33
import com.early_express.payment_service.domain.payment.domain.messaging.PaymentRefundFailedEventData;
44
import com.early_express.payment_service.global.infrastructure.event.base.BaseEvent;
55
import com.fasterxml.jackson.annotation.JsonFormat;
6-
import lombok.Builder;
76
import lombok.Getter;
87
import lombok.NoArgsConstructor;
8+
import lombok.experimental.SuperBuilder;
99

1010
import java.math.BigDecimal;
1111
import java.time.LocalDateTime;
1212

1313
/**
1414
* 결제 환불 실패 이벤트 (Kafka 전송용)
15-
* Topic: payment-events
15+
* Topic: payment-refund-failed
1616
*/
1717
@Getter
18+
@SuperBuilder
1819
@NoArgsConstructor
1920
public class PaymentRefundFailedEvent extends BaseEvent {
2021

@@ -26,33 +27,19 @@ public class PaymentRefundFailedEvent extends BaseEvent {
2627
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
2728
private LocalDateTime failedAt;
2829

29-
@Builder
30-
private PaymentRefundFailedEvent(
31-
String paymentId,
32-
String orderId,
33-
BigDecimal requestedRefundAmount,
34-
String errorMessage,
35-
LocalDateTime failedAt) {
36-
37-
super.initBaseEvent("PaymentRefundFailedEvent", "payment-service");
38-
39-
this.paymentId = paymentId;
40-
this.orderId = orderId;
41-
this.requestedRefundAmount = requestedRefundAmount;
42-
this.errorMessage = errorMessage;
43-
this.failedAt = failedAt;
44-
}
45-
4630
/**
4731
* 도메인 이벤트 데이터로부터 Kafka 이벤트 생성
4832
*/
4933
public static PaymentRefundFailedEvent from(PaymentRefundFailedEventData data) {
50-
return PaymentRefundFailedEvent.builder()
34+
PaymentRefundFailedEvent event = PaymentRefundFailedEvent.builder()
5135
.paymentId(data.getPaymentId())
5236
.orderId(data.getOrderId())
5337
.requestedRefundAmount(data.getRequestedRefundAmount())
5438
.errorMessage(data.getErrorMessage())
5539
.failedAt(data.getFailedAt())
5640
.build();
41+
42+
event.initBaseEvent("PAYMENT_REFUND_FAILED", "payment-service");
43+
return event;
5744
}
58-
}
45+
}

src/main/java/com/early_express/payment_service/domain/payment/infrastructure/messaging/event/PaymentRefundedEvent.java renamed to src/main/java/com/early_express/payment_service/domain/payment/infrastructure/messaging/payment/event/PaymentRefundedEvent.java

Lines changed: 9 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
1-
package com.early_express.payment_service.domain.payment.infrastructure.messaging.event;
1+
package com.early_express.payment_service.domain.payment.infrastructure.messaging.payment.event;
22

33
import com.early_express.payment_service.domain.payment.domain.messaging.PaymentRefundedEventData;
44
import com.early_express.payment_service.global.infrastructure.event.base.BaseEvent;
55
import com.fasterxml.jackson.annotation.JsonFormat;
6-
import lombok.Builder;
76
import lombok.Getter;
87
import lombok.NoArgsConstructor;
8+
import lombok.experimental.SuperBuilder;
99

1010
import java.math.BigDecimal;
1111
import java.time.LocalDateTime;
1212

1313
/**
1414
* 결제 환불 완료 이벤트 (Kafka 전송용)
15-
* Topic: payment-events
15+
* Topic: payment-refunded
1616
*/
1717
@Getter
18+
@SuperBuilder
1819
@NoArgsConstructor
1920
public class PaymentRefundedEvent extends BaseEvent {
2021

@@ -29,34 +30,11 @@ public class PaymentRefundedEvent extends BaseEvent {
2930
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
3031
private LocalDateTime refundedAt;
3132

32-
@Builder
33-
private PaymentRefundedEvent(
34-
String paymentId,
35-
String orderId,
36-
BigDecimal refundAmount,
37-
BigDecimal totalRefundedAmount,
38-
String refundReason,
39-
String pgRefundId,
40-
boolean fullRefund,
41-
LocalDateTime refundedAt) {
42-
43-
super.initBaseEvent("PaymentRefundedEvent", "payment-service");
44-
45-
this.paymentId = paymentId;
46-
this.orderId = orderId;
47-
this.refundAmount = refundAmount;
48-
this.totalRefundedAmount = totalRefundedAmount;
49-
this.refundReason = refundReason;
50-
this.pgRefundId = pgRefundId;
51-
this.fullRefund = fullRefund;
52-
this.refundedAt = refundedAt;
53-
}
54-
5533
/**
5634
* 도메인 이벤트 데이터로부터 Kafka 이벤트 생성
5735
*/
5836
public static PaymentRefundedEvent from(PaymentRefundedEventData data) {
59-
return PaymentRefundedEvent.builder()
37+
PaymentRefundedEvent event = PaymentRefundedEvent.builder()
6038
.paymentId(data.getPaymentId())
6139
.orderId(data.getOrderId())
6240
.refundAmount(data.getRefundAmount())
@@ -66,5 +44,8 @@ public static PaymentRefundedEvent from(PaymentRefundedEventData data) {
6644
.fullRefund(data.isFullRefund())
6745
.refundedAt(data.getRefundedAt())
6846
.build();
47+
48+
event.initBaseEvent("PAYMENT_REFUNDED", "payment-service");
49+
return event;
6950
}
70-
}
51+
}

0 commit comments

Comments
 (0)