Forms: 사용자 동작 명세
서버를 폼 유효성의 권위자로 만들고, 클라이언트는 속도를 위해 유효성을 검사하며 오류 코드를 공유하고, 첫 번째 잘못된 필드에 포커스를 맞추며, 개인 기록 존재 여부를 절대 누설하지 않습니다.
패키지 상태: 참조 컨텍스트가 인간 검토를 위해 준비됨. 계약과 테스트 시나리오는 완성되었으나, 이를 통과한 채택 구현체가 있다고 주장하지는 않습니다.
결정
네트워크 전 클라이언트에서 빈 필수 필드와 형식 오류를 잡도록 유효성 검사를 수행합니다. 이 검사는 잠정적인 것으로 간주합니다. 서버는 동일한 규칙과 권한 및 고유성 검사를 다시 수행하며, 서버의 오류 코드는 권위적입니다. 이들을 동일한 필드에 매핑합니다. 첫 번째 잘못된 컨트롤에 포커스를 맞추고 요약을 알립니다. 조회가 개인 기록을 노출할 수 있는 경우, 누락과 금지를 구분하지 않는 일반적인 충돌 코드를 반환합니다.
범위
- 클라이언트와 서버 검증기가 중첩된 데이터 입력 폼.
- 오류 코드, 포커스 순서, 보조 안내.
- 개인 또는 테넌트 간 존재를 노출해서는 안 되는 응답.
- 관련 없는 값을 잃지 않고 수정 후 재시도.
이 블록 외부
- 필드 오류를 넘어선 비동기 목록 피드백.
- CAPTCHA 및 속도 제한.
- 저장 문서 스키마 마이그레이션.
계약
- 클라이언트 규칙에 실패하는 제출은 요청을 보내지 않으며, 첫 번째 잘못된 컨트롤에 접근 가능한 이름과 오류 텍스트와 함께 포커스가 갑니다.
- 서버는 클라이언트가 중첩 규칙에 사용하는 동일한 코드로
{code, field}쌍의field_errors를 반환합니다. - 클라이언트 유효 페이로드도 실패할 수 있으며, UI는 클라이언트 메시지를 서버 목록으로 교체하고 별도의 어휘를 만들지 않습니다.
- 제출 실패 후, 포커스는 문서 순서상 첫 번째 서버-유효하지 않은 필드로 이동하며, 정중한 라이브 영역이 오류 수를 한 번 알립니다.
- 존재 민감 조회는 누락과 권한 없음 모두에 대해
not_available같은 일반 코드를 반환합니다. - 관련 없는 더러운 필드는 유지되며, 비밀번호와 비밀은 HTML이나 JSON에 반영되지 않습니다.
구현
형식과 필수 검사에 대한 기계 판독 가능한 규칙 목록을 공유합니다. 고유성과 권한은 서버에 둡니다. 오류는 라벨이 붙은 컨트롤 옆에 렌더링합니다. 존재 민감 부정은 권한 범위 내에 축소합니다. 키보드 전용과 화면 판독기에서 첫 오류 포커스를 테스트합니다.
실패 처리
서버에 연결할 수 없으면 값을 유지하고, 필드 오류와 구분되는 요청 수준 오류를 표시하며, 제출은 활성 상태로 둡니다. 알 수 없는 코드는 필드 연관성을 유지하면서 일반 필드 메시지를 받습니다. 두 필드가 코드를 공유하면 둘 다 표시하며, 포커스는 문서 순서상 첫 번째로 갑니다.
검증
중첩 코드에 대해 계약 테스트를 수행합니다. 개인 슬러그 충돌이 예약과 구분되지 않는지 확인합니다. 포커스와 단일 안내를 점검합니다. 폼 하니스에서 패키지된 시나리오를 실행합니다.
이 패키지의 실행 예시는 픽스처 및 수용 계약입니다. 컬렉션 루트에서
python tools/validate.py를 실행하여 패키지 구조와 메타데이터를 확인한 후,
대상 저장소에서 시나리오를 구현하고 실행하세요.
채택 가정
example.yaml의 이름과 숫자 값은 채택 프로필이며 보편적 기본값이 아닙니다.- 채택 팀은 행위자, 데이터 클래스, 오류 어휘, 소유권을 자사 시스템에 매핑해야 합니다.