10. 모든 조각의 결합 — 완성된 진단 플랫폼 🟡
학습 목표: 지금까지 배운 7가지 핵심 패턴(02~09장)이 어떻게 하나의 진단 워크플로우로 조화롭게 결합되는지 배웁니다. 인증, 세션 관리, 타이핑된 명령, 감사 토큰, 차원 결과, 검증된 데이터, 그리고 팬텀 타입 레지스터가 런타임 오버헤드 없이 어떻게 함께 작동하는지 확인합니다.
관련 장: 02~09장의 모든 핵심 패턴, 14장 (가정에 대한 테스트)
목표: 7가지 패턴의 통합
이 장에서는 앞서 배운 패턴들을 결합하여 실제와 유사한 서버 상태 점검 워크플로우를 구축합니다.
- 인증 (역량 토큰 — 04장)
- IPMI 세션 열기 (타입 상태 — 05장)
- 타이핑된 명령 전송 (타입 지성 명령 — 02장)
- 감사 로그 작성을 위한 단회용 토큰 (단회용 타입 — 03장)
- 차원 분석 결과 반환 (차원 분석 — 06장)
- FRU 데이터 검증 (유효성 검증 경계 — 07장)
- 타이핑된 레지스터 읽기 (팬텀 타입 — 09장)
통합 워크플로우 예시 (의사 코드)
fn full_diagnostic() -> Result<(), String> {
// 1. 인증 → 역량 토큰 획득
let admin = authenticate("admin", "secret")?;
// 2. 세션 연결 및 활성화 (타입 상태: Idle → Active)
// 활성화를 위해 관리자 토큰(AdminToken)이 필수로 요구됨
let mut session = Session::connect("192.168.1.100").activate(&admin)?;
// 3. 타이핑된 명령 전송 (반환 타입이 명령과 일치함)
let temp: Celsius = session.execute(&ReadTemp { sensor_id: 0 })?;
let fan: Rpm = session.execute(&ReadFanSpeed { fan_id: 1 })?;
// 4. 팬텀 타입이 적용된 PCIe 레지스터 읽기
let pcie = PcieDev::new();
let vid: u16 = pcie.vendor_id.read(); // 컴파일러가 u16임을 보장
// 5. 경계에서 FRU 데이터 검증
let fru = ValidFru::parse(&raw_bytes)?;
// 6. 단회용 감사 토큰 발행
let audit = AuditToken::issue(1001);
// 7. 보고서 생성 및 감사 토큰 소비 (두 번 로깅 불가)
audit.log(&format!("Server: {}, Temp: {:?}", fru.product_name, temp));
// 8. 세션 종료 (타입 상태: Active → 드롭)
session.close();
Ok(())
}
컴파일러가 증명하는 것들
| 버그 클래스 | 방지 방법 | 관련 패턴 |
|---|---|---|
| 비인증 접근 | activate() 호출 시 AdminToken 요구 | 역량 토큰 |
| 잘못된 상태에서의 명령 | execute()는 오직 Active 세션에만 존재 | 타입 상태 |
| 잘못된 응답 타입 처리 | 명령 트레이트에서 응답 타입을 고정함 | 타입 지정 명령 |
| 단위 혼동 (°C vs RPM) | Celsius와 Rpm은 서로 다른 타입임 | 차원 분석 |
| 레지스터 너비 불일치 | Reg<Width16>은 u16만 반환함 | 팬텀 타입 |
| 검증되지 않은 데이터 처리 | ValidFru::parse()를 거쳐야만 데이터 접근 가능 | 유효성 검증 경계 |
| 중복 감사 로그 작성 | 로그 작성 시 AuditToken이 소비됨 | 단회용 타입 |
핵심 요약
- 7가지 패턴의 빈틈없는 조화 — 각 패턴은 독립적으로도 유용하지만, 결합되었을 때 강력한 안전망을 형성합니다.
- 8가지 버그 클래스의 원천 차단 — 위의 표에서 보듯, 수많은 런타임 실수가 컴파일 에러로 전환됩니다.
- 제로 런타임 오버헤드 — 이 모든 보장은 컴파일 시점에 완료됩니다. 생성된 기계어는 아무런 검사도 하지 않는 C 코드만큼이나 빠릅니다. 하지만 C는 버그가 있을 수 있고, 이 코드는 그럴 수 없습니다.
- 점진적 도입 가능 — 이 모든 패턴을 한꺼번에 적용할 필요는 없습니다. 가장 필요한 부분부터 하나씩 도입해 나가세요.
- 확장 가능한 설계 템플릿 — 이 장의 구조는 여러분만의 타입 안전한 진단 워크플로우를 설계할 때 훌륭한 출발점이 될 것입니다.