Skip to Content
페이먼츠 미션1단계 FAQ 카드Q2. state 구조 — 묶을까 나눌까

Q2. 여러 input의 상태를 하나로 묶을까, 각각 둘까?

크루의 질문

“각 input에 들어가는 카드 정보들을 각각의 state로 관리해야 할지, 하나의 state에서 배열로 관리하고 각 input에서 index 정보를 알고 있게 한 뒤 index 정보로 setter를 호출할지 고민입니다.” — 라바·찰리 페어

“비슷한 여러 상태 데이터를 하나로 만들어야 할지, 혹은 각각 만들어야 할지? (카드 번호/유효기간/CVC). 하나의 데이터(카드번호)이지만 input이 4개인 경우, 상태를 나누는 것이 맞을까?” — 도넛·두부 페어

“각 input에 들어가는 정보에 대해서, state를 어떤 구조로 관리하는 게 좋을지 고민했습니다.” — 윤돌·비비빙 페어

“카드 번호 input을 어떤 구조(단일 string, string[], object)로 관리해야 할지.” — 아지·애니 페어

AS-IS 코드

🔍 읽기 전에

이 객체의 필드들은 함께 바뀌나요?

함께 바뀌는 일이 없다면, 한 객체로 묶은 이유는 무엇이었을까요?

// src/components/addCard/AddCard.jsx import { useState } from 'react'; import AddCardForm from '../addCardForm/AddCardForm'; import Card from '../card/Card'; function AddCard() { const [card, setCard] = useState({ firstCardNumber: '', secondCardNumber: '', thirdCardNumber: '', fourthCardNumber: '', expireMonth: '', expireYear: '', ownerName: '', securityCode: '', firstPassword: '', secondPassword: '', }); const updateCard = (name, value) => { setCard((prevCard) => { return { ...prevCard, [name]: value }; }); };

공식문서 단서 — State 구조 선택

React 공식문서 Choosing the State Structure  (한글 번역)는 다섯 원칙을 제시한다:

  1. Group related state. If you always update two or more state variables at the same time, consider merging them into a single state variable.
  2. Avoid contradictions in state. When the state is structured in a way that several pieces of state may contradict and “disagree” with each other, you leave room for mistakes. Try to avoid this.
  3. Avoid redundant state. 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.
  4. Avoid duplication in state. When the same data is duplicated between multiple state variables, or within nested objects, it is difficult to keep them in sync. Reduce duplication when you can.
  5. Avoid deeply nested state. Deeply hierarchical state is not very convenient to update. When possible, prefer to keep state flat.

핵심: “카드 번호와 유효기간이 항상 함께 바뀌나?” — 답이 No라면 한 state로 묶을 이유가 약하다. 이 원칙은 라바·도넛·아지의 고민에 적용해볼 수 있는 결정 기준이다.


선배 PR 읽기 가이드

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

선배 PR — 각 필드를 개별 state로 분리한 패턴

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

읽는 관점: “카드번호·만료일·CVC가 개별 useState로 흩어진 부분과 한 번에 갱신되는 부분을 비교하세요. 리뷰에서는 같이 변하는 값인지가 주요 기준으로 등장합니다.”

선배 PR — 객체 하나로 묶은 패턴

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

읽는 관점:cardInfo, cardData, formData처럼 객체로 묶은 상태의 setter를 보세요. 부분 업데이트 반복이 어디에서 생기고, 필드 이름 문자열이 어떤 위험을 만드는지 찾으면 좋습니다.”

선배 PR — 배열 + index 패턴

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

읽는 관점: “배열/index로 카드번호나 비밀번호를 다루는 코드에서 index가 도메인 의미를 대신하는 지점을 보세요. 순서 기반 접근이 읽기 쉬운지, 실수하기 쉬운지가 읽는 포인트입니다.”

추가 읽을거리 — Kent C. Dodds

외부 글 모음 — 펼쳐보기

Stop using isLoading booleans

  • 원문: kentcdodds.com/blog/stop-using-isloading-booleans 
  • 한 줄 요약: isLoading / isError / isSuccess 같은 boolean 여러 개를 두면 불가능한 상태가 생긴다. 대신 'idle' | 'pending' | 'resolved' | 'rejected' 같은 단일 status 상태로 묶어라. 공식문서 5원칙의 2번 — 모순 회피와 같은 기준이다.

Don’t Sync State. Derive It!

연관 PR 더 보기

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

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

