Whiteship's Note

Fail-fast vs. complete validation



원문 : http://hanuska.blogspot.com/2007/04/fail-fast-vs-complete-validation.html
번역[각주:1]

대부분 모든 어플리케이션은 사람 또는 다른 어플리케이션과의 상호 작용을 통한 데이터를 가지고 작업해야 합니다. 하지만 종종 이런 데이터들은 어플리케이션이 수용할 만한 요구 사항을 충족하지 못할 수 있습니다. 따라서 데이터는 반드시 검증해야 합니다.

Validation이란 무엇인가?



입력되는 데이터는 그 다음 처리 과정에 적합하여 유효한 것임을 판별하기 위해 반드시 일련의 검증 과정을 거쳐야 합니다.

예를 들어 세개의 멤버를 가지고 있는 클래스르 생각해 봅시다. name:String, created:Date total:int. name은 반드시 설정되어야 하며 길이가 최소한 세 글자 이상이여야 한다는 요구사항을 가지고 있습니다. created 역시 필수 요소이며 현재 시각 이전이어야 합니다. total은 음의 정수면 안됩니다.

데이터 유효성 검증에는 보통 두 가지 접근 방법이 있습니다. fail-fast validation 과 complete validation 입니다.

Fail-fast validation



How it works
만약 어떤 검증 규칙(validation rules)가 실패하면 검증은 그 즉시 멈추고 데이터가 유효하지 않다는 것을 알려주고 처리 과정을 중단합니다.

Output
검증의 결과에 대한 Boolean 값을 알려줍니다. true for valid, false for invalid.

Pros
검증 실패가 발생하면 그 후에 수행할 검증 작업을 멈추기 때문에 complete validation 보다 빠릅니다. 리포팅에 대한 오버헤드가 없습니다.

Cons
검증 실패에 관한 충분한 정보를 제공하지 못합니다.

When to use it
왜 검증이 실패 했는가 하는 자세한 정보가 필요하지 않고 단순히 true 나 false같은 결과를 원할 때 적당합니다. 보통 수정할 수 없는 데이터를 받아 들일 때(사람이 입력하는 것이 없는 시스템에서) 적당합니다.

Example
boolean isValid(String name, Date created, int total)
데이터가 들어가면 Boolean 값을 리턴합니다.

Complete validation



How it works
검증 규칙이 실패 하더라도 검증 절차를 중단하지 않습니다. 데이터가 유효하지 음을 체크 하고 전체 검증 절차를 마친 후에 다음에 처리할 작업을 중단합니다.

Output
Boolean 값으로 입력한 데이터가 유효한지 알려줍니다. true for valid, false for invalid. 에러 컬렉션 같은 폼에 유효성 실패에 대한 정보를 보관합니다.

예들 들어 Struts 프레임워크의 ActionMessages 클래스나 Atlassian JIRA의 ErrorCollection를 참고 하세요.[각주:2]

Pros
유효성 실패의 원인에 대한 정보를 제공합니다. 입력하는 데이터를 수정하는데 필요한 피드백을 제공할 수 있습니다.

Cons
모든 검증 절차를 수행하며 검증에 대한 결과에 대한 추가적인 정보를 리포팅 하기 때문에 file-fast validation보다 느립니다.

When to use it
검증 실패에 대한 원인이 필요할 때 적당합니다. 이 정보는 사용자가 데이터를 입력하고 어떻게 수정해야 하는지에 대한 힌트를 제공합니다.

Example
데이터는 에러 컬렉션과 함께 전달합니다. 유효하지 않은 데이터에 대한 정보는 에러 컬렉션으로부터 알 수 있기 때문에 메소드는 아무것도 반환하지 않습니다.

Conclusion
만약 복잡한 검증 규칙을 입력 필드 단위로 쪼갤 수 있다면 (JavaScript나 AJAX를 사용하여)사용자가 시스템에 적응 하도록 할 수 있습니다. 실시간으로 입력한 데이터에 대한 피드백을 받을 수 있기 때문이죠.

또한 여러 입력 값들을 가지고 데이터의 유효성을 판단해야 하는 경우를 생각해 봅시다. 세 개의 입력 필드로 구성된 하나의 날짜를 나타내는 값이 그런 예에 해당합니다(실제로 이렇게 하진 마세요. 데이터를 입력 받는 좋지 않은 방법입니다.).

사용자 삽입 이미지

또는 아래처럼 Other를 선택했을 때 text area가 보여야 하는 것처럼 조건적으로 필요한 필드의 경우를 생각할 수 있습니다.
 
사용자 삽입 이미지

두 유형의 검증 방법 모두 각각의 목적이 있습니다. 검증이 실패 했을 때 수정하거나 판단하기 위해 여러분에게 얼만큼의 정보가 필요한지에 따라 적당한 방법을 사용하면 됩니다.


  1. 해도 되냐고 물어보긴 했는데 아직 댓글이 안뜨네요. 일단 올리고 안 된다고 하면 지우죠 뭐; [본문으로]
  2. Spring의 Errors 클래스도 예가 될 수 있을 것 같네요. [본문으로]
top