한 곳에서 클라이언트 측 및 서버 측 유효성 검사 관리


17

나는 하나가있는 경우 보드에 100 % 야 한다 확실히 클라이언트 측 및 서버 측 데이터 유효성 검사를 모두 사용합니다.

그러나 내가 작업 한 프레임 워크와 환경에서 내가 본 접근 방식은 결코 건조하지 않았습니다. 대부분의 경우 계획이나 패턴이 없습니다. 유효성 검사는 모델 사양에 작성되고 유효성 검사는 뷰의 형식으로 작성됩니다. (참고 : 대부분의 직접 경험은 Rails, Sinatra 및 PHP w / jQuery 사용)

이를 종합 해보면 일련의 유효성 검사 (예 : 모델 이름, 필드, 조건)가 필요한 클라이언트 측 및 서버 측 자료를 모두 생성 할 수있는 생성기를 만드는 것이 어렵지 않은 것 같습니다. 또는 이러한 도구는 서버 측 유효성 검사 (예 : validatesActiveRecord 모델 의 코드)를 수행하고 클라이언트 쪽 유효성 검사 (예 : jQuery 플러그인)를 생성하여 양식에 적용 할 수 있습니다.

분명히 위의 내용은 단지 "이 아이디어를 가졌다"고 공식적인 제안이 아닙니다. 이런 종류의 일은 아이디어가 저를 때릴 때보 다 분명히 어렵습니다.

그러면 데이터 유효성 검사를위한 "한 번 쓰기, 서버 및 클라이언트에서 실행"기술을 설계하는 방법에 어떻게 접근 할 것입니까?

관련 하위 주제 : 특정 프레임 워크 또는 클라이언트-서버 기술에 이와 유사한 도구가 있습니까? 하나의 검증 세트 만 유지하려고 할 때의 주요 문제점 또는 문제점은 무엇입니까?

답변:


6

제한된 경험에서 검증이 필요한 시점은

  1. HTML을 사용한 프리젠 테이션 레벨
  2. 발표 후 레벨 (예 : Javascript 유효성 검사)에서
  3. 여러 필드 간의 상호 작용을 함께 확인해야하는 조합 수준에서
  4. 비즈니스 로직 수준에서
  5. 데이터베이스 수준에서.

각각의 언어, 타이밍 및 트리거가 다릅니다. 예를 들어, 한 부분 만 유효성 검사 하지 않는 한 전체 레코드가 일관된 상태가되기 전에 필드의 유효성을 검사하는 것은 의미가 없습니다 . 데이터베이스 레벨의 제한 조건은 커미트 이전의 끝에 만 적용 가능해야하며 조각 단위로 쉽게 수행 할 수 없습니다.

관련 개념은 데이터를 나타내는 것이 각 레벨마다 다릅니다. 간단한 예는 웹 브라우저가 CP1290과 같은 텍스트를 나타내는 반면 데이터베이스는 UTF-8로이를 나타내는 것입니다. 두 문자열의 길이가 다르므로 길이 제한을 적용하는 것이 어색합니다.


languages, 다른 언어와 프레임 워크는 이것을 비현실적으로 만듭니다. 충분한 리소스를 사용하여 수행 할 수 있기 때문에 "실행 취소 가능"하지는 않지만 언어간에 또는 언어간에 자동 변환기를 작성하는 것은 큰 작업입니다. 합리적인 시간 내에 그것을 수행하고 관련 기술이 변화함에 따라 유지하는 것은 많은 작업이 될 것입니다.
Michael Durrant

브라우저에서 많은 서버 측 유효성 검사 (예 : 필드의 고유성)를 수행 할 수 없다는 것은 확실합니다. 그러나 클라이언트를 신뢰할 수 없으므로 서버에서 모든 클라이언트 측 유효성 검사를 반복해야합니다. 여기서 건조하는 것이 특히 유용하다는 것을 알 수 있습니다. 예를 들어 Rails를 확장 form_for하여 클라이언트 측 유효성 검사 코드를 자동으로 제공 하는 gem 이 매우 유용하다는 것을 알 수 있습니다.
Dan

5

종종 솔루션을 제한하는 한 가지 고려 사항은 네트워크 왕복입니다. 클라이언트는 네트워크를 통해 메시지를 보내지 않고 사용자 데이터의 유효성을 검사해야합니다. 다시 말해, 사용자가 제출 버튼을 누르면 클라이언트는 데이터를 로컬에서 검증해야합니다.

먼저이 제한이 없다고 가정 해 봅시다. 우리는 검증 문제를 명확하게 설명하는 네트워크 엔드 포인트와 통신 할 수 있습니다. 예를 들어, 바닐라 HTTP 오류 코드로 응답하지 않고 새 사용자 레코드를 제출하면 문제를 항목별로 자세히 설명하는 JSON 응답을 반환 할 수 있으며 클라이언트는 발생한 문제를 반영하여 디스플레이를 스마트하게 업데이트합니다. 엔드 포인트는 유효성 검사 게이트웨이의 역할을합니다.

건조하지만 단점이 없습니다. 첫째, 클라이언트 측에서 처리 할 수있는 유효성 검사로 서버에 부담을주는 네트워크 왕복에 달려 있습니다. 둘째, 설계는 모든 CRUD 작업이 엔드 포인트를 통해 발생할 것으로 예상하지만 개발자와 프로세스 가 데이터베이스에 직접 접근하여 데이터 액세스 계층을 우회하는 경우는 어떻습니까?