PR작성자핵심 키워드
#3 @jho2301객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#4 @SunYoungKwon객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#7 @dudtjr913state 위치 / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성
#8 @goni-ssi객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성
#9 @0307kwonstate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 카드사/브랜드 판별
#10 @bucketHaneul객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#11 @Tanney-102state 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 카드사/브랜드 판별
#15 @365kim객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#16 @shinsehantan객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#17 @zigsong객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#20 @hchayan객체/배열 state 구조 / 공통 Input/컴포넌트 합성
#22 @ddongule (대표)객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성
#26 @igy95객체/배열 state 구조 / 카드사/브랜드 판별
#71 @DomMorellostate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#72 @jswithstate 위치 / 객체/배열 state 구조
#76 @rladpwl0512객체/배열 state 구조
#77 @JUDONGHYEOKstate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성
#78 @soyi47state 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성
#84 @greenblues1190객체/배열 state 구조 / 카드번호 4분할 / 검증·에러 처리
#85 @lokbastate 위치 / 객체/배열 state 구조 / 카드사/브랜드 판별
#89 @onschanstate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 검증·에러 처리
#93 @kwannee객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#94 @euijinkkstate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#96 @jhy979state 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 검증·에러 처리
#98 @byhhh2state 위치 / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#103 @kkojae91객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성
#104 @uk960214state 위치 / 객체/배열 state 구조 / 검증·에러 처리
#106 @jin7969 (대표)객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#187 @gabrielyoon7객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성
#189 @nlom0218state 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 검증·에러 처리
#190 @dladncks1217state 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 카드사/브랜드 판별
#191 @kyw0716객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성
#193 @suyoungjstate 위치 / 객체/배열 state 구조 / 카드번호 4분할
#198 @ashleysyheostate 위치 / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#200 @hae-on객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#201 @HyeryongChoistate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성
#203 @nangkyeonglimstate 위치 / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성
#204 @NaveOWOstate 위치 / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성
#205 @2yunseongstate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성
#206 @turtle601custom hook / 객체/배열 state 구조 / 검증·에러 처리
#207 @inyeong-kangcustom hook / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#208 @D0Damstate 위치 / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성
#211 @jariitastate 위치 / 객체/배열 state 구조
#212 @jw-rstate 위치 / 객체/배열 state 구조 / 카드번호 4분할
#213 @wzrabbitstate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#214 @n0eyescustom hook / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#215 @Dahyeeeestate 위치 / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성
#218 @tkdrb12객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#220 @ukkodeveloperstate 위치 / 객체/배열 state 구조
#224 @jeonjeunghoon객체/배열 state 구조
#226 @regularParkstate 위치 / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성
#227 @jeongwusi객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성
#228 @hozzijeongstate 위치 / 객체/배열 state 구조
#229 @feb-dain객체/배열 state 구조 / 공통 Input/컴포넌트 합성
#230 @gyeongzastate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성
#232 @Gilpop8663custom hook / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#233 @sh981013sstate 위치 / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성
#234 @yogjinstate 위치 / 객체/배열 state 구조 / 공통 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/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#342 @0jenn0객체/배열 state 구조
#343 @brgndyycustom hook / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#344 @soi-hastate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 검증·에러 처리 / 카드사/브랜드 판별
#345 @lurgi객체/배열 state 구조 / 카드번호 4분할 / 검증·에러 처리 / 카드사/브랜드 판별
#347 @useon객체/배열 state 구조 / 카드사/브랜드 판별
#348 @pp449state 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#349 @BadaHertz52state 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#351 @novice0840객체/배열 state 구조 / 카드번호 4분할 / 검증·에러 처리 / 카드사/브랜드 판별
#353 @ooherincustom hook / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#354 @hwinkrstate 위치 / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#355 @greetings1012객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#356 @cys4585객체/배열 state 구조
#357 @00kangstate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#360 @llqqssttyy객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#361 @skiende74custom hook / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#362 @Jaymyong66객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#364 @soosoo22객체/배열 state 구조 / 카드번호 4분할 / 검증·에러 처리
#365 @ImxYJL객체/배열 state 구조 / 카드번호 4분할 / 카드사/브랜드 판별
#367 @ss0526100custom hook / 객체/배열 state 구조 / 검증·에러 처리 / 카드사/브랜드 판별
#368 @Todari객체/배열 state 구조 / 카드번호 4분할 / 검증·에러 처리 / 카드사/브랜드 판별
#409 @keemsebinstate 위치 / 객체/배열 state 구조 / 카드사/브랜드 판별
#412 @mlnwnsstate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 검증·에러 처리 / 카드사/브랜드 판별
#414 @ohguscustom hook / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#415 @eunoia-jaxson객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#416 @jeongyoustate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#418 @MinSungJestate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 카드사/브랜드 판별
#419 @spoyodevelop객체/배열 state 구조 / 카드번호 4분할 / 검증·에러 처리 / 카드사/브랜드 판별
#422 @thgml05객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#425 @Db0111state 위치 / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#426 @rosielshstate 위치 / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#427 @sanghee01객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#430 @yeongiparkstate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#431 @eunwoo-levistate 위치 / 객체/배열 state 구조 / 검증·에러 처리
#433 @eunsoA (대표)state 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#435 @dev-dino22state 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#437 @aydenote객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#438 @wo-o29객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성
#439 @kimyou1102custom hook / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#440 @dlsxjzldcustom hook / 객체/배열 state 구조 / 카드번호 4분할 / 검증·에러 처리
#444 @mun-kyeongstate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#446 @JeLee-riverstate 위치 / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#447 @shuyeonstate 위치 / 객체/배열 state 구조 / 카드사/브랜드 판별
#448 @hoyyChoistate 위치 / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별

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

Last updated on