컬럼 제목 : ASP . NET Core MVC : 유효 성 검사 추가 하 기 
 최초 작성 일 : 2016 년 07 월 16 일 
 최종 수정 일 : 2016 년 07 월 18 일 
 읽 음 수 : 7 , 481 회 
 이번 컬럼 은 ASP . NET Core MVC 강좌 의 9 / 10 번 째 글 입니다 . 
 원문 : https : / / docs . asp . net / en / latest / tutorials / first - mvc - app / validation . html 
 ASP . NET Core MVC : 유효 성 검사 추가 하 기 
 이번 파트 에서 는 Movie 모델 에 유효 성 검사 로직 을 추가 하 고 , 사용 자 가 영화 정보 를 생성 하 거나 수정 할 때 마다 이 유효 성 검사 규칙 이 적용 되 도록 만들 어 보 겠 습니다 . 
 MVC 의 가장 기본 적 인 설계 원칙 중 한 가지 는 " 중복 배제 ( DRY , Don ' t Repeat Yourself ) " 입니다 . ASP . NET MVC 에서 권장 하 는 작업 방식 은 기능 이나 동작 을 단 한 번 만 지정 하 면 응용 프로그램 전반 에 그 효과 가 일괄 적 으로 반영 되 는 것 입니다 . 이런 방식 을 사용 하 면 작성 해야 할 코드 의 양 이 줄어들 뿐 만 아니 라 코드 자체 의 오류 도 적어지 고 , 테스트 가 쉬워 지 며 , 유지 보수 도 용이 해집니다 . 
 MVC 와 Entity Framework Code First 가 지원 해 주 는 유효 성 검사 기능 이 바로 중복 배제 원칙 의 좋 은 실제 사례 입니다 . 모델 클래스 한 곳 에서 만 선언 적 유효 성 검사 규칙 을 지정 하 면 응용 프로그램 의 모든 곳 에 선언 된 규칙 이 적용 됩니다 . 
 지금 부터 영화 정보 응용 프로그램 에서 유효 성 검사 기능 을 활용 하 는 방법 을 살펴보 도록 하 겠 습니다 . 
 모델 클래스 가 작성 되 어 있 는 Movie . cs 파일 을 엽 니다 . 클래스 나 속성 에 선언 적 으로 지정 할 수 있 는 내장 유효 성 검사 어 트리 뷰트 들 의 모음 은 DataAnnotations 네임 스페이스 에서 제공 됩니다 . ( 이 네임 스페이스 에 는 DataType 같이 서식 만 지정 할 뿐 아무런 유효 성 검사 기능 도 제공 해 주 지 않 는 서식 관련 어 트리 뷰트 들 도 포함 되 어 있 습니다 . ) 
 다음 코드 에서 볼 수 있 는 것 처럼 , 기본 으로 제공 되 는 내장 Required , StringLength , RegularExpression , 그리고 Range 유효 성 검사 어 트리 뷰트 들 을 적용 해서 Movie 클래스 를 수정 합니다 . 
 [ Range ( 1 ,   100 ) ] 
 이런 유효 성 검사 어 트리 뷰트 들 은 해당 어 트리 뷰트 가 적용 된 모델 속성 에 강제 하 려는 동작 들 을 지정 합니다 . Required 어 트리 뷰트 나 MinimumLength 속성 이 설정 된 StringLength 어 트리 뷰트 가 지정 된 속성 은 반드시 값 이 입력 되 야 만 유효 한 것 으로 인식 되 는데 , 사용 자 가 이 유효 성 검사 를 통과 하 기 위해서 공백 을 입력 하 는 것 까지 제한 하 지 는 못 합니다 . RegularExpression 어 트리 뷰트 는 입력 가능 한 문자 를 제한 하 기 위한 용도 로 사용 됩니다 . 이를테면 , 이번 예제 코드 에서 Genre 필드 와 Rating 필드 에 는 반드시 문자 만 입력 할 수 있 습니다 ( 공백 , 숫자 또는 특수 문자 는 허용 되 지 않 습니다 ) . 그리고 Range 어 트리 뷰트 는 지정 된 속성 에 입력 할 수 있 는 값 을 특정 범위 내 로 제한 합니다 . StringLength 어 트리 뷰트 는 문자열 속성 의 최대 길이 를 지정 하 며 , 필요 한 경우 선택 적 으로 최소 길이 를 지정 할 수 도 있 습니다 . 또한 값 형식 들 은 ( decimal , int , float , DateTime 등 ) 기본 적 으로 값 이 존재 해야 만 유효 한 것 으로 간주 되 므로 [ Required ] 어 트리 뷰트 를 명시 적 으로 지정 하 지 않 아도 동일 한 효과 를 갖 습니다 . 
 이렇게 지정 한 유효 성 검사 규칙 들 은 ASP . NET 에 의해서 자동 으로 적용 되 어 응용 프로그램 을 더욱 견고 하 게 만들 어 줍니다 . 그리고 그 로 인해서 , 특정 사례 에 대한 유효 성 검사 를 누락 해서 부주의 하 게 잘못 된 데이터 가 데이터베이스 에 저장 되 는 경우 를 방지 하 는 효과 도 얻 게 됩니다 . 
 ( 역주 : 엄밀 하 게 말 한다면 유효 성 검사 어 트리 뷰트 를 추가 하 는 작업 역시 모델 클래스 를 변경 하 는 행위 이 므로 , 이전 파트 에서 처럼 응용 프로그램 을 실행 하 기 전 에 먼저 마이 그레 이 션 작업 을 수행 해 주 는 것 이 보다 올바른 작업 방식 입니다 . 그러면 각각 의 속성 들 에 적용 된 어 트리 뷰트 의 규칙 들 이 적절 한 형태 로 데이터베이스 테이블 에 반영 되 는데 , 가령 Rating 컬럼 의 데이터 형식 같 은 경우 는 nvarchar ( 5 ) 로 변경 됩니다 . 그러나 마이 그레 이 션 작업 을 수행 하 지 않 더라도 본 자습서 를 살펴보 는 데 에 는 별다른 문제 가 없 습니다 . ) 
 폼 이 자동 으로 유효 하 지 않 은 값 이 입력 된 각 필드 에 적절 한 유효 성 검사 오류 메시지 를 렌 더 하 는 것 을 확인 할 수 있 습니다 . 이 오류 들 은 클라이언트 측 과 ( JavaScript 와 jQuery 를 이용 해서 ) 서버 측 ( 사용 자 가 JavaScript 를 비활성 화 시킨 경우 ) 모두 에서 발생 하 게 됩니다 . 
 //   POST :   Movies / Create 
 public   async   Task < IActionResult >   Create ( [ Bind ( " ID , Genre , Price , ReleaseDate , Title , Rating ")]   Movie   movie ) 
 이 두 버전 의 메서 드 들 중 , 첫 번 째 HTTP GET Create 액션 메 서 드 는 초기 Create 폼 을 출력 하 고 , [ HttpPost ] 어 트리 뷰트 가 적용 된 두 번 째 Create 액션 메 서 드 는 폼 전송 을 처리 합니다 . [ HttpPost ] 버전 의 두 번 째 Create 메 서 드 는 제출 된 데이터 에 유효 성 검사 오류 가 존재 하 는지 여부 를 검사 하 기 위해서 ModelState . IsValid 를 호출 하 는데 , 바로 이 메 서드 가 호출 될 때 개체 에 적용 된 모든 유효 성 검사 어 트리 뷰트 들 이 평가 됩니다 . 그리고 그 결과 에 따라 영화 정보 개체 에 유효 성 검사 오류 가 존재 하 면 Create 메서 드가 폼 을 다시 출력 하 고 , 오류 가 존재 하 지 않 으면 메 서드 가 새로운 영화 정보 를 데이터베이스 에 저장 합니다 . 다만 본 자습서 의 영화 응용 프로그램 에서 는 클라이언트 측 에서 유효 성 검사 오류 가 감지 되 면 아예 서버 로 폼 이 전송 되 지 않 기 때문 에 , 현재 상태 로 는 두 번 째 Create 메 서드 가 호출 되 는 일 은 결코 일어나 지 않 습니다 . 브라우저 에서 JavaScript 를 비활성 화 시키 는 경우 에 만 클라이언트 측 유효 성 검사 자체 가 비활성 화 되 어 , HTTP POST Create 메서 드가 ModelState . IsValid 메 서 드 를 호출 함 으로써 서버 측 에서 영화 정보 의 유효 성 검사 오류 여부 를 확인 할 수 있 습니다 . 
 @* 나머지   필드 들 의   마크업 은   생략 되 었 습니다 . *@ 
 이 코드 에서 Input 태그 헬퍼 ( Input Tag Helper ) 는 DataAnnotations 어 트리 뷰트 들 을 기반 으로 클라이언트 측 에서 jQuery 유효 성 검사 에 필요 한 HTML 어 트리 뷰트 들 을 만들 어 냅니다 . 그리고 유효 성 검사 태그 헬퍼 ( Validation Tag Helper ) 가 유효 성 검사 오류 를 출력 합니다 . 더 자세 한 정보 는 Validation 문서 를 참고 하 시 기 바랍니다 . 
 다시 Movie . cs 파일 로 돌아가 서 Movie 클래스 를 살펴봅니다 . 이미 언급 했 던 것 처럼 , 이 클래스 에서 사용 되 고 있 는 System . ComponentModel . DataAnnotations 네임 스페이스 는 내장 유효 성 검사 어 트리 뷰트 들 의 모음 과 함께 서식 관련 어 트리 뷰트 들 을 제공 해줍니다 . 이미 우리 는 ReleaseDate 속성 과 Price 속성 에 DataType 열거 형 값 을 적용 해 봤 습니다 . 다음 코드 는 적절 한 DataType 어 트리 뷰트 가 적용 된 ReleaseDate 속성 과 Price 속성 을 보여 주 고 있 습니다 . 
 일반 적 으로 DisplayFormat 어 트리 뷰트 만 단독 으로 사용 하 는 것 보다 는 DataType 어 트리 뷰트 를 함께 사용 하 는 것 이 바람직 합니다 . DataType 어 트리 뷰트 는 데이터 를 화면 에 렌 더 하 는 직접 적 인 방법 이 아닌 , 데이터 의 의미 ( Semantics ) 를 전달 해 주 며 다음 과 같이 DisplayFormat 어 트리 뷰트 가 지원 하 지 않 는 이점 들 을 제공 해줍니다 : 
 노트 : DateTime 형식 에 Range 어 트리 뷰트 를 적용 하 면 jQuery 유효 성 검사 기능 이 정상 적 으로 동작 하 지 않 습니다 . 가령 다음 코드 는 입력 된 날짜 가 지정 한 범위 내 에 존재 하 더라도 항상 클라이언트 측 유효 성 검사 오류 가 출력 됩니다 : 
 [ Range ( typeof ( DateTime ) ,   " 1 / 1 / 1966 ",   " 1 / 1 / 2020 ")] 
 [ RegularExpression ( @"^[ A - Z ] +[ a - zA - Z ''-'\ s ] *$"),   Required ,   StringLength ( 30 ) ] 
 [ Range ( 1 ,   100 ) ,   DataType ( DataType . Currency ) ] 
 [ RegularExpression ( @"^[ A - Z ] +[ a - zA - Z ''-'\ s ] *$"),   StringLength ( 5 ) ] 
 폼 작업 하 기 
 2016 - 07 - 18 ( 15 : 15 )