8개월 차, 아직도 컴포넌트 분리를 헷갈리는 이유
- 05 Jan, 2026
8개월 차, 아직도 컴포넌트 분리를 헷갈리는 이유
오늘도 코드리뷰에서 혼났다
출근하자마자 슬랙 알림. 심장이 쿵 내려앉았다.
“이신입님, 이 컴포넌트 너무 크지 않나요? 분리하면 좋을 것 같은데요.”
민수 선배다. 항상 친절하게 말하지만 그게 더 무섭다. 어제 올린 PR이었다. UserProfile.jsx 파일. 300줄짜리.
“아… 네네 수정하겠습니다.”
일단 답장부터. 그리고 코드를 다시 봤다. 뭘 분리하라는 건지 솔직히 모르겠다. 전부 프로필 관련 코드인데.
프로필 사진, 이름, 소개, 팔로우 버튼, 게시글 목록, 좋아요 수. 다 유저 프로필이잖아. 그럼 UserProfile 컴포넌트에 있는 게 맞는 거 아닌가.
근데 선배는 분리하래.

8개월 됐다. 근데 아직도 모르겠다. 컴포넌트를 어떻게 나누는 게 정답인지.
부트캠프 때는 간단했다. 헤더는 Header.jsx, 버튼은 Button.jsx. 그게 끝이었다. 근데 실무는 다르다.
UserProfile.jsx를 열면 그 안에 또 뭐가 들어가야 하는지. ProfileHeader? ProfileInfo? UserAvatar? FollowButton? 어디까지가 한 덩어리고 어디서부터 분리해야 하는지.
그냥 다 한 파일에 쓰면 안 되나. 길어도 Ctrl+F 하면 찾을 수 있는데.
선배들이 말하는 ‘재사용성’
“재사용 가능하게 만들어야죠.”
코드리뷰 댓글에 항상 나오는 말. 재사용성.
근데 뭘 재사용한다는 건지 모르겠다. 이 프로필 페이지는 프로필 페이지에서만 쓰는데. 다른 데서 언제 쓴다고.
FollowButton을 분리했다. 그럼 다른 페이지에서도 팔로우 버튼 쓸 수 있으니까 재사용 가능한 거다. 이해했다고 생각했다.
근데 일주일 뒤 또 지적받았다.
“ProfileInfo도 분리하면 좋을 것 같아요.”
ProfileInfo는 이름이랑 소개 보여주는 부분. 이건 어디서 재사용해. 프로필 페이지에서만 쓰는데.
물어봤다. 용기 내서.
“선배님, 근데 ProfileInfo는 프로필에서만 쓰지 않나요?”
“지금은 그렇죠. 근데 나중에 모달에서도 쓸 수도 있고, 카드 형태로 보여줄 수도 있잖아요.”
나중에. 모달. 카드.
모르겠다. 나중은 언제고 모달은 아직 없는데 지금 분리하라는 건가.

그래서 분리했다. ProfileInfo.jsx. 그 안에 이름이랑 소개만 넣었다. 30줄.
30줄짜리 파일을 만드는 게 맞나. components 폴더 열 때마다 파일이 수십 개다. 뭐가 뭔지 모르겠다.
Button.jsx, CustomButton.jsx, StyledButton.jsx, PrimaryButton.jsx. 다 버튼인데 뭐가 다른 건지. 누가 정리 좀 해줬으면 좋겠다.
컴포넌트 분리의 기준이 뭔데
구글링했다. “React 컴포넌트 분리 기준”.
블로그마다 다르다.
어떤 글은 “50줄 넘으면 분리하세요”래. 그럼 난 이미 300줄인데 6개로 쪼개야 하나.
어떤 글은 “단일 책임 원칙”이래. 하나의 컴포넌트는 하나의 일만. 그게 뭔데. 프로필 보여주는 게 한 가지 일 아닌가.
어떤 글은 “props가 5개 넘으면 분리”래. 그럼 지금 당장 분리해야 할 게 10개는 넘는다.
유튜브도 봤다. 영상마다 다르다.
“작게 쪼갤수록 좋습니다.” vs “너무 잘게 쪼개면 오히려 복잡해져요.”
둘 다 맞는 말 같은데 반대다. 뭘 믿어야 하지.
ChatGPT한테 물어봤다. 코드 붙여넣고 “이거 어떻게 분리하면 좋을까요?”
3가지 방법을 알려줬다. 전부 다른 방법. 어느 게 정답이래.
“상황에 따라 다릅니다.”
상황. 그 상황을 내가 모르는데 어떡하라고.
분리했더니 props 지옥
결국 분리했다. UserProfile을 5개로 쪼갰다.
ProfileHeader, ProfileAvatar, ProfileInfo, FollowButton, PostList.
뿌듯했다. 이제 각 파일이 50줄 정도. 깔끔하다. PR 올렸다.
“props drilling이 너무 심한 것 같아요.”
뭐라고.
UserProfile에서 userId를 받아서 ProfileHeader한테 넘기고, ProfileHeader가 또 ProfileAvatar한테 넘기고, ProfileAvatar가 이미지 URL 받아오려고 또…
props가 3단계를 내려간다. userId -> ProfileHeader -> ProfileAvatar -> 실제 사용.
“Context API 쓰시거나 상태관리 라이브러리 고려해보세요.”
Context API. 배웠다. 근데 언제 쓰는 건지 모르겠다. 이 정도면 쓰는 건가. 아직 안 쓰는 건가.
Zustand? Recoil? Redux는 너무 어렵다고 하던데. 뭘 선택해야 하나.
일단 물어봤다. 또.
“선배님, 이거 Context 써야 할까요?”
“음… 지금은 괜찮을 것 같은데요. 나중에 상태가 복잡해지면 그때 고민해봐요.”
나중에. 또 나중에.

