React와 Node.js를 사용한 웹 애플리케이션 개발

React와 Node.js를 사용한 웹 애플리케이션(게시판) 개발 강좌(21)

atomicdev 2024. 9. 21. 12:25
728x90

프로젝트 최적화 및 빌드: React 프로젝트 빌드 과정 및 배포 준비

이번 강의에서는 React 프로젝트를 빌드하고, Node.js 백엔드프론트엔드를 연동하여 배포를 준비하는 과정을 다룹니다. 이를 통해 최종 웹 애플리케이션을 최적화하고, 프로덕션 환경에서 실행할 수 있도록 설정합니다.

React 프로젝트를 빌드하고 Node.js 백엔드와 통합하여 배포하는 과정


1. React 프로젝트 빌드 과정

React는 개발 환경에서 개발 서버를 사용해 빠른 개발 사이클을 지원하지만, 실제로 배포할 때는 정적 파일로 빌드하여 서버에 배포해야 합니다. 빌드 과정은 이러한 정적 파일을 생성하고, 최적화된 버전을 만듭니다.

1.1 React 빌드 명령어

프로젝트가 준비되었으면 npm을 사용해 빌드합니다.

npm run build
 

이 명령어를 실행하면 build 폴더가 생성되고, React 애플리케이션의 최적화된 정적 파일(HTML, CSS, JS)이 해당 폴더에 저장됩니다.

1.2 빌드 폴더 설명

  • index.html: React 애플리케이션의 메인 HTML 파일.
  • CSS/JS 파일: 애플리케이션의 스타일과 동작을 담당하는 파일들로, 최적화되어 압축됩니다.

2. 백엔드와 프론트엔드 연동

React 프로젝트는 정적 파일로 빌드된 후, 백엔드 서버에 통합됩니다. Express를 사용하여 Node.js 서버에서 이 정적 파일을 서빙하고, 백엔드 API와 연동합니다.

2.1 Express로 정적 파일 서빙

빌드된 React 파일을 Express 서버에서 서빙하는 방법을 설정합니다.

// server.js
const express = require('express');
const path = require('path');
const app = express();

// 정적 파일 서빙 설정 (React 빌드 폴더)
app.use(express.static(path.join(__dirname, 'client/build')));

// API 엔드포인트 정의 (백엔드 API)

// 모든 라우트를 처리하여 React 앱의 index.html을 반환
app.get('*', (req, res) => {
  res.sendFile(path.join(__dirname, 'client/build', 'index.html'));
});

// 서버 실행
const PORT = process.env.PORT || 5000;
app.listen(PORT, () => {
  console.log(`Server running on port ${PORT}`);
});

2.2 코드 설명

  • express.static: 빌드된 정적 파일을 Express 서버에서 서빙합니다.
  • app.get('*'): 라우터에서 정의되지 않은 모든 요청을 React 애플리케이션의 index.html로 전달하여 클라이언트 사이드 라우팅을 지원합니다.

3. 배포 준비

서버와 클라이언트를 통합한 후, 최종 배포를 준비합니다.

3.1 환경 변수 설정

production 환경에서 실행될 서버와 클라이언트가 서로 통신할 수 있도록 환경 변수를 설정합니다. HerokuAWS와 같은 클라우드 플랫폼에 배포할 때, 환경 변수를 통해 데이터베이스 연결, 포트 번호 등의 설정을 관리합니다.

PORT=5000
DATABASE_URL=mysql://user:password@localhost/mydb
NODE_ENV=production

3.2 서버 배포 준비

Node.js 백엔드와 프론트엔드가 결합된 애플리케이션을 배포하기 위한 과정입니다. Heroku를 사용하는 경우, 다음과 같은 명령어로 배포할 수 있습니다.

heroku create
git push heroku master
heroku open
 

또는 AWS EC2와 같은 서버를 사용할 경우, 다음 과정을 통해 배포할 수 있습니다.

  1. 서버에 Node.jsMySQL 설정.
  2. SSH를 통해 서버에 애플리케이션 복사.
  3. PM2를 사용해 Node.js 서버 실행.
  4. NGINX를 사용해 프론트엔드 정적 파일 서빙 설정.

4. 프로젝트 최적화

4.1 코드 분할

**코드 스플리팅(code splitting)**을 통해 필요한 부분만 로드하도록 최적화할 수 있습니다. React에서는 React.lazySuspense를 사용해 라우트 단위로 코드를 분할할 수 있습니다.

const Home = React.lazy(() => import('./Home'));
const About = React.lazy(() => import('./About'));

function App() {
  return (
    <div>
      <Suspense fallback={<div>Loading...</div>}>
        <Route path="/" component={Home} />
        <Route path="/about" component={About} />
      </Suspense>
    </div>
  );
}

4.2 이미지 및 리소스 압축

React 애플리케이션에 포함된 이미지와 같은 정적 리소스를 이미지 압축을 통해 최적화하여 성능을 향상시킬 수 있습니다. Webpack과 같은 빌드 도구를 사용해 리소스 크기를 줄일 수 있습니다.


5. 배포 후 검토 사항

  1. HTTPS 사용: 배포 후에는 SSL 인증서를 설정해 HTTPS 프로토콜로 애플리케이션을 안전하게 제공해야 합니다.
  2. 에러 로깅: 배포된 애플리케이션에서 발생하는 에러를 로그 관리 도구(예: Sentry)를 통해 모니터링하여 문제를 빠르게 해결할 수 있습니다.
  3. 성능 모니터링: Google Lighthouse를 사용하여 애플리케이션의 성능을 측정하고 최적화할 수 있습니다.

결론

이번 강의에서는 React 프로젝트를 빌드하고, Node.js 백엔드와 프론트엔드를 연동하여 배포 준비를 완료하는 과정을 배웠습니다. 최종 애플리케이션을 최적화하고, 배포 환경에서 원활하게 동작하도록 설정하는 방법을 익혔습니다.

728x90