Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

metaapple/react-node

Open more actions menu

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

28 Commits
28 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Warning

⚠️ 윈도우에서 테스트시 다음과 같은 port충돌이 있을 수 있음.
⚠️ 윈도우에서 테스트 시에는 "8080"으로, AWS EC2 리눅스 배포 시에는 "80"으로 할 것


2025-12-31 12 26 31

✔️✔️✔️✔️✔️✔️ 아래의 모든 주소가 모두 테스트 통과해야함. ✔️✔️✔️✔️✔️✔️

image
image
image
image
2025-12-31 15 41 08
2025-12-31 15 40 20

React + Node.js Fullstack Project

이 프로젝트는 React를 사용한 프론트엔드와 Node.js (Express)를 사용한 백엔드로 구성된 풀스택 웹 애플리케이션 템플릿입니다.
프론트엔드와 백엔드를 별도의 폴더로 분리하여 관리하며, 각각 독립적으로 개발 및 실행이 가능하도록 설계되었습니다.

https://github.com/metaapple/react-node

프로젝트 개요

  • 프론트엔드: React (Vite 기반) SPA
  • 백엔드: Node.js + Express RESTful API 서버
  • 목적: 풀스택 개발 학습, 프로토타이핑, 배포 연습용 기본 구조 제공
  • 주요 특징:
    • 프론트엔드와 백엔드 완전 분리 (Monorepo 구조)
    • CORS 설정으로 로컬 개발 시 원활한 API 호출
    • 환경 변수(.env) 지원
    • Docker & Docker Compose 완전 지원 (단일 컨테이너 또는 멀티 컨테이너 배포 가능)
    • Nginx를 통한 React 정적 파일 서빙 + API 프록시

기술 스택

Frontend (frontend/)

  • React 19+
  • Vite 7+
  • Zustand (상태 관리)
  • Axios
  • ESLint

Backend (backend/)

  • Node.js (v20 이상 추천)
  • Express.js
  • MySQL2
  • Express Session
  • CORS

공통 / 배포

  • JavaScript
  • Docker
  • Docker Compose
  • Nginx (프로덕션 서빙)

프로젝트 구조

react-node/
├── frontend/                 # React 프론트엔드 (Vite)
│   ├── public/
│   │   ├── assets/
│   │   │   ├── css/
│   │   │   ├── img/
│   │   │   └── js/
│   │   └── vite.svg
│   ├── src/
│   │   ├── components/      # 재사용 컴포넌트
│   │   │   ├── Board.jsx
│   │   │   ├── Footer.jsx
│   │   │   └── Header.jsx
│   │   ├── store/           # Zustand 상태 관리
│   │   │   └── authStore.js
│   │   ├── App.jsx
│   │   ├── App.css
│   │   ├── main.jsx
│   │   └── index.css
│   ├── Dockerfile
│   ├── package.json
│   ├── vite.config.js
│   └── .env                 # VITE_ 접두사 환경 변수
│
├── backend/                  # Node.js 백엔드
│   ├── db/                   # 데이터베이스 관련
│   │   ├── db.js
│   │   ├── board_db.js
│   │   ├── user_db.js
│   │   └── init.sql
│   ├── routes/               # 라우트 정의
│   │   ├── board_router.js
│   │   └── user_router.js
│   ├── Dockerfile
│   ├── index.js              # Express 엔트리 포인트
│   ├── package.json
│   └── .env                  # 서버 환경 변수 (PORT, DB_URL 등)
│
├── nginx.conf                # Nginx 설정 (React 정적 파일 + API 프록시)
├── docker-compose.yml        # Docker Compose 정의
└── README.md                 # 이 파일

설치 및 실행 방법

1. 일반 로컬 개발 (Docker 없이)

git clone https://github.com/metaapple/react-node.git
cd react-node

백엔드

cd backend
npm install
npm run dev    # 또는 npm start
# → http://localhost:5000

프론트엔드

cd ../frontend
npm install
npm run dev    # Vite 개발 서버
# → http://localhost:5173 (Vite 기본 포트)

2. Docker Compose로 한 번에 실행 (추천)

# 프로젝트 루트에서
docker-compose up --build

# 백그라운드 실행
docker-compose up -d --build

로그 확인 및 종료

docker-compose logs -f
docker-compose down
C:\Users\Administrator\Desktop\react-node>docker-compose down       
time="2025-12-31T14:45:01+09:00" level=warning msg="C:\\Users\\Administrator\\Desktop\\react-node\\docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion"
[+] Running 3/3
 ✔ Container react-node-frontend-1  Removed                                                                                                                          0.1s 
 ✔ Container react-node-backend-1   Removed                                                                                                                          0.1s 
 ✔ Network react-node_default       Removed                                                                                                                          0.4s

