실제 스카이 스캐너측에서도 항공권 검색 버튼을 클릭할 경우 빨간색 ErrorBox가 생겼습니다. 그전에는 출발지와 도착지를 같게 고르던 좌석등급 및 승객을 마구잡이로 조작하던 전혀 문제가 없었습니다.
즉, 검색 버튼을 클릭함에 따라 유효성검사를 하여 에러유무를 판단하고 에러가 1개라도 있다면 ErrorBox가 열리게 됩니다.
조건은 다음과 같습니다.
1. 출발지와 도착지가 같을 경우 & 출발지와 도착지가 비워있을 경우
empty
2. 출발지 혹은 도착지에 국가단위의 나라명이 입력될 경우. (Browse Search를 구현한다면 제거해야함)
country
3. 좌석 등급 및 승객에서 유소아의 나이를 미 입력할 경우 & 성인수 보다 0~1살의 유소아가 더 많을 경우
normal
4. 재검색 시 의존성 검사
재검색할 때도 모든 에러를 표시할 수 있습니다.
reSearchPage
유효성 검사 구현 위치
모든 유효성 검사는 항공권검색 버튼을 눌렀을 때, 즉,SearchButton 컴포넌트에서 1번, 각 redux module에서 1번 이렇게 총 2번을 검사합니다. 모든 에러는 Redux Store에 저장이 되고 2번 검사를 하는 이유는 Errorbox가 화면에 렌더링 후부터는 반응형으로 항공권검색을 누르지 않아도 에러에 해당되는 사항들을 해결할 수록 에러가 즉시 제거되기 때문입니다.
따라서
SearchButton 컴포넌트
redux module
에서 유효성 검사를 진행합니다.
첫 시작은 항상 SearchButton 컴포넌트 에서 이뤄어지고 여기서 유효성 검사를 통해 에러의 유무에 따라 Errorbox가 화면에 렌더링할 안할지 판단하며 에러가 존재한다면 session은 생성되지 않습니다.
redux module 에서는 Errorbox 가 화면에 렌더링 되어있다면 에러에 대한 문제를 해결 즉시 에러가 필터링 되어 삭제되고 화면에 렌더링 됩니다.
// 세션 생성 함수 const create = () => { const errorLists = []; // 유효성 검사 : 출발지 혹은 도착지가 비워있을 경우 if (!allInfo.places.inBoundId || !allInfo.places.outBoundId) { errorLists.push({ id: generatedId(errorLists), type: 'Incorrect places', message: '출발지 혹은 도착지를 입력해주세요.' }); }
// 유효성 검사 : 출발지 혹은 도착지가 같을 경우 if (allInfo.places.inBoundId === allInfo.places.outBoundId) { errorLists.push({ id: generatedId(errorLists), type: 'PlaceId is same', message: '출발지와 도착지가 같으면 검색이 불가능합니다.' }); }
// 유효성 검사 : 유/소아의 나이를 입력하지 않을 경우 if ( allInfo.passenger.children.filter(child => child.type === undefined) .length >= 1 ) { errorLists.push({ id: generatedId(errorLists), type: 'Age not selected', message: '모든 유/소아의 나이를 입력해주세요.' }); }
// 유효성 검사 : 0~1세의 유/소아의 수가 성인의 수 보다 많을 경우 if (allInfo.passenger.children.filter(child => child.age < 2).length >= 2) { if ( allInfo.passenger.adults < allInfo.passenger.children.filter(child => child.age < 2).length ) { errorLists.push({ id: generatedId(errorLists), type: 'No matching adult', message: '성인 한 사람당 유/소아 1명(만 0 - 2세)만 허용됩니다.' }); } }
// 유효성 검사 : 출발지 혹은 도착지에 국가단위를 선택했을 경우 if ( allInfo.places.inBoundId.length === 2 || allInfo.places.outBoundId.length === 2 ) errorLists.push({ id: generatedId(errorLists), type: 'No Country', message: '실시간 항공권 검색은 도시 단위까지만 가능합니다.' }); }
SearchButton.jsx에서 유효성 검사를 통해 에러가 발생이 되었다면 Redux Store의 에러 객체가 존재 할 것입니다. 에러가 존재한다면 화면에 errorbox가 렌더링 되었을 것이고 각 리덕스 모듈(places, passenger)에서는 Redux Store의 에러가 존재하므로 재차 유효성검사를 하여 문제가 해결될 시 비동기적으로 Redux Store의 에러를 필터할 것입니다. 따라서 Redux Saga를 이용해 미들웨어로 처리하여 UI의 상태를 반응형으로 처리하도록 설계하였습니다.