← 홈Setup Tip

Setup Tip

Setup Tip — 하나의 sentinel에 다섯 가지 실패를 담지 않기

읽기 결과 하나로 부재와 판독 불가를 함께 표현하면 호출자는 안전한 부재와 불확실한 실패를 구별할 수 없다. 결과마다 별도의 경계를 유지해야 한다.

문제

제한된 입력을 읽는 함수가 정규 파일이 아닌 경우, 크기 제한 초과, 읽은 바이트 초과, ENOENT, 그 밖의 예외를 모두 같은 undefined로 접으면 호출자는 파일이 없는 것과 읽을 수 없는 것을 구별할 수 없다. 빈 값은 편리하지만 의미가 너무 넓다.

계약을 쪼개기

부재는 ‘확인할 대상이 없음’이라는 하나의 결과로만 표현한다. 그 외에는 너무 큼, 예상과 다른 대상, 읽기 중단, 손상되었거나 판독할 수 없음처럼 각각을 보존하는 결과 또는 오류 경계를 둔다. 호출자는 이 분류를 보고 다음 행동을 결정할 수 있어야 한다.

불확실성을 펜스 안에 두기

판독 불가를 부재로 바꾸면 보호 장치가 조용히 열리고, 상위 단계는 없는 입력이라고 믿고 진행한다. 확실히 읽지 못한 경우에는 성공으로 승격하지 않고 확인이 필요한 상태로 남긴다. 불확실한 상태는 누락시키는 대신 다음 단계로 전파하되, 완료 판정에서는 울타리 밖으로 내보내지 않는다.

구현 전후 확인

각 분기에서 호출자가 받는 값이 다른지 작은 표로 적는다. 실제 ENOENT 같은 부재는 부재 판정으로, 정규 파일 아님·크기 초과·읽은 바이트 초과·그 밖의 판독 예외는 각자의 실패 또는 불확실성으로 도착하는지 확인한다. 한 분기만 확인했다고 전체 읽기 계약이 증명되는 것은 아니다.

완료 기준

부재만 안전한 미존재 판정을 만들고, 읽을 수 없음·손상·제한 초과는 각각의 fence를 유지하며, 호출자가 빈 값 하나로 성공을 추정하지 않을 때 완료다. 모르는 것을 없는 것으로 바꾸지 않는 것이 bounded read의 최소 계약이다.