C:\Users\Administrator\Desktop\react-node>docker-compose build --no-cache         
time="2025-12-31T14:45:14+09:00" level=warning msg="C:\\Users\\Administrator\\Desktop\\react-node\\docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion"
[+] Building 16.9s (27/27) FINISHED
 => [internal] load local bake definitions                                                                                                                           0.1s 
 => => reading from stdin 1.10kB                                                                                                                                     0.1s 
 => [backend internal] load build definition from Dockerfile                                                                                                         0.0s 
 => => transferring dockerfile: 522B                                                                                                                                 0.0s 
 => [frontend internal] load build definition from Dockerfile                                                                                                        0.0s 
 => => transferring dockerfile: 1.04kB                                                                                                                               0.0s 
 => [frontend internal] load metadata for docker.io/library/nginx:alpine                                                                                             1.8s 
 => [backend internal] load metadata for docker.io/library/node:20-alpine                                                                                            1.8s 
 => [auth] library/node:pull token for registry-1.docker.io                                                                                                          0.0s 
 => [auth] library/nginx:pull token for registry-1.docker.io                                                                                                         0.0s 
 => [frontend internal] load .dockerignore                                                                                                                           0.0s 
 => => transferring context: 2B                                                                                                                                      0.0s 
 => [backend internal] load .dockerignore                                                                                                                            0.0s 
 => => transferring context: 90B                                                                                                                                    0.0s 
 => [backend 1/5] FROM docker.io/library/node:20-alpine@sha256:658d0f63e501824d6c23e06d4bb95c71e7d704537c9d9272f488ac03a370d448                                      0.2s 
 => => resolve docker.io/library/node:20-alpine@sha256:658d0f63e501824d6c23e06d4bb95c71e7d704537c9d9272f488ac03a370d448                                              0.2s 
 => [backend internal] load build context                                                                                                                            0.1s 
 => => transferring context: 741B                                                                                                                                    0.0s 
 => [frontend internal] load build context                                                                                                                           0.4s 
 => => transferring context: 394.38kB                                                                                                                                0.3s 
 => CACHED [frontend stage-1 1/3] FROM docker.io/library/nginx:alpine@sha256:8491795299c8e739b7fcc6285d531d9812ce2666e07bd3dd8db00020ad132295                        0.2s 
 => => resolve docker.io/library/nginx:alpine@sha256:8491795299c8e739b7fcc6285d531d9812ce2666e07bd3dd8db00020ad132295                                                0.2s 
 => CACHED [backend 2/5] WORKDIR /app                                                                                                                                0.0s 
 => [backend 3/5] COPY package*.json ./                                                                                                                              0.1s 
 => [backend 4/5] RUN npm install --production                                                                                                                       4.2s 
 => [frontend build 3/6] COPY frontend/package*.json ./                                                                                                              0.1s 
 => [frontend build 4/6] RUN npm install                                                                                                                             7.5s 
 => [backend 5/5] COPY . .                                                                                                                                           0.2s 
 => [backend] exporting to image                                                                                                                                     2.2s 
 => => exporting layers                                                                                                                                              1.1s 
 => => exporting manifest sha256:627b5d2980c3a0dff81767ebf402cb3708a6dcfe2883089045ca6f369be02846                                                                    0.0s 
 => => exporting config sha256:f9f8f52b97c03c9c5a2ac8b02d6ce9151c2fb98bb64bdd080cba9a58a9b187a0                                                                      0.0s 
 => => exporting attestation manifest sha256:f55c5f346f06745ae2e6f8a1b94d5f817e57c241a297db684774ad40ea5c5900                                                        0.1s 
 => => exporting manifest list sha256:cdcce61a0824f33e6afbedd0b5f4817689c6405611b87bb8ff988df2f41bd0b6                                                               0.0s 
 => => naming to docker.io/library/react-node-backend:latest                                                                                                         0.0s 
 => => unpacking to docker.io/library/react-node-backend:latest                                                                                                      0.7s 
 => [backend] resolving provenance for metadata file                                                                                                                 0.0s 
 => [frontend build 5/6] COPY ./frontend .                                                                                                                           1.8s 
 => [frontend build 6/6] RUN npm run build                                                                                                                           3.1s 
 => [frontend stage-1 2/3] COPY --from=build /app/dist /usr/share/nginx/html                                                                                         0.1s 
 => [frontend stage-1 3/3] COPY frontend/nginx.conf /etc/nginx/conf.d/default.conf                                                                                   0.0s 
 => [frontend] exporting to image                                                                                                                                    0.4s 
 => => exporting layers                                                                                                                                              0.1s 
 => => exporting manifest sha256:aab1e16cf1b23577174f08e38b8cd710b71e2333fa2ce978e52abbffd759f853                                                                    0.0s 
 => => exporting config sha256:ee6f3a2491705f997618850ada18cc4d8fe1b19bad0d854260ce1e15f386d0db                                                                      0.0s 
 => => exporting attestation manifest sha256:5eb235d73ada0b5e87aeb9a198dbb197837c4049012bf2d188c598b0c26395ef                                                        0.1s 
 => => exporting manifest list sha256:8d9da0257518ec65a79154dfce763769efb27088ba4f0e96057b83a591838be7                                                               0.0s 
 => => naming to docker.io/library/react-node-frontend:latest                                                                                                        0.0s 
 => => unpacking to docker.io/library/react-node-frontend:latest                                                                                                     0.1s 
 => [frontend] resolving provenance for metadata file                                                                                                                0.0s 
