Skip to content

Spm 360#30

Merged
vivivim merged 15 commits intomainfrom
SPM-360
Nov 3, 2025
Merged

Spm 360#30
vivivim merged 15 commits intomainfrom
SPM-360

Conversation

@vivivim
Copy link
Contributor

@vivivim vivivim commented Nov 3, 2025

📝 Summary

파트 업데이트, 지점, 거리 이벤트 처리

🙏 Question & PR point

📬 Reference

Summary by CodeRabbit

  • 새로운 기능

    • 이벤트 기반 지점 생성 및 거리/이동시간 소비자 추가
    • 지점·거리·부품 페이로드 구조 추가 및 부품 업데이트(리드타임·표준비용) 기능 추가
  • 개선사항

    • 지점에 코드·위도·경도·소프트삭제 필드 추가
    • 거리 값 정밀도 향상 및 관련 엔터티 확장
    • 거리 존재 여부 검증 로직 추가
  • 버그 수정 / 안정성

    • 중복 거리 등록 방지 및 적절한 오류 응답 추가
  • 주의

    • 기존 지점 생성 REST 엔드포인트가 제거되었습니다.

@coderabbitai
Copy link

coderabbitai bot commented Nov 3, 2025

Warning

Rate limit exceeded

@vivivim has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 10 minutes and 38 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

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.

📥 Commits

Reviewing files that changed from the base of the PR and between 11e0f56 and 279a2ba.

📒 Files selected for processing (3)
  • src/main/java/com/sampoom/backend/api/part/dto/PartPayload.java (1 hunks)
  • src/main/java/com/sampoom/backend/api/part/service/PartService.java (5 hunks)
  • src/main/java/com/sampoom/backend/common/response/ErrorStatus.java (1 hunks)

Walkthrough

REST 기반 Branch 생성 엔드포인트와 관련 DTO/응답 및 BranchEvent가 제거되고, Kafka 이벤트 소비자와 페이로드 DTO(BranchPayload, DistancePayload), DistanceService가 추가되었으며 엔티티(Branch, AWDistance, Part)와 리포지토리·서비스·이벤트 매핑이 확장·조정되었습니다.

Changes

Cohort / File(s) 변경 요약
컨트롤러 제거
src/main/java/com/sampoom/backend/api/branch/controller/BranchController.java
REST createBranch 엔드포인트 및 branchService 필드 삭제
요청/응답 DTO 삭제
src/main/java/com/sampoom/backend/api/branch/dto/BranchCreateReqDto.java, src/main/java/com/sampoom/backend/api/branch/dto/BranchCreateResDto.java
기존 Branch 생성용 요청/응답 DTO 전체 삭제
이벤트 페이로드 DTO 추가
src/main/java/com/sampoom/backend/api/branch/dto/BranchPayload.java, src/main/java/com/sampoom/backend/api/branch/dto/DistancePayload.java
이벤트 기반 처리를 위한 페이로드 DTO 신규 추가 (필드 정의, Lombok 접근자)
이벤트 소비자 추가 / 이벤트 클래스 삭제
src/main/java/com/sampoom/backend/api/branch/event/BranchEventConsumer.java, src/main/java/com/sampoom/backend/api/branch/event/BranchEvent.java
Kafka 소비자 BranchEventConsumer 신규 추가(메시지 파싱 → 페이로드 매핑 → 서비스 호출), 기존 BranchEvent 클래스 삭제
Branch 서비스 리팩토링
src/main/java/com/sampoom/backend/api/branch/service/BranchService.java, src/main/java/com/sampoom/backend/api/branch/service/DistanceService.java
BranchService.createBranch 시그니처가 BranchPayload로 변경되고 반환 void화; DistanceService 신규 추가(중복 검사 후 AWDistance 저장)
AWDistance 엔티티 변경
src/main/java/com/sampoom/backend/api/branch/entity/AWDistance.java
@Table 및 unique constraint 추가, 컬럼명 매핑, distance 타입 Long→Double, travelTime·isDeleted 필드 및 생성자 추가
Branch 엔티티 확장
src/main/java/com/sampoom/backend/api/branch/entity/Branch.java
code, latitude, longitude, isDeleted 필드 추가, status 타입 BranchStatus→Status 변경, id의 @GeneratedValue 제거
리포지토리 확장
src/main/java/com/sampoom/backend/api/branch/repository/AWDistanceRepository.java
existsByAgencyIdAndWarehouseId(Long, Long) 메서드 추가
Part 도메인 확장
src/main/java/com/sampoom/backend/api/part/entity/Part.java, src/main/java/com/sampoom/backend/api/part/dto/PartPayload.java
leadTime, standardCost 필드 추가, DTO 필드에 @NotNull 추가·검증 강화, 엔티티에 @Setter 추가
Part 서비스/컨슈머 변경
src/main/java/com/sampoom/backend/api/part/service/PartService.java, src/main/java/com/sampoom/backend/api/part/event/PartEventConsumer.java, src/main/java/com/sampoom/backend/api/part/event/EventPayloadMapper.java
updatePart(PartPayload) 추가 및 create에 leadTime·standardCost 포함, 이벤트 매핑에 BranchPayload·DistancePayload·PartUpdated 처리 추가, 소비자 로깅/흐름 변경
공통 코드 변경
src/main/java/com/sampoom/backend/common/response/ErrorStatus.java, src/main/java/com/sampoom/backend/api/event/entity/EventOutbox.java
DISTANCE_ALREADY_EXIST enum 추가, 사용되지 않는 BranchEvent import 제거
Order 서비스 변경
src/main/java/com/sampoom/backend/api/order/service/OrderService.java
AWDistance 비교 시 tie-breaker 변경(거리 비교 우선순위 반전)

