일상이 개발

React 폴더 구조 & 아키텍처 설계 가이드 – 유지보수성과 확장성을 높이는 실전 전략

아빠고미 2025. 5. 5. 12:08
반응형

React 앱 유지보수성과 확장성을 위한 폴더 구조 & 아키텍처 설계 가이드 – 기능 중심 vs 도메인 중심 비교와 실전 설계법

React 프로젝트가 커지면서 가장 먼저 복잡해지는 건 코드보다도 폴더 구조입니다.

처음엔 components 폴더 하나로 시작하지만, 점점 hooks, pages, utils, store 등 이름이 늘어나고, 나중엔 어느 파일이 어디에 있어야 할지 헷갈리기 시작하죠.

이번 글에서는 기능 중심 vs 도메인 중심 폴더 구조 비교부터, Atomic Design + Feature-based 구조 조합까지 실무에 강한 React 아키텍처 설계 전략을 3단계에 걸쳐 정리합니다.

 

React 폴더 구조 & 아키텍처 설계 가이드 – 유지보수성과 확장성을 높이는 실전 전략


1. 📁 기본 구조의 진화 과정

프로젝트가 커질수록 폴더 구조는 다음과 같은 단계로 진화합니다:

  1. 기초 구조: src 안에 모든 것을 몰아넣는 형태
  2. 역할 분리 구조: 컴포넌트, 훅, 유틸 등 역할별 디렉터리 분리
  3. 기능 중심 구조: 페이지나 도메인 단위로 디렉터리 구성
  4. 멀티 도메인 구조: 대규모 프로젝트에 맞는 도메인+레이어 혼합 방식

✅ 예: 기초 구조

src/
├── components/
├── pages/
├── App.js
└── index.js

❌ 문제점

  • 같은 기능이라도 서로 다른 폴더에 나뉘어 있음
  • 확장성, 테스트, 유지보수 모두 어려워짐

2. 🧱 역할 기반 구조 vs 기능 기반 구조 비교

📌 역할 기반 구조 (Role-based)

src/
├── components/
├── hooks/
├── utils/
├── services/
├── store/

✅ 장점

  • 처음 배우기 쉽고 직관적
  • 비슷한 역할끼리 묶여 있어 명확함

❌ 단점

  • 한 기능에 관련된 파일이 여기저기 흩어짐
  • 기능 단위 테스트 및 유지보수가 어려움

📌 기능 기반 구조 (Feature-based)

src/
├── features/
│   ├── auth/
│   │   ├── components/
│   │   ├── hooks/
│   │   └── store.js
│   ├── product/
│   │   ├── components/
│   │   └── productSlice.js

✅ 장점

  • 한 기능에 필요한 모든 코드가 한 곳에
  • 도메인 단위 유지보수가 쉬움
  • 기능별 모듈화 → 팀 단위 작업에 유리

❌ 단점

  • 파일이 중복되어 보일 수 있음
  • 초기 학습이 약간 까다로움

3. 🗂️ 실전 Feature 중심 폴더 구조 예시

기능 중심 구조는 대규모 프로젝트일수록 효과를 발휘합니다.

📁 구조 예시 (중대형 기준)

src/
├── app/               # 앱 설정 (라우팅, 스토어, 글로벌 스타일 등)
├── features/
│   ├── auth/
│   │   ├── components/
│   │   ├── hooks/
│   │   ├── pages/
│   │   ├── api/
│   │   └── store.js
│   ├── product/
│   │   ├── components/
│   │   ├── hooks/
│   │   └── productSlice.js
├── shared/            # 공통 컴포넌트, 훅, 유틸 등
│   ├── components/
│   ├── hooks/
│   ├── constants/
├── styles/            # 글로벌 스타일
├── assets/            # 이미지, 폰트 등 정적 자원
├── index.tsx
└── App.tsx

각 feature 안에 필요한 모든 요소가 함께 구성되어 있어 **코드 이동 없이도 한 기능을 온전히 파악하고 유지보수**할 수 있어요.


4. 🧩 레이아웃 중심 구조 분리 전략