[+] Building 2/2
 ✔ react-node-backend   Built                                                                                                                                        0.0s 
 ✔ react-node-frontend  Built                                                                                                                                        0.0s 

C:\Users\Administrator\Desktop\react-node>docker-compose up              
time="2025-12-31T14:46:02+09:00" level=warning msg="C:\\Users\\Administrator\\Desktop\\react-node\\docker-compose.yml: the attribute `version` is obsolete, it will be ignored, please remove it to avoid potential confusion"
[+] Running 3/3
 ✔ Network react-node_default       Created                                                                                                                          0.1s 
 ✔ Container react-node-frontend-1  Created                                                                                                                          0.1s 
 ✔ Container react-node-backend-1   Created                                                                                                                          0.2s 
Attaching to backend-1, frontend-1
frontend-1  | /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
frontend-1  | /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/
frontend-1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
frontend-1  | 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf
frontend-1  | 10-listen-on-ipv6-by-default.sh: info: /etc/nginx/conf.d/default.conf differs from the packaged version
frontend-1  | /docker-entrypoint.sh: Sourcing /docker-entrypoint.d/15-local-resolvers.envsh
frontend-1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh
frontend-1  | /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh
frontend-1  | /docker-entrypoint.sh: Configuration complete; ready for start up
frontend-1  | 2025/12/31 05:46:04 [notice] 1#1: using the "epoll" event method
frontend-1  | 2025/12/31 05:46:04 [notice] 1#1: nginx/1.29.4
frontend-1  | 2025/12/31 05:46:04 [notice] 1#1: built by gcc 15.2.0 (Alpine 15.2.0)
frontend-1  | 2025/12/31 05:46:04 [notice] 1#1: OS: Linux 6.6.87.2-microsoft-standard-WSL2
frontend-1  | 2025/12/31 05:46:04 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576
frontend-1  | 2025/12/31 05:46:04 [notice] 1#1: start worker processes
frontend-1  | 2025/12/31 05:46:04 [notice] 1#1: start worker process 29
frontend-1  | 2025/12/31 05:46:04 [notice] 1#1: start worker process 30
frontend-1  | 2025/12/31 05:46:04 [notice] 1#1: start worker process 31
frontend-1  | 2025/12/31 05:46:04 [notice] 1#1: start worker process 32
backend-1   |
backend-1   | > board-server@1.0.0 start
backend-1   | > node index.js
backend-1   |
backend-1   | Warning: connect.session() MemoryStore is not
backend-1   | designed for a production environment, as it will leak
backend-1   | memory, and will not scale past a single process.
backend-1   | 서버 실행 중: http://localhost:5000


v View in Docker Desktop   o View Config   w Enable Watch


환경 변수 설정

backend/.env 예시

PORT=5000
NODE_ENV=production
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=your_password
DB_NAME=myapp
SESSION_SECRET=your_strong_secret

frontend/.env 예시 (로컬 개발 시)

VITE_API_URL=http://localhost:5000/api

Docker 실행 시에는 docker-compose.ymlenvironment 또는 .env 파일 마운트로 설정 가능

API 예시

Method Endpoint 설명
GET /api/health 서버 상태 확인
GET /api/board 게시판 목록
POST /api/user/login 로그인
POST /api/user/register 회원가입

실제 API 엔드포인트는 backend/routes/ 폴더의 라우터 파일을 참고하세요.

배포 가이드

로컬/서버 직접 배포

  • 프론트엔드: npm run builddist 폴더를 Nginx나 정적 호스팅에 배포
  • 백엔드: PM2 등으로 프로세스 관리 (pm2 start index.js)

Docker 기반 배포 (Render, Railway, Fly.io, AWS 등)

docker-compose up --build -d

또는 각각의 Dockerfile을 사용해 개별 컨테이너로 배포 가능

기여하기 (Contributing)

  1. 리포지토리 Fork
  2. 새 브랜치 생성 (git checkout -b feature/amazing-feature)
  3. 변경사항 커밋 및 푸시
  4. Pull Request 생성

라이선스

MIT License — 자유롭게 사용 및 수정 가능


문의사항은 Issues에 남겨주세요!
Happy Coding! 🚀

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Morty Proxy This is a proxified and sanitized view of the page, visit original site.