좋은 폴더 구조?

white noise·2025년 6월 1일

처음 프로젝트를 하게 되면 가장 고민하는 것 중에 하나가 폴더 구조를 어떻게 만들어야 할까에 대한 고민일 것이다. 지금도 고민이다

그래서 폴더 대충 만들면 되는거 아님? 싶을텐데 폴더 구조를 생각하지 않고 만들다보면 생기는 문제점을 보여주겠다.

문제점

│  App.css
│  App.jsx
│  index.css
│  main.jsx
│
├─components
│      Account.jsx
│      Account.module.css
│      Auth.jsx
│      BannerIcon.jsx
│      BannerIcon.module.css
│      BirthPage.module.css
│      BloodTypePage.module.css
│      ConstellationItem.jsx
│      ConstellationItem.module.css
│      ConstellationPage.module.css
│      Footer.jsx
│      Footer.module.css
│      FortunePage.module.css
│      FortuneResultPage.module.css
│      FortuneTitle.jsx
│      FortuneTitle.module.css
│      Header.jsx
│      Header.module.css
│      Info.jsx
│      Info.module.css
│      KeyResultPage.module.css
│      KeywordPage.module.css
│      ListPage.module.css
│      Loading.jsx
│      Loading.module.css
│      LoginPage.module.css
│      MainView.jsx
│      MainView.module.css
│      Modal.jsx
│      Modal.module.css
│      MyPage.module.css
│      MyPlaylist.jsx
│      MyPlaylist.module.css
│      TestButton.module.css
│      TestFooter.jsx
│      TestFooter.module.css
│      TestMenu.jsx
│      TestMenu.module.css
│
├─images
│      acquarius.png
│      aries.png
│      cancer.png
│      capricorn.png
│      gemini.png
│      leo.png
│      libra.png
│      pisces.png
│      sagittarius.png
│      scorpio.png
│      taurus.png
│      virgo.png
│
└─pages
        BirthPage.jsx
        BloodTypePage.jsx
        ConstellationPage.jsx
        FortunePage.jsx
        FortuneResultPage.jsx
        HomePage.jsx
        KeyResultPage.jsx
        KeywordPage.jsx
        ListPage.jsx
        LoginPage.jsx
        MbtiPage.jsx
        MyPage.jsx
        SignupPage.jsx

부끄러운 내 이전 프로젝트 코드인데, 정리가 되어있지 않다.
팀원님이랑 둘 다 경험이 없어서.. 폴더 정리는 최소한으로 하고 작업했고, 작업하다보니 더욱 폴더가 더러워졌다..

결국 규모가 큰 프로젝트를 만들수록 폴더구조를 더욱 잘 구축해야한다.

그래서! 내가 다음부터 헤매지 않기 위해 한 번 알아보려고 한다.

좋은 폴더 구조

src/
├── assets/
│   ├── images/
│   │   └── logo.png
│   └── styles/
│       └── global.css
├── components/
│   ├── Button.tsx
│   └── Navbar.tsx
├── context/
│   └── AuthContext.tsx
├── data/
│   └── menuItems.ts
├── features/
│   └── user/
│       ├── UserProfile.tsx
│       └── userSlice.ts
│       └── index.ts
├── hooks/
│   └── useAuth.ts
├── layouts/
│   └── MainLayout.tsx
├── lib/
│   └── apiClient.ts
├── pages/
│   ├── Home.tsx
│   └── About.tsx
├── services/
│   └── userService.ts
└── utils/
    └── formatDate.ts

가장 보편적인 폴더구조가 이런 느낌인 것 같다.

하나하나 설명하자면

assets

프로젝트의 모든 사진, 폰트 파일, 전역 스타일 같은 정적 파일들을 보관한다.

components

재사용 가능한 UI 컴포넌트들을 모아두며, 예를 들면 버튼, 모달 등이 있다.

가벼운 프로젝트라면 분리할 필요가 딱히 없지만, 여러 기능들이 있다면 컴포넌트 폴더 아래에 하위 폴더들을 세분화하는 것을 추천한다.
(components 폴더 안에 체크박스, input, 날짜 선택 등을 모아둔 form 폴더를 만들기도 한다.)

context

React Context 관련 파일을 저장한다.

data