프로젝트가 커지면 페이지별 레이아웃도 달라집니다.

예시:

  • 메인 레이아웃 (헤더/푸터 포함)
  • 관리자 대시보드 레이아웃 (사이드바 포함)
  • 로그인/회원가입 레이아웃 (심플)

📦 구조 예시

src/
├── layouts/
│   ├── MainLayout.tsx
│   ├── AdminLayout.tsx
│   └── AuthLayout.tsx

📌 페이지와 조합 예시

// pages/Home.tsx
import MainLayout from '@/layouts/MainLayout';

export default function Home() {
  return (
    <MainLayout>
      <HeroSection />
      <ProductGrid />
    </MainLayout>
  );
}

➡️ 이렇게 하면 레이아웃 재사용 + UX 통일성 + 유지보수 세 마리 토끼를 잡을 수 있어요.


5. 🧱 Atomic Design과 기능 중심 구조의 하이브리드

요즘은 Atomic Design을 Feature 구조에 결합하는 방식이 가장 실용적입니다.

예시: features 내 UI 분할

features/
└── product/
    ├── atoms/
    │   └── ProductImage.tsx
    ├── molecules/
    │   └── ProductCard.tsx
    ├── organisms/
    │   └── ProductGrid.tsx
    ├── pages/
    └── store.ts

➡️ 디자인 시스템을 코드 구조에 반영하면서도, 도메인 단위로 관리할 수 있습니다.

6. 🧩 컴포넌트 분리 기준 – 언제 쪼개고, 어디에 둘 것인가?

“컴포넌트를 어떻게 나누면 좋을까?”는 React 개발에서 가장 자주 나오는 질문입니다.

✅ 분리 기준 5가지

  • 재사용 가능성: 다른 화면에서도 쓸 수 있는가?
  • 의미 단위 완결성: UI 구조가 명확한 하나의 역할인가?
  • 상태 보유 여부: 상태가 있다면 위쪽으로 끌어올릴 여지가 있는가?
  • 길이: 한 파일 100줄 이상이면 분리 고려
  • 테스트 가능성: 테스트 단위로 나누기 적절한가?

📌 위치 결정 가이드

  • features 내부: 도메인 종속 컴포넌트 (예: ProductCard)
  • shared/components: 재사용 가능한 범용 컴포넌트 (예: Button, Modal)

7. ✅ 테스트, 스토리북, 타입 설계까지 구조에 포함하자

📦 테스트 파일 위치 예시

ProductCard/
├── index.tsx
├── ProductCard.test.tsx
└── ProductCard.stories.tsx

📌 통합 디렉터리 패턴

  • 컴포넌트 코드, 테스트, 스토리북, 스타일을 한 디렉터리에 통합

✅ 장점

  • 컴포넌트와 관련된 모든 것을 한눈에 관리
  • 협업자와의 의사소통이 쉬움

8. 🧠 마무리 – 폴더 구조는 팀의 협업 전략이다

잘 짜인 폴더 구조는 단지 보기 좋기 위해서가 아니라, 팀의 협업 속도를 높이고, 유지보수 부담을 줄이는 중요한 전략입니다.

✨ 핵심 요약

  • 기초 구조 → 역할 기반 → 기능 기반 → 레이아웃/도메인 결합 구조로 진화
  • Atomic Design + Feature 구조 = 실용적 확장 구조
  • shared / features / app 디렉터리 구분은 필수
  • 테스트, 스토리북, 타입은 컴포넌트와 함께 위치
  • 정답은 없지만, ‘예측 가능하고 일관된’ 구조가 가장 좋다

React 앱 구조를 잘 설계하면, 한 줄의 코드를 수정하는 시간이 10분에서 10초로 줄어듭니다.

이번 글이 여러분의 프로젝트 폴더 구조를 설계하는 데 실질적인 도움이 되었기를 바랍니다!


긴 글 읽어주셔서 감사합니다. 공감, 댓글, 공유로 응원해주시면 다음 글 제작에 큰 힘이 됩니다 🙌

반응형