Skip to Content
페이먼츠 미션1단계 FAQ 카드Q6. 카드 브랜드 — 폼 vs 도메인

Q6. 카드 브랜드 식별 로직 — 폼 값일까, 도메인 모델일까?

크루의 질문

“브랜드 로직은 어디에서 알고 있는 게 맞는가.” — 포도·레스 페어

“cardBrand 값을 formValue로써 관리해야 할지 별도 변수로 관리해야 할지.” — 아지·애니 페어

AS-IS 코드

🔍 읽기 전에

cardBrand를 알려면 어떤 정보가 필요한가요?

그 정보가 cardNumber에 이미 있다면, cardBrand는 상태일까요, 파생값일까요?

// src/components/AddCardPage/AddCardForm/index.tsx const [cardBrand, setCardBrand] = useState<CardBrand>({ name: '', color: '' }); const [cardNumber, setCardNumber] = useState<CardNumberState>(['', '', '', '']); const [expDate, setExpDate] = useState<ExpDate>({ year: '', month: '' }); const [password, setPassword] = useState<PasswordState>(['', '']); const [ownerName, setOwnerName] = useState<string>(''); const [nickname, setNickname] = useState<string>(''); const [CVC, setCVC] = useState<string>(''); const [isCardBrandModalVisible, setIsCardBrandModalVisible] = useState<boolean>(false); const [isNicknameModalVisible, setIsNicknameModalVisible] = useState<boolean>(false); const onSelectCardBrand = (cardBrand: CardBrand) => { setCardBrand(cardBrand); setIsCardBrandModalVisible(false); }; const onSetCardBrand = () => { if (cardNumber[0].length !== CARD_NUMBER_DIGITS || cardNumber[1].length !== CARD_NUMBER_DIGITS) { setCardBrand({ name: '', color: '' }); return; } const cardBrand = CARD_BRAND[Number(cardNumber[1][3])]; if (!cardBrand) {

공식문서 단서 + 도메인 노트

React 공식문서 Avoid redundant state  (한글 번역 — 5원칙 중 3번):

If you can calculate some information from the component’s props or its existing state variables during rendering, you should not put that information into that component’s state.

cardBrandcardNumber로부터 결정 가능하다면 별도 상태로 두는 것은 redundant. 그러나 2단계 요구사항(“사용자는 카드사를 선택할 수 있고, 선택에 따라 프리뷰 카드의 색상이 변경된다”)은 사용자 선택도 입력원이 된다 — 즉 brand는 (자동 식별 ∪ 사용자 선택) 두 입력의 해소다.

도메인 노트: 카드 브랜드 식별 규칙은 React가 모르는 영역이다. 페이먼츠 2단계의 카드사 식별 번호 규칙(Diners 36/14자리, AMEX 34·37/15자리, UnionPay 622126부터 622925까지 등)은 순수 함수로 분리할 수 있다. 컴포넌트 외부의 도메인 모듈에 두면 React 16/17/18/19가 어떻게 바뀌든 영향받지 않는다. 이게 1단계에서 지금 도메인 분리를 시작할 가치다.


선배 PR 읽기 가이드

선배 PR 읽기 가이드 — 펼쳐보기

선배 PR — 폼 상태에 cardBrand를 같이 둔 패턴

PR #4  · 인라인 리뷰 모음 → 

읽는 관점:cardBrand를 입력 form state에 저장하는지, 카드번호에서 계산하는지 비교하세요. 리뷰에서 파생값과 원천 입력값을 구분하는 표현을 찾는 것이 핵심입니다.”

선배 PR — cardNumber로부터 매번 계산하는 패턴

PR #444  · 인라인 리뷰 모음 → 

읽는 관점: “카드번호 앞자리나 특정 index로 브랜드를 계산하는 코드를 보세요. 2단계의 카드사 선택 UX가 들어오면 식별값과 사용자 선택값이 어떻게 달라지는지 연결해볼 수 있습니다.”

선배 PR — 도메인 모듈로 분리한 패턴

PR #3  · 인라인 리뷰 모음 → 

읽는 관점:cardCompany, cardBrand, bank 상수/유틸 파일을 보세요. 컴포넌트 밖 도메인 모듈로 빠졌을 때 테스트와 변경 범위가 어떻게 줄어드는지가 읽는 포인트입니다.”

추가 읽을거리 — Kent C. Dodds

외부 글 모음 — 펼쳐보기

Don’t Sync State. Derive It!

  • 원문: kentcdodds.com/blog/dont-sync-state-derive-it 
  • 한 줄 요약: cardBrandcardNumber로부터 파생시키면 두 상태를 동기화할 필요가 없다. 그러나 사용자 선택이 들어오면 — 두 입력원을 어떻게 다룰지가 새로운 학습 포인트가 된다. 이 글이 그 시작점.

연관 PR 더 보기

이 주제에 매핑된 1단계 PR 전체 — 펼쳐보기

자기 가설에 가까운 PR을 골라 추가로 비교해보세요.

