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

13. 실습 가이드 — 타입 안전한 Redfish 클라이언트 🟡

학습 목표: 타입 상태 세션, 역량 토큰, 팬텀 타입 리소스 탐색, 차원 분석, 유효성 검증 경계, 빌더 타입 상태, 그리고 단회용 타입을 결합하여 완전하고 오버헤드 없는 Redfish 클라이언트를 구축합니다. 모든 프로토콜 위반은 런타임이 아닌 컴파일 타임 에러가 됩니다.

관련 장: 02장 (타입 지정 명령), 03장 (단회용 타입), 04장 (역량 토큰), 05장 (타입 상태), 06장 (차원 분석), 07장 (유효성 검증 경계), 09장 (팬텀 타입), 10장 (Const Fn), 11장 (팁 4 — 빌더 타입 상태)


Redfish와 타입 안전성

IPMI가 바이트 수준의 프로토콜이라면, Redfish는 REST API 기반의 복잡한 리소스 트리를 다룹니다. Redfish에서는 다음과 같은 위험 요소들이 존재하지만, 타입 기반 설계로 이를 원천 차단할 수 있습니다.

위험 요소예시결과(기존 환경)해결 방법(타입 기반)
잘못된 URI/Chassis/1/Processors (부모가 틀림)404 또는 데이터 유실팬텀 기반 리소스 탐색 (09장)
권한 누락일반 사용자가 Manager.Reset 호출403 에러 또는 보안 사고역량 토큰 (04장)
불완전한 PATCH필수 설정 항목 누락설정 오염 또는 무시됨빌더 타입 상태 (11장)
단위 혼동온도를 팬 속도와 비교잘못된 임계치 판단차원 분석 (06장)

실습 1 — 세션 생명주기 (타입 상태)

Redfish 세션은 Disconnected → Connected → Authenticated → Closed와 같은 엄격한 상태 변화를 따릅니다.

pub struct Disconnected;
pub struct Connected;
pub struct Authenticated;

pub struct RedfishSession<S> { /* ... */ }

impl RedfishSession<Connected> {
    pub fn login(self, user: &str) -> RedfishSession<Authenticated> { /* ... */ }
}

impl RedfishSession<Authenticated> {
    pub fn get(&self, path: &str) -> Json { /* API 호출 가능 */ }
}
// Connected 상태에서는 get() 메서드 자체가 없어 호출 불가능함

실습 2 — 권한 토큰 (역량 토큰)

Redfish의 4가지 권한 수준을 제로 크기 타입(ZST) 토큰으로 인코딩합니다.

pub struct ConfigureManagerToken; // 관리자 권한 증명

fn reset_to_defaults(
    session: &RedfishSession<Authenticated>,
    _proof: &ConfigureManagerToken, // 이 토큰이 있어야만 호출 가능
) { /* ... */ }

// 관리자로 로그인하지 않으면 해당 토큰을 얻을 수 없어 컴파일 타임에 차단됨

실습 3 — 계층 구조 탐색 (팬텀 타입)

잘못된 URI를 생성하는 것은 불가능해집니다.

let root = RedfishPath::root();
let thermal = root.chassis().instance("1").thermal(); // ✅ 정상적인 경로
// let bad = root.thermal(); // ❌ 컴파일 에러: root 아래에 thermal은 존재하지 않음

실습 4 — 차원 텔레메트리 (차원 분석)

서버에서 응답을 파싱할 때 즉시 단위를 부여합니다.

let thermal = session.get_resource(&thermal_path)?;
// thermal.reading은 Celsius 타입이므로 Rpm 타입과 비교하려 하면 컴파일 에러 발생

핵심 요약

  1. 복합적인 안전망 — 이 장에서는 지금까지 배운 모든 패턴을 결합하여, 리소스 경로, 권한, 상태 변화, 데이터 단위까지 모든 층위에서 안전한 클라이언트를 만드는 법을 보여줍니다.
  2. 런타임 에러를 컴파일 에러로 — 404(잘못된 경로), 403(권한 없음), 400(잘못된 요청 형식) 등의 REST 오류 상당수를 코드를 실행하기도 전에 잡아낼 수 있습니다.
  3. 오버헤드 없는 추상화 — 모든 타입 체크와 토큰 전달은 컴파일 시점에 사라지며, 실제 실행 시에는 효율적인 네트워크 호출만 남습니다.
  4. 규모에 따른 확장성 — 이 패턴들은 소규모 스크립트부터 수천 대의 서버를 관리하는 대규모 인프라 도구까지 동일하게 적용될 수 있습니다.