assets 폴더와 비슷하지만 보통 더미데이터나 프로그램 내에서 사용되는 정보(store 아이템, 테마 정보 등)가 포함된 JSON 파일, 상수 등을 저장해놓는다.

features

모든 애플리케이션 기능이 포함되어 있다. 비슷한 기능을 묶어놓음으로써 구조를 이해하기 쉽다.

features에 각 기능이 있는 폴더마다 index.ts (or index.js)가 존재한다 이 index.ts공개 API처럼 작동하며 다른 도메인에서 무언가를 가져올 때는 이 파일을 통해서 가져오게 된다.

# Bad 🚫 🚫 🚫
import { UserProfile } from '@/features/profile/components/UserProfile.vue'

# Good ✅ ✅ ✅
import { UserProfile } from '@/features/profile'

다만 규모가 작은 프로젝트라면 features는 필요가 없을 수도 있다.
features에는 모든 애플리케이션 기능이 들어가야 해서 pages에는 최소한의 기능만을 유지해야하는데, 소규모 프로젝트라면 features 대신 pages에 페이지마다 기능을 모아둬도 괜찮다.

hooks

커스텀 hook을 저장한다.
특정 기능에서 쓰이는 커스텀 hook은 그 폴더에 저장하는게 좋고, 이 폴더에는 전역 hook만 저장하는 것이 더욱 좋다.

layouts

사이드바, 네비게이션바, 컨테이너 등 페이지 레이아웃 구성요소들을 저장한다.

만약 소규모 프로젝트라면 컴포넌트 안에 레이아웃 폴더를 만들어서 저장해놔도 좋다.

lib

외부 라이브러리 래퍼나 공용 유틸 함수를 저장한다. 관련 라이브러리를 사용하는 경우에는 이 폴더에 저장해놓고 import를 한다.

pages

라우팅되는 페이지 컴포넌트들을 저장한다.
features가 없는 경우에는 페이지 별로 기능을 함께 저장해도 되지만, features가 있는 경우에는 최소한의 로직만 구현하는 것이 좋다고 한다.

services

API 요청 함수들을 저장한다. API로 상호작용하는 코드들은 여기에 저장하면 된다.

utils

유틸리티 함수들을 저장한다고 한다.

마무리

어떻게 폴더 구조를 만들면 좋을지 알아보는 시간을 가져봤다. 모든 프로젝트의 폴더구조가 같지 않고, 다들 다르게 만들지만 어느정도의 기준에 따라 만들면 누구와 해도 기준내에서 크게 벗어나지 않을까.. 싶어서 알아두면 좋을 것 같아 알아봤다.

참조 사이트

https://bttrthn-ystrdy.tistory.com/91

https://fadamakis.com/a-front-end-application-folder-structure-that-makes-sense-ecc0b690968b

profile
Hello World

5개의 댓글

comment-user-thumbnail
2025년 6월 4일

제가 항상 새 프로젝트를 진행하고 얼마안돼서 그만 둔 이유가...... 바로 폴더 구조거든요 이번 기회로 조금 정리해볼 수 있는 기회가 되었습니다👍🏻

답글 달기
comment-user-thumbnail
2025년 6월 20일

정답이 없는 문제 같아요. 프로젝트마다, 팀마다 규칙을 잘 정해서 하는 일이 정말 어려운 것 같습니다.

답글 달기
comment-user-thumbnail
2025년 6월 29일

앗....저랑 같이 했던 프로젝트네요...이렇게 보니깐 진짜 지저분했네요ㅋㅋㅋㅋ저도 한번쯤은 다루고 싶었던 주제인데 많은 도움이 되었어요!!

답글 달기
comment-user-thumbnail
2025년 6월 30일

헐 근데 진짜 잘 정리된 폴더와 아닌 폴더가 시각적으로 딱(?) 느껴지는 거 같아요 .. 저도 곧 있으면 개발을 시작해야 되는데 한숨만 앞서네요 허허 참고해서 폴더관리에 좀 더 신경써보겠습니다~!

답글 달기
comment-user-thumbnail
2025년 7월 28일

저도 지금 플젝하는데 파일구조 예쁘게 정리해놔도 실제 코딩하면 그대로 안되더라구요 ㅎㅎ

답글 달기