기존 MVP에서 구현했던 Validation 리팩토링을 진행하였습니다.
기존 로직은 Validation 파일에 모든 유효성 로직이 한 파일에 모여있었습니다.
기능 구현이 우선이었기 때문에 일단 돌아가게만 하자... 라고 생각하고
구현을 한 결과 Validator 한 파일에 모든 유효성 검증이 몰려버렸습니다...
(무려 유효성 로직만 277줄...)

1. 모든 검증 로직이 한 파일에 집중
전부 하나의 파일에 있었습니다.
문제가 되는 분이 단순히 코드가 긴게 아닌
형식 검증 + 비즈니스 로직 + 도메인 조건이 한 함수 안에 섞여있는 문제였습니다.
2. 하나의 input에 여러 도메인이 겹침
예를 들어 비자 발급일 검증의 경우
이 모든 로직이 한 곳에 섞여 있었습니다.
해당 구조의 문제점은 명확하였습니다.
DX도 좋지 않았고 확장성 역시 매우 나쁘다고 생각하였습니다.
3. Date 검증식 중복
Date 검증식이 여러 곳에서 중복 사용되고 있었습니다.
해당 부분 역시 공통 로직으로 분리해야 하는 영역이었습니다.

우선 기존 한 파일에 모여있던 유효성 검증을 도메인 및 공통 사용으로 분리하였습니다.
공통 검증 (common)
- validateDate.ts
- validateText.ts
- validateAutocomplete.ts
비자 도메인 검증 (visa)
- validateIssuanceDate.ts
- validateExpirationDate.ts
기존에는 정규식 검사, 날짜 객체 생성, 미래 과거 검증이 각 파일에 흩어져 있었습니다.
그래서 이를 하나의 순수 함수로 통합하였습니다.
validateDate(value, allowFuture, allowPast)
형식 검증과 기본 유효성은 해당 순수 함수로 처리하며 사용하는 곳에서 해당 순수함수를 바탕으로 유효성 검증 로직을 추가하였습니다.
const dateValidation = validateDate(issuanceDate, false, true);
if (dateValidation !== true) {
return dateValidation;
}