그래서 원래대로 돌렸다. props 3개만 넘기게. 근데 그러니까 ProfileHeader가 너무 많은 일을 한다고 또 지적받았다.
“ProfileHeader가 너무 많은 책임을 가지고 있네요.”
책임. 또 책임.
뭐가 책임인지 모르겠다. 그냥 props 전달하는 건데. 이것도 책임인가.
결국 정답은 없다는 걸 깨달았다
3주 걸렸다. 한 페이지 리팩토링하는 데.
처음 300줄 UserProfile.jsx는 이제 10개 파일이 됐다. components/profile 폴더에 들어가면 파일이 즐비하다.
ProfileHeader.jsx ProfileAvatar.jsx ProfileBadge.jsx ProfileInfo.jsx ProfileBio.jsx FollowButton.jsx FollowStats.jsx PostList.jsx PostItem.jsx PostImage.jsx
10개. 원래 하나였는데.
깔끔한가. 모르겠다. 파일 찾으려고 왔다 갔다 하는 게 더 불편한 것 같기도 하다.
근데 민수 선배는 좋다고 했다.
“이제 훨씬 읽기 좋네요. 수고했어요.”
읽기 좋다고. 진짜 그런가. 난 아직도 헷갈리는데.
어제 신입이 한 명 더 들어왔다. 나보다 3개월 늦게. 이름은 김신입.
“선배님, 컴포넌트 어떻게 나누는 게 좋아요?”
물어봤다. 나한테. 선배라고.
“음… 재사용 가능하게? 그리고 너무 길어지면 분리하고…”
내가 하는 말이 민수 선배랑 똑같다. 웃겼다.
근데 김신입이 물었다.
“그럼 몇 줄 정도가 적당한가요?”
“그게… 상황에 따라 달라요.”
이 말을 내가 하고 있다. 3주 전에 제일 듣기 싫었던 말을.
아직도 모르지만 조금 알 것 같기도 하다
오늘도 컴포넌트 분리했다. 새로운 기능. 장바구니 페이지.
처음부터 나눴다. ShoppingCart.jsx 하나에 다 쓰지 않았다.
CartHeader, CartItem, CartSummary, CheckoutButton.
4개로 시작했다. 200줄이 4개 파일, 50줄씩.
PR 올리기 전에 스스로 봤다. CartItem이 좀 긴 것 같다. 80줄.
분리했다. CartItemImage, CartItemInfo, CartItemQuantity.
혼자 했다. 지적받기 전에.
뿌듯했다. 조금. 아주 조금.
그리고 민수 선배가 approve 눌렀다. 댓글 없이.
댓글 없는 게 제일 좋은 거다. 배웠다.
여전히 모른다. 정확한 기준 같은 건. 몇 줄에서 나누고, 어떤 이름을 붙이고, props를 몇 개까지 넘기고.
근데 계속 하다 보니까 감이 생긴다. 이 정도면 분리해야겠다. 이건 하나여도 되겠다.
틀릴 때도 있다. 많다. 근데 틀리면 또 고치면 된다. 3주 걸려도 되고.
8개월 차. 아직도 주니어. 컴포넌트 분리는 여전히 어렵다.
근데 3개월 전보다는 덜 어렵다. 그게 성장인가 보다.
내일도 분리하겠지. 또 헷갈리겠지. 그래도 해본다.
김신입한테 알려줄 건 생겼다. “일단 해봐. 틀려도 돼.”
