7 minute read

리액트 최소조건 기본실행 모듈

기본적으로 실행하기 위한 최소한 포함되어야 하는 모듈을 소개한다.

react 모듈

  • react
    리액트의 핵심 모듈로, UI 컴포넌트를 생성하고 관리하는 역할을 수행한다. 가상 DOM(Virtual DOM)을 사용하여 성능을 최적화하고, 컴포넌트의 상태(State)와 속성(Props)을 관리하며, 이벤트 처리, 라이프사이클 메서드 등을 제공한다.

react-dom 모듈

  • react-dom
    리액트에서 실제 DOM(Document Object Model)과 상호작용하기 위한 모듈로, 웹 브라우저에서 리액트 애플리케이션을 렌더링하는 역할을 수행한다. DOM 요소를 조작하고, 컴포넌트를 실제 DOM에 렌더링하며, 이벤트 핸들러를 등록하고 관리하는 등의 기능을 제공한다.

    react와 react-dom은 함께 사용되어, 리액트 애플리케이션을 개발하고 브라우저에서 실행시키는데 필수적인 모듈이다.

react-scripts 모듈

  • react-scripts
    React 애플리케이션을 개발, 빌드 및 실행하기 위한 설정 및 스크립트를 제공하는 패키지 이다. Create React App이라는 React 프로젝트를 쉽게 생성하고 개발 환경을 구성하는 도구에서 사용되는 패키지 이다. 특징은 다음과 같다.
      // package.json
      {
        "scripts": {
          "start": "react-scripts start",  
          "build": "react-scripts build",
          "test": "react-scripts test",
          "eject": "react-scripts eject"
        },
      }
    
    

    기본 설치된 Create React App 에서 기본적으로 등록되어있고 제공하는 scripts 기능을 살펴본다.

    • react-scripts start
      • (기본적이므로 생략)
    • react-scripts build

      #STEP0. React 애플리케이션을 로컬에서 개발하고 테스트했다면, 애플리케이션을 실제 웹 서버에 배포해야 하는 상황. 
      npx react-scripts build
      
      # STEP1. /build 폴더 생성 되어짐
      # STEP2. 빌드된 애플리케이션 파일들이 해당 폴더에 저장 되어짐. 
      # STEP3. 이제 이 폴더를 웹 서버에 업로드. (FTP, AWS, GCP 등등.)
            
      

      create-react-app으로 만든 프로젝트에서 사용할 수 있다.

      1. 프로덕션 빌드를 위해 애플리케이션 코드를 번들링 한다.
      2. 코드를 최적화하고, 불필요한 코드를 제거 한다.
      3. public 폴더에 있는 정적 파일을 빌드된 애플리케이션 폴더로 복사 한다.
      4. build 폴더에 최종 빌드된 애플리케이션을 생성 한다.
      5. 이렇게 생성된 빌드된 애플리케이션은 [웹 서버에 배포]하여 사용할 수 있다.
    • react-scripts test

      npx react-scripts test  #실행
          
      PASS  src/App.test.js
      ✓ renders learn react link (122 ms)
          
      Test Suites: 1 passed, 1 total
      Tests:       1 passed, 1 total
      Snapshots:   0 total
      Time:        5.83 s
      Ran all test suites.
          
      Watch Usage
      › Press f to run only failed tests.
      › Press o to only run tests related to changed files.
      › Press q to quit watch mode.
      › Press p to filter by a filename regex pattern.
      › Press t to filter by a test name regex pattern.
      › Press Enter to trigger a test run.
          
      

      react-scripts test 명령어는 Create React App에서 제공하는 테스트 러너인 Jest를 실행하는 명령어이다.

      • 이 명령어는 src 폴더 내부에 있는 파일들 중에서 .test.js나 .spec.js 확장자를 가진 파일들을 찾아서 자동으로 실행한다.
      • 해당 파일에 대한 테스트를 실행하고, 결과를 콘솔에 출력한다.
      • Jest는 일반적으로 [유닛 테스트]와 [통합 테스트]를 지원한다.
      • [유닛 테스트]는 코드의 일부분, 즉 함수나 모듈 등의 작은 단위를 테스트.
      • [통합 테스트]는 전체 시스템이나 애플리케이션의 구성요소들 간의 상호작용을 테스트.
      • Jest는 이 두 가지 유형의 테스트를 모두 지원하며, 또한 describe와 it 함수를 사용하여 테스트 케이스를 작성할 수 있다.
      • react-scripts test 명령어는 기본적으로 Jest의 Watch 모드로 실행된다.
      • 이 모드에서는 테스트 파일이 변경될 때마다 자동으로 테스트를 다시 실행한다.
      • Watch 모드를 끄려면 react-scripts test –no-watch 명령어를 사용한다.
      • 그리고 –coverage 옵션을 사용하면 테스트 커버리지 정보를 출력할 수 있다.
    • react-scripts eject
      # 아직 안해봄
         
      

      react-scripts eject 명령어는 Create React App으로 만든 프로젝트에서 webpack, Babel 등의 설정 파일을 외부로 분리하여 직접 수정할 수 있게 해주는 명령어.

      • eject 명령어를 실행하면, Create React App이 생성한 모든 설정 파일이 현재 프로젝트 폴더의 최상위 디렉토리에 복사 된다.
      • 이후 package.json 파일의 scripts 항목에서 react-scripts 대신 webpack-dev-server 등을 직접 사용할 수 있다.

        단, eject 명령어는 되돌릴 수 없으므로, 사용하기 전에는 반드시 백업을 해두는 것이 좋습니다. 또한, 설정 파일을 직접 수정하면서 발생하는 오류는 모두 사용자 책임이므로, 신중하게 사용해야 한다.

