뉴질랜드 다이어리(NZ Diary) 라빠

React 프로젝트 환경설정(feat. 순수한 react project) 본문

개발

React 프로젝트 환경설정(feat. 순수한 react project)

Donochi 2020. 8. 17. 15:32

React 프로젝트를 시작한다고 하면 일단 create-react-app 을 이용하는 경우가 많습니다. 그런데, 이렇게 툴들을 이용하면 생산성은 물론 향상되는 장점이 있지만, 그 내부에 어떤 일들이 일어나고 있는지를 알지 못하니, 문제가 발생했을때 대응을 할 수 가 없는 경우가 많습니다. 마치, 냉장고는 잘 사용하지만, 고장나면 사람을 불러야 하는 것과 마찬가지죠. 적어도 개발자라면, 설정을 하나하나 해가면서 프로젝트를 구성해보고 그 이후에 좋은 툴들을 이용하는 것이 좋을 것이라고 생각합니다.

그래서, 수도없이 생성해 봤을 React Project 를 어떠한 툴의 도움도 없이 생성해 보는 과정을 살펴볼까 합니다.

Node 를 설치하는 과정은 생략합니다!

1. 작업폴더 생성 및 banana project 만들기

일단, 프로젝트 파일들이 위치한 폴더를 새로 만들어줍니다. 

이 과정도 create-react-app 에서 대신 해 주었죠?
mkdir banana-react
cd banana-react

해당 폴더에서 이제 npm init 을 수행해서 프로젝트 파일을 만들어줍니다. 여기서 프로젝트 파일이라고 해봐야 결국 package.json 파일을 만들어주는게 전부입니다.

$ npm init
This utility will walk you through creating a package.json file.

It only covers the most common items, and tries to guess sensible defaults.
See `npm help init` for definitive documentation on these fields
and exactly what they do.

Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.
Press ^C at any time to quit.

package name: (banana-react) 
version: (1.0.0) 
description: 
entry point: (index.js) 
test command: 
git repository: 
keywords: 
author: 
license: (ISC)
사실, 이 과정도 npm init 을 수행하지 않고, package.json 파일을 편집기를 통해 생성해도 되지만, 그건 좀 과하다는 느낌이네요;;

자 이제, 프로젝트가 생성되었습니다. 물론 아직 이 프로젝트는 node 의 기본적인 프로젝트일뿐, React 와는 관계가 없습니다;;

2. React 적용하기

React 프로젝트의 기본이 되는 파일들을 생성해줍니다.

touch index.html
touch index.js

index.html 과 index.js 파일은 각각 아래와 같이 작성해 볼 수 있습니다.

이 글은 react 를 설명하기보다는 설정과정을 정리하는 글이니까 완전 기본중의 기본만 작성합니다. 
<html>
<head></head>
<body>
<div id="root"></div>
<script src="./index.js"></script>
</body>
</html>
import React from 'react';
import ReactDOM from 'react-dom';

ReactDOM.render(<h1>Hello React</h1>, document.getElementById('root'));

index.js 에서 사용한 React, React-DOM dependency 도 추가해 주어야겠죠?

$npm install --save react react-dom

자 이렇게 하면, 실제로 react 프로젝트를 만들기 위해 할 일은 다 한 셈입니다. 이제 html 파일을 browser 에서 로드해볼까요?

..
..
아무것도 나오지 않습니다.
왜 그를까요?

console 창을 확인해보면

Uncaught SyntaxError: Cannot use import statement outside a module

이라고 출력되는것을 확인할 수 있습니다. 네, index.js 에서 import 문을 수행할때, 해당 모듈을 import 하는데 실패하고 있는것이죠. React 관련한 모듈들이 각각 별도의 파일로 나뉘어져 있으니, 이를 하나의 모듈(혹은 번들)로 묶어주는 작업을 해야 import 가 가능해집니다. 

바로, webpack 이 등장하는 이유입니다.

3. webpack 적용하기

프로젝트에 추가된 react, react-dom library 를 하나의 모듈로 번들해주기 위해 webpack 을 설정해보도록 합니다.

일단, 관련 모듈들을 프로젝트에 추가해줍니다.

$npm install --save-dev webpack

그리고, webpack 을 수행하기 위해 webpack.config.js 설정파일을 만들어주야아 합니다.

const path = require('path');
module.export = {
  entry: path.resolve(__dirname, 'index.js'),
  output: {
    path: path.resolve(__dirname),
    filename: 'bundle.js'
  }
}

그리고, package.json 에 이를 수행하기 위한 script 를 추가해줍니다.

"scripts": {
  "test": "echo \"Error: no test specified\" && exit 1",
 
"build": "webpack"
},

자 이제 webpack 을 실행하기만 하면 되겠네요.

$npm run build

..
..
네. 또 에러가 나네요.

이런 과정을 거치며 배우는거죠
ERROR in ./index.js 5:16
Module parse failed: Unexpected token (5:16)You may need an appropriate loader to handle this file type, currently no loaders are configured to process this file. See https://webpack.js.org/concepts#loaders

자 드디어, 많이 들어본 babel 을 적용할 때가 되었습니다.

4. babel 적용하기

 babel 은 EC6 문법으로 작성된 React 구성 요소들을 banana javascript 로 변환해주는 기능을 수행합니다.

npm install --save-dev @babel/core babel-loader @babel/preset-env @babel/preset-react

그리고, webpack.config.js 파일을 아래와 같이 수정해줍니다.

const path = require('path')
  module.exports = {
    mode: 'development',
    entry: path.resolve(__dirname, 'index.js'),
    output: {
      path: path.resolve(__dirname),
      filename: 'bundle.js'
    },
    module: {
      rules: [
        {
          test: /\.jsx?$/,
          exclude: /node_modules/,
          loader: 'babel-loader',
          options: {
            presets: ['@babel/preset-env', '@babel/preset-react']
          }
        }
      ]
    }
  }

webpack 의 loader 를 설정하고, react preset 을 설정하여 react 의 구문을 babel 에게 알려주는 설정입니다.

다시 webpack 을 실행해봅니다.

$npm run build

자 이제 정상적으로 bundle.js 파일이 생성되었습니다. index.html 에서 index.js 대신 bundle.js 파일을 사용하는것으로 설정이 마무리됩니다.

<html>
<head></head>
<body>
<div id="root"></div>
<script src="./bundle.js"></script>
</body>
</html>

자 이제 다시 브라우저로 index.html 을 열어볼까요?

4. 프로젝트 동작확인

짜잔~

5. 그리고 다음으로...

지금 상태로는 매번 코드를 수정하고 나면 webpack 을 수행하고, 브라우저에서 리프레쉬를 해야 하는 불편함이 있습니다. 이런 불편함을 해결해주는 다양한 모듈과 플러그인들이 제공되고 있죠. 그 대표적인게 webpack-dev-server 같은 라이브러리입니다. 그 외에도 다양한 툴들이 많으니, 하나하나 추가하면서 기능을 익히면 됩니다.


자, 이렇게 프로젝트를 직접 구성해보면서 webpack 은 왜 추가해야 하는지, babel 은 또 무었인지 그리고 어떻게 설정하는지를 알아보았습니다. 물론 더 자세한 내용은 각각의 라이브러리 홈페이지를 방문하여 직접 알아보시는 것을 추천드립니다. 

이렇게 하나씩 하나씩 기본기를 익혀가면서 Senior 개발자가 되는것이죠~^^