제조 소프트웨어/설계
제조업 경험을 도메인으로(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 |