Conversation
재주문 점 도달 시 복잡도가 높은 부품은 제외하고 주문한다
|
Warning Rate limit exceeded@vivivim has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 14 minutes and 14 seconds before requesting another review. ⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. 📒 Files selected for processing (15)
요약이 풀 리퀘스트는 BOM(Bill of Materials) 도메인 모델을 도입하고 이벤트 인프라를 리팩토링합니다. BomPayload DTO, Bom JPA 엔티티, BomComplexity 열거형, 이벤트 컨슈머/서비스/저장소를 추가하고 Event 및 EventPayloadMapper의 패키지를 이동하여 여러 컨슈머의 임포트를 업데이트합니다. ROP 조회 쿼리와 인벤토리 주문 수량 로직도 확장되었습니다. WalkthroughBOM 도메인(엔티티/DTO/레포/서비스/이벤트 컨슈머) 추가 및 이벤트 인프라 패키지 이동과 ROP 쿼리·인벤토리 주문 로직 확장이 이루어졌습니다. Changes
Sequence Diagram(s)sequenceDiagram
autonumber
actor Kafka as Kafka<br/>(bom-events)
participant Consumer as BomEventConsumer
participant EventSvc as EventService / EventPayloadMapper
participant Service as BomService
participant Repo as BomRepository
Kafka->>Consumer: JSON message
activate Consumer
Consumer->>EventSvc: getEventType(JsonNode)
EventSvc-->>Consumer: eventType
Consumer->>EventSvc: getEventFromType(eventType, message)
EventSvc-->>Consumer: Event<BomPayload>
Consumer->>Consumer: deserialize payload
alt BomCreated
Consumer->>Service: createBom(payload)
activate Service
Service->>Repo: findBomById(bomId)
alt exists
Service-->>Service: log & return
else
Service->>Repo: save(new Bom)
end
deactivate Service
else BomUpdated
Consumer->>Service: updateBom(payload)
activate Service
Service->>Repo: findBomById(bomId)
alt found
Service->>Repo: save(updated Bom)
else
Service-->>Service: log & return
end
deactivate Service
else unknown
Consumer-->>Consumer: log skip
end
deactivate Consumer
Estimated code review effort🎯 4 (Complex) | ⏱️ ~40 minutes 검토 시 주의 사항:
Possibly related PRs
Suggested labels
Suggested reviewers
Poem
Pre-merge checks and finishing touches❌ Failed checks (2 warnings)
✅ Passed checks (1 passed)
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: 4
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (2)
src/main/java/com/sampoom/backend/api/part/event/PartEventConsumer.java (1)
31-35: 알 수 없는 이벤트 유형에 대한 방어 로직 추가 필요
EventPayloadMapper가 아직 등록하지 않은 이벤트를 받으면payloadClass가null이 되어 바로 아래constructParametricType호출에서 NPE가 발생하고 메시지 처리가 실패합니다. 최소한 null을 검사해 미등록 이벤트를 건너뛰도록 방어 로직을 추가해 주세요.String eventType = root.get("eventType").asText(); Class<?> payloadClass = eventPayloadMapper.getPayloadClass(eventType); + if (payloadClass == null) { + log.info("⚠️ Unknown event type, skipping: {}", eventType); + return; + } Event<?> event = objectMapper.readValue(src/main/java/com/sampoom/backend/api/inventory/event/ForecastEventConsumer.java (1)
24-34: 미등록 이벤트 타입 처리 누락으로 인한 NPE 위험
getPayloadClass가null을 반환하는 경우를 고려하지 않아constructParametricType호출에서 NPE가 발생할 수 있고, 이때 파티션 전체 처리가 중단됩니다. 미등록 이벤트는 로그만 남기고 건너뛰도록 해 주세요.String eventType = root.get("eventType").asText(); Class<?> payloadClass = eventPayloadMapper.getPayloadClass(eventType); + if (payloadClass == null) { + log.info("⚠️ Unknown event type, skipping: {}", eventType); + return; + } Event<?> event = objectMapper.readValue(
🧹 Nitpick comments (5)
src/main/java/com/sampoom/backend/api/part/repository/PartGroupRepository.java (1)
6-6: JpaRepository 인터페이스에 @repository 어노테이션은 선택 사항입니다.Spring Data JPA는 JpaRepository를 확장하는 인터페이스를 자동으로 감지하고 빈으로 등록하므로
@Repository어노테이션이 기술적으로는 불필요합니다. 그러나 컴포넌트 역할을 명시적으로 선언하고 일관성을 유지하기 위한 스타일 선택으로 사용할 수 있으므로, 현재 상태로 유지해도 무방합니다.Also applies to: 10-10
src/main/java/com/sampoom/backend/api/part/repository/PartRepository.java (1)
5-5: JpaRepository 인터페이스에 @repository 어노테이션은 선택 사항입니다.Spring Data JPA가 JpaRepository 인터페이스를 자동으로 빈으로 등록하므로
@Repository어노테이션이 기술적으로는 중복됩니다. 그러나 명시적인 선언을 통한 일관성 유지 측면에서 현재 상태로 유지 가능합니다.Also applies to: 10-10
src/main/java/com/sampoom/backend/api/part/repository/CategoryRepository.java (2)
5-5: JpaRepository 인터페이스에 @repository 어노테이션은 선택 사항입니다.Spring Data JPA가 자동으로 인터페이스를 감지하고 등록하므로
@Repository어노테이션이 기술적으로는 불필요합니다. 다만 명시적 선언을 통한 팀 전체의 일관성 유지를 위한 것이라면 현재 상태로 유지 가능합니다.Also applies to: 9-9
11-11: findAll() 메서드 선언은 중복입니다.
findAll()메서드는 이미JpaRepository인터페이스에서 상속되므로 명시적으로 재선언할 필요가 없습니다. 제거해도 동일하게 동작합니다.다음과 같이 제거할 수 있습니다:
@Repository public interface CategoryRepository extends JpaRepository<Category, Long> { - List<Category> findAll(); }src/main/java/com/sampoom/backend/api/bom/event/BomEventConsumer.java (1)
55-57: 예외 로그에 스택트레이스를 포함해 주세요
현재는e.getMessage()만 남겨서 원인 파악이 어려우니, 예외 객체를 그대로 전달해 스택트레이스를 남기는 편이 좋습니다.- log.error("❌ Failed to process bom event: {}, {}", message, e.getMessage()); + log.error("❌ Failed to process bom event: {}", message, e);
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (18)
src/main/java/com/sampoom/backend/api/bom/dto/BomPayload.java(1 hunks)src/main/java/com/sampoom/backend/api/bom/entity/Bom.java(1 hunks)src/main/java/com/sampoom/backend/api/bom/entity/BomComplexity.java(1 hunks)src/main/java/com/sampoom/backend/api/bom/event/BomEventConsumer.java(1 hunks)src/main/java/com/sampoom/backend/api/bom/repository/BomRepository.java(1 hunks)src/main/java/com/sampoom/backend/api/bom/service/BomService.java(1 hunks)src/main/java/com/sampoom/backend/api/branch/event/BranchEventConsumer.java(1 hunks)src/main/java/com/sampoom/backend/api/event/entity/Event.java(1 hunks)src/main/java/com/sampoom/backend/api/event/service/EventPayloadMapper.java(2 hunks)src/main/java/com/sampoom/backend/api/inventory/event/ForecastEventConsumer.java(1 hunks)src/main/java/com/sampoom/backend/api/inventory/service/InventoryService.java(3 hunks)src/main/java/com/sampoom/backend/api/order/event/PurchaseEventConsumer.java(1 hunks)src/main/java/com/sampoom/backend/api/part/event/PartEventConsumer.java(1 hunks)src/main/java/com/sampoom/backend/api/part/repository/CategoryRepository.java(1 hunks)src/main/java/com/sampoom/backend/api/part/repository/PartGroupRepository.java(1 hunks)src/main/java/com/sampoom/backend/api/part/repository/PartRepository.java(1 hunks)src/main/java/com/sampoom/backend/api/rop/repository/RopQueryRepository.java(1 hunks)src/main/java/com/sampoom/backend/api/rop/repository/RopQueryRepositoryImpl.java(3 hunks)
🧰 Additional context used
🧬 Code graph analysis (7)
src/main/java/com/sampoom/backend/api/bom/event/BomEventConsumer.java (4)
src/main/java/com/sampoom/backend/api/bom/service/BomService.java (1)
Service(10-46)src/main/java/com/sampoom/backend/api/branch/event/BranchEventConsumer.java (1)
Service(17-52)src/main/java/com/sampoom/backend/api/inventory/event/ForecastEventConsumer.java (1)
Service(13-42)src/main/java/com/sampoom/backend/api/part/event/PartEventConsumer.java (1)
Service(17-63)
src/main/java/com/sampoom/backend/api/bom/repository/BomRepository.java (1)
src/main/java/com/sampoom/backend/api/rop/repository/RopQueryRepositoryImpl.java (1)
Repository(24-108)
src/main/java/com/sampoom/backend/api/bom/dto/BomPayload.java (1)
src/main/java/com/sampoom/backend/api/event/entity/Event.java (1)
Getter(8-16)
src/main/java/com/sampoom/backend/api/bom/entity/Bom.java (2)
src/main/java/com/sampoom/backend/api/bom/dto/BomPayload.java (1)
Getter(10-20)src/main/java/com/sampoom/backend/api/event/entity/Event.java (1)
Getter(8-16)
src/main/java/com/sampoom/backend/api/bom/service/BomService.java (1)
src/main/java/com/sampoom/backend/api/bom/event/BomEventConsumer.java (1)
Service(15-60)
src/main/java/com/sampoom/backend/api/part/repository/PartRepository.java (2)
src/main/java/com/sampoom/backend/api/rop/repository/RopQueryRepositoryImpl.java (1)
Repository(24-108)src/main/java/com/sampoom/backend/api/order/repository/PurchaseOrderQueryRepositoryImpl.java (1)
Repository(21-96)
src/main/java/com/sampoom/backend/api/part/repository/CategoryRepository.java (1)
src/main/java/com/sampoom/backend/api/rop/repository/RopQueryRepositoryImpl.java (1)
Repository(24-108)
⏰ 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 (9)
src/main/java/com/sampoom/backend/api/order/event/PurchaseEventConsumer.java (1)
1-54: 전체 파일이 주석 처리되어 있어 기능적 영향 없음파일 전체가 주석 처리되어 있으며, 변경 사항은 import 경로 업데이트만 포함하고 있습니다. 런타임 동작에는 영향이 없습니다.
src/main/java/com/sampoom/backend/api/bom/entity/BomComplexity.java (1)
3-7: 잘 정의된 enum입니다BOM 복잡도를 명확하게 표현하는 enum이며, 한글 주석으로 가독성이 좋습니다.
src/main/java/com/sampoom/backend/api/branch/event/BranchEventConsumer.java (1)
9-10: Import 경로 업데이트 확인패키지 리팩토링에 따른 import 경로 변경이며, 기능적 변경 사항은 없습니다.
src/main/java/com/sampoom/backend/api/rop/repository/RopQueryRepository.java (1)
14-14: 새로운 쿼리 메서드 선언 확인메서드명이 명확하며, PR 목표인 복잡도 기반 부품 필터링을 위한 쿼리 메서드입니다. 구현은 RopQueryRepositoryImpl에서 확인됩니다.
src/main/java/com/sampoom/backend/api/event/entity/Event.java (1)
1-16: 이벤트 클래스 패키지 리팩토링 확인Event 클래스가 전용 이벤트 패키지로 이동되었으며, 불필요한 Lombok 생성자 어노테이션이 제거되었습니다. 기능적 변경은 없습니다.
src/main/java/com/sampoom/backend/api/bom/dto/BomPayload.java (1)
14-20: BomPayload DTO 구조 확인BOM 이벤트를 위한 표준 DTO 구조입니다. 모든 필드가 nullable이므로 서비스 레이어에서 적절한 검증이 필요할 수 있습니다.
src/main/java/com/sampoom/backend/api/rop/repository/RopQueryRepositoryImpl.java (1)
31-31: QueryDSL QBom 필드 선언 확인BOM 조인을 위한 표준 QueryDSL 패턴입니다.
src/main/java/com/sampoom/backend/api/inventory/service/InventoryService.java (2)
14-14: Import 경로 업데이트 확인Event 클래스의 패키지 이동에 따른 import 경로 변경입니다.
216-220: 복잡도 기반 부품 필터링 적용 확인PR 목표에 따라 ROP 도달 시 낮은 복잡도의 부품만 주문하도록
findActiveRopExcludingComplexParts메서드를 사용하고 있습니다. 변경 사항이 요구사항과 일치합니다.
src/main/java/com/sampoom/backend/api/bom/event/BomEventConsumer.java
Outdated
Show resolved
Hide resolved
src/main/java/com/sampoom/backend/api/inventory/service/InventoryService.java
Show resolved
Hide resolved
src/main/java/com/sampoom/backend/api/rop/repository/RopQueryRepositoryImpl.java
Show resolved
Hide resolved
파싱 로직 리팩토링 조금
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/branch/event/BranchEventConsumer.java (1)
44-48: 로그 메시지를 수정하세요.로그 메시지에 "partCreated saved"라고 되어 있지만 "branchCreated saved"로 수정해야 합니다. 복사-붙여넣기 오류로 보입니다.
- log.info("✅ partCreated saved: {}", payload.getBranchName()); + log.info("✅ branchCreated saved: {}", payload.getBranchName());
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (6)
src/main/java/com/sampoom/backend/api/bom/event/BomEventConsumer.java(1 hunks)src/main/java/com/sampoom/backend/api/branch/event/BranchEventConsumer.java(3 hunks)src/main/java/com/sampoom/backend/api/event/service/EventService.java(3 hunks)src/main/java/com/sampoom/backend/api/inventory/event/ForecastEventConsumer.java(1 hunks)src/main/java/com/sampoom/backend/api/order/event/PurchaseEventConsumer.java(1 hunks)src/main/java/com/sampoom/backend/api/part/event/PartEventConsumer.java(2 hunks)
🧰 Additional context used
🧬 Code graph analysis (3)
src/main/java/com/sampoom/backend/api/order/event/PurchaseEventConsumer.java (2)
src/main/java/com/sampoom/backend/api/event/service/EventService.java (1)
Service(15-60)src/main/java/com/sampoom/backend/api/order/service/PurchaseOrderService.java (1)
Service(35-193)
src/main/java/com/sampoom/backend/api/bom/event/BomEventConsumer.java (2)
src/main/java/com/sampoom/backend/api/event/service/EventService.java (1)
Service(15-60)src/main/java/com/sampoom/backend/api/bom/service/BomService.java (1)
Service(10-46)
src/main/java/com/sampoom/backend/api/inventory/event/ForecastEventConsumer.java (2)
src/main/java/com/sampoom/backend/api/event/service/EventService.java (1)
Service(15-60)src/main/java/com/sampoom/backend/api/inventory/service/InventoryService.java (1)
Service(40-344)
⏰ 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 (3)
src/main/java/com/sampoom/backend/api/branch/event/BranchEventConsumer.java (3)
23-23: LGTM!
EventPayloadMapper에서EventService로의 의존성 전환이 적절하게 이루어졌습니다.
38-42: LGTM!
Event객체 생성 후 null 체크와 로깅 처리가 적절하게 구현되었습니다. 방어적 코딩 패턴이 잘 적용되었습니다.
32-36: 원본 review comment는 잘못되었습니다.
eventService.getEventType()의 메서드 시그니처를 확인한 결과,public String getEventType(JsonNode jsonNode)로 이미JsonNode를 parameter로 받도록 설계되어 있습니다. 따라서root.get("eventType")에서.asText()호출이 필요하지 않습니다. 현재 코드는 정확하게 구현되어 있으며, null/empty 체크 로직도 적절합니다.Likely an incorrect or invalid review comment.
📝 Summary
rop 재주문점 도달 시 발주 넣을 때 복잡도 낮은 부품만 주문하는 것으로 변경.
주문 시 기준 수량에 맞춰서 주문합니다.
🙏 Question & PR point
📬 Reference
Summary by CodeRabbit
릴리스 노트
New Features
Refactor