|
1 | 1 | # react-payments |
| 2 | + |
| 3 | +# 기능 목록 |
| 4 | + |
| 5 | +## 사용자 입력 |
| 6 | + |
| 7 | +- [x] 사용자는 카드 번호를 입력할 수 있다. |
| 8 | + - [x] 16자리의 입력 번호를 실시간 감지하여 알맞는 브랜드 로고를 UI에 표시한다. (Visa: 4로 시작 / MasterCard: 51~55로 시작 / 그외 로고 렌더링 x ) |
| 9 | + - [x] 예외: 숫자만 가능 / 16자리 / 한칸에 네 자리 -> 피드백: 빨간 border & 포커스 & 밑에 피드백 문구 출력 |
| 10 | +- [x] 사용자는 카드 유효기간을 입력할 수 있다. |
| 11 | + - [x] 예외: 숫자만 가능 / 2자리 / 월은 1~12 까지 연도 25~99까지 / 오늘 날짜를 기준으로 유효한 기간인지 검증 -> 피드백: 빨간 border & 포커스 & 밑에 피드백 문구 출력 |
| 12 | +- [x] 사용자는 CVC 번호를 입력할 수 있다. |
| 13 | + - [x] 예외: 숫자만 가능 / 3자리 -> 피드백: 빨간 border & 포커스 & 밑에 피드백 문구 출력 |
| 14 | + |
| 15 | +## UI 업데이트 |
| 16 | + |
| 17 | +- [x] 사용자 입력에 따라 동시에 프리뷰를 업데이트한다. |
| 18 | + - [x] 입력할 때마다 한자리 단위로 실시간 업데이트 |
| 19 | + - [x] 카드번호에 유효한 로고 실시간 업데이트 |
| 20 | + - [x] 카드번호 뒷 8자리는 마스킹 처리 |
| 21 | + |
| 22 | +# 테스트 목록 (Storybook) |
| 23 | + |
| 24 | +## 결제 입력 테스트 파일 |
| 25 | + |
| 26 | +- ### Describe |
| 27 | + |
| 28 | + - 사용자가 카드 정보를 입력 시 |
| 29 | + |
| 30 | + - ### Context |
| 31 | + |
| 32 | + - 사용자가 카드 번호를 입력할 경우 |
| 33 | + - ### It |
| 34 | + |
| 35 | + - 사용자가 16자리를 다 채우지 않은 채 카드번호 인풋 포커스를 이탈하면 "유효하지 않은 카드번호입니다. 16자리를 입력해주세요." 피드백을 출력한다. |
| 36 | + - 한 칸에 4자리를 다 채우지 않은 채 다음 포커스 이동하면 "유효하지 않은 번호입니다. 4자리를 입력해주세요." 피드백을 출력한다. |
| 37 | + - 사용자가 숫자 이외를 입력하려고 하면 "유효하지 않은 입력입니다. 숫자만 입력해주세요." 피드백을 출력한다. |
| 38 | + |
| 39 | + - ### Context |
| 40 | + - 사용자가 카드 유효 기간을 입력할 경우 |
| 41 | + - ### It |
| 42 | + |
| 43 | + - 사용자가 4자리를 다 채우지 않은 채 유효기간 인풋 포커스를 이탈하면 "유효하지 않은 카드번호입니다. 16자리를 입력해주세요." 피드백을 출력한다. |
| 44 | + - 한 칸에 2자리를 다 채우지 않은 채 다음 포커스 이동하면 "유효하지 않은 번호입니다. 2자리를 입력해주세요." 피드백을 출력한다. |
| 45 | + - 사용자가 숫자 이외를 입력하려고 하면 "유효하지 않은 입력입니다. 숫자만 입력해주세요." 피드백을 출력한다. |
| 46 | + - 사용자가 현재 날짜 이전 기간을 입력할 경우 "유효하지 않은 카드입니다. 유효 기간을 확인해주세요." 피드백을 출력한다. |
| 47 | + |
| 48 | + - ### Context |
| 49 | + - 사용자가 CVC를 입력할 경우 |
| 50 | + - ### It |
| 51 | + - 사용자가 3자리를 다 채우지 않은 채 CVC 인풋 포커스를 이탈하면 "유효하지 않은 CVC입니다. 3자리를 입력해주세요." 피드백을 출력한다. |
| 52 | + - 사용자가 숫자 이외를 입력하려고 하면 "유효하지 않은 입력입니다. 숫자만 입력해주세요." 피드백을 출력한다. |
| 53 | + |
| 54 | +## 카드 프리뷰 UI 테스트 파일 |
| 55 | + |
| 56 | +- ### Describe |
| 57 | + - 사용자가 카드 정보를 입력 시 |
| 58 | + - ### Context |
| 59 | + - 사용자가 카드 번호를 입력할 경우 |
| 60 | + - ### It |
| 61 | + - 카드 번호 첫 자리가 4로 시작하면 VISA 로고가 렌더링된다. |
| 62 | + - 카드 번호 첫 자리가 51~55 로 시작하면 MasterCard 로고가 렌더링된다. |
| 63 | + - 사용자가 카드번호를 입력할 시 실시간으로 카드 번호가 업데이트된다. |
| 64 | + - 카드번호 뒷 8자리는 마스킹 처리하여 표시한다. |
| 65 | + - ### Context |
| 66 | + - 사용자가 유효 기간을 입력할 경우 |
| 67 | + - ### It |
| 68 | + - 사용자가 유효 기간을 입력할 시 실시간으로 카드 번호가 업데이트된다. |
| 69 | + |
| 70 | +# 설계 구조 |
| 71 | + |
| 72 | +## 디렉터리 구조 |
| 73 | + |
| 74 | +```js |
| 75 | + |
| 76 | + |
| 77 | +src/ |
| 78 | +├── components/ |
| 79 | +│ ├── common/ |
| 80 | +│ │ └── inputForm/ |
| 81 | +│ │ ├── InputForm.tsx |
| 82 | +│ │ └── input/ |
| 83 | +│ │ └── Input.tsx |
| 84 | +│ |
| 85 | +│ ├── paymentInputPage/ |
| 86 | +│ │ ├── cardInputForm/ |
| 87 | +│ │ │ └── cardInput/ |
| 88 | +│ │ │ ├── CardCVCInput.tsx |
| 89 | +│ │ │ ├── CardExperienceInput.tsx |
| 90 | +│ │ │ └── CardNumberInput.tsx |
| 91 | +│ │ └── cardPreview/ |
| 92 | +│ │ └── CardPreview.tsx |
| 93 | + |
| 94 | +``` |
| 95 | + |
| 96 | +## 컴포넌트 분리 |
| 97 | + |
| 98 | +## 상태 관리 |
| 99 | + |
| 100 | +paymentsInputPage는 cardInputForm의 상태를 cardPreview에 반영 |
| 101 | + |
| 102 | +- cardInputForm 은 paymentsInputPage의 setState 콜백을 받아 자식들(card~input 컴포넌트들) 상태를 변경 |
| 103 | + |
| 104 | +- paymentsInputPage는 state를 cardPreview에 전달 |
| 105 | + - cardPreview는 state에 따라 실시간 변경 |
| 106 | + |
| 107 | +# 컨벤션 |
| 108 | + |
| 109 | +## CSS 작성 방식 |
| 110 | + |
| 111 | +- Module CSS |
0 commit comments