제조 소프트웨어/설계

제조업 경험을 도메인으로(5) - MES/MSA 자재 관리 설계

문쿼리 2025. 4. 14. 01:25

자재 관리 

주요 업무

  • 2주 단위 생산 계획에 필요한 자재의 충분 여부 점검
  • 부족한 자재에 대해 구매 요청 등록 및 승인 흐름 수행
  • 불량 자재에 대해 교체 신청 등록 및 처리 흐름 관리
  • (추가) 생산 계획 기준으로 필요한 자재 소요량 자동 산정 및 수급 가능 여부 판단
  • (추가) 자재 사용 예약 등록 (생산 Lot에 대한 자재 Lot 할당 요청)
  • (추가) 생산 공정에 실제로 사용된 자재 Lot 이력 등록
  • (추가) 자재 상태(WMS 제공) 기반으로 생산 사용 가능 여부 판단
  • (추가) 불량 자재 발생 시, 해당 생산 계획/공정/품질 결과에 미치는 영향 추적
  • (추가) 구매 요청 및 교체 요청 처리 현황에 대한 상태 추적 (진행 중 / 완료 등)

설계 목적

  • 생산 계획과 자재 수급 상황의 정합성을 확보하여 생산 지연 요소를 사전에 방지
  • WMS에서 관리하는 자재 정보를 기반으로 MES는 흐름, 예약, 사용 이력을 중심으로 관리
  • 자재 부족 판단, 사용 예약, 불량 추적 등 생산 중심의 자재 활용 시점에 집중
  • 구매 요청과 교체 요청을 독립된 흐름으로 설계하여 자재 수급 대응의 유연성 확보
  • 자재 Lot 기반으로 생산 이력, 품질 문제 발생 시 원인 자재까지 추적 가능하게 설계
  • MES와 WMS 간 역할을 분리함으로써, 물류 흐름과 생산 흐름의 책임 경계를 명확히 유지
고민한 내용
1. 자재 관리와 생산 계획 관리를 통합/분리 여부
설계하고 있는 방향성이, 경험했던 제조업 현상을 기반으로 하다보니 해당 업무들의 일부분들만 접했고,
그래서 통합에 대한 고려를 했음
-> MSA에는 맞지 않기 때문에 분리 결정, 양 측의 영역이 통합되는 경우 너무 크고 복잡하기 때문

2. 자재 관리의 영역을 어디까지 설정할 것인가? (입고, 재고, 출고 등)
자재 관리의 경우 MES 외부에 WMS가 있는 경우와 없는 경우 차이가 클 것으로 판단됨.
-> 자재를 제대로 다루려면 WMS 전체 시스템이 필요함, WMS가 따로 있다는 가정하에 MES 관점에서 필요한 생산 중심 흐름만 책임지도록 설계하여, 입출고 이벤트를 수신하여 처리
-> WMS는 실물 재고 중심! MES는 생산 흐름 중심!

3. 자재를 어떤 단위로 관리할 것인가?
입고된 자재(Lot) 단위로 모든 자재가 불량일 수 있지만, 부분적인 불량 처리가 불가함.
동시에 낱개 단위 혹은 일정 부분을 제거하고 사용할 수 있다. 라고 한다면 어떻게 표현해야할까
-> Lot 단위의 관리 결정. 실제 업무에서 그렇게 진행했던것도 있지만. 각 고객사 별로 커스텀해야 하는 영역으로 판단됨.
-> 재활용, 폐기물 처리 등 프로세스에 대한 고려 필요

4. 자재 요청과 연관 관계를 갖는 도메인으로 어떤 엔티티를 선택할 것인가? 부품 관리/생산 관리 
-> 둘 다 연결하여 처리 필요, 제품 정의에서 부품관리와 레시피관리 모두 연결한 것과 동일한 사유
-> 자재 요청은 부품이 부족할 때, 발생하기 때문에 부품 관리와 연관을 갖도록 처리해야 하며
-> 생산 관리 측면에서는 왜 정상적인 처리가 불가했는지 확인 할 수 있어야 함
-> 요청에 의해 발생된 앞뒤 상황을 논리적으로 표현하기 용이한 형태로 고려

 

Material (자재 관리)

속성명 타입 설명 관계 / 특징
materialId UUID 자재 식별자 (입고 단위 기준) 식별자, Aggregate Root
materialCode String 자재 코드 (전선, 단자 등) ERP / 품목 마스터와 연계
lotNumber String 공급사 기준 Lot 번호 WMS 연동 및 품질 이력 추적
quantity Float 입고 수량 단위는 unit 기준
unit String 단위 (롤, 개, m 등) 입고 단위
locationCode String 보관 위치 코드 (WMS 제공) 읽기 전용 / 창고 위치 참조용
status Enum 자재 상태 (정상, 불량, 사용중 등) 생산 사용 여부 결정 기준
receivedAt LocalDateTime 입고 시각 입고 이력 관리용
supplier String 공급처 이름 또는 코드 품질 연동 / 불량 추적용
qualityStatus Enum 품질 상태 (합격, 불합격, 검수 중 등) 품질검사 연동 가능
remarks String 비고 및 특이사항 Optional

 

MaterialHistory (자재 사용 이력)

* supplyPlanId는 완제품 관리 설계 참고 

속성명 타입 설명 관계 / 특징
historyId UUID 자재 이력 고유 식별자 식별자, Aggregate Root
materialId UUID 대상 자재 Lot ID Material과 연계
supplyPlanId UUID 해당 자재가 사용될 예정이었던 생산 계획 ID SupplyPlan과 연계
usageType Enum 사용 목적 또는 분류 (정상 사용 / 불량 발생 / 교체 요청 / 샘플 등) Value Domain 분기 기준 (추적/분석에 사용)
quantity Float 해당 이벤트에 사용되거나 처리된 수량 단위는 Material Lot 단위 기준
recordedAt LocalDateTime 기록 시각 흐름 타임라인 분석용
remarks String 메모 / 사유 등 Optional

 

MaterialRequest (자재 요청)

속성명 타입 설명 관계 / 특징
requestId UUID 자재 요청 고유 ID 식별자, Aggregate Root
requestType Enum 요청 유형 (추가, 교환 등) 업무 흐름 분기용
materialCode String 요청 대상 자재 코드 (예: WIRE-2P) 자재 마스터와 연계 (ERP, WMS 연동 가능)
quantity Float 요청 수량 단위는 uom 기준
uom String 수량 단위 (개, 롤, m 등) 단위 변환 가능
reason String 요청 사유 (예: 재고 부족, 불량 발생 등) Optional
status Enum 요청 상태 (요청, 확인, 거부 등) 상태 전이 흐름 관리
requestedAt LocalDateTime 요청 생성 시점 이력 추적용
respondedAt LocalDateTime 요청 승인/처리 시점 Optional
relatedMaterialId UUID (Optional) 교체 요청일 경우 대상 자재 ID (Material) REPLACEMENT일 경우만 사용
supplyPlanId UUID (Optional) 해당 요청이 발생한 생산 계획 ID 자재 수요가 어떤 계획에서 발생했는지 추적 가능
bomId UUID (Optional) 요청이 발생한 BOM ID (partProduct.bomId) 부품 구조 기반 요청일 경우 출처 추적 가능
componentId UUID (Optional) 해당 자재가 부족했던 구성품의 제품 정의 ID (partProductComponent.componentId) ProductDefinition 참조 → 어떤 부품 수요로 발생한 요청인지 기록 가능
remarks String 기타 메모 또는 특이사항 Optional