Sequence Diagram(s)

sequenceDiagram
    participant Kafka as Kafka
    participant Consumer as BranchEventConsumer
    participant Mapper as EventPayloadMapper
    participant OM as ObjectMapper
    participant BranchSvc as BranchService
    participant DistSvc as DistanceService
    participant DB as Database

    Kafka->>Consumer: 메시지 전달 (branch-events / branch-distance-events)
    Consumer->>OM: JSON 파싱
    OM->>Mapper: eventType -> payload 클래스 조회
    Mapper-->>OM: payload 클래스 반환
    OM->>Consumer: Event<Payload> 역직렬화

    alt eventType == "BranchCreated"
        Consumer->>BranchSvc: createBranch(BranchPayload)
        BranchSvc->>DB: Branch 저장
        DB-->>BranchSvc: 저장 완료
    else eventType == "DistanceCalculated"
        Consumer->>DistSvc: createDistance(DistancePayload)
        DistSvc->>DB: existsByAgencyIdAndWarehouseId 체크
        alt exists == true
            DistSvc-->>Consumer: 예외(중복)
        else
            DistSvc->>DB: AWDistance 저장
            DB-->>DistSvc: 저장 완료
        end
    end
    Consumer->>Consumer: 처리 결과 로깅
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

  • 주의할 파일/영역:
    • BranchEventConsumer — JSON 역직렬화, eventType→페이로드 매핑, 트랜잭션/예외 전파
    • BranchService.createBranch 호출 영향 범위(이전 REST → 이벤트 기반 전환)
    • DistanceService.createDistance 및 AWDistance unique constraint/exists 체크 일치 여부
    • Branch / AWDistance 엔티티 스키마 변경(타입·컬럼명·제약)
    • PartService.updatePart 및 이벤트 소비자 동작 변경

Possibly related PRs

  • Spm 324 #28 — AWDistance 엔티티·리포지토리 변경과 도메인/쿼리 수정 관련.
  • fix: warehouse event #20 — Branch 이벤트 및 아웃박스 처리 변경과 직접적 연관(BranchEvent 관련).
  • Dev #29 — Branch 및 AWDistance 필드·타입 변경과 연동 관련.

Suggested reviewers

  • Sangyoon98
  • Lee-Jong-Jin
  • yangjiseonn
  • taemin3
  • CHOOSLA

Poem

