Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

10. 모든 조각의 결합 — 완성된 진단 플랫폼 🟡

학습 목표: 지금까지 배운 7가지 핵심 패턴(02~09장)이 어떻게 하나의 진단 워크플로우로 조화롭게 결합되는지 배웁니다. 인증, 세션 관리, 타이핑된 명령, 감사 토큰, 차원 결과, 검증된 데이터, 그리고 팬텀 타입 레지스터가 런타임 오버헤드 없이 어떻게 함께 작동하는지 확인합니다.

관련 장: 02~09장의 모든 핵심 패턴, 14장 (가정에 대한 테스트)


목표: 7가지 패턴의 통합

이 장에서는 앞서 배운 패턴들을 결합하여 실제와 유사한 서버 상태 점검 워크플로우를 구축합니다.

  1. 인증 (역량 토큰 — 04장)
  2. IPMI 세션 열기 (타입 상태 — 05장)
  3. 타이핑된 명령 전송 (타입 지성 명령 — 02장)
  4. 감사 로그 작성을 위한 단회용 토큰 (단회용 타입 — 03장)
  5. 차원 분석 결과 반환 (차원 분석 — 06장)
  6. FRU 데이터 검증 (유효성 검증 경계 — 07장)
  7. 타이핑된 레지스터 읽기 (팬텀 타입 — 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)CelsiusRpm은 서로 다른 타입임차원 분석
레지스터 너비 불일치Reg<Width16>u16만 반환함팬텀 타입
검증되지 않은 데이터 처리ValidFru::parse()를 거쳐야만 데이터 접근 가능유효성 검증 경계
중복 감사 로그 작성로그 작성 시 AuditToken이 소비됨단회용 타입

핵심 요약

  1. 7가지 패턴의 빈틈없는 조화 — 각 패턴은 독립적으로도 유용하지만, 결합되었을 때 강력한 안전망을 형성합니다.
  2. 8가지 버그 클래스의 원천 차단 — 위의 표에서 보듯, 수많은 런타임 실수가 컴파일 에러로 전환됩니다.
  3. 제로 런타임 오버헤드 — 이 모든 보장은 컴파일 시점에 완료됩니다. 생성된 기계어는 아무런 검사도 하지 않는 C 코드만큼이나 빠릅니다. 하지만 C는 버그가 있을 수 있고, 이 코드는 그럴 수 없습니다.
  4. 점진적 도입 가능 — 이 모든 패턴을 한꺼번에 적용할 필요는 없습니다. 가장 필요한 부분부터 하나씩 도입해 나가세요.
  5. 확장 가능한 설계 템플릿 — 이 장의 구조는 여러분만의 타입 안전한 진단 워크플로우를 설계할 때 훌륭한 출발점이 될 것입니다.