감행 - #3 CRA 프로젝트 상태 분석 및 개선 방향 정리 (프론트)

2025. 7. 15. 18:54·Project/감행

1. 기존 FE_Original 프로젝트 상태

-  리팩토링 전, 내가 작업 중인 프로젝트는 CRA (Create React App) 기반의 React 프로젝트임.

- 기존 프로젝트 코드가 FISA에서 배워서 익혔던 방식과 많이 차이 나서 이해하는데 시간이 걸림.

- Next.js에 익숙해져서 CRA가 많이 어색해짐. 전에 Vite로 하기로 했는데 CRA를 결국 사용함.

- 리팩토링 전에 Original 레포 프로젝트 코드를 분석하여 정리해두고 개선 방향을 찾으려 함.

/**pakage.json*/
"dependencies": {
  ...
  "react-scripts": "5.0.1",
  ...
},
"scripts": {
  "start": "react-scripts start",
  "build": "react-scripts build",
  "test": "react-scripts test",
  "eject": "react-scripts eject"
}
  • react-scripts는 CRA의 핵심이라고 함.. (현재 react, react-dom 사용)
  • proxy, axios, redux, react-query 등 다양한 라이브러리 사용 중
  • 상태 관리 : Redux + React-Redux
  • 기타 유틸 : dayjs, date-fns, styled-components, swiper, react-icons, 등

- 프로젝트 초기에 Vite로 하자는 FE 팀장님의 의견이 있었지만, 그때 당시 팀장님을 제외한 나 포함 2명의 팀원은 개발 초짜였기도 하고, FE, BE 팀장들도 CRA만 알고 있었기 때문에 이 방식을 선택했었다. (이제보니 CRA가 더 복잡한듯...)

 


 

2. CRA 프로젝트의 문제점 (1)

  1. 느린 속도 : 개발 서버(HMR) 반응 속도가 느리고, 빌드 시간이 김
  2. 구조 정리가 안 되어 있음 : 디렉토리/컴포넌트 분리 안 되어 복잡, 공통 로직 재사용 어려움
  3. 타입 안정성 없음 : JavaScript만 사용 → 타입 체크, 자동완성 부족
  4. 확장성에 한계 : 프로젝트가 커질수록 유지보수 어려워짐
항목 CRA (react-scripts) Vite
번들러 Webpack ESBuild
속도 느림 (특히 빌드) 빠름 (HMR, 빌드 매우 빠름)
설정 숨겨짐 오픈 (vite.config.js 커스터마이징)
사용 명령어 npm start, build, test npm run dev, build
지원 파일 .js, .jsx .js, .jsx (추가로 .ts, .tsx도 쉽게 지원)

 


 

3. CRA 프로젝트의 문제점 (2) - 디렉토리

1. components/와 pages/가 혼재됨

- 일부 "페이지" 성격의 컴포넌트가 components/booking/에 있고, 또 다른 페이지는 pages/에 있어 명확하지 않음

- 컴포넌트 이름이 _page.js, book.js 등으로 혼동

- 역할이 명확히 드러나지 않음 (컴포넌트? 라우팅 페이지?)

 

2. 중복되거나 모호한 디렉토리

- Original에 있는 디렉토리 구조가 매우 복잡함.

- components/pages/ 와 pages/가 동시에 있음

- 기능 단위가 아니라 UI 단위로 구성됨 (재사용 어려움)

타입  접미사 추천 예시
페이지 컴포넌트 Page login_page.js => LoginPage.jsx, mypage_page.js => MyPage.jsx
재사용 UI 컴포넌트 명확한 기능 이름 Header.jsx, BookingCard.jsx
API 요청 기능 + Api bookingApi.js, authApi.js
훅 use 접두사 useBooking.js, useAuth.js
유틸 기능 이름 그대로 formatDate.js, validateInput.js

 

 


4. 개선 방향: 리팩토링 전략

✅ 1차 리팩토링: JavaScript + Vite 기반으로 구조 정리

  • CRA 탈출 → Vite 기반 개발환경 구축
  • 속도 개선 + 설정 유연성 확보 (훨씬 빠른 HMR, 빌드 속도)
  • 기존 JS 코드를 그대로 옮기며 구조, 코드 리팩토링
  • 디렉토리 정리 (components, pages, hooks, api 등)