🐇 카프카 바람 타고 달려왔네,
페이로드 주머니에 지점과 거리 담아,
토끼는 로그에 조용히 발자국 남기고,
DB에 쏴- 저장되면 당근을 쪼갠다,
배포 축하해요, 깡총깡총 🥕✨

Pre-merge checks and finishing touches

❌ Failed checks (1 inconclusive)
Check name Status Explanation Resolution
Title check ❓ Inconclusive PR 제목 'Spm 360'은 매우 모호하고 구체적이지 않습니다. 실제 변경 사항은 부품 업데이트, 지점(브랜치) 생성, 거리 계산 이벤트 처리 등 여러 주요 기능을 포함하고 있으나, 제목은 이러한 내용을 전혀 반영하지 않습니다. 제목만으로는 코드 검토자가 PR의 주요 변경 내용을 파악하기 어렵습니다. PR 제목을 변경하여 주요 변경 사항을 명확하게 설명하는 구체적인 제목으로 수정해주시기 바랍니다. 예를 들어 '파트 업데이트 및 지점-거리 이벤트 처리 구현' 또는 '이벤트 기반 브랜치 및 거리 데이터 처리 추가'와 같이 실제 변경 내용을 반영하는 제목이 좋습니다.
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@taemin3 taemin3 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

화긴

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

🧹 Nitpick comments (3)
src/main/java/com/sampoom/backend/api/branch/service/DistanceService.java (1)

17-21: 페이로드 null 검증 추가를 권장합니다.

페이로드나 필수 필드(agencyId, branchId)가 null일 경우를 대비한 검증이 없습니다. Kafka 메시지 역직렬화 실패 시 예상치 못한 동작이 발생할 수 있습니다.