PR작성자핵심 키워드
#2 @bigsaigon333카드사/브랜드 판별
#3 @jho2301 (대표)객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#4 @SunYoungKwon (대표)객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#5 @zereight카드사/브랜드 판별
#6 @Puterismstate 위치 / 공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#9 @0307kwonstate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 카드사/브랜드 판별
#11 @Tanney-102state 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 카드사/브랜드 판별
#12 @seojihwan카드사/브랜드 판별
#13 @yujo11카드사/브랜드 판별
#14 @sunhpark42카드사/브랜드 판별
#15 @365kim객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#16 @shinsehantan객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#17 @zigsong객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#18 @0imbean0카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#19 @iborymagic공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#25 @2SOOY공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#26 @igy95객체/배열 state 구조 / 카드사/브랜드 판별
#28 @jum0공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#29 @swon3210state 위치 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#67 @devhyun637카드사/브랜드 판별
#79 @wonsss검증·에러 처리 / 카드사/브랜드 판별
#81 @usageness공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#82 @hwangstar156state 위치 / 카드번호 4분할 / 카드사/브랜드 판별
#85 @lokbastate 위치 / 객체/배열 state 구조 / 카드사/브랜드 판별
#93 @kwannee객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#94 @euijinkkstate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#98 @byhhh2state 위치 / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#101 @sanaandmomostate 위치 / 카드사/브랜드 판별
#105 @roncicustom hook / 카드번호 4분할 / 카드사/브랜드 판별
#186 @bassyu공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#190 @dladncks1217state 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 카드사/브랜드 판별
#202 @kangyeongmin카드사/브랜드 판별
#218 @tkdrb12객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#331 @anttieystate 위치 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#332 @seongjinme카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#333 @jinyoung234객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#334 @vi-wolhwastate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#335 @healim01객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#336 @jaeml06객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#337 @jinhokim98custom hook / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#338 @Largopiecustom hook / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#340 @chosim-dvlpr객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#341 @simorimistate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#343 @brgndyycustom hook / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#344 @soi-hastate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 검증·에러 처리 / 카드사/브랜드 판별
#345 @lurgi객체/배열 state 구조 / 카드번호 4분할 / 검증·에러 처리 / 카드사/브랜드 판별
#346 @chlwlstlfstate 위치 / 카드사/브랜드 판별
#347 @useon객체/배열 state 구조 / 카드사/브랜드 판별
#348 @pp449state 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#350 @pakxe검증·에러 처리 / 카드사/브랜드 판별
#351 @novice0840객체/배열 state 구조 / 카드번호 4분할 / 검증·에러 처리 / 카드사/브랜드 판별
#354 @hwinkrstate 위치 / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#355 @greetings1012객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#357 @00kangstate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#358 @dle234state 위치 / 검증·에러 처리 / 카드사/브랜드 판별
#359 @rbgksqkrcustom hook / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#360 @llqqssttyy객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#361 @skiende74custom hook / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#362 @Jaymyong66객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#363 @chysisstate 위치 / 공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#365 @ImxYJL객체/배열 state 구조 / 카드번호 4분할 / 카드사/브랜드 판별
#366 @Parkhanyoungcustom hook / 카드번호 4분할 / 검증·에러 처리 / 카드사/브랜드 판별
#367 @ss0526100custom hook / 객체/배열 state 구조 / 검증·에러 처리 / 카드사/브랜드 판별
#368 @Todari객체/배열 state 구조 / 카드번호 4분할 / 검증·에러 처리 / 카드사/브랜드 판별
#409 @keemsebinstate 위치 / 객체/배열 state 구조 / 카드사/브랜드 판별
#411 @AHHYUNJUstate 위치 / 카드번호 4분할 / 검증·에러 처리 / 카드사/브랜드 판별
#412 @mlnwnsstate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 검증·에러 처리 / 카드사/브랜드 판별
#417 @sooyeoniyacustom hook / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#418 @MinSungJestate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 카드사/브랜드 판별
#419 @spoyodevelop객체/배열 state 구조 / 카드번호 4분할 / 검증·에러 처리 / 카드사/브랜드 판별
#420 @ShinjungOhstate 위치 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#421 @ExceptAnyonestate 위치 / 검증·에러 처리 / 카드사/브랜드 판별
#422 @thgml05객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#423 @yeji0214state 위치 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#424 @guesung카드번호 4분할 / 검증·에러 처리 / 카드사/브랜드 판별
#425 @Db0111state 위치 / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#427 @sanghee01객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#429 @youdame카드사/브랜드 판별
#430 @yeongiparkstate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#432 @ha-kuku카드번호 4분할 / 검증·에러 처리 / 카드사/브랜드 판별
#433 @eunsoAstate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#434 @minji2219state 위치 / 카드번호 4분할 / 검증·에러 처리 / 카드사/브랜드 판별
#435 @dev-dino22state 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#436 @bunju20카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#437 @aydenote객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#439 @kimyou1102custom hook / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#441 @hanheel카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#442 @jaeyoung-kwonstate 위치 / 공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#443 @jin123457카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#444 @mun-kyeong (대표)state 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#445 @Daeun-100state 위치 / 카드번호 4분할 / 검증·에러 처리 / 카드사/브랜드 판별
#446 @JeLee-riverstate 위치 / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#447 @shuyeonstate 위치 / 객체/배열 state 구조 / 카드사/브랜드 판별
#448 @hoyyChoistate 위치 / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#453 @ExceptAnyonestate 위치 / 검증·에러 처리 / 카드사/브랜드 판별

195개 전체 인덱스(다른 주제 포함)는 부록에서 확인할 수 있습니다.

Last updated on