Skip to content

Spm 438#37

Merged
yangjiseonn merged 4 commits into
mainfrom
SPM-438
Nov 6, 2025
Merged

Spm 438#37
yangjiseonn merged 4 commits into
mainfrom
SPM-438

Conversation

@yangjiseonn
Copy link
Copy Markdown
Contributor

@yangjiseonn yangjiseonn commented Nov 6, 2025

📝 Summary

  • 기준 수량 추가

🙏 Question & PR point

📬 Reference

Summary by CodeRabbit

변경사항

  • New Features

    • 자재 및 부품에 기준수량(Standard Quantity) 필드 추가
    • 기준수량 미입력 시 기본값 1 적용
    • 생성/조회/목록 API 응답과 생성/수정 요청에 기준수량 정보 포함되어 표시/전달됨
  • Chores

    • 일부 불필요한 import 정리 및 생성자/업데이트 흐름에 기준수량 반영

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Nov 6, 2025

Walkthrough

여러 DTO·엔티티에 Integer 타입 standardQuantity 필드를 추가하고, 서비스·생성자·업데이트 경로에서 해당 값을 전달·초기화하도록 변경했습니다. null 입력은 기본값 1로 처리되며 일부 불필요한 import가 제거되었습니다.

Changes

Cohort / File(s) 변경 요약
Item DTO
src/main/java/com/sampoom/backend/api/item/dto/ItemResponseDTO.java
standardQuantity 필드 추가 및 팩토리/응답 생성 시 초기화
Material DTOs
src/main/java/com/sampoom/backend/api/material/dto/MaterialRequestDTO.java, .../MaterialResponseDTO.java
standardQuantity 필드 추가, 응답 생성자에서 초기화, 불필요한 BigDecimal import 제거
Material 엔티티 & 서비스
src/main/java/com/sampoom/backend/api/material/entity/Material.java, .../material/service/MaterialService.java
standardQuantity 영속 필드 추가(standard_quantity, nullable=false, columnDefinition DEFAULT 1), updateBasicInfo 시그니처에 standardQuantity 추가, 서비스에서 DTO 매핑 시 null→1 기본값 처리
Part DTOs
src/main/java/com/sampoom/backend/api/part/dto/PartCreateRequestDTO.java, .../PartListResponseDTO.java, .../PartResponseDTO.java, .../PartUpdateRequestDTO.java
standardQuantity 필드 추가, 응답 DTO에서 엔티티 값으로 초기화, 불필요한 import 제거
Part 엔티티 & 서비스
src/main/java/com/sampoom/backend/api/part/entity/Part.java, .../part/service/PartService.java
standardQuantity 영속 필드 추가(기본값 1, nullable=false), 생성자 시그니처에 standardQuantity 인자 추가 및 할당, update 메서드에서 조건부 할당 추가, 서비스에서 생성 시 null→1 기본값 처리

Sequence Diagram(s)

sequenceDiagram
    autonumber
    participant Client
    participant ReqDTO as Request DTO
    participant Service as MaterialService / PartService
    participant Entity as Material / Part
    participant RespDTO as ResponseDTO

    Client->>ReqDTO: 생성/수정 요청 (optional standardQuantity)
    ReqDTO->>Service: create/update 호출
    Service->>Service: standardQuantity null 체크 → 기본값 1 적용
    Service->>Entity: 생성자 호출 / updateBasicInfo 호출 (standardQuantity 전달)
    Entity->>Entity: 필드 할당 (`standard_quantity` 영속 컬럼)
    Entity-->>Service: 엔티티 반환
    Service->>RespDTO: ResponseDTO 생성 (standardQuantity 포함)
    Service-->>Client: 응답 반환
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

  • 주의할 파일/영향 범위:
    • Material.updateBasicInfo(...) 시그니처 변경에 따른 모든 호출 지점 확인
    • Part 생성자 시그니처 변경으로 인한 호출 위치(테스트, 리플렉션, 팩토리 등) 점검
    • DB 스키마(컬럼 기본값/마이그레이션) 관련 영향 확인

Possibly related PRs

  • 33-Auto/Sampoom-Management-Backend-Part#23 — Part 엔티티/DTO 및 생성자 관련 변경이 겹쳐 호출부·생성자 시그니처 충돌 가능성 있음.
  • 33-Auto/Sampoom-Management-Backend-Part#20 — Material 엔티티·DTO 및 updateBasicInfo 관련 변경이 유사하게 적용되어 병합 충돌 우려.
  • 33-Auto/Sampoom-Management-Backend-Part#28 — Material/Part DTO·엔티티에 새로운 필드 추가 작업으로 코드 레벨 연관성 높음.

Suggested labels

ready-to-merge

Suggested reviewers

  • Sangyoon98
  • Lee-Jong-Jin
  • CHOOSLA
  • vivivim

Poem

