Skip to Content
페이먼츠 미션1단계 FAQ 카드Q4. 공통 Input 컴포넌트 — 합성

Q4. 공통 Input/Fieldset 컴포넌트 — 합성을 위해 만드는 게 맞을까?

크루의 질문

“공통 fieldset 컴포넌트를 사용하여 카드번호, 유효기간, cvc의 컴포넌트를 만들었습니다. payment에서 이 컴포넌트들을 합성하여 사용하였고, value 상태랑 유효성 검사 값이 payment에 있는데, 공통 fieldset 컴포넌트가 필요한지 궁금합니다.” — 콘티·먼지 페어

“컴포넌트 쪼개는 기준에 대해 얘기를 많이 했습니다.” — 파라디·피트·이현 페어

AS-IS 코드

🔍 읽기 전에

이 Input 컴포넌트의 책임을 한 문장으로 적어보면 어떨까요?

그 한 문장에 몇 가지 일이 들어 있나요?

// src/components/@common/Input/Input.tsx Input.Label = Label; Input.Limit = Limit; export default Input; interface InputItemsContext { itemMap: Map<string, { ref: RefObject<HTMLInputElement | null> }>; } const InputItemsContext = createContext<InputItemsContext>({ itemMap: new Map(), }); const useInputItemsContext = () => useContext(InputItemsContext); function InputItemsProvider({ children }: PropsWithChildren) { const itemMap = useRef<InputItemsContext['itemMap']>(new Map()).current; return <InputItemsContext.Provider value={{ itemMap }}>{children}</InputItemsContext.Provider>; } function InputItem({ children }: PropsWithChildren) { const { itemMap } = useInputItemsContext(); const childrenArray = Children.toArray(children);

공식문서 단서 — children으로 합성하기

React 공식문서 Passing JSX as children  (한글 번역)이 합성의 기초를 보여준다:

When you nest content inside a JSX tag, the parent component will receive that content in a prop called children.

페이먼츠에서 fieldset은 *시각적 묶음(레이블 + 입력 영역)*이라는 구조 역할만 가질 수 있다. 그 안에 들어가는 input의 종류·검증·자동 이동이 다르다면, 합성의 단위는 fieldset이 아니라 각 도메인 영역일 수 있다 — children부모가 자식의 종류를 알 필요가 없을 때 가장 강하다.

추가로 Reusing Logic with Custom Hooks  (요약)의 “같은 코드가 여러 곳에서 반복되면 Custom Hook으로 추출할 수 있다” 는 기준과 짝지어 볼 수 있다. Q1에서 본 AHA 원칙(먼저 1단계 스타일로 완성한 뒤 중복을 본 뒤 추출)을 컴포넌트 추출에도 적용하면, 공통 컴포넌트는 중복과 변화 방향을 본 뒤 만든다는 쪽이 더 안전하다.


선배 PR 읽기 가이드

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

선배 PR — 공통 Input 컴포넌트로 합성한 패턴

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

읽는 관점: “공통 Input이 받는 props 목록을 먼저 세어보세요. 리뷰어가 범용 컴포넌트의 이름, value 전달, label/htmlFor, disabled 같은 확장 지점을 어떻게 짚는지 확인하면 좋습니다.”

선배 PR — 도메인 영역별 컴포넌트로 분리한 패턴

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

읽는 관점: “도메인별 컴포넌트로 나눈 뒤에도 같은 JSX 모양이 반복되는지 보세요. 리뷰에서 추출 타이밍을 묻는 코멘트가 있으면 Q01의 hook 추출 논의와 연결됩니다.”

추가 읽을거리 — Kent C. Dodds · Dan Abramov

외부 글 모음 — 펼쳐보기

Kent C. Dodds — AHA Programming

  • 원문: kentcdodds.com/blog/aha-programming 
  • 한 줄 요약: Avoid Hasty Abstractions — 성급한 추상화를 피하라. 공통 컴포넌트의 prop 인터페이스가 자꾸 넓어진다면 추상화 시점이 너무 빨랐을 가능성. 페이먼츠 2단계 *“먼저 1단계 스타일로 완성한 뒤 추출”*과 이어진다.

Kent C. Dodds — When to break up a component into multiple components

Dan Abramov — Writing Resilient Components

  • 원문: overreacted.io/writing-resilient-components 
  • 한 줄 요약: 합성된 자식 컴포넌트가 부모 prop 변경에 잘 견디려면 어떤 원칙을 따라야 하는가. 공통 컴포넌트의 *“확장성을 위해 prop을 늘리는 것”*이 어디서부터 비용으로 보이는지의 단서.

