assembly-service는 SK 쉴더스 루키즈 개발 5기 AI 기반 자동차 스마트팩토리 관제 시스템 AIMS에서 제조 공정 이벤트를 수집하고, 공정/설비/품질 분석 결과를 대시보드에 제공하는 Spring Boot 기반 백엔드 서비스입니다.
제조 서비스는 프레스·차체·도장·의장 조립 공정에서 발생해 Kafka로 발행된 이벤트를 수집하고, 생산 이벤트와 센서 데이터를 기반으로 이상을 탐지·저장·조회하는 역할을 담당합니다.
- 제조 공정 이벤트 수집 및 조회
- 차량별 공정 이동 이력 관리
- 프레스, 차체, 도장, 의장 공정별 분석 결과 관리
- 실시간 병목 분석 결과 제공
- 공정 간 불량 전이 예측 결과 제공
- Kafka 기반 제조 이벤트 스트리밍 연동
- Redis 기반 실시간 대시보드 캐시 연동
ISO 표준 문서 및 통계적 공정관리(SPC) 원칙에 따라 설비별 정상 데이터의 평균(μ)과 표준편차(σ)를 기반으로 동적 임계값을 생성하여 이상을 탐지합니다. (2σ 이내 정상, 2~3σ 경고, 3σ 초과 위험)
- 적용 레퍼런스:
ISO 22400(제조 KPI),ISO 7870(관리도),ISO 20958(모터 전류 상태감시) - 사이클 시간 (
cycleTimeSec) 및 지연시간 (timestampDelaySec):- 차종, 금형, 작업별 평균 사이클 시간 및 지연시간에 대해 평균+2σ 이내면
NORMAL, 2~3σ는WARNING, 3σ 초과는CRITICAL로 판정합니다.
- 차종, 금형, 작업별 평균 사이클 시간 및 지연시간에 대해 평균+2σ 이내면
- 전류 RMS (
current.rmsAmpere):- 모터 및 운전 단계(타격/복귀/대기)별 정상 전류의 평균과 표준편차를 기준으로 평가합니다. 제조사 과부하 한계를 초과하거나 3σ를 벗어나면
CRITICAL입니다.
- 모터 및 운전 단계(타격/복귀/대기)별 정상 전류의 평균과 표준편차를 기준으로 평가합니다. 제조사 과부하 한계를 초과하거나 3σ를 벗어나면
- 생산 카운트 (
countIncreaseYn):true시 정상, 데이터 누락(null) 시 경고,false시 위험. - 설비 상태 (
operationStatus):RUNNING정상,WARNING경고,STOPPED/FAULT위험.
- 적용 레퍼런스:
ISO 13373(진동 센서 측정/분석),ISO 20816(기계 진동 상태평가),ISO 7870 - 로봇 진동 점수 (
vibrationScore) 및 주파수 피크 (frequencyBands):- 로봇 번호, 작업 프로그램, 속도, 페이로드 조건에 따라 정상 평균과 표준편차를 도출합니다. 조건별 평균+2σ 이하
NORMAL, 2~3σWARNING, 3σ 초과CRITICAL. (각 주파수 대역별로 별도 임계치 적용)
- 로봇 번호, 작업 프로그램, 속도, 페이로드 조건에 따라 정상 평균과 표준편차를 도출합니다. 조건별 평균+2σ 이하
- 로봇 상태 (
robotMotionStatus):NORMAL정상,WARNING경고,ABNORMAL또는COLLISION_RISK위험. - 운전 모드 (
robotOperationMode): 생산 중AUTO정상. 계획 없는MANUAL/STOPPED위험.
- 적용 레퍼런스:
ISO 4628-1(도막 결함 평가),ISO 2808(도막 두께 측정) - 표면 품질 점수 (
surfaceQualityScore): ISO 결함 등급을 점수로 환산. 80점 이상 정상, 60~80점 경고, 60점 미만 위험. - 도막 두께 (
thicknessValue): 목표치 115μm (90~120μm 범위 내 정상). 80μm 미만 또는 130μm 초과 시 위험. - 불량 점수 (
defectScore): 0.4 미만 정상, 0.4~0.6 경고, 0.6 이상 위험 (visionLabel이 정상이어도 점수에 따라 경고 발송). - 온도 편차 (
thermalStdTemp): 오븐 온도 균일도 기준에 따라 2℃ 미만 정상, 2~5℃ 경고, 5℃ 이상 위험.
- 작업/조립 순서 오류 (
sequenceErrorCount): 실제 작업 순서(actualSequence)가 기준 순서(expectedSequence)와 불일치할 경우 위험(CRITICAL) 판정. - 부품 누락 (
missingPartCount) 및 체결 오류 (fasteningErrorCount): 1건이라도 발생 시 위험 판정.
Bosch Production Line Performance Dataset의 Station 통과 시간, 공정 처리 시간, 대기 시간을 기반으로 병목 공정을 탐지합니다.
판단 예시:
- 평균 처리 시간 대비 30% 이상 증가
- 특정 Station 체류 시간 급증
- 생산 대기열 증가
- 공정별 지연 위험도 증가
공정별 센서 데이터, 공정 이동 이력, 품질 검사 결과를 기반으로 특정 공정의 이상이 후속 공정의 불량으로 이어질 가능성을 예측합니다.
예시:
- 차체 공정 이상이 도장 공정 불량으로 전이될 확률
- 도장 공정 불량 위험도
- 주요 원인 Station 및 Sensor Feature
- 위험도 등급:
LOW,MEDIUM,HIGH
프로젝트의 AI 분석 신뢰도와 공정 모의(Simulation)를 위해 다음의 산업용 오픈 데이터셋을 활용합니다.
엔진 진동 시계열 데이터를 바탕으로 정상(1)과 이상(-1)을 분류하는 KAMP 예지보전 데이터셋입니다.
- 활용 공정: 프레스, 차체 공정
- 주요 활용도: 로봇 암 및 프레스 설비 진동 이상 탐지 패턴 적용
프레스 유압 모터 및 로봇의 전류(RMS[A])와 가속도(Acceleration[g]) 시계열 데이터가 포함되어 있습니다.
- 활용 공정: 프레스 공정
- 주요 활용도: 전류 피크(Peak) 탐지, 모터 과부하 및 설비 비정상 정지 상태 감지
제품 표면의 열화상 센서 데이터와 정상(0), 불량(1)이 라벨링된 품질 검사 데이터셋입니다.
- 활용 공정: 도장 공정
- 주요 활용도: 도장 표면 온도 편차 분석 및 비전 기반 품질 불량 탐지 이벤트 생성
Kaggle에서 제공하는 대규모 제조 라인 성능 데이터셋으로, 공정 센서값, 시간 정보, 상태 정보 등을 포함합니다.
- 활용 공정: 통합 관제 (병목 및 품질 분석)
- 주요 활용도:
- Station 체류 시간 등을 분석하여 제조 병목 공정 탐지
- 특정 공정의 센서 데이터가 후속 공정에 미치는 영향을 분석해 공정 간 불량 전이 예측
DB는 sampledb(샘플 원천 데이터)와 maindb(분석 결과 데이터)로 분리됩니다. 원천 데이터 흐름 제어는 다음 3개의 주요 테이블을 통해 관리됩니다.
car_master: 차량 기준 정보 및 상태 관리 (WAITING,RUNNING,HOLD,DEFECT,COMPLETED)equipment: 공정별 설비 정보 및 상태 (RUNNING,IDLE,STOPPED,FAULT,MAINTENANCE)manufacturing_event_json: 10만 건 이상의 공정/센서/품질 원천 이벤트
제조 이벤트 흐름 제어 원칙:
차량 1대당 4개 공정(PRESS, BODY, PAINT, ASSEMBLY)의 이벤트가 존재하지만, 최초에는 PRESS만 READY 상태입니다.
정상적으로 공정이 완료된 경우에만 다음 공정 row의 상태를 READY로 변경하여 스케줄러가 가져갈 수 있게 합니다.
상태값 의미:
dispatch_status:PENDING(대기),READY(발행 가능),SENT(발행 완료),BLOCKED(설비 고장 대기),SKIPPED(진행 불가),FAILEDanalysis_status:NOT_ANALYZED,NORMAL,ABNORMAL
제조 이벤트, 분석 결과, 설비 상태, 알림을 분리하기 위해 4개의 Topic을 운영합니다. 모든 Topic은 2개의 파티션으로 구성됩니다.
| Topic | 역할 | Message Key |
|---|---|---|
factory.manufacturing.raw |
원천 제조 이벤트 전달 | carMasterId |
factory.manufacturing.analysis |
공정·AI 분석 결과 전달 | carMasterId |
factory.equipment.status |
설비 상태 변경 이벤트 전달 | equipmentId 또는 equipmentCode |
factory.manufacturing.alert |
이상·위험 알림 이벤트 전달 | alertId |
carMasterId를 Key로 사용함으로써 동일 차량의 이벤트 순서를 파티션 레벨에서 보장합니다.
| Topic | Producer | Consumer Group |
|---|---|---|
manufacturing.raw |
제조 이벤트 서비스 이벤트 재생 스케줄러 Kafka 테스트 컨트롤러 |
manufacturing-consumer-groupai-consumer-group |
manufacturing.analysis |
제조 이벤트 분석 Consumer | alert-analysis-consumer-group |
equipment.status |
제조 이벤트 분석 Consumer 설비 상태 Listener |
dashboard-consumer-group |
manufacturing.alert |
제조 이벤트 분석 Consumer | alert-notification-consumer-group |
flowchart TD
DB[원천DB : manufacturing_event_json]
subgraph SCHEDULER [Scheduler]
REPLAY[ManufacturingEventReplayScheduler<br/>READY 상태 조회 & 설비 RUNNING 확인]
end
RAW_TOPIC[["Topic: factory.manufacturing.raw<br/>(Partitions: 2, Key: carMasterId)"]]
subgraph CONSUMERS [Event Consumers]
MANUFACTURING_CG["manufacturing-consumer-group<br/>(Press/Body/Paint/Assembly 분석)"]
AI_CG["ai-consumer-group<br/>(병목/불량 전이 AI 분석)"]
end
ANALYSIS_TOPIC[["Topic: factory.manufacturing.analysis<br/>(Key: carMasterId)"]]
EQUIPMENT_TOPIC[["Topic: factory.equipment.status<br/>(Key: equipmentId/equipmentCode)"]]
ALERT_TOPIC[["Topic: factory.manufacturing.alert<br/>(Key: alertId)"]]
ANALYSIS_CG["alert-analysis-consumer-group<br/>분석 결과 알림"]
EQUIPMENT_CG["dashboard-consumer-group<br/>상태 이력 기록"]
ALERT_CG["alert-notification-consumer-group<br/>실시간 WebSocket 알림"]
DB --> REPLAY
REPLAY -->|조건 충족 시 발송| RAW_TOPIC
RAW_TOPIC --> MANUFACTURING_CG
RAW_TOPIC --> AI_CG
MANUFACTURING_CG -->|정상 시 다음 공정 DB 업데이트<br/>분석 결과 발행| ANALYSIS_TOPIC
AI_CG -->|분석 결과 발행| ANALYSIS_TOPIC
ANALYSIS_TOPIC --> ANALYSIS_CG
MANUFACTURING_CG -->|설비 상태 변경 시| EQUIPMENT_TOPIC
EQUIPMENT_TOPIC --> EQUIPMENT_CG
MANUFACTURING_CG -->|이상 감지 시| ALERT_TOPIC
AI_CG -->|위험 탐지 시| ALERT_TOPIC
ALERT_TOPIC --> ALERT_CG
1) Scheduler 로직
app.kafka.scheduler.enabled=true일 때만 자동 재생 스케줄러가 동작합니다.ManufacturingEventReplayScheduler가READY이벤트를 배치로 조회하고,ManufacturingRawEventService가FOR UPDATE SKIP LOCKED로 잠근 뒤 발행합니다.- 원천 이벤트는
dispatch_status='READY',is_sent=0,retry_count < maxRetries조건을 만족할 때만 발행합니다. - 전송 성공 시에만
dispatch_status='SENT',is_sent=1,event_time=현재 시각으로 갱신합니다. - 전송 실패 시에는
retry_count를 증가시키고error_message를 남깁니다.
2) Consumer (제조 공정 로직)
manufacturing-consumer-group은 이벤트를 소비하고processCode에 따라 분기합니다. (예:PRESS->PressAnalysisService)- 분석 결과가
NORMAL인 경우에는 현재 이벤트의analysis_status를NORMAL로 기록하고, 다음 공정이 진행 가능하도록 후속 상태를 갱신합니다. - 분석 결과가
ABNORMAL인 경우에는 후속 공정을READY로 바꾸지 않고 해당 차량을HOLD또는DEFECT상태로 전환합니다. ai-consumer-group은 병목 분석과 불량 전이 예측을 수행하고,alert-analysis-consumer-group이WARNING/CRITICAL결과에 대해 추가 알림을 발행합니다.dashboard-consumer-group은 설비 상태 이벤트를 반영하고,RECOVERED면 blocked 이벤트를 복구하며FAULT면READY이벤트를 차단합니다.alert-notification-consumer-group은 최종 알림 이벤트를 소비합니다.- 다음 공정
READY전환은 Kafka 소비만으로 끝나지 않고AgvArrivalService.handleArrival(eventId)같은 별도 도착 처리에서 마무리됩니다.
3) 추적 및 진단
KafkaMessageTraceStore는 현재 Pod 메모리에 최근 200건의 PRODUCED/CONSUMED trace만 보관합니다.ManufacturingKafkaTestController의/brokerAPI는KafkaDiagnosticsService를 통해 실제 clusterId, broker 수, 토픽별 partition 수를 확인합니다./messages와/alertsAPI는 현재 인스턴스가 본 Kafka 메시지 흐름을 eventId 또는 alert 기준으로 조회하는 진단용 엔드포인트입니다.
# 로컬 서버 실행
./gradlew bootRun
# 단위 및 통합 테스트 실행
./gradlew test- Swagger UI:
http://localhost:8082/swagger-ui/index.html