🐰 기준수량 하나 슬며시 더했네
DTO에 담고 엔티티에 새긴다
서비스가 널을 챙겨 하나로 맞추고
테스트는 통과, 마이그레이션도 준비
깡총, 배포 길로 뛰어갑니다 🥕

Pre-merge checks and finishing touches

❌ Failed checks (2 warnings, 1 inconclusive)
Check name Status Explanation Resolution
Description check ⚠️ Warning PR 설명에서 '기준 수량 추가'라는 최소한의 요약만 제공되었으며, Related Issue 섹션과 상세한 구현 내용이 누락됨. Related Issue (#438 또는 관련 이슈)와 상세한 구현 내용(Material, Part, DTO 등의 변경)을 추가하여 완성도 높은 설명 제공.
Docstring Coverage ⚠️ Warning Docstring coverage is 54.55% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
Title check ❓ Inconclusive PR 제목 'Spm 438'은 작업 추적 번호만 나타내며, 변경 사항의 핵심 내용(기준 수량 추가)을 명확하게 설명하지 못함. 제목을 'Add standardQuantity field to material and part entities' 또는 유사한 구체적인 내용으로 변경하여 변경 사항을 명확하게 요약하기를 권장.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch SPM-438

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
Copy Markdown
Contributor

@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
Copy Markdown

@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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (3)
src/main/java/com/sampoom/backend/api/material/service/MaterialService.java (1)

113-122: 이벤트 페이로드에 standardQuantity 필드가 누락되었습니다.

MaterialEvent.PayloadstandardQuantity 필드가 포함되어 있지 않습니다. 이로 인해 다운스트림 시스템이 자재의 기준 수량 정보를 받을 수 없습니다. 동일한 문제가 MaterialUpdated(Line 175-184) 및 MaterialDeleted(Line 212-221) 이벤트에도 존재합니다.

이벤트 페이로드에 standardQuantity를 추가하세요:

 MaterialEvent.Payload payload = MaterialEvent.Payload.builder()
         .materialId(material.getId())
         .materialCode(material.getMaterialCode())
         .name(material.getName())
         .materialUnit(material.getMaterialUnit())
         .baseQuantity(material.getBaseQuantity())
+        .standardQuantity(material.getStandardQuantity())
         .leadTime(material.getLeadTime())
         .deleted(false)
         .materialCategoryId(category.getId())
         .build();

동일한 수정을 Line 175-184 및 Line 212-221의 이벤트 페이로드에도 적용해야 합니다.

src/main/java/com/sampoom/backend/api/part/service/PartService.java (2)

154-166: 이벤트 페이로드에 standardQuantity 필드가 누락되었습니다.

PartEvent.PayloadstandardQuantity 필드가 포함되어 있지 않습니다. 이로 인해 다운스트림 시스템이 부품의 기준 수량 정보를 받을 수 없습니다. 동일한 문제가 PartUpdated(Line 207-219), PartDeleted(Line 251-263), 그리고 publishPartUpdatedEvent 메서드(Line 390-402)에도 존재합니다.

이벤트 페이로드에 standardQuantity를 추가하세요:

 PartEvent.Payload payload = PartEvent.Payload.builder()
         .partId(savedPart.getId())
         .code(savedPart.getCode())
         .name(savedPart.getName())
         .partUnit(savedPart.getPartUnit())
         .baseQuantity(savedPart.getBaseQuantity())
+        .standardQuantity(savedPart.getStandardQuantity())
         .leadTime(savedPart.getLeadTime())
         .status(savedPart.getStatus().name())
         .deleted(false)
         .groupId(partGroup.getId())
         .categoryId(partGroup.getCategory().getId())
         .standardCost(savedPart.getStandardCost())
         .build();

동일한 수정을 Line 207-219, Line 251-263, 및 Line 390-402의 모든 이벤트 페이로드에 적용해야 합니다.


104-141: 데이터베이스 스키마 마이그레이션이 누락되었습니다. 검증 결과 원본 리뷰 의견이 정당합니다.

엔티티 클래스는 올바르게 정의되어 있으나, 다음과 같은 중대한 문제가 확인되었습니다:

  1. 데이터베이스 마이그레이션 파일 부재: 프로젝트에 Flyway/Liquibase 마이그레이션 인프라가 존재하지 않습니다 (src/main/resources/db/migration 디렉토리 및 V*.sql 파일 없음).

  2. 애플리케이션 설정 파일 부재: src/main/resources에 application.yml 또는 application.properties 파일이 없습니다. JPA ddl-auto 설정이 명시되지 않았으므로, 기본값인 "none"이 적용되어 자동 스키마 생성이 불가능합니다.

  3. 스키마 변경 미반영: Material 및 Part 테이블에 standard_quantity 컬럼을 추가하는 마이그레이션이 필요하며, 현재 상태로는 해당 컬럼이 데이터베이스에 존재하지 않을 가능성이 높습니다.

필수 조치:

  • Flyway 또는 Liquibase 마이그레이션 파일 생성 (예: src/main/resources/db/migration/V1__add_standard_quantity_columns.sql)
  • 마이그레이션 파일에서 Material 및 Part 테이블의 standard_quantity 컬럼 추가 (NOT NULL, DEFAULT 1)
  • 또는 application.yml 파일 추가하여 spring.jpa.hibernate.ddl-auto: update 설정 (개발 환경에서만 권장)
🧹 Nitpick comments (1)
src/main/java/com/sampoom/backend/api/part/dto/PartCreateRequestDTO.java (1)

26-28: 선택적 필드가 적절하게 추가되었습니다.

standardQuantity 필드가 선택적으로 올바르게 추가되었으며, 기본값 1에 대한 주석이 도움이 됩니다.

값이 제공되는 경우 양수인지 검증하기 위해 @Min(1) 어노테이션을 추가하는 것을 고려해보세요:

+import jakarta.validation.constraints.Min;

 // 기준 수량 (선택적, 기본값 1)
+@Min(value = 1, message = "기준 수량은 1 이상이어야 합니다.")
 private Integer standardQuantity;
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4d9da71 and 6e1d865.

📒 Files selected for processing (11)
  • src/main/java/com/sampoom/backend/api/item/dto/ItemResponseDTO.java (3 hunks)
  • src/main/java/com/sampoom/backend/api/material/dto/MaterialRequestDTO.java (1 hunks)
  • src/main/java/com/sampoom/backend/api/material/dto/MaterialResponseDTO.java (2 hunks)
  • src/main/java/com/sampoom/backend/api/material/entity/Material.java (2 hunks)
  • src/main/java/com/sampoom/backend/api/material/service/MaterialService.java (2 hunks)
  • src/main/java/com/sampoom/backend/api/part/dto/PartCreateRequestDTO.java (1 hunks)
  • src/main/java/com/sampoom/backend/api/part/dto/PartListResponseDTO.java (2 hunks)
  • src/main/java/com/sampoom/backend/api/part/dto/PartResponseDTO.java (2 hunks)
  • src/main/java/com/sampoom/backend/api/part/dto/PartUpdateRequestDTO.java (1 hunks)
  • src/main/java/com/sampoom/backend/api/part/entity/Part.java (3 hunks)
  • src/main/java/com/sampoom/backend/api/part/service/PartService.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 (9)
src/main/java/com/sampoom/backend/api/part/dto/PartUpdateRequestDTO.java (1)

18-18: 필드 추가가 올바르게 구현되었습니다.

standardQuantity 필드가 다른 DTO 필드들과 일관되게 추가되었습니다. 선택적 필드로 적절하게 구현되었습니다.

src/main/java/com/sampoom/backend/api/material/service/MaterialService.java (2)

104-104: 기본값 처리가 올바르게 구현되었습니다.

standardQuantity가 null일 경우 1로 기본값을 설정하는 로직이 적절하게 구현되었습니다.


162-169: 업데이트 로직이 올바르게 구현되었습니다.

standardQuantityupdateBasicInfo 메서드에 올바르게 전달되고 있습니다.

src/main/java/com/sampoom/backend/api/item/dto/ItemResponseDTO.java (1)

28-28: 필드가 일관되게 추가 및 매핑되었습니다.

standardQuantity 필드가 올바르게 추가되었고, ofMaterialofPart 팩토리 메서드에서 적절하게 매핑되고 있습니다.

Also applies to: 44-44, 62-62

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

23-23: 필드가 올바르게 추가되고 초기화되었습니다.

standardQuantity 필드가 적절하게 선언되었고, 생성자에서 Part 엔티티로부터 올바르게 초기화되고 있습니다.

Also applies to: 41-41

src/main/java/com/sampoom/backend/api/material/dto/MaterialRequestDTO.java (1)

17-17: 필드가 올바르게 추가되었습니다.

standardQuantity 필드가 다른 필드들과 일관되게 추가되었으며, 명확한 주석이 포함되어 있습니다.

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

16-16: 필드가 일관되게 추가 및 초기화되었습니다.

standardQuantity 필드가 적절하게 선언되었고, Part 엔티티로부터 올바르게 초기화되고 있습니다.

Also applies to: 31-31

src/main/java/com/sampoom/backend/api/part/service/PartService.java (1)

128-131: 기본값 처리가 올바르게 구현되었습니다.

Part 생성 시 standardQuantity가 null일 경우 1로 기본값을 설정하는 로직이 적절하게 구현되었습니다.

src/main/java/com/sampoom/backend/api/material/dto/MaterialResponseDTO.java (1)

25-32: 표준 수량 응답 매핑 확인 완료
Material 엔티티의 standardQuantity 값을 DTO로 그대로 전달하는 구현이 기대 동작과 일치합니다.

Comment thread src/main/java/com/sampoom/backend/api/material/entity/Material.java
Comment thread src/main/java/com/sampoom/backend/api/part/entity/Part.java
Copy link
Copy Markdown

@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

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

4-5: 사용하지 않는 import를 제거하세요

클래스에서 @AllArgsConstructor@Builder 어노테이션이 제거되었으므로 해당 import도 함께 삭제하는 것이 좋습니다.

다음 diff를 적용하여 사용하지 않는 import를 제거하세요:

-import lombok.AllArgsConstructor;
-import lombok.Builder;
 import lombok.Getter;
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 6e1d865 and 2ac183d.

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

29-31: standardQuantity 필드 추가가 적절합니다

이전 리뷰에서 지적된 @Builder.Default 관련 우려는 @Builder 어노테이션을 제거함으로써 해결되었습니다. 현재 구현은 다음과 같은 방어 전략을 사용하고 있어 안전합니다:

  • 필드 초기화 (= 1)로 @NoArgsConstructor 사용 시 기본값 보장
  • 데이터베이스 제약 조건 (nullable = false) 및 기본값 (DEFAULT 1)
  • updateBasicInfo 메서드의 null 체크 (Line 48)

44-51: updateBasicInfo 메서드 업데이트가 올바릅니다

standardQuantity 파라미터 추가와 null 체크 로직이 적절하게 구현되었습니다. Line 48의 null 체크는 nullable = false 제약 조건을 만족하면서도 안전한 업데이트를 보장합니다.

@yangjiseonn yangjiseonn merged commit 3c67c45 into main Nov 6, 2025
4 of 5 checks passed
Copy link
Copy Markdown

@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

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2ac183d and 6299a6d.

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

31-34: 이전 리뷰의 중요 이슈가 해결되었습니다!

@Builder.Default 어노테이션이 올바르게 추가되어 빌더 패턴 사용 시에도 standardQuantity가 1로 초기화됩니다. 이제 nullable = false 제약 조건 위반 없이 빌더를 통해 엔티티를 생성할 수 있습니다.

Comment on lines +46 to 54
/** 이름/단위/기준단위/리드타임/기준수량 수정 */
public void updateBasicInfo(String name, String unit, Integer baseQuantity, Integer standardQuantity, Integer leadTime, Long standardCost) {
this.name = name;
this.materialUnit = unit;
this.baseQuantity = baseQuantity;
this.standardQuantity = standardQuantity != null ? standardQuantity : 1;
this.leadTime = leadTime;
this.standardCost = standardCost;
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

Javadoc가 불완전하고 null 처리 로직을 명확히 할 필요가 있습니다.

두 가지 개선 사항이 있습니다:

  1. 불완전한 문서화: Line 46의 Javadoc에 standardCost (표준단가) 파라미터에 대한 언급이 누락되어 있습니다.

  2. 일관성 없는 null 처리: Line 51에서 standardQuantity만 null 체크 후 기본값 1로 처리하는 반면, 다른 필드들(name, unit, baseQuantity 등)은 그대로 할당됩니다. 업데이트 시 standardQuantity에 null을 전달하면 의도치 않게 1로 초기화될 수 있습니다.

다음과 같이 수정하는 것을 권장합니다:

-    /** 이름/단위/기준단위/리드타임/기준수량 수정 */
+    /** 이름/단위/기준단위/기준수량/리드타임/표준단가 수정 */
     public void updateBasicInfo(String name, String unit, Integer baseQuantity, Integer standardQuantity, Integer leadTime, Long standardCost) {

추가로, null 처리 전략을 명확히 하기 위해 다음 중 하나를 고려해주세요:

  • 옵션 1: standardQuantity가 null이면 예외를 던지도록 변경 (명시적 값 요구)
  • 옵션 2: 현재 동작을 Javadoc에 명시 (예: @param standardQuantity 기준 수량 (null인 경우 1로 설정됨))
🤖 Prompt for AI Agents
In src/main/java/com/sampoom/backend/api/material/entity/Material.java around
lines 46 to 54, the Javadoc for updateBasicInfo is missing documentation for the
standardCost parameter and the method applies inconsistent null-handling for
standardQuantity (it silently defaults to 1 while other params are directly
assigned). Update the Javadoc to document all parameters including standardCost
and clearly state the null-handling behavior for standardQuantity (or that null
is not allowed), and then choose and implement one of the two recommended
strategies: either (A) enforce non-null by validating standardQuantity at the
start of the method and throw an IllegalArgumentException when null, or (B) keep
the current defaulting behavior but make it explicit in the Javadoc (e.g.,
“@param standardQuantity 기준 수량 (null인 경우 1로 설정됨)”) so callers know the contract.

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