장치를 하나 더 붙였다 — 호스트는 손대지 않았다

5 분
목표여러 장치를 한 화면에 모으려면 보통 호스트가 결합을 코드로 짠다. 그러면 장치가 늘 때마다 호스트를 고친다. 여기서는 그 결합이 문서로 내려간다. 실제로 장치 셋을 한 페이지에 붙이고, 셋째를 추가할 때 호스트 바이너리의 해시가 바뀌는지 재 봤다. 그리고 하나를 죽여 봤다.

앞의 두 글에서 장치 하나를 다뤘다. 자기 화면을 건네고, 그 화면이 설치 없이 도착한다.

현장에는 장치가 하나만 있지 않다. 조타실에는 발전기와 밸러스트와 연료계가 같이 있다. 이 글은 여럿을 한 화면에 모을 때 무엇이 일어나는지다.

보통은 호스트가 결합을 짠다

여러 장치를 한 화면에서 보려면, 대개 앱이 그 결합을 코드로 갖고 있다. 어느 장치의 어떤 값을 어디에 놓을지, 그 버튼이 어느 장치로 갈지를 앱이 안다.

그래서 장치를 하나 더 붙일 때마다 앱을 고친다. 그리고 조합이 빌드 시점에 고정된다. 현장에서 장비 구성이 바뀌면 앱도 다시 나와야 한다.

여기서는 결합이 문서로 내려간다

UI DSL 1.4의 합성 규약은 그 결합을 문서로 내린다. 호스트가 하는 일은 두 가지뿐이다 — 연결을 쥐고 있는 것, 그리고 문서가 이름 부른 상대를 열어 주는 것. 결합 로직이 없다.

문서에는 이렇게 적힌다. 여기에 이 연결이 주는 화면을 넣어라. 저기에 저 연결이 주는 화면을 넣어라.

규약이 정하는 성질이 넷이다.

  • 각 장치가 내주는 화면을 무수정 그대로 남의 앱 안에 넣는다. 장치는 자기가 합성되는 줄 모른다.
  • 임베드된 부분의 조작과 구독이 그 장치로 나간다.
  • 실패는 타일 단위로 격리된다.
  • 서버를 추가해도 호스트는 바뀌지 않는다.

넷 다 스펙에 적힌 말이다. 그래서 화면에서 재 봤다.

가닥을 묶어 올린 배선반

잰 것 — 노드 셋

MCP 노드 셋을 띄웠다. Boiler A, Pump B, Valve C. 각자 자기 화면을 내주고, 자기 값을 갖고, 자기 도구를 노출한다. 서로를 모른다.

그리고 세 장치를 한 페이지에 놓는 문서를 하나 썼다. 그 문서에는 무엇이 그려질지 적혀 있지 않다. 어느 연결이 어디에 들어갈지만 적혀 있다.

① 세 타일이 각자 자기 화면으로 그려졌다. 각자 자기 이름, 자기 단위, 자기 색, 자기 값. 앱은 그중 아무것도 쓰지 않았다.

② 타일의 버튼이 자기 서버로만 갔다. 첫 타일의 버튼을 누르면 첫 서버의 값만 오른다. 서버에 직접 물어서 확인했다 — 29→30, 나머지 둘은 그대로. 둘째를 누르면 둘째만, 셋째를 누르면 셋째만.

이게 합성에서 가장 조용히 틀릴 수 있는 자리다. 화면은 제대로 그려지는데 버튼이 엉뚱한 서버로 가면, 증상이 화면에 안 나타난다.

③ 하나를 죽였다. 둘째 노드를 내렸다. 그 타일만 대체 표시로 바뀌고 첫째 타일은 살아 있었다. 페이지도, 그 아래 내용도 계속 그려졌다. 네 장치 중 하나가 꺼진 화면은 세 개가 살아 있는 화면이지 빈 화면이 아니다.

④ 셋째를 추가했다. 문서에 두 자리를 더했다 — 연결 하나, 자리 하나. 그리고 호스트 바이너리의 해시를 추가 전후로 비교했다.

같았다. 재빌드가 없었다.

그래서 제목이 이렇다

여기서 정확해야 한다. 앱을 안 고친 게 아니다. 문서에는 두 자리가 늘었다. 장치를 늘리려면 그 장치를 어디에 놓을지는 누군가 말해야 한다.

바뀌지 않은 것은 호스트다. 실행 파일이 그대로다. 그 말은 심사를 다시 받지 않고, 배포를 다시 하지 않고, 현장의 기기를 건드리지 않는다는 뜻이다.

측정한 것이 그것이므로 제목도 그렇게 적었다.

이 판에서 나온 것들

이 측정은 한 번에 되지 않았다. 처음에는 타일이 둘 다 대체 표시였고, 원인을 찾는 데 통제 줄을 여럿 놓아야 했다.

그 과정에서 이 구조 쪽 결함이 넷 나왔고 전부 고쳐졌다 — 연결 실패가 30초 침묵하다 타임아웃되던 것, 없는 도구를 부르면 성공으로 돌아오던 것, 실패한 연결이 실패 처리로 오지 않던 것, 그리고 액션을 여럿 걸었을 때 조용히 버려지던 것.

그중 절반은 내 문서가 규약 밖이라서 난 것이었다. 화면이 비어 있던 진짜 이유도 그쪽이었다. 그리고 없는 도구가 성공으로 돌아오던 것은, 원인을 찾으려고 곁들여 놓은 통제 줄 하나가 잡았다 — 아무도 찾고 있지 않던 결함이다.

합성을 재려고 놓은 판에서 그 아래층의 결함이 함께 드러났다.

확인 과제

예제에 장치를 하나 더 붙여 보세요. 고친 파일을 모두 적어 보세요. 호스트가 그 목록에 있으면 안 됩니다.

관련 글One More Device Attached — The Host Was Not Touched