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

11. 실무에서 건진 14가지 팁 🟡

학습 목표: 파수꾼(Sentinel) 값 제거, 봉인된 트레이트, 세션 타입, Pin, RAII, #[must_use] 등 실무에서 유용하게 쓰이는 14가지 소규모 기법을 배웁니다. 각 기법은 적은 노력으로 특정 범주의 버그를 완벽히 차단합니다.

관련 장: 02장 (봉인된 트레이트), 05장 (타입 상태 빌더), 07장 (FromStr)


팁 1 — 경계에서 파수꾼(Sentinel) 값을 Option으로 변환

하드웨어 프로토콜은 0xFF(센서 없음), 0xFFFF(장치 없음)와 같은 마법 같은 숫자로 가득합니다. 이를 코드 전체에 정수로 들고 다니면 모든 곳에서 체크를 잊지 말아야 합니다. 하나라도 놓치면 255°C라는 엉뚱한 값을 읽게 됩니다.

규칙: 파싱 경계에서 즉시 Option으로 변환하고, 직렬화 직전에만 다시 파수꾼 값으로 돌려놓으세요.

pub struct ThermalEvent {
    pub temperature: Option<u8>, // 센서가 0xFF를 보고하면 None
}
// 이제 소비자는 반드시 None 케이스를 처리해야만 하며, 컴파일러가 이를 강제합니다.

팁 2 — 봉인된 트레이트 (Sealed Traits)

누구나 구현할 수 있는 공용 트레이트는 위험할 수 있습니다. 봉인된 트레이트는 외부 크레이트에서 해당 트레이트를 구현하는 것을 막아, 시스템의 무결성을 보호합니다.

mod private { pub trait Sealed {} }
pub trait IpmiCmd: private::Sealed { ... }
// 외부에서는 private::Sealed를 구현할 수 없으므로 IpmiCmd도 구현할 수 없습니다.

팁 3 — 진화하는 열거형을 위한 #[non_exhaustive]

새로운 하드웨어 SKU가 추가될 때마다 기존의 match 문이 깨지는 것을 방지합니다. 외부 소비자가 반드시 와일드카드(_)를 포함하도록 강제하여 하위 호환성을 유지합니다.


팁 4 — 타입 상태 빌더 (Typestate Builder)

필수 필드가 누락된 채로 build()가 호출되는 것을 컴파일 타임에 방지합니다. 모든 필수 설정이 완료되어야만 finish() 메서드가 나타나도록 설계합니다.


팁 5 — 문자열 검증 경계로서의 FromStr

설정 파일, CLI 인자 등의 문자열 데이터를 파싱할 때 FromStr을 사용하면 잘못된 입력(오타 등)을 시스템 진입점에서 즉시 차단할 수 있습니다.


팁 6 — 컴파일 타임 크기 검증을 위한 상수 제네릭 (Const Generics)

하드웨어 버퍼나 레지스터 뱅크의 크기가 고정되어 있다면 상수 제네릭을 사용하여 크기 불일치를 컴파일 타임에 잡아냅니다.


팁 7 — unsafe에 대한 안전한 래퍼

하드웨어 제어를 위해 unsafe가 필요하다면, 이를 안전한 공용 메서드로 감싸서 오남용을 방지하고 코드의 가독성을 높입니다.


팁 8 — 비동기 타입 상태 머신

async 환경에서도 타입 상태 패턴은 유효합니다. 다만 .await 지점을 넘나들 때 소유권 이동에 주의하여 상태 전이를 구현합니다.


팁 9 — 상수 어서션(Const Assertion)을 통한 정제 타입

컴파일 타임에 수치적 제약 조건(예: 팬 ID는 0~7 사이여야 함)을 체크하여 잘못된 고정값이 코드에 포함되는 것을 막습니다.


팁 10 — 정적 리소스 주소 지정 (ZST 필드)

특정 하드웨어 인스턴스(예: 0번 I2C 버스)를 타입 시스템의 일부로 만들어, 런타임 매개변수 없이도 특정 리소스에 안전하게 접근하게 합니다.


팁 11 — 선언적 레지스터 맵

매크로를 사용하여 레지스터의 오프셋, 비트 필드, 권한(R/W)을 선언적으로 정의함으로써 수동 계산 실수를 방지합니다.


팁 12 — PinDrop을 이용한 하드웨어 해제 보장

하드웨어 리소스가 사용 후 반드시 안전한 상태로 돌아가야 한다면 Drop 트레이트와 Pin을 결합하여 리소스 유출과 조기 해제를 방지합니다.


팁 13 — #[must_use]를 통한 무시 방지

함수의 반환값(예: 에러 결과나 권한 토큰)이 무시되면 안 되는 경우 이 속성을 사용하여 개발자의 실수를 경고합니다.


팁 14 — 제로 비용 로깅 및 추적

타입 레벨 마커를 사용하여 런타임 오버헤드 없이 디버그 정보를 남기거나 제거할 수 있는 구조를 만듭니다.