본문 바로가기

국비교육/React

React 예제풀이 # 01 - 카운터를 통하여 알아보는 자바스크립트와 리액트의 차이점,장단점

 

 

 

React를 이용한 counter 구현, Javascript를 이용한 counter구현을 비교해보면서 

구조적으로 어떤 차이점을 가지고 있는지, 왜 React를 이용하여 구현하는 것이 더 좋은지에 대해 얘기해보려고합니다 ! 

 

 

 

 

 

 

 

 

 

 

 

 


 

 

 

 

 

 

 

 

 

먼저 React 프로젝트를 시작하기 앞서 해당 프로젝트가 저장될 폴더를 만들어주세요

 

 

 저는 리액트 공부를 위한 프로젝트폴더니까 React_study라는 폴더를 만들었습니다 ~

 

CMD를 실행해 다음과 같이 명령어를 입력해주세요.

 

** cd 폴더위치 ** 해주시는거 잊지 마시구요 

 

 

$ npm install -g create-react-app
$ create-react-app my-app

 

저는 다음과 같이 작성했습니다 

 

체인지 디렉토리 명령어를 통해 프로젝트를 설치할 위치로 이동

 

이렇게 이동해주고 

 

 

 

npx create-react-app study

 

그럼 cmd창 밑에서 삐로리하면서 프로젝트를 만들어줄거에요 
Happy hacking! 이라는 문구가 뜨면 준비 완료! 

 

이제 처음 만들었던 React_study 폴더를 가보면

짜잔 이렇게 준비되었습니다

 

폴더 안에 뭐가 많을텐데 당황하지않고 vscode로 해당 폴더를 열어줍니다 

 

 

index.js 와 app,js를 제외한 나머지 js파일과 css파일을 지워주세요 

 

 

이렇게 정리했으면 진짜 준비 끝 

 

그럼 먼저 자바스크립트를 이용한 카운터를 먼저 구현해볼게요 

 

*  화면에 " 00 " 이라는 숫자가 있으며 

숫자 아래 count 라는 버튼을 클릭하면 숫자가 1씩 올라가게 만들어볼게요 *

 

 

 

 

html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>카운터</title>
    <link rel="stylesheet" href="style.css" />
  </head>
  <body>
    <div class="counter">
      <span id="count">00</span>
      <button id="countButton">count</button>
    </div>
    <script src="app.js"></script>
  </body>
</html>

 

css

.counter {
  text-align: center;
  margin-top: 50px;
}

#count {
  font-size: 48px;
}

#countButton {
  font-size: 24px;
  margin-top: 20px;
  cursor: pointer;
}

 

 

js

 

document.addEventListener("DOMContentLoaded", function () {
  var count = 0;
  var countDisplay = document.getElementById("count");
  var countButton = document.getElementById("countButton");

  countButton.addEventListener("click", function () {
    console.log("자바스크립트 카운터 버튼 클릭!");
    count++;
    countDisplay.textContent = count < 10 ? "0" + count : count;
  });
});

 

 

 

 

 

 

 

 

 

 

 

 

클릭한 만큼 표시된 숫자가 올라가는걸 확인할 수 있어요 ~ 

 

css,html,js 파일을 따로 만들어 작업하여 가독성은 좋지만 리액트로 작성하면 더 깔끔하고 확장성이 용이하게 작성할 수 있어요 

 

 

이제 React로 만들어볼게요 

 

 

 

import "./App.css";

function App() {
  let number = 0;

  const btnClick = () => {
    number++;
    console.log("리액트 버튼 클릭", number);
  };

  return (
    <div className="App">
      <button onClick={btnClick}>리액트 카운터 버튼</button>
      <h1>{number}</h1>
    </div>
  );
}

export default App;

 

 

ctrl + ` 백틱 으로 터미널을 띄운 뒤 npm start 를 입력해 실행 

 

 

 

 

 

 

 

 

 

 

버튼을 클릭하면 콘솔에선 카운트가 올라가지만 화면에선 변하지않아요 

 

useState 함수를 이용해서 상태가 변화하도록 다시 작성해볼게요 

 

 

 

 

import React from "react";
import { useState } from "react";

function App() {
  const [number, setNumber] = useState(0);

  const btnClick = () => {
    setNumber(number + 1);
    console.log("리액트 버튼 클릭", number);
  };

  return (
    <div className="App">
      <button onClick={btnClick}>리액트 카운터 버튼</button>
      <h1>{number}</h1>
    </div>
  );
}

export default App;

 

 

 

 

 

 

 

 

 

이제 차이점과 장단점을 비교해볼까요 ?

 

 

자바스크립트 카운터

장점:

  1. 간단한 기능을 구현할 때는 별도의 라이브러리나 프레임워크 없이 순수 자바스크립트로도 충분히 구현 가능하다.
  2. 작은 규모의 프로젝트나 단순한 기능에 적합하다.
  3. 초기 렌더링 속도가 상대적으로 빠르다.

단점:

  1. 상태 관리와 UI 갱신을 직접 다루어야 하므로 코드의 복잡도가 증가한다.
  2. 큰 규모의 프로젝트나 복잡한 상태 관리가 필요한 경우 유지보수와 확장이 어려울 수 있다.
  3. DOM 조작으로 인한 성능 저하 가능성이 있다.

리액트 카운터

장점:

  1. 가상 DOM을 통한 효율적인 UI 업데이트로 성능이 향상된다.
  2. 상태 관리와 UI 갱신을 간편하게 할 수 있는 React의 상태 관리 기능 및 생명 주기 메서드를 활용할 수 있다.
  3. 컴포넌트 기반 아키텍처로 코드의 재사용성과 유지보수성이 높아진다.

단점:

  1. 학습 곡선이 상대적으로 높다. React의 생태계와 개념을 익히는 데 시간이 필요하다.
  2. 초기 렌더링 속도가 자바스크립트 카운터보다 느릴 수 있다.
  3. 작은 규모의 프로젝트나 간단한 기능을 구현할 때에는 오버헤드가 발생할 수 있다.

차이점

  1. 기술 스택: 자바스크립트 카운터는 HTML, CSS, JavaScript를 사용하고, 리액트 카운터는 React를 사용한다.
  2. 코드 구성: 자바스크립트 카운터는 세 가지 파일로 구성되어 있지만, 리액트 카운터는 단일 파일로 구성되어 있다.
  3. 동작 방식: 자바스크립트 카운터는 순수 자바스크립트를 사용하여 DOM을 직접 조작하지만, 리액트 카운터는 가상 DOM을 사용하여 React가 변화를 감지하고 자동으로 화면을 업데이트한다.
  4. 상태 관리: 자바스크립트 카운터는 변수를 사용하여 상태를 관리하지만, 리액트 카운터는 useState 훅을 사용하여 상태를 관리한다.

 

 

 

 

 


 

 

 

 

 

이번 포스팅에서는 간단한 카운터 예제를 통해 자바스크립트와 리액트의 차이점과 장단점을 알아보았어요

배우면 배울수록 재밌는 리액트다 이거에요 ㅎㅎ