** 디렉토리 구조 정리 **
src/
├── assets/                                             # 정적 파일 (이미지, 폰트 등)
│ ├── images/
│ └── fonts/
│ ├── components/                                # 공통 UI 컴포넌트 (공용/레이아웃)
│ ├── common/                                      # Button, Modal 등 재사용 컴포넌트
│ └── layout/                                          # Header, Footer 등 레이아웃 관련
│ ├── features/                                       # 기능 단위 폴더 (기능 중심 정리)
│ ├── booking/                                       # 예약 기능 관련 폴더
│ │ ├── components/                             # 해당 기능 전용 컴포넌트
│ │ │ ├── BookingForm.jsx
│ │ │ └── BookingComplete.jsx
│ │ ├── pages/                                       # 해당 기능 전용 라우트 대상 페이지
│ │ │ └── BookingPage.jsx
│ │ ├── bookingApi.js                            # 기능 전용 API
│ │ └── useBooking.js                           # 기능 전용 커스텀 훅
│ ├── auth/
│ │ ├── components/
│ │ ├── pages/
│ │ ├── authApi.js
│ │ └── useAuth.js
│ └── ...
│ ├── pages/                                          # 전체 라우팅 대상 (빠른 참조용 or 라우트 직접 연결 시)
│ └── NotFoundPage.jsx
│ ├── routes/                                          # 라우터 정의
│ └── AppRouter.jsx
│ ├── hooks/                                          # 공통 커스텀 훅
│ └── useModal.js
│ ├── api/                                               # 공통 API 설정
│ └── axiosInstance.js
│ ├── utils/                                             # 공통 유틸 함수
│ └── formatDate.js
│ ├── styles/                                          # 전역 스타일, 테마
│ ├── global.css
│ └── variables.js
│ ├── App.jsx                                         # App 루트 컴포넌트
└── main.jsx                                           # Vite 기준 진입점 (CRA의 index.js 역할)

- 이 구조의 장점 : 한 기능에 필요한 컴포넌트, 페이지, 훅, API 모두 모아두고 공통 컴포넌트는 분리함.

- 확장성이 탁월하고 나중에 Next.js로 전화할 때 호환성 높음.

 

✅ 2차 리팩토링: TypeScript + Next.js로 확장

  • Next.js의 SSR/SEO, 라우팅, API 등 고급 기능 활용
  • 코드가 정리된 상태에서 TS 전환하므로 수월
  • 타입 안전성 확보로 유지보수성 향상.

 


 

 

5. .js vs .jsx 차이?

  • .js는 순수 자바스크립트 파일
  • .jsx는 JSX(HTML-like) 문법을 포함하는 파일 (js의 확장 : JS + XML 문법 => 리액트 컴포넌트 만들 때 쓰는 형식)
  • CRA나 Vite에서는 .js에서도 JSX 사용 가능하지만, .jsx로 명시하면 가독성과 협업에 좋음!!

 


 

6. 향후 계획 (마이그레이션 로드맵)

1. CRA 기반 JS 프로젝트 → Vite로 재세팅
2. 디렉토리 구조, 상태 관리 정리
3. 타입스크립트 환경 세팅 → 점진적 파일 전환 (.js → .ts)
4. Next.js로 마이그레이션 (파일 기반 라우팅, API routes 등)

- 코드를 단순히 보기 좋고 예쁘게 고치는 게 아니라, 앞으로의 확장성과 유지보수를 위한 "기반 설계 작업"을 진행할 것.

'Project > 감행' 카테고리의 다른 글

감행 - #2 컨벤션 및 디렉토리 구조 정리  (0) 2025.07.15
감행 - #1 리팩토링 시작 및 일정 정리  (0) 2025.07.15
'Project/감행' 카테고리의 다른 글
  • 감행 - #2 컨벤션 및 디렉토리 구조 정리
  • 감행 - #1 리팩토링 시작 및 일정 정리
iamyuunzo
iamyuunzo
https://github.com/iamyuunzo
  • iamyuunzo
    iamyuunzo
    iamyuunzo
  • 전체
    오늘
    어제
    • 분류 전체보기 (94)
      • Study (5)
        • App Developer (0)
        • Algorithm study (0)
        • Google AI Essentials (3)
      • Project (3)
        • 감행 (3)
        • Tokkit (0)
        • 다시, 봄 (0)
        • Clone Coding (0)
      • 자격증 모음 (5)
        • AWS Certification (1)
        • 정보처리기사 (0)
        • 빅데이터분석기사 (1)
        • TOEIC Speaking (3)
      • CODING TEST (79)
        • baekjoon (26)
        • programmers (20)
        • MySQL (31)
        • COS Pro (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • github
  • 공지사항

  • 인기 글

  • 태그

    백준
    COS Pro
    우리 fisa
    감행
    AWS Certified Cloud Practitioner
    Programmers
    클라우드서비스개발
    toeic speaking
    회고
    프로그래머스
    우리fisa
    회고록
    AWS Certification
    우리fis아카데미
    프로젝트 리팩토링
    SQL
    CLF-C02
    java
    토익 스피킹
    baekjoon
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
iamyuunzo
감행 - #3 CRA 프로젝트 상태 분석 및 개선 방향 정리 (프론트)
상단으로

티스토리툴바