Spm 441#38
Conversation
Walkthrough이 PR은 Material과 Part 이벤트 시스템을 개선하여 Changes
Sequence Diagram(s)sequenceDiagram
participant Service as Material/PartService
participant OutboxService as OutboxService
participant Repo as OutboxRepository
participant Publisher as OutboxPublisher
participant Processor as OutboxEventProcessor
participant Kafka as Kafka Topic
Service->>Service: Build MaterialEvent/PartEvent<br/>(eventId, eventType, version,<br/>occurredAt, payload)
Service->>OutboxService: saveEvent(fullEvent)
OutboxService->>Repo: save(Outbox with<br/>serialized event)
Note over Publisher: Scheduled Task
Publisher->>Repo: findTop10ByStatusReadyOrFailedWith<br/>RetryLimitOrderByCreatedAtAsc(10)
Repo-->>Publisher: List<Outbox>
loop For each Outbox record
Publisher->>Processor: Deserialize payload
Processor->>Processor: Deserialize to<br/>MaterialEvent/PartEvent class
Processor->>Kafka: Send event
Publisher->>Repo: Update status to PUBLISHED
end
Note over Repo: Failed records within retry limit<br/>are included in query result
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes
Possibly related PRs
Suggested labels
Suggested reviewers
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 inconclusive)
✅ Passed checks (2 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 5
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
src/main/java/com/sampoom/backend/api/part/service/PartService.java (1)
215-244: 심각: 이벤트 직렬화/역직렬화 불일치 (updatePart)createPart와 동일한 문제가 있습니다. 전체 PartEvent를 생성하지만 payload만 전달하여 역직렬화 실패가 발생합니다.
다음과 같이 수정하세요:
outboxService.saveEvent( "PART", part.getId(), "PartUpdated", part.getVersion(), - partEvent.getPayload() + partEvent );
🧹 Nitpick comments (2)
src/main/java/com/sampoom/backend/common/outbox/service/OutboxEventProcessor.java (1)
91-95: MATERIAL 이벤트 역직렬화 개선 완료, 패턴 통일 고려 가능전체 MaterialEvent 객체를 직접 역직렬화하는 방식으로 변경되어 PART와 일관된 패턴을 따릅니다.
다만, PART_GROUP, PART_CATEGORY, BOM, MATERIAL_CATEGORY는 여전히 이전 패턴(Payload 역직렬화 + 이벤트 빌더 구성)을 사용하고 있습니다. 향후 유지보수성을 위해 모든 aggregate type이 동일한 패턴을 따르도록 통일하는 것을 고려해보세요.
src/main/java/com/sampoom/backend/api/material/service/MaterialService.java (1)
113-130: 코드 중복 개선 고려MaterialEvent 생성 로직이 3군데에서 반복됩니다. PartService와 유사한 헬퍼 메서드 추가를 고려해보세요.
private MaterialEvent buildMaterialEvent(Material material, String eventType, boolean deleted) { return MaterialEvent.builder() .eventId(UUID.randomUUID().toString()) .eventType(eventType) .version(material.getVersion()) .occurredAt(OffsetDateTime.now().toString()) .payload(MaterialEvent.Payload.builder() .materialId(material.getId()) .materialCode(material.getMaterialCode()) .name(material.getName()) .materialUnit(material.getMaterialUnit()) .baseQuantity(material.getBaseQuantity()) .standardQuantity(material.getStandardQuantity() != null ? material.getStandardQuantity() : 1) .leadTime(material.getLeadTime()) .deleted(deleted) .materialCategoryId(material.getMaterialCategory().getId()) .standardCost(material.getStandardCost()) .build()) .build(); }
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (9)
src/main/java/com/sampoom/backend/api/material/event/dto/MaterialEvent.java(1 hunks)src/main/java/com/sampoom/backend/api/material/event/service/MaterialEventBatchService.java(1 hunks)src/main/java/com/sampoom/backend/api/material/service/MaterialService.java(3 hunks)src/main/java/com/sampoom/backend/api/part/event/dto/PartEvent.java(1 hunks)src/main/java/com/sampoom/backend/api/part/event/service/PartEventBatchService.java(1 hunks)src/main/java/com/sampoom/backend/api/part/service/PartService.java(5 hunks)src/main/java/com/sampoom/backend/common/outbox/repository/OutboxRepository.java(1 hunks)src/main/java/com/sampoom/backend/common/outbox/service/OutboxEventProcessor.java(2 hunks)src/main/java/com/sampoom/backend/common/outbox/service/OutboxPublisher.java(1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
- GitHub Check: Analyze (java-kotlin)
🔇 Additional comments (10)
src/main/java/com/sampoom/backend/common/outbox/service/OutboxEventProcessor.java (1)
49-52: PART 이벤트 역직렬화 방식 개선 완료전체 PartEvent 객체를 직접 역직렬화하는 방식으로 변경되어 코드가 간결해졌습니다. PartService에서 전체 이벤트 객체를 직렬화하는 방식과 일치합니다.
src/main/java/com/sampoom/backend/api/part/event/dto/PartEvent.java (1)
27-29: standardQuantity 필드 추가 완료기준수량(standardQuantity) 필드가 적절히 추가되었으며, 안전재고(baseQuantity)와 함께 재고 관리에 필요한 정보를 제공합니다.
src/main/java/com/sampoom/backend/api/material/event/dto/MaterialEvent.java (1)
30-30: standardQuantity 필드 추가 완료PartEvent와 동일한 패턴으로 기준수량 필드가 추가되어 일관성이 유지됩니다.
src/main/java/com/sampoom/backend/api/material/event/service/MaterialEventBatchService.java (1)
32-61: 올바른 이벤트 직렬화 구현전체 MaterialEvent 객체를 생성하고 직렬화하여(line 57) OutboxEventProcessor의 역직렬화와 일치합니다. standardQuantity 기본값 처리도 적절합니다.
src/main/java/com/sampoom/backend/api/part/event/service/PartEventBatchService.java (1)
45-76: 올바른 이벤트 직렬화 구현전체 PartEvent 객체를 생성하고 직렬화하여(line 71) OutboxEventProcessor의 역직렬화와 일치합니다. MaterialEventBatchService와 동일한 패턴을 따릅니다.
src/main/java/com/sampoom/backend/api/material/service/MaterialService.java (3)
112-138: 올바른 이벤트 직렬화 구현 (createMaterial)전체 MaterialEvent 객체를 OutboxService에 전달하여(line 137) OutboxEventProcessor의 역직렬화와 일치합니다. 이것이 올바른 패턴입니다.
참고: PartService.java는 현재 payload만 전달하는 잘못된 패턴을 사용하고 있으므로 수정이 필요합니다.
174-200: 올바른 이벤트 직렬화 구현 (updateMaterial)전체 MaterialEvent 객체를 전달하는 올바른 패턴을 따릅니다.
211-237: 올바른 이벤트 직렬화 구현 (deleteMaterial)전체 MaterialEvent 객체를 전달하는 올바른 패턴을 따릅니다.
src/main/java/com/sampoom/backend/common/outbox/service/OutboxPublisher.java (1)
22-43: 재시도 로직 개선 완료최대 10회 재시도 로직이 추가되어 일시적 장애에 대한 복원력이 향상되었습니다. FAILED 이벤트의 재시도 로그(lines 40-43)는 디버깅에 유용합니다.
5초 간격으로 10회 재시도는 합리적인 설정이며, 이후에는 수동 개입이 필요한 것으로 간주됩니다.
src/main/java/com/sampoom/backend/common/outbox/repository/OutboxRepository.java (1)
6-7: LGTM!커스텀 쿼리에 필요한 import가 올바르게 추가되었습니다.
📝 Summary
🙏 Question & PR point
📬 Reference
Summary by CodeRabbit
릴리스 노트
New Features
Improvements