이러한 단점을 극복하기 위해 우리의 솔루션을 다시 살펴 보자. 대신 유효성 검사를 메타 데이터로 저장하고 전달하십시오.

{field: 'username', type: 'required'}
{field: 'username', type: 'unique'} //requires a network roundtrip
{field: 'password', type: 'length', min: 10, max: 50}
{field: 'password', type: 'contains', characters: ['upper', 'special', 'letter', 'number']}

클라이언트와 서버 모두이 데이터를 해석하고 적용하기위한 메커니즘 (예 : 엔진)이 있습니다. (일부에서는 해석 부분과 선언 부분을 분리하므로 이것을 자유 모나드라고 부릅니다.) JavaScript에서는 각 정보를 작업 함수에 매핑 할 수 있습니다. 부팅하기 위해 데이터베이스를 포함한 모든 아키텍처 계층에 대해 일관된 유효성 검사를 시행 할 수 있습니다.


웹 브라우저, 전송, 구현 언어 및 데이터베이스에서 필드가 다르게 표시 될 때 필드를 어떻게 설명합니까? 예를 들어, 문자열 필드를 나타내는 데 필요한 바이트 수는 CP1290 (IE), UTF-8 (JSON), UTF-8 (C #) 또는 UCS-16 (Oracle)을 사용할 때 다릅니다. 길이 제한이란 무엇입니까? 문자 표시가 브라우저와 운영 체제에 따라 다를 때 브라우저에서 더 중요한 것은 무엇입니까?
BobDalgleish 2018 년

이러한 제약은 인간의 정신 모델로 목표로합니다. 프로그래머로서의 직업은 기계의 차이점을 추상화하여 사람이 기술적 차이에 신경 쓸 필요가 없도록하는 것입니다.
마리오 란자

당신은 요점을 완전히 놓쳤다. 지금까지 아무도 하나의 사양으로 엔드 투 엔드 검증을 허용하는 추상화를 제시하지 않았습니다. OP에서 "한 번 쓰기"는 다른 단계를 다루는 다른 절을 갖는 것이 자격이 없음을 의미합니다. 마찬가지로 제안 된 유효성 검사에서 필드 간 또는 개체 간 유효성 검사를 다루는 내용이 없습니다.
BobDalgleish 2014 년

필드 간 / 개체 유효성 검사는 그다지 중요하지 않습니다. 메타 데이터는 단지 관계를 나타냅니다. 한 번 쓰기는 한 번의 유효성 검사를 한 번 작성하고 여러 사이트에서 시행한다는 것을 의미합니다. 테이블에 메타 데이터를 추가합니다. 해당 메타 데이터는 모든 사이트에서 수신되며 간단한 클래스 / 유틸리티 / 엔진이 제약 조건을 적용합니다.
마리오 T. 란자

1
이러한 유효성 검사 언어는 매우 유용합니다. UI 집약적 웹 애플리케이션과 관련된 코드의 1/3을 대체 할 수 있습니다.
BobDalgleish 2016 년

2

한 가지 방법은 서버와 클라이언트 측에서 동일한 언어 / 프레임 워크를 사용하는 것입니다.

예 :

Node.js :: JavaScript의 클라이언트 / 서버 GET :: Java의 클라이언트 / 서버

이 경우, 대부분의 "도메인 객체"코드는 공통적이며 여기에는 유효성 검사가 포함됩니다. 프레임 워크는 필요에 따라 코드를 호출합니다. 예를 들어, "제출"전에 서버 측 웹 서비스에서 동일한 코드가 호출됩니다.

편집 (2014 년 6 월) : Java 8을 사용하면 Java 응용 프로그램에서도 JS 유효성 검사 코드를 쉽게 통합 할 수 있습니다. Java 8에는보다 영구적 인 새로운 JS 실행 엔진이 있습니다 (예 : invokeDynamic을 사용함).


SQL 데이터베이스에 관해서는 이것이 어떻게 작동하는지 확실하지 않습니다.
Michael Durrant

또한 브라우저와 운영 체제가 입력 도메인에 영향을 미치는 문제를 해결하지 못합니다.
BobDalgleish 2018 년

@Micheal Durrant, For Database 유효성 검사는 DB 제약 조건 (예 : 외래 키, 고유 등)으로 구현됩니다. BobDalgleish, 1. 브라우저 (예 : Sencha)에 따라 런타임을 조정하는 라이브러리를 사용하여 브라우저 / OS 호환성 문제를 완화 할 수 있습니다. 2. 브라우저 호환성은 유효성 검사와 같은 코드의 "논리적"부분에 영향을 미치지 않습니다. DOM / UI 렌더링 관련.
Shamit Verma

0

나는 단지 같은 문제에 대해 생각하고있었습니다. C #과 javascript 모두에서 추상 구문 트리를 얻기 위해 ANTLR을 사용하려고 생각했습니다. 거기에서 트리 워커를 사용하여 언어로 지정된 조치를 유효성 검증 할 오브젝트에 적용하십시오.

따라서 필요한 경우 데이터베이스에 필요한 유효성 검사에 대한 설명을 저장할 수 있습니다.

이것이 내가 문제에 접근하는 방법입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.