정규식과 FormBuilder로 Form 검증하기

정하승정하승
3 min read

예약자 정보 입력 페이지에서 성(lastName) / 이름(firstName)을 검증해야 할 일이 있었다.

요구사항

  • 성/이름 필드 중 어느 하나라도 값이 비어 있으면 안 된다.
  • 성 또는 이름은 한글과 영어과 혼용되면 안된다. → 한글 입력이 된 후에는 영어 입력 불가 및 특수문자 입력 불가, 영어 입력 후에는 한글 입력 불가 및 특수문자 입력 불가
  • 한글의 경우 완성된 형태여야 한다.

폼 구성하기

Angular에서 Form을 구성할 때 FormBuilder 을 이용하는 방법이 있다.

constructor(prviate fb:FormBuilder){}

newForm = this.fb.group({
  name: ['', Validators.required],
  email: ['', [Validators.required, Validators.email]]
})

다른 방법으로는 FormGroup 을 이용하는 것도 있다.

newForm = new FormGroup({
  name: new FormControl('', Validators.required),
  email: new FormControl('', [Validators.required, Validators.email])
})

구현하기

1. 필드값 비어있는지 유무 확인하기

FormGroup 내부에는 errors 프로퍼티가 존재한다.

isRequired(){
    this.form.get('firstName').errors?.required
}
<div *ngIf=isRequired()>
{/* 에러 메시지 표시 */}
</div>

errors 안에 있는 required 속성을 사용하면 필드에 있는 값이 비어있으면 에러 메시지를 표시하도록 처리할 수 있다.

notion image

2. 언어 감지 및 특수문자 입력 여부 확인하기

사람의 성이나 이름은 한글 혹은 영어로만 구성되어야 한다. ‘김테스T’ ,’정T김’처럼 한글과 영어가 섞여 있는 형태의 성 또는 이름은 올바르지 않은 형식이다.

앞서 요구사항대로 영어 입력 후 새로운 입력이 한글일 때 해당 새로운 입력을 차단해야 하고, 반대로 한글 입력 후 새로운 입력이 영어일 때 해당 새로운 입력을 막아야 한다.

예를 들어,

  • ‘정’ 입력이 됐을 때 새로운 입력으로 T 입력 시도 시 해당 새로운 입력 차단
  • ‘T’ 입력이 됐을 때 새로운 입력으로 ‘테’ 입력 시도 시 해당 새로운 입력 차단

이 부분은 해당 정규식으로 검증한다.

private filterInput(value: string): string {
    // 새로운 입력 언어를 감지에서 기존 입력 언어와 새로운 입력 언어가 서로 다르면 입력을 막기    
    // 정규식과 replace를 이용
}

또 한 가지로 특수문자가 들어가는 경우에 대해서도 다음과 같은 정규식으로 검증을 해야한다.

/[^a-zA-Zㄱ-ㅎㅏ-ㅣ가-힣]/

/[^a-zA-Zㄱ-ㅎㅏ-ㅣ가-힣]/.test('정//') -> true
/[^a-zA-Zㄱ-ㅎㅏ-ㅣ가-힣]/.test('정') -> false

notion image

3. 한글이 완성된 자음인지 확인하기

실컷 특수문자 및 숫자 패턴을 거르다 보니 또 다른 문제가 생겼다.

예약자 정보 입력 시에 ‘정ㅎ’ 나 정하ㅅ’ 처럼 완성되지 않은 한글에서도 유효성 검증이 필요했다.

여기서도 두 가지 경우에 대해서도 처리가 필요했다.

값이 비어있을 때

input에 값이 존재하지 않을 때도 에러메시지가 뜨는 버그가 생겼는데,

이를 방지하기 위해 inputLanguage를 초기화하고 setValue로 빈 값을 보내서 아예 폼을 초기화 하는 방식을 사용했다.

// inputLanguage 초기화
// 값이 비어있는지 확인
// FormControl 내 값을 setValue로 빈 값 보내기

값이 비어있지 않을 때

예약자 정보 페이지 로딩 시 로그인 유저 정보에서 넘어오는 lastName과 firstName이 세팅되는 로직이 존재하고 있는데, 다음과 같은 정규식을 사용해서 미완성 한글일 경우 에러가 나오게끔 처리했다.

inputLanguage: 'korean'|'english'

private inCompleteHangeul(...) {
  return /[ㄱ-ㅎㅏ-ㅣ]/.test(value);
}

notion image

notion image

마무리

정규식 공부를 잘 안 했었는데, 유효성 검증 시 이를 활용하려다 보니 조금 시간이 많이 걸렸던 것 같다.

사실 클로드나 GPT한테 물어보면 금방 답변해주기는 하지만… 그래도 기본적인건 머리에 좀 넣고 있어야 하지 않을까라는 생각이 든다.

0
Subscribe to my newsletter

Read articles from 정하승 directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

정하승
정하승