15-2. 리액트 앱 빌드 및 서버에서 제공하기

이제 우리의 리액트 프로젝트를 프로덕션 전용으로 빌드를 하겠습니다. 프로덕션 전용으로 빌드를 하면, 불필요한 경고 메시지들과 주석들을 제거해주어 파일의 용량을 줄여줍니다.

클라이언트 디렉토리에서 해당 명령어를 입력하세요.

$ yarn build # 혹은 npm run build

이 프로세스는 보통 1~2분이 걸리며, 프로젝트 규모, 그리고 컴퓨터의 사양에 따라 더 걸릴 수 도 있습니다.

이 명령어를 실행하고 나면 build 라는 디렉토리가 생성되고, index.html, 그리고 static 디렉토리에는 css, images, js 파일들이 들어있습니다. buld 디렉토리에 있는 파일들을 서버쪽에서 koa-static 을 통하여 제공을 해보도록 하겠습니다.

우선 서버쪽 디렉토리에서 koa-static 을 설치하세요.

$ yarn add koa-static

그리고 서버의 인덱스 파일에서 koa-static 을 불러온다음에 라우트들과 웹소켓을 설정하는 코드 하단에서 적용을 해주면 백엔드 서버에서도 클라이언트쪽 파일들을 접근 할 수 있게 해줍니다.

src/index.js

(...)

const serve = require('koa-static');
const path = require('path');

(...)

router.use('/api', api.routes()); // api 라우트를 /api 경로 하위 라우트로 설정
app.use(router.routes()).use(router.allowedMethods());
app.ws.use(ws.routes()).use(ws.allowedMethods());

app.use(serve(path.resolve(__dirname, '../../heurm-client/build/')));

app.listen(port, () => {
    console.log('heurm server is listening to port ' + port);
});

이제, http://localhost:4000/ 에 접속을 하면, 페이지가 잘 나타나게 될 것입니다. 하지만 유저 페이지에 들어가는 경우에는, index.html 으로 연결되는것이 아니기 때문에 Not Found 가 나타나게됩니다. (리액트의 빌드 파일에 서비스워커가 적용되어있기 때문에 유저페이지나 로그인페이지에서 새로고침을해도 잘 나타나긴 합니다. 하지만, 캐시가 없을경우엔 Not Found 가 뜹니다. 한번 개발자콘솔을 열고, 새로고침 아이콘을 우클릭하여 캐시를 비우면서 새로고침을 해보세요)

이를 해결하기 위해선, 우리가 이전에 리액트 라우터 서버사이드 렌더링을 하기 전에 준비작업을 했었을 때 처럼, index.html 파일을 불러와서 나머지 라우트에 연결을 해주면 됩니다. 혹은, 이 작업을 대신 해주는 라이브러리를 사용하는것도 좋습니다.

서버측에서 준비되지 않은 라우트들을 처리해주는 koa-connect-history-api-fallback 라이브러리를 설치하세요.

$ yarn add koa-connect-history-api-fallback

이 라이브러리는 connect-history-api-fallback 라이브러리의 koa 호환버전입니다.

이 라이브러리를 적용 할 땐, 해당 모듈을 불러와서, serve 를 사용하기 전에 적용해주세요.

src/index.js

(...)

const fallback = require('koa-connect-history-api-fallback');

(...)

app.use(fallback());
app.use(serve(path.resolve(__dirname, '../../heurm-client/build/')));

app.listen(port, () => {
    console.log('heurm server is listening to port ' + port);
});

이렇게 설정을 하고 나면, 유저페이지나 로그인페이지도 정상적으로 라우팅이 작동하게 됩니다.

이제 코드 상으로는, 프로젝트가 완성되었습니다!

나머지 섹션에서 다루는 작업들은, Vultr 에서 만든 우분투 서버에서 데이터베이스 및 환경설정을 다루게 됩니다.

results matching ""

    No results matching ""