변경 이력 (Changelog)
Caffeine Framework의 버전별 변경 사항입니다.
개요
이 문서는 NuGet.org에 공식 배포된 버전의 변경 이력을 기록합니다.
최신 NuGet 버전: v3.2.0 (2026-03-26) — AAS Ecosystem (Auto Twin + Multi-Driver + PassiveIngest)
v2.0.9은 Caffeine Framework의 첫 NuGet.org 공개 릴리스입니다. 이전 버전(v2.0.8 이하)은 내부 개발 빌드로 공개 배포되지 않았습니다.
[2.3.0] - 2026-04-17
Added
- FIR-046:
AddCaffeineInfrastructure(config, Action<InfraOptions>?)overload — Feature Module 선택적 활성화. - FIR-038:
IBridgeAdvertiser.UpdateAdvertisementAsyncDIM 본문 제거 (순수 추상) +ZeroconfBridgeAdvertiserdiff 기반 분기 (Identity 변경 vs Updatable-only).NullBridgeAdvertiser신규. - FIR-041:
IOtaUpdateService.DeployAsync(OtaDeploymentPlan)+IObservable<OtaProgressEvent> Progress병존 추가.OtaStage,OtaProgressEvent,OtaCanarySchedule,OtaDeploymentPlan,OtaProgressCalculator신규 Core 타입. Canary/Phase1~3 점진 롤아웃 +MaxFailureRate초과 시 자동Aborted.
Documented
- FIR-040:
ITagToSubmodelMapper.Map(..., equipmentCategory)카테고리별 매핑은 NexMind REQ-11 (v2.2.x 이전) 구현 과정에서 선행 반영되어 v2.3.0 에서 공식 항목으로 기록. 동일Temperature가Compressor와PackagingMachine등 카테고리에 따라 서로 다른TagMappingRule로 해석됨. - FIR-039:
NetworkComplianceSubmodelProvider및 관련INetworkComplianceChecker/IdtaSemanticIds.NetworkCompliance/AasConstants.SubmodelTypes.NetworkCompliance는 AAS IEC 63278 초기 구현 과정에서 선행 반영되어 v2.3.0 에서 공식 항목으로 기록. 9 개 Provider 의 공통ISubmodelProvider.BuildSubmodelAsync컨벤션을 따르며, SemanticId 는 IDTA URL 포맷 (https://admin-shell.io/idta/SM/NetworkCompliance/1/0) 을 유지.
Upgrade Notes (v2.3.0)
FIR-046: 선택적 Feature Module 활성화
v2.3.0 이전에는 모든 인프라 모듈이 일괄 등록되었습니다.
// v2.3.0 이전 — 12개 모듈 전부 등록
services.AddCaffeineInfrastructure(configuration);
v2.3.0부터 Action<InfraOptions> overload로 필요한 모듈만 활성화할 수 있습니다.
// v2.3.0 — NexMind 예시: InfluxDB 제외, TypeDB 유지
services.AddCaffeineInfrastructure(configuration, opt =>
{
opt.UseInfluxDb = false; // TimescaleDB로 교체 예정 (FIR-042 Phase C 대기)
opt.UseTypeDb = true; // 지식 그래프는 유지
});
상호 의존성 검증은 DI 등록 시점에 자동 수행됩니다.
| 조건 | 결과 |
|---|---|
UseAlerting=true && UseRedis=false | InvalidOperationException (시작 차단) |
UseTimescaleDb=true (v2.3.0) | InvalidOperationException — FIR-042 Phase C 이후 지원 |
UseInfluxDb=false && UseTimescaleDb=false | Warning 로그 — TraceWriter no-op |
UseMachineLearning=true && UseObservability=false | Warning 로그 — ML 메트릭 누락 |
기본값은 모두 true이므로 Action<InfraOptions>를 생략하면 기존 동작과 동일합니다.
전체 플래그 목록은 infrastructure.md#infra-options를 참조하세요.
FIR-038: IBridgeAdvertiser.UpdateAdvertisementAsync
Bridge.Host에서 광고 메타데이터를 변경할 때 UpdateAdvertisementAsync를 사용합니다.
구현체는 Identity 필드(BridgeId, DriverType, Port) 변경 여부를 diff로 판단해 최소 단절만 유발합니다.
// FriendlyName·Location 등 Updatable 필드만 변경 — 재등록 없이 TXT 레코드만 갱신
var updated = current with { FriendlyName = "Conveyor Line B" };
await _advertiser.UpdateAdvertisementAsync(updated, ct);
// BridgeId가 변경된 경우 — 내부적으로 Stop → Start (단절 발생, 로그에 경고)
var reregistered = current with { BridgeId = newBridgeId };
await _advertiser.UpdateAdvertisementAsync(reregistered, ct);
광고가 불필요한 환경(테스트, 단독 실행)에서는 NullBridgeAdvertiser를 DI에 등록하면 됩니다.
NullBridgeAdvertiser는 모든 호출을 no-op으로 처리합니다.
FIR-040: ITagToSubmodelMapper — equipmentCategory 파라미터
v2.3.0에서 Map 메서드에 선택적 equipmentCategory 파라미터가 추가되었습니다.
동일한 SemanticId라도 장비 유형에 따라 다른 매핑 규칙을 적용할 수 있습니다.
// 기존 호출 — 하위 호환 (null 카테고리로 동작)
mapper.Map(tagValue, equipmentId, "0173-1#02-AAV232#002");
// v2.3.0 — 카테고리별 규칙 적용
mapper.Map(tagValue, equipmentId, "0173-1#02-AAV232#002", "Compressor");
mapper.Map(tagValue, equipmentId, "0173-1#02-AAV232#002", "PackagingMachine");
// 동일 Temperature SemanticId, 서로 다른 TagMappingRule 반환
v2.2.x에서 카테고리 구분을 위해 사용하던 워크어라운드(Wrapper 타입, 별도 매퍼 등록)는 제거해도 됩니다.
FIR-041: IOtaUpdateService — Fleet 점진 배포
DeployAsync + Progress Rx 스트림으로 Canary → Phase1~3 → Complete 단계를 관찰합니다.
var plan = new OtaDeploymentPlan
{
FirmwareArtifact = "harbor.internal/firmware/bridge-agent:2.3.0",
TargetDevices = new[] { "bridge-01", "bridge-02", "bridge-03" },
MaxFailureRate = 0.05, // 5% 초과 시 자동 Aborted
// Canary 기본값: OtaCanarySchedule.Default (5% → 25% → 60% → 100%)
};
var disposables = new CompositeDisposable();
_otaService.Progress
.Subscribe(ev => _logger.LogInformation("[OTA] {Stage} {DeviceId} {Pct:P0}",
ev.Stage, ev.DeviceId, ev.ProgressPercent))
.DisposeWith(disposables);
await _otaService.DeployAsync(plan, ct);
disposables.Dispose();
Canary 비율을 커스터마이즈하려면 OtaCanarySchedule을 직접 생성합니다.
var plan = new OtaDeploymentPlan
{
FirmwareArtifact = "harbor.internal/firmware/bridge-agent:2.3.0",
TargetDevices = devices,
Canary = new OtaCanarySchedule(
CanaryPercent: 0.02, // 2% Canary
Phase1Percent: 0.20,
Phase2Percent: 0.50,
Phase3Percent: 1.00),
};
FIR-039: NetworkComplianceSubmodelProvider
ISubmodelProvider 구현체를 DI에 등록하면 AAS 서브모델 조회 시 자동으로 포함됩니다.
// DI 등록
services.AddScoped<INetworkComplianceChecker, DefaultNetworkComplianceChecker>();
services.AddScoped<ISubmodelProvider, NetworkComplianceSubmodelProvider>();
// AAS API를 통한 조회
// GET /api/v1/aas/{id}/submodels
// 응답에 SemanticId="https://admin-shell.io/idta/SM/NetworkCompliance/1/0" 서브모델 포함
[Tool] Simulator Hub — GUI 기반 올인원 PLC 시뮬레이터 (2026-04-01)
PlcSimulator CLI를 라이브러리(Caffeine.Simulator.Lib)로 추출하고, Blazor Server 기반 GUI 앱(Caffeine.Tools.SimulatorApp)을 추가했습니다.
주요 기능
- Caffeine.Simulator.Lib: PlcSimulator 핵심 코드를 재사용 가능한 클래스 라이브러리로 분리
IPlcInstance인터페이스 + MC/XGT 구현체PlcInstanceManager: 멀티 인스턴스 관리, 포트 중복 검사, Rx 이벤트 스트림PlcMemory: thread-safe 메모리 (maxAddress 가드 추가)
- Caffeine.Tools.SimulatorApp: Blazor Server 웹 UI (http://localhost:5050)
- 대시보드: PLC 카드 그리드, 시작/정지/추가/삭제
- 메모리 편집기: 5열 테이블 (Hex/Decimal/Float/ASCII), 인라인 편집
- 실시간 모니터링: SVG 스파클라인 차트, 다중 Watch 목록
- 설정 영속화:
simulator_config.json자동 저장/복원
실행
dotnet run --project tools/Caffeine.Tools.SimulatorApp/
문서
[Tool] PLC Simulator — 가상 PLC 프로토콜 서버 (2026-03-31)
실제 PLC 장비 없이 MC(SLMP) 및 XGT(FEnet) 프로토콜을 TCP로 제공하는 가상 PLC 시뮬레이터입니다.
주요 기능
- 듀얼 프로토콜: MC(SLMP) 3E Binary Frame (포트 5007) + XGT FEnet (포트 2004)
- 자동 시뮬레이션: 사인파, 카운터, 온도, Alive 비트 등 다양한 패턴 자동 생성
- 7개 디바이스 코드: D, W, R, ZR (워드), M, X, Y (비트)
- CLI 인수:
--mc-port,--xgt-port,--interval,--no-sim
실행
dotnet run --project tools/Caffeine.Tools.PlcSimulator/
문서
[Fix] Admin 모니터링 폴링 안정화 (2026-03-31)
로그인/로그아웃 시 모니터링 API 폴링의 안정성을 개선했습니다.
수정 사항
- ISSUE-001: 로그인 전 모니터링 API 401 대량 폴링 방지 — 인증 상태 확인 후에만 폴링 시작
- ISSUE-002: 로그아웃 시 모니터링 폴링 정지 누락 — 로그아웃 이벤트에서 타이머 해제
- BridgeDiscovery.razor:
JsonDocumentdispose 누수 수정 + BridgeId slice 안전화
[Testing] E2E Playwright Suite — Admin + Remote Edge Integration (2026-03-31)
End-to-End 테스팅 스위트를 Playwright로 구현하여 Admin 대시보드와 원격 Edge 기기의 통합 검증을 자동화했습니다.
E2E Test Coverage
- 로컬 Admin 테스트 (29개): 인증, 네비게이션 (14 라우트), 테마/언어 전환, Blazor 런타임, UI 구조 검증
- 원격 Edge 통합 테스트 (31개): Edge API (/health, /api/bridge/status), 기기 발견, Admin ↔ Edge 통신 검증
- 헤드리스 모드: CI/CD 파이프라인 통합 준비 (Chromium headless: true)
- 콘솔 에러 모니터링: 0 critical errors 검증
- Design Match Rate: 100% (60/60 테스트 통과)
주요 특징
- Playwright 자동 선택자 검증 (실제 DOM 기반)
- Remote Edge (192.168.219.117:5100) 연동 테스트
- Blazor JS interop, MudBlazor 컴포넌트 검증
- 다크모드/라이트모드, 한국어/영어 전환 검증
- 14개 Admin 라우트 전체 커버
문서
- Completion Report: docs/04-report/features/e2e-playwright-testing.report.md
- Gap Analysis: docs/03-analysis/e2e-playwright-testing.analysis.md
Next Steps
- GitHub Actions CI 통합 계획 (
npm run e2e:headless) - Edge 기기 Mock 서버 구성
- 부정 케이스(error scenarios) 테스트 추가
[WIP] v3.5.0 — Bridge Host UI v2 + Edge→Engine 데이터 파이프라인 (2026-03-30)
Edge(Bridge Host) UI를 전면 개편하여 설비 벤더사 엔지니어의 커미셔닝 경험을 개선하고, Edge→Engine 데이터 파이프라인의 4단계 연쇄 실패를 수정했습니다.
Bridge Host UI v2
- 모니터링 탭 신규: 드라이버 상태 카드 + 실시간 태그 값 (1초 폴링) + 오프라인 버퍼 게이지
- AAS 편의 기능: 장비 유형 템플릿 (Pump/Motor/CNC/Robot/Conveyor/PLC), IRDI 검색 팝업, IRDI 형식 검증, AAS 설정 JSON Export/Import
- 태그 Bulk Import/Export: CSV 파일 가져오기/내보내기 버튼 (기존 bulk API 활용)
- 감사 로그 필터: 액션 유형 드롭다운 + 검색어 필터
- 다크 모드 토글: ☀️/🌙 버튼, localStorage 영속, 시스템 설정 자동 감지
- 모니터링 API 3개:
GET /api/bridge/monitoring/status,/tags,/buffer
데이터 파이프라인 수정
- Driver ID 통일: TagManager 등록 시
manifest.DriverId사용 (BridgeId가 아닌 실제 gRPC driver-id) - ScanPlan 동적 푸시: Bind 후 활성 gRPC 스트림으로 ScanPlan 즉시 전송
- Bridge transport driverId: 레거시
Driver:Id대신Drivers[0].Id사용 - GET /manifest 태그 포함: manifest 조회 시 빈 배열 대신 실제 태그 반환
- Admin 모니터링 ID 수정: EdgeDetail/TagDetail에서
DriverId폴백 패턴 적용 - Bool 태그 Length 수정: 2→1 바이트로 정확화
[WIP] v3.4.0 — 통합 알람 인텔리전스 대시보드 (2026-03-29)
알람 클릭 시 AI 조치 가이드, AAS 디지털 트윈, TypeDB 인과분석, RUL 예측, 이상탐지를 한 화면에서 병렬 로드하는 통합 대시보드.
새로운 기능
알람 인텔리전스 대시보드
- 통합 인텔리전스 페이지 (
/alarms/intelligence): 알람 선택 시 5개 패널 자동 확장 - AI 조치 가이드: 기존 RecommendationPanel 재사용, 알람별 맞춤 추천
- AAS 디지털 트윈 연동: Engine REST API로 설비 트윈 데이터 로드
- TypeDB 인과분석: ContextSnapshot에서 AI_Insight 항목 파싱 및 표시
- RUL 예측 표시: PredictiveMaintenanceController에서 잔여 수명 로드
- 이상탐지 컨텍스트: Z-score, 상관 이상 점수, 이상 태그 표시
알람 해결 피드백
POST /api/v1/alarms/{code}/resolution: 조치 완료/실패 피드백 저장GET /api/v1/alarms/{code}/resolutions: 해결 이력 조회- SQLite
AlarmResolutions테이블 자동 생성
알람 트렌드
GET /api/v1/alarms/trend: 시간대별 알람 발생 건수 (Severity별 분류)
데모 시나리오 통합
- 대시보드에서 직접 Overheat/PressureDrop/RandomSpike/Normal 시나리오 실행
[WIP] v3.3.0 — AAS 서브모델 등록 + Bridge AAS Config (2026-03-29)
Bridge Host에서 AAS 서브모델 정보를 직접 등록하고 Admin에서 Pull하여 디지털 트윈을 생성하는 아키텍처.
새로운 기능
Bridge AAS Config
- Bridge Config UI에 AAS 탭 추가 (Nameplate 입력 + 서브모델 선택 + 시맨틱 매핑)
- REST API:
GET/PUT /api/bridge/config/aas(admin 권한 필요),GET /api/bridge/config/aas/export(인증 불필요) bridge_config.json에"aas"섹션 추가 (하위 호환: 기존 파일은 빈 기본값)- 시맨틱 자동 매핑: SensorProperty 기반 ECLASS IRDI 기본 테이블 제공
AAS 서브모델 Viewer
- AAS 대시보드에서 서브모델 카드 클릭 시 실제 내용 표시 (SubmodelTab 연결)
OperationalDataSubmodelProvider: 빈 껍데기 → Tag 기반 스켈레톤 반환- REST API:
GET /api/aas/shells/{id}/submodels,GET /api/aas/shells/{id}/submodels/{type}
Admin 위저드 Bridge AAS Pull
- 설비 구성 위저드 Step 3에서 Bridge의
/api/bridge/config/aas/export자동 조회 (인증 불필요) - Nameplate, 서브모델 선택, 시맨틱 매핑이 Bridge에서 Pull되어 자동 채움
- 감사 로그에 AAS 설정 변경 기록
[WIP] v2.2.2-edge-resilience — Edge 디바이스 복원력 및 생명주기 관리 (2026-03-28)
엣지 디바이스 무인 설치 및 자동 복구 기능. systemd 기반 서비스 관리, 주기적 heartbeat, Engine 동적 재연결, 헬스 체크 통합.
새로운 기능
CLI 명령어: cafe edge
cafe edge install— systemd 서비스 자동 등록 (6단계: 환경검증→바이너리배치→.env→Docker→systemd→시작)--source옵션: 오프라인 배포 팩 또는 바이너리 디렉토리 지정--path옵션: 설치 경로 커스텀 (기본:/opt/caffeine/bridge-host)--skip-docker옵션: 외부 MQTT/Redis 환경 지원--upgrade옵션: 기존 설치 백업 → 교체 → 재시작
cafe edge status— 서비스 상태 + Health endpoint 조회 (running/enabled/memory/lastStarted)cafe edge uninstall— 클린 제거--keep-data옵션: 오프라인 버퍼 데이터 유지
cafe edge logs— journalctl 래핑 (-f,-n옵션 지원)
Heartbeat + Engine 동적 재연결
- 주기적 Heartbeat: 60초 간격으로 Engine 연결 상태 모니터링
- 자동 재스캔: Heartbeat 3회 연속 실패 시 mDNS 재스캔 자동 트리거
- 동적 URL 전환: Engine URL 변경 감지 → 즉시 전환 (event-driven)
DiscoveredEngineUrlstatic property: thread-safe 스태틱 상태 관리EngineUrlChanged이벤트: DefaultDeviceProvisioner 구독 → URL 변경 적용
Health Check 통합
EngineConnectivityHealthCheck: IHealthCheck 구현- Healthy: Engine 발견 + 연결 정상
- Degraded: Engine 발견 + 연결 끊김 (재스캔 중)
- Unhealthy: Engine 미발견
- 데이터: engineUrl, isConnected, discoveryMethod (manual/mDNS/none)
- 엔드포인트:
/health,/health/live,/health/ready
systemd Unit File (조건부)
[Unit]
Description=Caffeine Bridge Host - Edge Gateway
After=docker.service network-online.target # --skip-docker 시 network-online.target만
Requires=docker.service # --skip-docker 시 생략
[Service]
Type=notify
Restart=always
RestartSec=5
WatchdogSec=90
StartLimitIntervalSec=300
StartLimitBurst=5
MemoryMax=512M
CPUQuota=80%
NoNewPrivileges=true
ProtectSystem=strict
.env 환경변수 자동 생성
Driver__Id=Edge-01
Driver__Type=Simulation
Engine__Url= # 비워두면 mDNS 자동 검색
Mqtt__Host=localhost
Redis__Host=localhost
OfflineBuffer__Enabled=true
OfflineBuffer__MaxSizeMb=512
OfflineBuffer__MessageTtlHours=48
테스트
- EdgeServiceTests: 19개 (systemd unit file 생성/보안 설정/리소스 제한/.env 생성/Docker Compose)
- EngineConnectivityHealthCheckTests: 5개 (3-state 헬스 체크 + discoveryMethod)
- 전체: 24개 테스트 100% 통과
빌드
| 메트릭 | 결과 |
|---|---|
| 빌드 오류 | 0 ✅ |
| 테스트 실패 | 0 ✅ |
| Match Rate | 93% (PASS) ✅ |
파일 변경
| 파일 | 유형 | 줄수 |
|---|---|---|
src/Caffeine.Cli/Commands/EdgeCommand.cs | NEW | ~270 |
src/Caffeine.Cli/Services/EdgeService.cs | NEW | ~310 |
src/Caffeine.Infrastructure/Discovery/EngineDiscoveryBackgroundService.cs | MOD | +120 |
src/Caffeine.Bridge.Host/Health/EngineConnectivityHealthCheck.cs | NEW | ~42 |
tests/Caffeine.Cli.Tests/Services/EdgeServiceTests.cs | NEW | ~220 |
tests/Caffeine.Bridge.Host.Tests/Health/EngineConnectivityHealthCheckTests.cs | NEW | ~105 |
| 기타 | MOD | +10 |
NOT in Scope (v2 이상)
- Admin UI Edge Fleet 페이지
- macOS launchd 지원
- mTLS 보안 강화
- 원격 OTA 업데이트
배포 시나리오
| 시나리오 | 복구 흐름 |
|---|---|
| Bridge 크래시 | systemd Restart=always → 5초 후 자동 재시작 ✅ |
| 디바이스 재부팅 | systemd boot → Docker auto-start → Bridge auto-start ✅ |
| Engine 끊김 | heartbeat 3회 실패 → mDNS 재스캔 → URL 전환 ✅ |
| 네트워크 단절 | OfflineBuffer 활성화 → 48시간 메시지 보관 ✅ |
v3.2.0 — AAS Ecosystem (2026-03-26)
IEC 63278 디지털 트윈 에코시스템 통합. Auto Twin 자동 생성/동기화, Bridge Multi-Driver 아키텍처, PassiveIngest HTTP 수신 드라이버를 포함한다.
주요 기능
AAS Auto Twin (IEC 63278)
IAutoTwinService: 장비 매니페스트로부터 AAS Shell + Submodels 자동 생성·동기화AutoTwinBackgroundWorker: System.Reactive 기반 이벤트 구독 — 장비 등록/변경/삭제에 실시간 반응EventPublishingEquipmentRepository: Decorator 패턴으로IRepository<EquipmentManifest>CRUD 시 이벤트 자동 발행AutoTwinOptions:SyncOnStartup(기본 true),AutoDeleteOnRemoval(기본 true)- Fluent API:
.AddCaffeineAas().AddAutoTwin()한 줄 등록 - 시작 시 전체 동기화: 누락된 Twin 생성, 고아 Shell 정리
Bridge Host Multi-Driver 아키텍처
DriverPipeline: (Driver + Scheduler + SharedWriter) 합성체 — Active/Passive 분기DriverPipelineFactory:Options["PipelineType"]기반 파이프라인 생성IDriverPipelineRegistry: O(1) 드라이버 파이프라인 조회BridgeWorker: N개 이종 드라이버 동시 운영,BoundedChannel(50K, DropOldest)- 설정:
"Drivers": [...]배열형 (기존 단수형 하위호환 유지)
PassiveIngest 드라이버
PassiveIngestDriver: HTTP POST로 RS-232/HMI 장비 데이터 수신POST /api/bridge/ingest/{driverId}: 외부 시스템 연동 엔드포인트IngestSecurityMiddleware: Bearer Token + IP Whitelist (CIDR) + Rate Limiting (100 req/s)- 헬스 체크: 30초/60초 기준 Healthy → Degraded → Unhealthy
테스트
- Auto Twin: 22개 테스트 (AutoTwinService 13, BackgroundWorker 8, Builder 1)
- EventPublishingEquipmentRepository: 6개 테스트
- Multi-Driver Pipeline: 18개 테스트
- PassiveIngest: 24개 테스트
NuGet 패키지
| 패키지 | 버전 | 변경 |
|---|---|---|
| NEXCODE.Caffeine.AAS | 3.2.0 | Auto Twin + EventPublishingEquipmentRepository |
| NEXCODE.Caffeine.Aas.Mapping | 3.2.0 | ManifestToAasConverter 개선 |
| Caffeine.Bridge.Host | 3.2.0 | Multi-Driver + PassiveIngest |
마이그레이션
// 기존: AAS 모듈만 등록
builder.Services.AddCaffeineAas();
// v3.2.0: Auto Twin 활성화
builder.Services.AddCaffeineAas()
.AddAutoTwin(); // 이벤트 기반 자동 트윈 동기화
배포 시스템 개선 (2026-03-27)
오프라인 배포 팩 시스템과 CLI 배포 명령의 안정성·사용성을 대폭 개선.
배포 프로파일 재설계
app→server(중앙 서버 배포): 이름과 설명 명확화 — Docker 이미지 기반 통합 배포edge(엣지 Docker): Bridge.Host Docker 컨테이너, ENGINE_URL 수동 연결edge-native(엣지 Runtime): Bridge.Host 네이티브 실행, 양방향 mDNS 자동 검색- 프로파일을 개발 환경(minimal/standard/full/full+monitoring)과 배포 환경(server/edge/edge-native)으로 명확히 구분
Engine mDNS 광고 + Bridge Engine 자동 검색
IEngineAdvertiser+ZeroconfEngineAdvertiser: Engine이_caffeine-engine._tcp서비스를 mDNS로 광고IEngineDiscovery+ZeroconfEngineDiscovery: Bridge.Host가 Engine을 mDNS로 자동 검색EngineDiscoveryBackgroundService: Bridge 시작 시 3회 재시도로 Engine 검색, 발견 시 ENGINE_URL 자동 설정- Runtime(네이티브) 실행 시
.envENGINE_URL 설정 불필요 — mDNS로 자동 연결
publish_pack.sh --runtime 옵션
--runtime linux-x64|linux-arm64|win-x64|osx-arm64옵션으로 Bridge.Host self-contained 바이너리 팩 포함PublishSingleFile=true로 단일 실행 파일 생성- .NET Runtime 설치 없이 Edge PC에서 직접 실행 가능
cafe setup clean 명령 추가
Docker 컨테이너·볼륨·런타임 데이터를 단계별로 정리하는 안전한 초기화 명령:
- 현재 상태를 테이블로 표시 후 사용자 확인 (기본값 No)
--all옵션으로.env파일 + NuGet 소스까지 완전 초기화
오프라인 팩 안정성 개선
publish_pack.shmacOS bash 3.2 호환성 수정 (declare -A,grep -oP, 변수명+한글 충돌)- Docker 이미지
:latest태그 자동 추가 (버전 태그 + latest 양쪽 포함) .env에CAFFEINE_VERSION자동 기록 (팩 버전 ↔ Docker 이미지 태그 자동 일치)- macOS
._리소스 포크 파일 Docker 이미지 로드에서 자동 제외 COPYFILE_DISABLE=1로 tar 생성 시._파일 포함 방지
Dockerfile 수정
- 4개 Dockerfile에
--platform=linux/amd64추가 (grpc.toolsprotoc ARM64 SIGSEGV 우회) - Engine Dockerfile:
Caffeine.AAS.csprojrestore 단계 누락 수정 - Admin Dockerfile:
ErrorOnDuplicatePublishOutputFiles=false(appsettings 충돌 해결) - Admin Dockerfile: UTF-8 BOM 제거
Demo Live Stage — 고객 시연용 라이브 대시보드 (2026-03-26)
Caffeine Admin에 Demo Live Stage 대시보드 추가. SignalR 실시간 아키텍처 시각화 + 8단계 가이드 + 4종 시나리오 자동 전환으로 3-PC 분산 환경에서 "제로→라이브 데이터" 10분 시연 가능. 설비 업체(AAS 표준) + 공장 엔지니어(비표준 설비 통합) 양쪽 페르소나 동시 대응.
주요 기능
Demo Stage 페이지 (/demo-stage)
- SVG 아키텍처 맵: 5개 노드(Engine, Edge×2, Bridge×N) + 5개 상태(Loading/Active/Error/Connecting/Inactive)
- 시나리오 선택 오버레이: 2가지 페르소나 (설비 업체 / 공장 엔지니어)
- 8단계 가이드: 아키텍처 → Edge 실행 → Bridge 발견 → 장비 등록 → 실시간 모니터링 → AI 분석 → 마무리
- 실시간 통계: EPS(초당 이벤트) / 장비 수 / 알람 / Bridge 카운트
- 시나리오 전환: Normal → Overheat → PressureDrop → RandomSpike (1클릭)
DemoStateService (Singleton)
- 시나리오 선택 상태 관리 (SelectedCase / CurrentStep / CurrentScenario)
- 노드 상태 추적 (
Nodes: Dict<nodeId, DemoNode>) OnStateChanged이벤트로 UI 자동 갱신
DemoHub (SignalR)
- OnAlarmRaised: 알람 발생 실시간 수신
- OnIngestionStats: 수집 통계 업데이트
- OnEquipmentRegistered: 장비 등록 알림
- 자동 재연결: [0ms, 2s, 5s] 단계적 폴백
SimulatorEngine 4종 시나리오
- Normal: 온도 20±10°C, 압력 1000~1020 hPa
- Overheat: 평균 온도 70°C 이상
- PressureDrop: 평균 압력 850 hPa 이하
- RandomSpike: 15% 확률로 50°C 초과 스파이크
파일 및 테스트
| 구성 | 파일 | 수 |
|---|---|---|
| 신규 | DemoStage.razor (398줄) | 1 |
| DemoStateService.cs (120줄) | 1 | |
| DemoHub.cs (45줄) | 1 | |
| DemoScenarioController.cs (35줄) | 1 | |
| 테스트: DemoStateServiceTests | 9 | |
| 테스트: ScenarioGenerationTests | 7 | |
| 수정 | NavMenu, Program.cs×2, SimulatorEngine, Dockerfile | 5 |
테스트: 16/16 통과 (0 실패)
설계 결정
- ICaffeineEventBus → SignalR 브릿지: gRPC 계약 무변경. Admin-specific 실시간 기능 격리
- DemoStateService Singleton: 페이지 재로딩 후에도 상태 유지
- MQTT 시나리오 제어: 다중 Edge 시뮬레이터 동시 제어 가능
- 네트워크 복원력: WithAutomaticReconnect로 순간 끊김 복구
사용 시나리오
10분 라이브 시연:
- 데모 시작 (Admin
/demo-stage) - Case 선택 (설비 업체 / 공장 엔지니어)
- Edge 시뮬레이터 Docker 실행
- Bridge 자동 발견 (노드 활성화)
- 장비 등록/태그 추가
- 시나리오 전환 (Overheat) → 알람 실시간 표시
- AI 분석 대시보드 이동
- 마무리 (모든 노드 활성화 맵 표시)
[Internal] Test Coverage 90%+ Achieved - 2026-03-25
테스트 커버리지 대규모 개선 완료. 전체 라인 커버리지 95.3% 달성 (목표 90% 초과).
주요 성과
- 전체 커버리지: 91.0% → 95.3% (+4.3pp)
- Core: 99.4%, Admin: 98.2%, Cli: 97.7%, Client: 97.5%
- Engine: 95.4%, Infrastructure: 91.1% — 모든 어셈블리 90%+ 달성
- 신규 테스트: 100+ 케이스 추가 (6개 파일+)
- 빌드: 0 에러, 테스트: 0 실패
버그 수정
LseDriverCoverageTests: InlineData 기대값 오류 수정ProvisioningBackgroundServiceTests: NSubstitute 구문 수정- AnsiConsole 전역 상태 오염: 문제 파일 2개 삭제 → SetupCommandTests 15건 연쇄 실패 해결
기술 개선
- stale 아티팩트 정리: cobertura.xml 병합 오류 (55.2% 오보) 해결
- 커버리지 측정 신뢰성:
dotnet clean + TestResults 정리필수화 - Rx 파이프라인 테스트 패턴: AlarmServiceRxPipelineTests 기준 확립
- NSubstitute Best Practice:
ReceivedWithAnyArgs() + Invocations검사 패턴 확립
문서
docs/04-report/test-coverage-90.report.md— 완료 보고서 (PDCA Match Rate 95%)- CI:
dotnet clean자동화 예정 (다음 스프린트)
[v3.0.5] - 2026-03-24
NexMind v1.0 피드백(FIR-034) 3건 + AAS 플랫폼 확장 5건 구현입니다.
새로운 기능
- REQ-09: IBridgeAdvertiser.UpdateAdvertisementAsync() — FriendlyName, Location 등 런타임 변경 시 TXT 레코드 동적 갱신. Default Interface Method로 하위 호환
- REQ-10: NetworkComplianceSubmodelProvider — 9번째 AAS SubmodelProvider.
INetworkComplianceChecker진단 결과를 IEC 63278 서브모델로 변환 - REQ-11: ITagToSubmodelMapper equipmentCategory —
Map()메서드에equipmentCategory파라미터 추가 (default null). 장비 카테고리별 다른 ECLASS IRDI 매핑 가능 - EXP-04: TagDefinition.EquipmentCategory — 도메인 엔티티에 장비 카테고리 필드 추가 (기본값
"General") - EXP-05: Bridge Self-Description AAS —
IBridgeSelfDescriptionProvider+BridgeSelfDescriptionProviderMVP. Bridge.Host를 IEC 63278 AAS Asset으로 모델링 (BridgeNameplate + NetworkCompliance 2개 서브모델)
버그 수정
- EXP-01: ZeroconfBridgeAdvertiser TXT 레코드에 ConfigUiPort/FriendlyName/Location 누락 수정 (REQ-04 후속). status 하드코딩("free") 버그 수정
- EXP-02: BridgeAdvertiserBackgroundService에서 Configuration의 FriendlyName/ConfigUiPort/Location 미읽기 수정
개선
- EXP-03: TagToSubmodelMapper에서 equipmentId를
Qualifiers["sourceEquipment"]에 기록. 카테고리별 복합 키 규칙 조회 지원
[v3.0.4] - 2026-03-24
NexMind 플랫폼 요구사항 8건 + 프레임워크 확장 7건 구현입니다.
새로운 기능
- REQ-01: ServiceRecordSubmodelProvider — AAS 서브모델 8종째 추가. 필드 엔지니어 서비스 방문 기록 (8개 기본 필드 + RAG 인덱싱 지원)
- REQ-02: EdgeCommunicationMode — OT 보안 통신 방향 제어.
UploadOnly/DownloadOnly모드로 Edge↔Cloud 메시지 필터링 - REQ-03: AlarmEvent.IsTrainingData — ML 학습 데이터 태깅.
IAlarmRepository에 학습 데이터 전용 조회/카운트/플래그 설정 메서드 추가 - REQ-04: BridgeAdvertisement 확장 —
ConfigUiPort,FriendlyName,Location필드 추가.BridgeInfo.ConfigUiUrl자동 생성 헬퍼 - REQ-05: IWritableSemanticIdCatalog — 런타임 설비 카테고리 등록 API. ISP 분리 (읽기/쓰기 인터페이스), ConcurrentDictionary 기반
- REQ-06: ITenantHierarchy — 계층형 테넌트 인터페이스 (B2B2B). 부모/자식/조상 경로/접근 권한 4개 메서드 + Null Object 패턴
- REQ-07: IMediaCachePolicy — 오프라인 미디어 캐시 정책 추상화.
FrequencyBasedMediaCachePolicy기본 구현 (빈도 기반 프리로드) - REQ-08: ISubmodelWriteHandler — AAS Submodel 역방향 쓰기.
AasSubmodelBridge.AddWriteHandler<T>()체인 패턴
확장
IEdgeCloudTransportdefault interface methods:SetCommunicationModeAsync,CommunicationModeChangesIAlarmRepositorydefault interface methods:GetTrainingDataAsync,CountTrainingDataAsync,SetTrainingDataFlagAsyncSemanticIdCatalogOptions: JSON 파일 기반 커스텀 카테고리 로딩InMemoryTenantHierarchy: 테스트용 계층 테넌트 구현체 (순환 참조 방어 포함)AasBuilder.AddSubmodelProvider<T>(): Fluent API 서브모델 등록SubmodelUpdatedEvent.UpdatedBy: 수정자 추적 프로퍼티
Admin-Engine 서비스 분리
AddCaffeineEngineCore()/AddCaffeineEngineHost()분리 — Admin에서 Engine 호스트 워커 미실행EngineServiceMode:CAFFEINE_ENGINE_MODE=remote환경변수로 gRPC 원격 프록시 전환- DIO/AIO/VIO 원격 프록시 (
RemoteDioService,RemoteAioService,RemoteVioService) - IO Write 엔드포인트 Admin 권한 강화 (
AuthInterceptor.AdminOnlyEndpoints3건 추가)
테스트
- 신규 단위 테스트 81개 (NexMind REQ 8건 전체 커버)
[v3.0.3] - 2026-03-22
Edge AAS Platform P1~P3 전체 구현 완료입니다.
새로운 기능
- P1: Bridge.Host 자체 설정 Web UI — 설비 벤더가 Engine 없이 독립 운영할 수 있는 Bridge 전용 관리 인터페이스
- 독립 인증 시스템 (admin/viewer 역할, First-Run Setup Wizard)
- Minimal API 13개 엔드포인트 (
/api/bridge/config,/api/bridge/auth,/api/bridge/audit,/api/bridge/license) - SPA 기반 설정 UI: 설비 정보, 드라이버 구성, 태그 CRUD, 라이선스 관리
- 감사 로그 (Bridge Professional 전용) — 모든 설정 변경·인증 이벤트 기록
- P2: Admin 설비 구성 4-Step Wizard — 라인 운영자가 Bridge를 단계별로 설정하는 Admin UI 가이드
- Step 1: Bridge 검색 (mDNS), Step 2: 설비 정보 입력, Step 3: 드라이버 선택, Step 4: 태그 매핑
IEngineRegistryFederation 경로 — 단일 Engine에서 멀티 Engine 통합으로 진화 가능한 인터페이스 설계
- P3: Bridge PKV 라이선스 2-Tier — Bridge Community(무료) / Professional(구독) 독립 라이선스 체계
- PKV 오프라인 키 기반 검증 (네트워크 불필요)
- Engine 바인딩 시 Professional 자동 활성화, 언바인딩 시 Community 자동 복귀
- 라이선스 상태 API (
/api/bridge/license) + 활성화 API (/api/bridge/license/activate) - 티어별 제한 적용: 태그 수, 드라이버 수, AAS 서브모델 종류, 감사 로그 활성화 여부
테스트
- 신규 단위 테스트 57개 (Bridge Config UI + PKV 라이선스 + 4-Step Wizard)
[v3.0.2] - 2026-03-22
Edge AAS Configuration Platform 아키텍처 설계 및 양면 라이선스 모델 도입입니다.
새로운 기능
- 양면 라이선스 모델 — Bridge(설비 벤더) + Engine(라인 운영자) 독립 라이선스 체계
- Bridge Community: 무료 (태그 50, 드라이버 1)
- Bridge Professional: 연간 구독 (태그 무제한, 감사 로그, 전체 서브모델)
- Engine에 Bridge 슬롯 개념 도입 (Community 3대, Professional 20대, Enterprise 무제한)
- 바인딩 시 Bridge Professional 자동 활성화
- Edge AAS 아키텍처 PRD — 3-Phase 설계 문서
- P1: Bridge.Host 자체 설정 Web UI + 독립 인증
- P2: Engine Admin 설비 구성 Wizard (4-Step)
- P3: 양면 라이선스 모델 + 문서 업데이트
아키텍처 결정
- Hybrid 분리: Bridge = 물리 계층(PLC), Engine = 논리 계층(AAS)
- Bridge 독립 운영: 설비 벤더가 Engine 없이 자체 인증·설정·모니터링
- Zone 그룹핑: 단일 Engine + N개 Bridge로 시작, 멀티 Engine Federation 진화 가능
- IEngineRegistry: 인터페이스만 정의하여 향후 Federation 교체 준비
[v3.0.1] - 2026-03-22
Bridge Discovery 기능 추가 및 SCADA 컴포넌트 모델링 확장입니다.
새로운 기능
- Zero-Config Bridge Discovery — mDNS/DNS-SD 기반 네트워크 자동 검색
IBridgeDiscovery— Rx 실시간 스트림 +ScanAsync()스캔IBridgeAdvertiser— Bridge.Host mDNS 서비스 광고IBridgeBindingRepository— SQLite 기반 바인딩 상태 영속화- 값 객체:
BridgeInfo,BridgeManifest,BridgeBindingState,BridgeBindingStatus,BridgeAdvertisement
- Bridge Discovery REST API — Engine 측
/api/discovery/scan|bind|unbind|bindings엔드포인트 - Bridge Heartbeat 모니터링 — 30초 간격 자동 헬스 체크
- Admin Bridge Discovery UI — Blazor 대시보드에서 Bridge 검색·바인딩·해제
개선
- AAS 서브모델 선택 UI — 바인딩 시 활성화할 서브모델을 선택 가능
- 감사 로깅 — Bridge 바인딩/언바인딩 이벤트 감사 추적
- SCADA 컴포넌트 인터페이스 —
IComponent,IIoPart,IAddressMapper,IEquipmentRegistry추가 - Core 인터페이스 109개 → 116개 (Discovery 3 + Scada 4 도메인 추가)
테스트
- Bridge Discovery E2E 테스트 9개 (Playwright 기반 시뮬레이션 환경)
- Bridge Discovery 단위 테스트 10개 (Heartbeat 모니터링 포함)
[v3.0.0] - 2026-03-20
Caffeine V3 — AAS-First IIoT 플랫폼 메이저 릴리스입니다.
Breaking Changes
- SemanticId 체계 전환:
AasConstants.SemanticIds제거 →IdtaSemanticIds(IDTA 공식 표준)로 전면 교체- 일부 ECLASS IRDI 값 변경 (Temperature, Flow, Voltage, Speed, Humidity)
- 서브모델 SemanticId: ECLASS IRDI → IDTA Submodel Template URI로 변경
- 최소 .NET 버전: .NET 10.0 필수
새로운 기능
- IEC 63278 AAS(Asset Administration Shell) 통합 — 장비 디지털 트윈의 국제 표준 기반 구조화
IAasShell,ISubmodel,ISubmodelElement핵심 인터페이스ISubmodelProvider기반 서브모델 빌더 패턴 (Nameplate, TechnicalData, OperationalData, AlarmCondition, MaintenanceHistory, PredictiveMaintenance, AiModelNameplate)ISemanticIdCatalog— 장비 카테고리별 센서→SemanticId 자동 매핑 (Pump, Motor, Compressor, HeatExchanger, Conveyor)ISemanticIdMapper+ChainedSemanticIdMapper— Caffeine 타입 ↔ ECLASS IRDI 양방향 변환IAasProtocolServer— ISP-6 표준 6개 Operation (GetAas, GetAllSubmodels, GetSubmodel, GetSubmodelElements, PutSubmodel, DeleteSubmodel)
Caffeine.AAS.Rag— RAG 기반 AAS 서브모델 검색Caffeine.AAS.Claude— Claude AI 연동 AAS 분석Caffeine.ML.Pipeline— ML 파이프라인 관리Caffeine.Predictive— 예측 정비 엔진Caffeine.TypeDb+Caffeine.TypeDb.Client+Caffeine.TypeDb.Sync— TypeDB 지식 그래프 통합
개선
IdtaSemanticIds상수 클래스에 IDTA 공식 Submodel Template URI + ECLASS IRDI 통합DefaultSemanticIdMapperIDTA 표준 IRDI로 매핑 갱신- 전체 어셈블리 버전 3.0.0 통일
- NuGet 배포 목록에 V3 신규 9개 패키지 추가
Admin UI 완성도 개선
9개 관리자 페이지의 기능 완성도를 대폭 개선했습니다.
- 설비 상태 모니터링 (
/equipment-status) — 실제 서비스 연동, 검색/상태 필터, 30초 자동 새로고침, 5개 통계 카드, 설비 상세 모달(태그 목록) - AI 분석 대시보드 (
/iot/ai-dashboard) — ApexCharts 시계열 차트(Line+Scatter), 이중 AI 분석(Spike+ChangePoint), 15초 자동 분석, 4개 통계 카드, 20건 알림 테이블 - 로보틱스 디바이스 (
/robotics) — 디바이스 상세 모달, E-STOP 확인 다이얼로그, 검색 필터 추가 - 함대 관리 (
/robotics/fleet) — 배포 링 생성 다이얼로그(이름+우선순위), 롤아웃 다이얼로그(패키지+버전+체크섬) - 안전 감사 로그 (
/robotics/audit) — 동적 심각도 매핑, 날짜/위반유형 필터, 4개 통계 카드 - AAS 관리 (
/aas) — 검색/종류 필터, 상세 모달(서브모델 목록), 삭제 확인 다이얼로그, 3개 통계 카드 - 역할 관리 (
/admin/roles) — 역할 생성 다이얼로그, 삭제 확인 다이얼로그, 시스템 역할 보호 - 사용자 관리 (
/admin/users) — 이름/이메일 검색, 역할/상태 필터, 4개 통계 카드 - 알람 이력 (
/alarms/history) — 페이지네이션(50건/페이지), Excel 내보내기, 6개 통계 카드
NuGet 신규 패키지
| 패키지 | 설명 |
|---|---|
| NEXCODE.Caffeine.AAS | IEC 63278 AAS 핵심 모듈 |
| NEXCODE.Caffeine.Aas.Mapping | AAS ↔ Caffeine 매핑 |
| NEXCODE.Caffeine.AAS.Rag | RAG 기반 AAS 검색 |
| NEXCODE.Caffeine.AAS.Claude | Claude AI AAS 분석 |
| NEXCODE.Caffeine.ML.Pipeline | ML 파이프라인 |
| NEXCODE.Caffeine.Predictive | 예측 정비 |
| NEXCODE.Caffeine.TypeDb | TypeDB 통합 |
| NEXCODE.Caffeine.TypeDb.Client | TypeDB 클라이언트 |
| NEXCODE.Caffeine.TypeDb.Sync | TypeDB 동기화 |
마이그레이션
V2에서 V3로의 마이그레이션은 마이그레이션 가이드를 참조하세요.
[v2.1.8] - 2026-03-16
커버리지 90%+ 달성 릴리스입니다.
개선
- CI 임계값 상향: 80% → 90% (per-assembly 기준)
- 어셈블리별 커버리지: AI(95.9%), Admin(90.1%), Bridge.Host(92.4%), Cli(97.3%), Drivers.Mitsubishi(100%), Drivers.Omron(100%), Engine(91.4%), Identity(92.8%), Infrastructure(90.8%)
테스트
- 전체 3,595개 통과, 9 skip, 0 실패
[v2.1.7] - 2026-03-16
APNs / FCM 푸시 알림 채널 추가 릴리스입니다.
새로운 기능
- FIR-031:
ApnsNotificationChannel— P8 ECDSA ES256 JWT 기반 Apple Push Notification Service 채널 (Caffeine.Infrastructure)- P8 파일 기반 ES256 JWT 서명, HTTP/2 전용 전송
- JWT 50분 캐시 (만료 60분 기준 여유 보정)
NotificationChannelType.Apns = 9추가
- FIR-032:
FcmNotificationChannel— Google Service Account JSON → RS256 JWT → OAuth2 기반 Firebase Cloud Messaging 채널 (Caffeine.Infrastructure)- SA JSON 파일에서 RS256 JWT 생성 후 OAuth2 액세스 토큰 교환
- 토큰 55분 캐시 (만료 60분 기준 여유 보정)
NotificationChannelType.Fcm = 8추가
- FIR-032: Polly 통합 —
AddResilientFcm(),AddResilientApns()확장 메서드 추가, 파이프라인 11→13개 - FIR-032: 심각도 라우팅 업데이트:
Critical→ 7채널 (Email + Teams + SMS + TTS + SignalR + FCM + APNs)Error→ 6채널 (Teams + Kakao + Telegram + SignalR + FCM + APNs)
기각
- FIR-033: ML.NET SSA ONNX 변환 — ML.NET이 SSA(Singular Spectrum Analysis) 모델의 ONNX 내보내기를 미지원하므로 기각. Framework 책임 범위 밖으로 판단
테스트
- 신규 16개 (FCM 7 + APNs 9), 전체 4,651개 통과
[v2.1.6] - 2026-03-15
IAlarmRepository, IAnomalyDetectionService Graceful Degradation 릴리스 — Infrastructure 미등록 시 No-op 기본 구현체로 안전하게 폴백합니다.
버그 수정
- FIR-029:
IAlarmRepositoryNull Object 기본 등록 —IAlarmRepository가 미등록된 환경에서 ML 서비스 DI 해소가 실패하던 문제 수정 (Caffeine.Infrastructure)IAlarmRepositoryNo-op 기본 구현체 추가 — Graceful Degradation 지원- Infrastructure 초기화 시 기본 구현체 자동 등록 (실제 구현체로 자연스럽게 대체 가능)
- FIR-030:
IAnomalyDetectionServiceNull Object 기본 등록 — Infrastructure 단독 사용 시IAnomalyDetectionServiceDI 실패하던 문제 수정 (Caffeine.Infrastructure)IAnomalyDetectionServiceNo-op 기본 구현체 추가- Engine 구성 시 SSA 기반 실제 구현체로 자동 대체
테스트
IAlarmRepositoryNull Object 테스트 8개,IAnomalyDetectionServiceNull Object 테스트 7개 추가 — 전체 테스트 통과
[v2.1.5] - 2026-03-15
Azure Speech SDK MAUI 통합 — IVoiceInputService STT 추상화 릴리스입니다.
새로운 기능
- FIR-028:
IVoiceInputService— Azure Speech SDK MAUI 음성 입력 추상화 — IIoT 현장 핸즈프리/장갑 착용 환경을 위한 양방향 음성 I/O 완성 (Caffeine.Presentation)IVoiceInputService인터페이스:RecognizeOnceAsync,EnsureMicrophonePermissionAsync,IsAvailableVoiceRecognitionResultsealed record:IsSuccess,Text,ErrorMessage,Confidence,Locale,Success()/Failure()팩토리NoOpVoiceInputService폴백 구현 (Caffeine.Presentation) — 비 MAUI 환경(테스트, SSR) 대응MauiVoiceInputServiceAzure Speech SDK 구현 (Caffeine.Presentation.Maui)VoiceInputOptions설정 클래스:SpeechKey,SpeechRegion,DefaultLocale,Validate()MicrophonePermissionHandlerMAUI 퍼미션 래퍼MauiVoiceExtensions.AddCaffeineMauiVoice()DI 확장 메서드 (useFallback파라미터 지원)TtsNotificationChannel(음성 출력)과 함께 양방향 음성 I/O 완성
테스트
VoiceRecognitionResultTests6개,NoOpVoiceInputServiceTests6개 추가
[v2.1.4] - 2026-03-15
TypeDB Graceful Degradation + 센서 메타데이터 레지스트리 + MAUI 토큰 저장소 추상화 릴리스입니다. NuGet 배포완료.
새로운 기능
- FIR-025: TypeDB Graceful Degradation — TypeDB 미연결 상태에서도 시스템이 정상 동작하도록 Graceful Degradation 구현 (Caffeine.Infrastructure)
TypeDbRealClientPolly Circuit Breaker 연동 강화 — 연결 실패 시 No-op 폴백으로 전환- 연결 상태 Observable 스트림(
IObservable<TypeDbConnectionState>) 제공
- FIR-027:
ISensorRegistry— 센서 메타데이터 CRUD — 센서 정보를 런타임에 등록·조회·삭제하는 레지스트리 추상화 (Caffeine.Core)ISensorRegistry인터페이스:RegisterAsync,GetAsync,GetAllAsync,UnregisterAsyncSensorInfo값 객체:SensorId,Name,Unit,MinValue,MaxValue,TagsInMemorySensorRegistry구현체 (Caffeine.Infrastructure),AddCaffeineInfrastructure()자동 등록
- FIR-026:
ITokenStorage— MAUI 토큰 저장소 추상화 — JWT 토큰 안전 저장을 위한 플랫폼 추상화 (Caffeine.Presentation)ITokenStorage인터페이스:SaveTokenAsync,GetTokenAsync,ClearTokenAsyncInMemoryTokenStorage기본 구현 (Caffeine.Presentation)SecureStorageTokenStorageMAUI 구현 (Caffeine.Presentation.Maui — IsPackable=false)MauiAuthExtensions.AddMauiTokenStorage()DI 확장 메서드
테스트
- 전체 테스트 통과
[v2.1.3] - 2026-03-14
알림 채널 4개 확장 + 다변량 이상 탐지 추가 릴리스입니다. NuGet 배포완료.
새로운 기능
- FIR-021: 알림 채널 4개 확장 —
NotificationChannelenum에Kakao=4,Sms=5,Tts=6,Telegram=7추가KakaoNotificationChannel,SmsNotificationChannel,TtsNotificationChannel,TelegramNotificationChannel구현체 추가 (Caffeine.Infrastructure)AddCaffeineResilience()Resilience 파이프라인 4개 추가:"kakao","sms","tts","telegram"(Retry 2 + Timeout 10s)AddCaffeineInfrastructure()DI Singleton 등록 자동화
- FIR-022: 심각도별 알림 라우팅 정책 —
AlertSeverity에 따라 채널 자동 선택- Critical → Email + Teams + SMS + TTS + SignalR
- Error → Teams + Kakao + Telegram + SignalR
- Warning/Info → SignalR only
- FIR-023: 다변량 이상 탐지 —
IAnomalyDetectionService.DetectMultivariateAnomalyAsync()추가MultivariateAnomalyResultDTO 추가 (Caffeine.Core.Abstractions.AI)AnomalyDetectionService구현 (Caffeine.Engine)
테스트
- 전체 테스트 통과
[v2.1.2] - 2026-03-10
Caffeine.Robotics 패치 릴리스 — Safety 네임스페이스 충돌 해소, 연결 계층 추상화 강화.
새로운 기능
- FIR-019:
IRoboticsSafetyPolicyEngine도입 — CoreISafetyPolicyEngine상속 +ValidateCommandAsync(DeviceCommand)추가SafetyEvaluationResult를 Core 단일 소스(Caffeine.Core.Abstractions.Safety)로 통합, Robotics 중복 제거- 하위호환 별칭
ISafetyPolicyEngine(Robotics 네임스페이스) 유지 - DI 이중 등록 패턴:
IRoboticsSafetyPolicyEngine+Core.ISafetyPolicyEngine동시 등록
- FIR-020:
DeviceTransportBridgeBase추상 Base 클래스 도입 — 보일러플레이트 제거 및 확장 포인트 표준화- 4개 virtual 확장 포인트:
BuildTelemetryTopic,BuildStatusTopic,BuildCommandTopicFilter,SerializeTelemetry DeviceTransportBridge가 Base 상속으로 리팩토링
- 4개 virtual 확장 포인트:
테스트
- 전체 테스트 4,698개 통과
[v2.1.1] - 2026-03-10
Caffeine.Infrastructure 패치 릴리스 — Polly 업그레이드, FIR-017/018 DI 버그 수정.
버그 수정
- FIR-017:
IZoneManager/IZoneMonitorDI 등록 누락 수정InMemoryZoneManager(11개 메서드 구현),InMemoryZoneMonitor(Subject 기반 Observable 스트림) 신규 구현AddCaffeineInfrastructure()내부에 Singleton 등록 추가
- FIR-018:
InMemoryUserSeedServiceCaptive Dependency 수정- Singleton 서비스가 Scoped
UserManager<ApplicationUser>직접 주입받던 구조를IServiceScopeFactory패턴으로 교체
- Singleton 서비스가 Scoped
의존성 업그레이드
Polly.Extensions8.4.2 → 8.6.6
테스트
- 전체 테스트 4,634개 통과
[v2.1.0] - 2026-03-08
Resilience DI 표준화, 라이선스 검증 전용 API, Testing 패키지 공개 배포, Mermaid 다이어그램 개선 릴리스입니다.
개선 사항
- Mermaid 다이어그램 뷰어 개선 — 기본 프레임 최소 높이 300px 적용, 전체화면 진입/종료 시 줌 자동 리셋, 전체화면에서 줌/이동이 확장된 프레임 전체를 대상으로 동작하도록 수정
새로운 기능
- FIR-013: Resilience DI 표준화 —
AddCaffeineResilience()내부 구현을AddKeyedSingleton방식에서AddResiliencePipeline(표준 Polly.Extensions 패턴) 으로 전환.ResiliencePipelineProvider<string>DI 등록으로 표준 Polly 사용 방식 지원. Polly.Extensions 8.4.2 - FIR-014:
AddCaffeineLicenseVerification()신규 DI 확장 메서드 — 검증 전용 DI 등록 (ILicenseService+IHardwareInfo).DefaultHardwareInfo크로스 플랫폼 폴백(Windows/Linux/macOS) 지원. 라이선스 생성·서명 기능은 포함하지 않음 (보안 정책) - FIR-015:
NEXCODE.Caffeine.TestingNuGet.org 공개 배포 — 드라이버 테스트 하네스 패키지 공식 배포 개시. 18개 → 19개 NuGet 패키지
품질
- 전체 테스트 4,579개 통과 (0 실패)
- 신규 테스트 8개 추가 (ResilienceExtensions, LicenseVerification)
[v2.0.9] - 2026-03-06
Caffeine Framework의 첫 NuGet.org 공식 릴리스입니다. NuGet 패키지명 NEXCODE 리브랜딩, 커버리지 개선, CI 안정성 수정이 포함됩니다.
변경 사항
- NuGet 패키지명 NEXCODE 리브랜딩 — 모든 패키지명
NEXCODE.Caffeine.*통일 (docs 반영) - 개별 어셈블리 커버리지 80%+ 달성 — CI 측정 버그 수정 및
ExcludeFromCodeCoverage적용 - CI ubuntu SIGBUS(exit 135) 크래시 수정 — TypeDB P/Invoke RID 조건부 참조 적용
[v2.0.8] - 2026-03-03
라이선스 정책 문서화, Community 에디션 기본값 동기화, Licensing 보안 재설계 릴리스입니다.
보안 개선
Caffeine.LicensingNuGet 배포 중단 (IsPackable=false) — 라이선스 생성 코드(PkvKeyGenerator,LicenseGenerator)의 외부 노출 차단. NuGet을 통해 누구나 라이선스를 발급할 수 있던 보안 취약점 해소- PKV 검증 타입
Caffeine.Core.Licensing으로 이동 —PkvKeyVerifier,KeyByteSet을 내부 전용 어셈블리에서 Core 네임스페이스로 분리하여 검증(Verification)과 생성(Generation) 책임 명확히 분리
새로운 기능
- 토큰 자동 영속화 (
FileBasedLicenseTokenStore) — 업로드 성공 시 로컬 디스크 자동 저장, 서버 재시작 시 자동 로드 (Windows:%LocalApplicationData%/Caffeine/license.jwt, Linux:~/.local/share/Caffeine/license.jwt) appsettings.jsonLicensing 섹션 —PublicKeyXml(RSA 공개키),TokenStorePath(저장 경로 오버라이드) 설정 지원AddCaffeineLicensing(IConfiguration)DI 확장 메서드 —IConfiguration기반 설정 주입으로 단순화된 서비스 등록cafe-license내부 전용 CLI (Caffeine.Licensing.Cli,IsPackable=false) — RSA 키 쌍 생성(generate-keys), JWT 토큰 발급(issue), 검증(verify), HWID 조회(hwid) 서브커맨드 제공
NuGet 패키지 변경
Caffeine.Licensing패키지 배포 목록에서 제거 — 내부 전용(IsPackable=false)으로 전환. v2.0.9 기준 19개 배포 패키지 → 18개
문서
라이선스 문서 신규 추가 (docs/licensing/)
pricing.md: 에디션별 가격 정책, 경쟁사 대비 장점, Community/Professional/Enterprise 상세guide.md: JWT + HWID 이중 바인딩 동작 원리, 활성화 Mermaid 플로우차트, Admin UI 사용법, 토큰 영속화 설명, 서버 설정 가이드, Safe Mode 설명feature-comparison.md: 데이터 수집·저장·통신·AI·로보틱스·보안 전 영역 기능 비교 매트릭스, Feature Flag 목록, 드라이버별 라이선스 요구사항trial.md: 30일 무료 Trial 시작 절차, 기간 확인, 만료 후 동작, 정식 전환 절차troubleshooting.md: HWID 불일치, Safe Mode 복구, 토큰 업로드 실패, 에러 코드 레퍼런스
기존 문서 개선
introduction/overview.md: 라이선스 비교·가격·가이드 링크 3곳 추가api/license.md: 정책 안내 박스 + 기능 비교표 링크 추가 + POST /upload 토큰 영속화 노트 추가reference/faq.md: Q3 실제 3-tier 모델로 전면 수정, 라이선스 FAQ 5개 추가 (Trial·업그레이드·HWID·SafeMode·Community 기능)
버그 수정
LicenseModels.cs: Community 기본값 API 문서와 동기화 (MaxTags500→100,MaxDrivers1→2)
[v2.0.7] - 2026-03-02
Caffeine CLI (cafe) 배포 위자드 및 원격 Docker Context 지원이 추가된 릴리스입니다.
새로운 기능
cafe setup 대화형 배포 위자드 (Setup Distribution Phase 2)
- 원클릭 배포:
cafe setup한 줄로 Docker 환경 구성 완료 - 5개 프로파일 시스템:
minimal/standard/full/full+monitoring/app - 사전 검증: Docker 설치, 데몬 실행, Compose v2 자동 확인
- 포트 충돌 감지: 선택한 프로파일 포트 사용 현황 자동 감지
- .env 자동 생성:
RandomNumberGenerator기반 암호학적 안전 시크릿 자동 생성 - EmbeddedResource 배포 파일:
cafe setup extract로 docker-compose.yml 추출 - 서브커맨드:
status,down,extract(--list, --profile, --force, --output)
원격 Docker Context (SSH) 지원 (2D-04)
--remote ssh://user@host: 원격 서버에 직접 배포- Docker Context 자동 생성: SSH URL에서 context 이름 자동 유도
.caffeine-context영속화: 배포 후 context 저장,status/down에서 재사용- SSH 연결 검증: 배포 전 원격 Docker 데몬 연결 자동 확인
Production 보안 강화
--mode production: 6개 보안 항목 자동 검증.env파일 존재 확인- JWT Secret 강도 검사 (44자 이상)
- 기본 비밀번호 탐지 (
admin123,changeme등) CAFFEINE_ENV=production설정 확인- TLS 인증서 존재 확인
- Docker 데몬 실행 확인
docker-compose.prod.yml: 리소스 제한, 로그 로테이션, 재시작 정책 오버레이
인프라 표준화 (Setup Distribution Phase 1)
- 통합
docker-compose.yml: 5개 프로파일 통합 관리 .env.example: 안전한 환경 변수 템플릿 제공- NEXCODE.Caffeine.Cli v0.9.0 NuGet 패키지:
dotnet tool install -g NEXCODE.Caffeine.Cli
테스트 커버리지
- 90.4% line-rate (CI 임계값 80% 초과)
- 총 409개 테스트 통과, 0 실패
- 신규 테스트 +36개 (DockerContextService, 원격 배포 시나리오)
[v2.0.6] - 2026-03-02
내부 개발 빌드 릴리스입니다.
포함된 패키지 (19개)
⚠️ v2.0.8 변경:
Caffeine.Licensing이 내부 전용(IsPackable=false)으로 전환되어 배포 목록에서 제거되었습니다. v2.0.8부터 18개 패키지가 배포됩니다.
| 패키지 | 설명 |
|---|---|
| NEXCODE.Caffeine.Core | 핵심 인터페이스, 엔티티, 값 객체 |
| NEXCODE.Caffeine.Client | gRPC/SignalR 클라이언트 SDK |
| NEXCODE.Caffeine.Identity | ASP.NET Core Identity + JWT 인증 |
| NEXCODE.Caffeine.Infrastructure | InfluxDB, Redis, SQLite 어댑터 |
| NEXCODE.Caffeine.IPC | gRPC/Protobuf 계약 |
| NEXCODE.Caffeine.AI | ONNX/ML.NET 예측 정비 |
| NEXCODE.Caffeine.Generators | Roslyn Source Generator |
| NEXCODE.Caffeine.Presentation | Web API/gRPC/SignalR 진입점 |
| NEXCODE.Caffeine.Simulation | 시뮬레이션 엔진 |
| NEXCODE.Caffeine.UI | Blazor Blueprint 공유 UI |
| NEXCODE.Caffeine.Robotics.Abstractions | 로보틱스 추상화 |
| NEXCODE.Caffeine.Testing | 테스트 유틸리티 |
| NEXCODE.Caffeine.Drivers.Simulation | 시뮬레이션 드라이버 |
| NEXCODE.Caffeine.Drivers.ModbusTcp | Modbus TCP 드라이버 |
| NEXCODE.Caffeine.Drivers.ModbusRtu | Modbus RTU 드라이버 |
| NEXCODE.Caffeine.Drivers.SecsGem | SECS/GEM 반도체 드라이버 |
| NEXCODE.Caffeine.Drivers.Lse | LSE 드라이버 |
| NEXCODE.Caffeine.Drivers.Mitsubishi | Mitsubishi PLC 드라이버 |
| NEXCODE.Caffeine.Drivers.Omron | Omron PLC 드라이버 |
주요 기능
- .NET 10 기반 IIoT 엣지 플랫폼
- Reactive Programming (System.Reactive) 기반 실시간 데이터 파이프라인
- 플러그인 아키텍처 드라이버 시스템 (Modbus, SECS/GEM, PLC)
- gRPC + SignalR 이중 통신
- MQTT/Kafka 엣지-클라우드 전송
- ASP.NET Core Identity + JWT RBAC 인증
- InfluxDB 시계열 + Redis 캐시 + SQLite 로컬 스토리지
- ONNX Runtime 예측 정비
- Blazor Server + Blazor Blueprint 관제 대시보드
- OpenTelemetry 관측성
📊 버전 정책
Semantic Versioning
Caffeine은 Semantic Versioning 2.0.0을 따릅니다.
형식: MAJOR.MINOR.PATCH
- MAJOR: Breaking changes (호환성 깨짐)
- MINOR: 새로운 기능 추가 (하위 호환)
- PATCH: 버그 수정 (하위 호환)
예제:
2.0.6→2.0.7: 버그 수정2.0.7→2.1.0: 새 기능 추가2.1.0→3.0.0: Breaking changes
LTS (Long-Term Support)
| 버전 | 릴리스 날짜 | 일반 지원 종료 | LTS 종료 |
|---|---|---|---|
| 3.x | 2026-03-20 | 2027-03-20 | 2029-03-20 |
| 2.x | 2026-03-02 | 2027-03-02 | 2029-03-02 |
지원 정책:
- 일반 지원: 버그 수정, 보안 패치, 새 기능
- LTS: 버그 수정, 중요 보안 패치만
📝 알려진 문제
Version 2.0.0
문제 1: SignalR 재연결 지연
- 설명: 네트워크 끊김 후 재연결에 최대 30초 소요
- 임시 해결책:
HubOptions.HandshakeTimeout조정 - 수정 예정: 2.0.7
문제 2: InfluxDB 배치 쓰기 메모리 누수
- 설명: 대량 데이터 쓰기 시 메모리 증가
- 임시 해결책: 배치 크기를 500개로 제한
- 수정 예정: 2.0.7
📞 문의
버전 관련 질문이나 문제가 있으시면:
- 이메일: matrix@live.co.kr
- 공식 문서: https://docs.nexcode.co.kr/caffeine
최종 업데이트: 2026-04-17