리액트앱 구조

public/index.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8" />
    <link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="theme-color" content="#000000" />
    <meta
      name="description"
      content="Web site created using create-react-app"
    />
    <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
    <!--중략-->
    <link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
    <!--중략-->
    <title>React App</title>
  </head>
  <body>
    <noscript>You need to enable JavaScript to run this app.</noscript>
    <div id="root"></div>
    <!--중략-->
  </body>
</html>

이 파일은 웹의 메인 페이지 이다.
react를 하면서 여러 컴포넌트들을 만들어 나간다.
이때 create-react는 여기 마지막 줄 근처에 div id =”root” 안에 들어가도록 약속되어 있다.

src/index.js

import App from './App';  // 컴포넌트 호출
// (중략)
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

이 파일은 엔트리포인트인 main() 이다.
document.getElementById('root') 이 부분은 index.html에서의 #root 부분에 해당 한다. 현재 라는 사용자정의태그를 호출하고 있다.

src/App.js

import logo from './logo.svg';
import './App.css';

function App() {
  return (
    <div className="App">
      <header className="App-header">
        <img src={logo} className="App-logo" alt="logo" />
        <p>
          Edit <code>src/App.js</code> and save to reload.
        </p>
        <a
          className="App-link"
          href="https://reactjs.org"
          target="_blank"
          rel="noopener noreferrer"
        >
          Learn React
        </a>
      </header>
    </div>
  );
}

export default App;

이 파일은 리액트 기본구성에 들어있던 App 이라는 컴포넌트이다. 즉, 리턴되는 내용을 불러와서 메인 화면을 구성한 것이다.

src/index.css

body {
  margin: 0;
  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
    'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
    sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

code {
  font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',
    monospace;
}

/* 추가 CTH */
button {
  background-color: #4CAF50;
  color: white;
  border: none;
  border-radius: 4px;
  padding: 8px 16px;
  margin-left: 10px;
  cursor: pointer;
  font-size: 16px;
}
.button-gray {background-color: #A9A9A9;}
button:hover {background-color: #3e8e41;}
.button-gray:hover {background-color: #F09438;}

추가하고 서버를 재기동하면 버튼에 대한 스타일이 잘 적용된다.
지금 디폴트로 css파일이 위치한 경로는 src 경로에 있는데 일반적으로 src/styles 디렉토리 안에 index.css 파일을 위치시키고, 해당 파일에서 전역적으로 사용되는 스타일을 정의한다고 한다.

리액트에서 엔트리포인트를 찾는 방법

리액트에서 엔트리포인트를 찾는 방법은 webpack.config.js 파일에서 entry 항목을 확인하는 것이다. 이 항목은 웹팩이 번들링을 시작할 진입점(entry point)을 지정하는 곳으로, 일반적으로 src/index.js 또는 src/App.js와 같은 파일이 지정된다.

그런데 아무리 뒤져봐도 이 파일이 없다..

찾아보니 엔트리포인트를 내부적으로 설정한다고 한다.

  • create-react-app 명령어로 생성한 React 프로젝트에서는 기본적으로 webpack.config.js 파일이 생성되지 않는다.
  • 대신에 기본적인 설정은 숨겨져 있는 상태로 create-react-app이 내부적으로 Webpack을 사용한다
  • 만약 Webpack 설정을 커스터마이징하고 싶다면, eject 명령어를 사용하여 create-react-app에서 기본으로 제공하는 설정 파일들을 밖으로 꺼내고, 직접 수정해야 한다.
    • eject 명령어를 사용하여 create-react-app의 내부 설정을 수정하는 것은 비추천
    • 프로젝트 구성이 복잡해지고 업데이트가 어려워질 수 있기 때문
    • react-app-rewired 와 같은 도구를 사용하여 기본 설정을 커스터마이징을 추천한다. 이 방법은 create-react-app 이 제공하는 내부 설정을 직접 수정하지 않고, 커스터마이징된 설정을 사용하여 React 애플리케이션을 빌드할 수 있도록 도와준다.

정리하면, create-react-app으로 프로젝트를 생성했다면, src/index.js 파일이 엔트리포인트이다. 이 파일에서 ReactDOM.render() 메서드를 호출하여 리액트 컴포넌트를 렌더링한다. 따라서 src/index.js 파일에서 ReactDOM.render() 메서드를 찾아보면 엔트리포인트를 확인(엔트리 포인트라고 생각해라..)할 수 있다.

// src/index.js (설치시 디폴트 내용)
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <App />
  </React.StrictMode>
);

// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();


리액트 기본설치(일반적인)

다음과 같이 리액트를 사용하기 위해 별도 학습용 폴더를 생성했다.

mkdir reactStudy 

기본 설치한구조는 다음과 같다.

tree
.
├── package.json
├── package-lock.json
├── bck # 리액트 앱 CREATE 한 프로젝트
│   ├── README.md
│   ├── node_modules
│   ├── package-lock.json
│   ├── package.json
│   ├── public
│   │   ├── favicon.ico
│   │   ├── index.html # react 의 기본구조 /public/웰컴파일 필수
│   │   ├── logo192.png
│   │   ├── logo512.png
│   │   ├── manifest.json
│   │   └── robots.txt
│   └── src
│        ├── App.css
│        ├── App.js
│        ├── App.test.js
│        ├── index.css
│        ├── index.js  # react 의 기본구조 /src/리액트트실행파일 필수
│        ├── logo.svg
│        ├── reportWebVitals.js
│        └── setupTests.js
└── node_modules

STEP1. npm 프로젝트 초기화

# package.json 1개의 파일이 생성되어짐.
npm init -y


tree
.
└── package.json

STEP2. React 설치

# React 설치
# npm install -g create-react-app   # 전역 설치
npm install create-react-app        # 일반 설치


tree
.
├── node_modules
├── package-lock.json
└── package.json

// package.json
{
  "dependencies": {
    "create-react-app": "^5.0.1", //추가
  }
}

STEP3. React 앱 생성

# create-react-app bck    # 전역 설치 시 앱생성(npx 생략가능)
npx create-react-app bck  # 일반 설치 시 앱생성


tree
.
├── package.json
├── package-lock.json
├── bck # 리액트 앱 CREATE 한 프로젝트
│   ├── README.md
│   ├── node_modules
│   ├── package-lock.json
│   ├── package.json
│   ├── public
│   │   ├── favicon.ico
│   │   ├── index.html # react 의 기본구조 /public/웰컴파일 필수
│   │   ├── logo192.png
│   │   ├── logo512.png
│   │   ├── manifest.json
│   │   └── robots.txt
│   └── src
│        ├── App.css
│        ├── App.js
│        ├── App.test.js
│        ├── index.css
│        ├── index.js  # react 의 기본구조 /src/리액트트실행파일 필수
│        ├── logo.svg
│        ├── reportWebVitals.js
│        └── setupTests.js
└── node_modules

npx create-react-app 프로젝트이름

위 명령어를 사용하면 Create React App이라는 공식 리액트 프로젝트 템플릿을 이용하여 새로운 리액트 프로젝트를 생성할 수 있다. 이 명령어를 실행하면, 리액트 프로젝트를 위한 초기 파일과 폴더 구조가 생성되며, 필요한 리액트 라이브러리 및 개발 도구가 자동으로 설치된다.
npx의 경우 항상 최신버전의 react를 설치하지만, 임시로 설치하는 것이기 때문에 매번 새롭게 다운로드를 받아야 한다. 그에 반해 npm은 한번 설치를 하게 되면 추가적으로 다운로드 할 필요가 없지만 버전업이 됐을 시, 최신 버전을 사용하지는 못한다.

STEP4. React 앱 실행

# 일반적인 리액트 개발서버 실행(react-scripts 모듈의 기능)
npx react-scripts start

# 실행 스크립트 생성으로 개발서버 실행
npm start

사진1

정리

기본 구성을 정리하면 다음과 같다.

  • React 앱의 기본 구성은 src 디렉토리 안에 있는 index.js 파일에서 이루어진다. 이 파일에서는 React 앱의 루트 컴포넌트를 정의하고, ReactDOM.render() 함수를 사용하여 컴포넌트를 DOM에 렌더링 한다.
  • React에서는 컴포넌트 단위로 앱을 구성한다. 새로운 컴포넌트를 생성하려면 src 디렉토리 안에 새로운 .js 파일을 생성하여 컴포넌트를 정의하면 된다.
  • 기본적으로 생성된 React 앱에는 이미 예제 컴포넌트들이 포함되어 있으므로 이를 참고하여 컴포넌트를 생성하면 된다.

무엇보다 create-react-app 기능으로 매우 간단하게 구축했다.

Tags:

Categories:

Updated:

Leave a comment