연관 PR 더 보기

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

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

PR작성자핵심 키워드
#3 @jho2301객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#4 @SunYoungKwon객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#6 @Puterismstate 위치 / 공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#7 @dudtjr913state 위치 / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성
#8 @goni-ssi객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성
#10 @bucketHaneul객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#15 @365kim객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#16 @shinsehantan객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#17 @zigsong객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#18 @0imbean0카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#19 @iborymagic공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#20 @hchayan객체/배열 state 구조 / 공통 Input/컴포넌트 합성
#22 @ddongule객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성
#25 @2SOOY공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#28 @jum0공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#29 @swon3210state 위치 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#69 @juunzzistate 위치 / 공통 Input/컴포넌트 합성
#71 @DomMorellostate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#77 @JUDONGHYEOKstate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성
#78 @soyi47state 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성
#81 @usageness공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#86 @yunjin-kim공통 Input/컴포넌트 합성
#87 @airman5573공통 Input/컴포넌트 합성
#90 @prefer2카드번호 4분할 / 공통 Input/컴포넌트 합성
#91 @moonheekim0118custom hook / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#93 @kwannee객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#94 @euijinkkstate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#95 @KangYunHo1221state 위치 / 카드번호 4분할 / 공통 Input/컴포넌트 합성
#97 @kamwoostate 위치 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#98 @byhhh2state 위치 / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#100 @woose28state 위치 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#103 @kkojae91객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성
#106 @jin7969객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#186 @bassyu공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#187 @gabrielyoon7객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성
#188 @ksone02공통 Input/컴포넌트 합성
#191 @kyw0716 (대표)객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성
#194 @shackstack카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#197 @xodms0309state 위치 / 카드번호 4분할 / 공통 Input/컴포넌트 합성
#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/컴포넌트 합성
#207 @inyeong-kangcustom hook / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#208 @D0Damstate 위치 / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성
#209 @jiwonh423state 위치 / 공통 Input/컴포넌트 합성
#210 @chsua카드번호 4분할 / 공통 Input/컴포넌트 합성
#213 @wzrabbitstate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#214 @n0eyes (대표)custom hook / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#215 @Dahyeeeestate 위치 / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성
#217 @WaiNaat공통 Input/컴포넌트 합성
#218 @tkdrb12객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#219 @Creative-Lee공통 Input/컴포넌트 합성
#225 @woo-jkstate 위치 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#226 @regularParkstate 위치 / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성
#227 @jeongwusi객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성
#229 @feb-dain객체/배열 state 구조 / 공통 Input/컴포넌트 합성
#230 @gyeongzastate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성
#232 @Gilpop8663custom hook / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#233 @sh981013sstate 위치 / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성
#234 @yogjinstate 위치 / 객체/배열 state 구조 / 공통 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/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#339 @Yoonkyoungmestate 위치 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#340 @chosim-dvlpr객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#341 @simorimistate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#343 @brgndyycustom hook / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#348 @pp449state 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#349 @BadaHertz52state 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#353 @ooherincustom hook / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#354 @hwinkrstate 위치 / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#355 @greetings1012객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#357 @00kangstate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#359 @rbgksqkrcustom hook / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#360 @llqqssttyy객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#361 @skiende74custom hook / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#362 @Jaymyong66객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#363 @chysisstate 위치 / 공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#413 @Beomtaecustom hook / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#414 @ohguscustom hook / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#415 @eunoia-jaxson객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#416 @jeongyoustate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#417 @sooyeoniyacustom hook / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#420 @ShinjungOhstate 위치 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#422 @thgml05객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#423 @yeji0214state 위치 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#425 @Db0111state 위치 / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#426 @rosielshstate 위치 / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 검증·에러 처리
#427 @sanghee01객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#430 @yeongiparkstate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#433 @eunsoAstate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#435 @dev-dino22state 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#436 @bunju20카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#437 @aydenote객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#438 @wo-o29객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성
#439 @kimyou1102custom hook / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#441 @hanheel카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#442 @jaeyoung-kwonstate 위치 / 공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#443 @jin123457카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#444 @mun-kyeongstate 위치 / 객체/배열 state 구조 / 카드번호 4분할 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별
#446 @JeLee-riverstate 위치 / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 카드사/브랜드 판별
#448 @hoyyChoistate 위치 / 객체/배열 state 구조 / 공통 Input/컴포넌트 합성 / 검증·에러 처리 / 카드사/브랜드 판별

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

Last updated on