다음과 같이 null 검증을 추가하는 것을 고려하세요:

 @Transactional
 public void createDistance(DistancePayload payload) {
+    if (payload == null || payload.getAgencyId() == null || payload.getBranchId() == null) {
+        throw new BadRequestException("필수 필드가 누락되었습니다");
+    }
+    
     if (distanceRepository.existsByAgencyIdAndWarehouseId(payload.getAgencyId(), payload.getBranchId()))
         throw new BadRequestException(ErrorStatus.DISTANCE_ALREADY_EXIST.getMessage());
src/main/java/com/sampoom/backend/api/branch/event/BranchEventConsumer.java (1)

41-49: 로그 메시지를 브랜치 맥락에 맞게 정리해주세요.

BranchCreated 이벤트 처리 로그가 partCreated로 남아 있고, 예외 로그도 part event로 표기되어 있어 추적 시 혼동될 것 같습니다. 메시지를 브랜치 이벤트명에 맞추고, 에러 로그는 메시지 구분자를 둬 주세요.

-                log.info("✅ partCreated saved: {}", payload.getBranchName());
+                log.info("✅ branchCreated saved: {}", payload.getBranchName());
@@
-            log.error("❌ Failed to process part event" + message);
+            log.error("❌ Failed to process branch event: {}", message);
src/main/java/com/sampoom/backend/api/branch/entity/AWDistance.java (1)

3-3: 명시적 import 사용을 권장합니다.

와일드카드 import(jakarta.persistence.*)보다는 사용하는 클래스를 명시적으로 import하는 것이 코드의 명확성과 유지보수성 측면에서 더 좋습니다.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1aa43a6 and 5a700e8.

📒 Files selected for processing (20)
  • src/main/java/com/sampoom/backend/api/branch/controller/BranchController.java (0 hunks)
  • src/main/java/com/sampoom/backend/api/branch/dto/BranchCreateReqDto.java (0 hunks)
  • src/main/java/com/sampoom/backend/api/branch/dto/BranchCreateResDto.java (0 hunks)
  • src/main/java/com/sampoom/backend/api/branch/dto/BranchPayload.java (1 hunks)
  • src/main/java/com/sampoom/backend/api/branch/dto/DistancePayload.java (1 hunks)
  • src/main/java/com/sampoom/backend/api/branch/entity/AWDistance.java (2 hunks)
  • src/main/java/com/sampoom/backend/api/branch/entity/Branch.java (2 hunks)
  • src/main/java/com/sampoom/backend/api/branch/event/BranchEvent.java (0 hunks)
  • src/main/java/com/sampoom/backend/api/branch/event/BranchEventConsumer.java (1 hunks)
  • src/main/java/com/sampoom/backend/api/branch/repository/AWDistanceRepository.java (1 hunks)
  • src/main/java/com/sampoom/backend/api/branch/service/BranchService.java (1 hunks)
  • src/main/java/com/sampoom/backend/api/branch/service/DistanceService.java (1 hunks)
  • src/main/java/com/sampoom/backend/api/event/entity/EventOutbox.java (0 hunks)
  • src/main/java/com/sampoom/backend/api/order/service/OrderService.java (1 hunks)
  • src/main/java/com/sampoom/backend/api/part/dto/PartPayload.java (1 hunks)
  • src/main/java/com/sampoom/backend/api/part/entity/Part.java (2 hunks)
  • src/main/java/com/sampoom/backend/api/part/event/EventPayloadMapper.java (2 hunks)
  • src/main/java/com/sampoom/backend/api/part/event/PartEventConsumer.java (2 hunks)
  • src/main/java/com/sampoom/backend/api/part/service/PartService.java (2 hunks)
  • src/main/java/com/sampoom/backend/common/response/ErrorStatus.java (1 hunks)
💤 Files with no reviewable changes (5)
  • src/main/java/com/sampoom/backend/api/branch/dto/BranchCreateResDto.java
  • src/main/java/com/sampoom/backend/api/branch/dto/BranchCreateReqDto.java
  • src/main/java/com/sampoom/backend/api/event/entity/EventOutbox.java
  • src/main/java/com/sampoom/backend/api/branch/controller/BranchController.java
  • src/main/java/com/sampoom/backend/api/branch/event/BranchEvent.java
🧰 Additional context used
🧬 Code graph analysis (7)
src/main/java/com/sampoom/backend/api/branch/service/DistanceService.java (3)
src/main/java/com/sampoom/backend/common/exception/BadRequestException.java (1)
  • BadRequestException (5-14)
src/main/java/com/sampoom/backend/api/branch/event/BranchEventConsumer.java (1)
  • Service (17-52)
src/main/java/com/sampoom/backend/api/branch/service/BranchService.java (1)
  • Service (13-37)
src/main/java/com/sampoom/backend/api/branch/dto/DistancePayload.java (2)
src/main/java/com/sampoom/backend/api/branch/dto/BranchPayload.java (1)
  • Getter (7-18)
src/main/java/com/sampoom/backend/api/part/dto/PartPayload.java (1)
  • Getter (7-21)
src/main/java/com/sampoom/backend/api/branch/dto/BranchPayload.java (2)
src/main/java/com/sampoom/backend/api/branch/dto/DistancePayload.java (1)
  • Getter (6-15)
src/main/java/com/sampoom/backend/api/part/dto/PartPayload.java (1)
  • Getter (7-21)
src/main/java/com/sampoom/backend/api/part/service/PartService.java (1)
src/main/java/com/sampoom/backend/common/exception/NotFoundException.java (1)
  • NotFoundException (5-13)
src/main/java/com/sampoom/backend/api/branch/service/BranchService.java (3)
src/main/java/com/sampoom/backend/common/exception/BadRequestException.java (1)
  • BadRequestException (5-14)
src/main/java/com/sampoom/backend/api/branch/event/BranchEventConsumer.java (1)
  • Service (17-52)
src/main/java/com/sampoom/backend/api/branch/service/DistanceService.java (1)
  • Service (12-32)
src/main/java/com/sampoom/backend/api/branch/event/BranchEventConsumer.java (3)
src/main/java/com/sampoom/backend/api/branch/service/BranchService.java (1)
  • Service (13-37)
src/main/java/com/sampoom/backend/api/branch/service/DistanceService.java (1)
  • Service (12-32)
src/main/java/com/sampoom/backend/api/part/event/PartEventConsumer.java (1)
  • Service (23-69)
src/main/java/com/sampoom/backend/api/branch/entity/AWDistance.java (1)
src/main/java/com/sampoom/backend/api/branch/entity/Branch.java (1)
  • Entity (8-41)
⏰ 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/api/branch/dto/DistancePayload.java (1)

6-15: LGTM!

DTO 구조가 명확하고 다른 페이로드 클래스(BranchPayload, PartPayload)와 일관된 패턴을 따르고 있습니다. 필드 타입도 적절합니다.

src/main/java/com/sampoom/backend/api/part/dto/PartPayload.java (1)

20-20: LGTM!

필드 추가가 Part 엔티티의 standardCost 필드와 일치하며, 타입도 적절합니다.

src/main/java/com/sampoom/backend/common/response/ErrorStatus.java (1)

23-23: LGTM!

에러 상수 정의가 명확하며, 기존 패턴을 잘 따르고 있습니다. HTTP 상태 코드도 적절합니다.

src/main/java/com/sampoom/backend/api/branch/repository/AWDistanceRepository.java (1)

11-11: LGTM!

Spring Data JPA 파생 쿼리 메서드가 올바르게 정의되었으며, DistanceService의 중복 체크 로직과 잘 연동됩니다.

src/main/java/com/sampoom/backend/api/part/event/EventPayloadMapper.java (1)

3-4: LGTM!

새로운 이벤트 타입 매핑이 올바르게 추가되었으며, BranchEventConsumer와 PartEventConsumer에서 사용하는 이벤트 타입과 일치합니다.

Also applies to: 22-25

src/main/java/com/sampoom/backend/api/part/event/PartEventConsumer.java (1)

48-53: LGTM!

PartUpdated 이벤트 처리가 올바르게 추가되었으며, 기존 이벤트 처리 패턴과 일관성을 유지하고 있습니다.

src/main/java/com/sampoom/backend/api/branch/entity/AWDistance.java (4)

29-30: travelTime 필드의 null 허용 여부를 확인하세요.

새로 추가된 travelTime 필드에 nullable = false 제약조건이 없어 null 값이 허용됩니다. 이동 시간이 필수 값인지, 선택적 값인지 비즈니스 요구사항을 확인하고 필요시 제약조건을 추가하세요.

만약 필수 값이라면:

-@Column(name = "travel_time")
+@Column(name = "travel_time", nullable = false)
 private Double travelTime;

32-34: 소프트 삭제 패턴이 잘 구현되었습니다.

isDeleted 필드를 통한 소프트 삭제 패턴이 적절하게 구현되었습니다. @Builder.Default를 사용하여 기본값이 올바르게 설정되고, nullable = false 제약조건도 적절합니다.


17-18: ID 설정 로직이 올바르게 구현되었습니다.

검증 결과, DistanceService에서 AWDistance 엔티티의 ID가 Kafka 이벤트 페이로드의 payload.getDistanceId()로부터 명시적으로 설정되고 있습니다. @Id 필드에 @GeneratedValue 어노테이션이 없는 것은 의도된 설계이며, ID가 데이터베이스에서 자동 생성되지 않고 이벤트 소스에서 제공되는 이벤트 기반 아키텍처 패턴으로 올바르게 구현되어 있습니다.


26-27: 마이그레이션 전략 및 타입 변경 내역 확인이 필요합니다.

코드베이스 검증 결과, 다음을 확인했습니다:

  • 데이터베이스 마이그레이션 프레임워크(Flyway, Liquibase) 미검출
  • SQL 스키마 버전 관리 파일 없음
  • 현재 AWDistance의 distance 필드는 Double 타입

원본 검토 의견에서 제시된 "마이그레이션 스크립트" 우려는 명시적 마이그레이션 시스템이 존재한다는 가정하에 작성되었으나, 해당 시스템이 코드베이스에 없습니다. 프로젝트가 Hibernate 자동 DDL 생성(ddl-auto=update)을 사용하는지, 아니면 다른 마이그레이션 전략을 사용하는지 확인하고, distance 필드 타입이 실제로 Long에서 Double로 변경되었는지 검증해 주세요.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (1)
src/main/java/com/sampoom/backend/api/part/entity/Part.java (1)

11-11: 클래스 레벨 @Setter 사용을 재고해주세요.

이전 리뷰에서 지적된 사항이 아직 해결되지 않았습니다. 엔티티의 모든 필드가 무분별하게 변경 가능해지면 의도하지 않은 상태 변경이 발생할 수 있습니다. 특히 id, createdAt과 같은 필드는 변경되어서는 안 됩니다.

필드별로 선택적 @Setter를 적용하거나, 명시적인 업데이트 메서드를 제공하는 것을 권장합니다.

🧹 Nitpick comments (1)
src/main/java/com/sampoom/backend/api/branch/entity/Branch.java (1)

38-40: is_deleted 컬럼은 NOT NULL로 막아두는 편이 안전합니다
DB에 새 컬럼을 추가할 때 기본값 없이 null을 허용하면, 마이그레이션 과정이나 수동 수정으로 null이 들어와도 탐지하기 어렵고 하이버네이트가 기본 false로만 간주해 정합성 확인이 힘듭니다. 컬럼 자체를 NOT NULL로 고정해 두면 이런 위험을 줄일 수 있어요.

-    @Column(name = "is_deleted")
+    @Column(name = "is_deleted", nullable = false)
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 5a700e8 and c37b8d2.

📒 Files selected for processing (6)
  • src/main/java/com/sampoom/backend/api/branch/entity/AWDistance.java (2 hunks)
  • src/main/java/com/sampoom/backend/api/branch/entity/Branch.java (2 hunks)
  • src/main/java/com/sampoom/backend/api/branch/service/DistanceService.java (1 hunks)
  • src/main/java/com/sampoom/backend/api/order/service/OrderService.java (1 hunks)
  • src/main/java/com/sampoom/backend/api/part/entity/Part.java (2 hunks)
  • src/main/java/com/sampoom/backend/api/part/event/PartEventConsumer.java (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/main/java/com/sampoom/backend/api/branch/service/DistanceService.java
🧰 Additional context used
🧬 Code graph analysis (1)
src/main/java/com/sampoom/backend/api/branch/entity/AWDistance.java (1)
src/main/java/com/sampoom/backend/api/branch/entity/Branch.java (1)
  • Entity (8-41)
⏰ 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 (7)
src/main/java/com/sampoom/backend/api/part/event/PartEventConsumer.java (2)

48-53: PartUpdated 이벤트 처리가 올바르게 구현되었습니다.

PartCreated와 동일한 패턴을 따르고 있으며, 페이로드 매핑과 서비스 호출이 적절합니다.


65-65: 예외 로깅이 수정되었습니다.

이전 리뷰 코멘트가 반영되어 예외 객체가 로거에 올바르게 전달되고 있습니다. 이제 스택 트레이스가 로그에 기록됩니다.

src/main/java/com/sampoom/backend/api/part/entity/Part.java (1)

32-33: primitive 타입으로의 변경이 적절합니다.

Integer, Long, Boolean에서 int, long, boolean으로 변경하여 nullable = false 제약 조건과 일치하게 되었습니다. 이는 이전 리뷰에서 지적된 타입 불일치 문제를 해결합니다. 새로 추가된 leadTimestandardCost 필드도 primitive 타입을 사용하여 일관성이 유지되고 있습니다.

Also applies to: 36-36, 38-39, 41-42, 45-45, 48-48

src/main/java/com/sampoom/backend/api/branch/entity/AWDistance.java (1)

6-34: 고유 제약 조건과 컬럼 매핑이 일관적으로 정리되었습니다. 스네이크 케이스 컬럼명을 명시해 DB 스키마와 불일치 위험이 사라졌고, soft delete 필드 기본값도 안전하게 설정되었습니다.

src/main/java/com/sampoom/backend/api/order/service/OrderService.java (1)

66-69: 동점 시 짧은 거리를 우선하는 tie-breaker가 올바르게 작동합니다. Comparator.reverseOrder()를 사용해 .max 호출과 조합할 때 더 짧은 거리가 선택되도록 정렬 방향을 맞춘 점이 좋습니다.

src/main/java/com/sampoom/backend/api/branch/entity/Branch.java (2)

15-16: ID 자동 생성 제거에 따른 저장 경로 재확인 필요
@GeneratedValue를 제거했으므로 이제 JPA가 식별자를 채워주지 않습니다. 이벤트/서비스에서 Branchsave하기 전에 id가 비어 있으면 IdentifierGenerationException이 바로 발생하니, 모든 신규 생성 경로에서 명시적으로 id를 세팅하고 있는지 확인 부탁드립니다.


27-28: 좌표 null 허용 처리 깔끔합니다
Double 타입으로 바꿔주셔서 좌표가 미확정인 이벤트도 안전하게 적재할 수 있게 되었습니다. 이전 NPE 우려가 해소됐어요.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
src/main/java/com/sampoom/backend/api/part/entity/Part.java (1)

11-11: 이전 리뷰에서 지적된 @Setter 이슈가 해결되지 않았습니다.

클래스 레벨의 @Setter가 추가되어 이전 리뷰에서 제기된 우려사항이 악화되었습니다. id, createdAt 등 변경되어서는 안 되는 필드까지 모두 수정 가능해집니다.

이전 리뷰 제안을 참고하여 다음 중 하나를 적용해주세요:

  • 변경 가능한 필드에만 개별적으로 @Setter 적용
  • 비즈니스 로직이 포함된 명시적 업데이트 메서드 제공
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between c37b8d2 and 9cb9282.

📒 Files selected for processing (1)
  • src/main/java/com/sampoom/backend/api/part/entity/Part.java (2 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 (1)
src/main/java/com/sampoom/backend/api/part/entity/Part.java (1)

38-39: 박싱 타입에서 원시 타입으로의 변경이 적절합니다.

safetyStock, groupId, categoryId를 박싱 타입(Integer, Long)에서 원시 타입(int, long)으로 변경한 것은 좋은 개선입니다:

  • 컴파일 타임에 non-null 보장
  • DB 제약 조건(nullable = false)과 일치
  • NPE 위험 감소
  • 메모리 효율성 향상

이전 리뷰에서 제기된 타입 불일치 문제를 부분적으로 해결했습니다.

Also applies to: 45-45, 48-48

notnull 추가
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
src/main/java/com/sampoom/backend/api/part/entity/Part.java (1)

12-12: 클래스 레벨 @Setter 사용 지양 권장 (이전 리뷰 내용 참조)

이전 리뷰에서 지적된 사항과 동일합니다. 클래스 레벨 @Setter는 id, createdAt 등 변경되어서는 안 되는 필드까지 mutable하게 만듭니다. 필드별 선택적 @Setter 또는 명시적 업데이트 메서드 사용을 권장합니다.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 9cb9282 and 06df6b4.

📒 Files selected for processing (1)
  • src/main/java/com/sampoom/backend/api/part/entity/Part.java (2 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
src/main/java/com/sampoom/backend/api/part/entity/Part.java (4)
src/main/java/com/sampoom/backend/api/inventory/entity/Inventory.java (1)
  • Entity (10-50)
src/main/java/com/sampoom/backend/api/part/entity/Category.java (1)
  • Entity (8-23)
src/main/java/com/sampoom/backend/api/part/entity/PartGroup.java (1)
  • Entity (8-26)
src/main/java/com/sampoom/backend/api/part/dto/PartPayload.java (1)
  • Getter (7-21)
⏰ 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 (1)
src/main/java/com/sampoom/backend/api/part/entity/Part.java (1)

38-38: 기존 필드에 @NotNull 추가는 좋은 개선입니다

isDeleted, safetyStock, groupId, categoryId 필드에 @NotNull 애노테이션을 추가하여 DB 제약조건(nullable = false)과 Java 검증 레이어의 일관성을 확보한 것은 좋은 개선입니다.

다만, 위에서 언급한 것처럼 Bean Validation이 실제로 트리거되는지 확인이 필요합니다.

Also applies to: 42-42, 50-50, 54-54

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (2)
src/main/java/com/sampoom/backend/api/part/dto/PartCategoryPayload.java (1)

10-15: 검증 어노테이션이 올바르게 추가되었습니다

모든 필드에 @NotNull 검증이 추가되어 페이로드의 필수 값 검증이 가능해졌습니다. 다른 페이로드 클래스들(PartGroupPayload, PartPayload)과 일관된 패턴을 따르고 있습니다.

선택사항: String 필드에 대해 @NotBlank 사용 고려

categoryNamecategoryCode는 문자열 필드이므로, @NotNull 대신 @NotBlank를 사용하면 null뿐만 아니라 빈 문자열이나 공백 문자열도 방지할 수 있습니다:

+import jakarta.validation.constraints.NotBlank;
+
 @Getter
 @Setter
 public class PartCategoryPayload {
     @NotNull
     private Long categoryId;
-    @NotNull
+    @NotBlank
     private String categoryName;
-    @NotNull
+    @NotBlank
     private String categoryCode;
 }

참고: 이 개선사항을 적용하려면 PartGroupPayloadPartPayload의 문자열 필드들도 함께 업데이트하여 일관성을 유지하는 것이 좋습니다.

src/main/java/com/sampoom/backend/api/part/dto/PartGroupPayload.java (1)

3-17: 유효성 검증 일관성이 확보되었습니다.

모든 필드에 @NotNull 어노테이션을 추가한 것은 다른 Payload DTO들(PartCategoryPayload, PartPayload)과 일관된 패턴을 따르고 있어 좋습니다. 이벤트 페이로드의 경우 완전한 데이터를 포함해야 하므로 적절한 접근입니다.

다음 사항을 고려해보시기 바랍니다:

  • 문자열 필드(groupName, groupCode)에 대해 @NotBlank를 사용하면 빈 문자열도 방지할 수 있습니다
  • ID 필드(groupId, categoryId)에 대해 @Positive를 추가하면 음수 값을 방지할 수 있습니다

예시:

+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Positive;

 public class PartGroupPayload {
     @NotNull
+    @Positive
     private Long groupId;
     @NotNull
+    @NotBlank
     private String groupName;
     @NotNull
+    @NotBlank
     private String groupCode;
     @NotNull
+    @Positive
     private Long categoryId;
 }
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 06df6b4 and 11e0f56.

📒 Files selected for processing (4)
  • src/main/java/com/sampoom/backend/api/part/dto/PartCategoryPayload.java (1 hunks)
  • src/main/java/com/sampoom/backend/api/part/dto/PartGroupPayload.java (1 hunks)
  • src/main/java/com/sampoom/backend/api/part/dto/PartPayload.java (1 hunks)
  • src/main/java/com/sampoom/backend/api/part/entity/Part.java (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/main/java/com/sampoom/backend/api/part/entity/Part.java
🧰 Additional context used
🧬 Code graph analysis (3)
src/main/java/com/sampoom/backend/api/part/dto/PartGroupPayload.java (2)
src/main/java/com/sampoom/backend/api/part/dto/PartCategoryPayload.java (1)
  • Getter (7-16)
src/main/java/com/sampoom/backend/api/part/dto/PartPayload.java (1)
  • Getter (8-33)
src/main/java/com/sampoom/backend/api/part/dto/PartCategoryPayload.java (2)
src/main/java/com/sampoom/backend/api/part/dto/PartGroupPayload.java (1)
  • Getter (7-18)
src/main/java/com/sampoom/backend/api/part/dto/PartPayload.java (1)
  • Getter (8-33)
src/main/java/com/sampoom/backend/api/part/dto/PartPayload.java (2)
src/main/java/com/sampoom/backend/api/part/dto/PartCategoryPayload.java (1)
  • Getter (7-16)
src/main/java/com/sampoom/backend/api/part/dto/PartGroupPayload.java (1)
  • Getter (7-18)
⏰ 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 (1)
src/main/java/com/sampoom/backend/api/part/dto/PartCategoryPayload.java (1)

3-3: 검증 지원을 위한 적절한 import 추가

Jakarta Bean Validation의 @NotNull 어노테이션을 사용하기 위한 import가 올바르게 추가되었습니다.

@vivivim vivivim merged commit ca26648 into main Nov 3, 2025
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants