13강 / 20강

압력 제어기 — 프로토콜을 모르는 장비 감싸기

시리얼 · 어댑터 계층

압력 제어기 — 프로토콜을 모르는 장비 감싸기
남이 만든 상자를 내 약속의 모양으로 감싸는 법.

지금까지 다룬 장치는 우리가 밑바닥까지 아는 것이었습니다. 압력 제어기는 다릅니다 — 제조사가 만든 완성된 상자이고, 안이 어떻게 생겼는지 우리는 모릅니다.

이런 장치를 다루는 요령이 어댑터 계층입니다. 남의 약속을 우리 약속의 모양으로 감싸 버립니다(3강의 Protocol).

class PressureSource(Protocol): # 우리가 정한 약속 def set_mbar(self, v: float) -> None: ... def read_mbar(self) -> float: ... def safe(self) -> None: ... # 3강에서 정한 공통 약속 class VendorPressureAdapter: # 남의 SDK 를 우리 모양으로 def __init__(self, sdk): self._sdk = sdk def set_mbar(self, v): self._sdk.SetPressure(self._ch, v) # 이름이 제각각이다 def read_mbar(self): return self._sdk.GetPressure(self._ch) def safe(self): self._sdk.SetPressure(self._ch, 0)
타임아웃 설정을 바꿔 보세요. 장비가 응답하지 않을 때 무슨 일이 생기는지 보입니다.
불러오는 중…
장비가 죽는 것보다 나쁜 것은 죽었는데 우리가 모르는 것입니다. 타임아웃이 그 둘을 가릅니다.
Python 브라우저에서 실행

읽기는 마음껏, 쓰기는 조심스럽게

읽기 — 다시 해도 된다
CRC 오류나 타임아웃이면 그냥 다시 읽으면 됩니다. 세상에 아무 일도 안 일어납니다. tenacity 로 지수 백오프를 걸어 두십시오.
쓰기 — 함부로 다시 하면 안 된다
“100 µL 넣어라” 를 보냈는데 응답이 없었습니다. 안 들어간 걸까요, 들어갔는데 응답만 못 온 걸까요? 그냥 다시 보내면 200 µL 가 들어갑니다.

규칙은 이것입니다 — 쓰기를 재시도하기 전에 먼저 읽어서 실제 상태를 확인한다. 읽을 수 없는 장치라면 재시도하지 말고 결함으로 올립니다(→ 19강).

🤔 확인 문제
장비에 “설정압 1200 mbar” 를 보냈는데 응답이 없었다. 올바른 대응은?
🤔 확인 문제
어댑터 계층을 두는 실용적 이득은?