티스토리 뷰

FRONTEND

Vue.js 와 React 비교

주니어발록 2024. 1. 20. 15:02

데이터 바인딩 (Data Binding)

Vue.js

양방향 데이터 바인딩을 통해 사용자 입력과 데이터 속성이 자동으로 동기화되며, 반응형 시스템을 통해 관련된 DOM을 자동으로 업데이트합니다.

양방향 데이터바인딩

  • v-model 디렉티브를 사용하여 UI 요소와 데이터를 연결
  • 데이터 속성을 정의하고, v-model을 통해 해당 데이터 속성과 입력 요소를 연결

생명주기

  • beforeCreate -> created -> beforeMount -> mounted -> beforeUpdate -> updated -> beforeDestroy -> destroyed 
  • 데이터 입력시: 사용자 입력에 의해 v-model이 바인딩된 데이터가 변경
  • 생명주기 단계: created에서 데이터가 설정되고, mounted에서 DOM에 바인딩이 활성화
  • 랜더링: 데이터 변경이 감지되면, Vue 반응형 시스템을 통해 자동으로 DOM 업데이트
<template>
  <div>
    <input v-model="message" />
    <p>입력된 메시지: {{ message }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: "" // 데이터 바인딩을 위한 속성
    };
  }
};
</script>

React

단방향 데이터 바인딩과 상태 관리 시스템을 사용하여, 사용자 입력을 처리하고 상태 변경에 따라 render 메소드를 호출하여 DOM을 수동으로 업데이트합니다.

단방향 데이터 바인딩

  • 상태(state)와 이벤트 핸들러를 사용하여 UI 요소와 상태를 연결합니다.
  • 상태를 정의하고, 입력 요소의 value 속성을 상태에 연결한 후, 입력 변경 이벤트에서 상태를 업데이트합니다.

생명주기

  • constructor -> render -> componentDidMount -> componentDidUpdate -> componentWillUnmount
  • 데이터 입력시: 이벤트 핸들러가 호출되고 setState를 통해 상태가 업데이트됩니다.
  • 생명주기 단계: componentDidMount에서 컴포넌트가 마운트된 후 추가 작업을 수행할 수 있습니다.
  • 랜더링: 상태가 변경되면, React render 메소드를 호출하여 DOM 업데이트합니다.
import React, { useState } from 'react';

function App() {
  const [message, setMessage] = useState(""); // 상태 정의

  const handleChange = (event) => {
    setMessage(event.target.value); // 상태 업데이트
  };

  return (
    <div>
      <input value={message} onChange={handleChange} />
      <p>입력된 메시지: {message}</p>
    </div>
  );
}

export default App;

 

데이터 관리

Vue.js 2 

반응형 데이터 시스템과 계산된 속성을 통해 데이터를 효율적으로 관리하며, 데이터 변경에 따른 자동 리렌더링을 제공합니다.

Vue.js에서는 데이터 관리를 위해 반응형 시스템과 computed 속성, methods, watchers 등을 사용합니다.

  • Computed: 복잡한 로직을 처리하거나, 데이터를 변형해야 할 때 사용됩니다. 계산된 값을 캐시하여 효율적으로 재사용할 수 있습니다.
  • Methods: 이벤트 핸들러나 재사용 가능한 로직을 정의하는 데 사용됩니다.
  • Watchers: 데이터의 변경을 감시하고, 변경 특정한 동작을 수행하게 있습니다.

이 코드에서 reversedMessage는 계산된 속성으로, message 데이터가 변경될 때마다 자동으로 업데이트됩니다. 사용자가 message를 업데이트하면, reversedMessage도 그에 따라 업데이트되어 화면에 표시됩니다.

import React, { useState } from 'react';

function App() {
  const [message, setMessage] = useState("");

  const reversedMessage = message.split("").reverse().join("");

  return (
    <div>
      <input value={message} onChange={(e) => setMessage(e.target.value)} />
      <p>역순 메시지: {reversedMessage}</p>
    </div>
  );
}

export default App;

React

주로 state와 props를 사용하여 데이터를 관리합니다. 또한, Context API나 Redux와 같은 상태 관리 라이브러리를 사용하여 애플리케이션의 상태를 관리할 수 있습니다.

  • State: 컴포넌트의 상태를 저장하고, 이를 변경하기 위해 setState 또는 Hooks API(useState)를 사용합니다.
  • Props: 부모 컴포넌트로부터 전달받은 데이터입니다. 읽기 전용이며, 자식 컴포넌트는 props를 변경할 수 없습니다.
  • Hooks: 함수형 컴포넌트에서 상태 관리, 라이프사이클, 사이드 이펙트 관리 등을 있게 해주는 기능입니다.

이 코드에서 useState를 사용하여 message 상태를 관리합니다. message가 변경될 때마다, 컴포넌트는 자동으로 리렌더링되며, reversedMessage도 업데이트됩니다.

import React, { useState } from 'react';

function App() {
  const [message, setMessage] = useState("");

  const reversedMessage = message.split("").reverse().join("");

  return (
    <div>
      <input value={message} onChange={(e) => setMessage(e.target.value)} />
      <p>역순 메시지: {reversedMessage}</p>
    </div>
  );
}

export default App;

 

렌더링 (Rendering)

Vue.js

반응형 데이터 시스템을 통해 데이터 변화를 자동으로 감지하고, 선언적 템플릿을 사용하여 DOM을 업데이트합니다. 개발자는 데이터와 템플릿에 집중하며, DOM 조작은 프레임워크가 처리합니다.

렌더링 방식

Vue.js는 반응형 데이터 시스템과 가상 DOM을 사용합니다. 데이터가 변경되면, Vue는 자동으로 관련된 컴포넌트를 다시 렌더링합니다.

렌더링 시 생명주기 흐름

  • beforeCreate와 created: 데이터 관찰이 설정되고 이벤트/라이프사이클이 초기화됩니다.
  • beforeMount와 mounted: 컴포넌트가 DOM에 마운트되고, 첫 렌더링이 발생합니다.
  • beforeUpdate updated: 데이터 변경에 의해 컴포넌트가 다시 렌더링되고, DOM 업데이트됩니다.

DOM 조작

Vue는 선언적 템플릿을 사용하여 DOM을 조작합니다. 데이터와 템플릿이 연결되어 있으며, 데이터 변경시 자동으로 DOM이 업데이트됩니다.

  • 직접적인 DOM 조작: 특정 DOM 요소에 직접 접근이 필요한 경우, 예를 들어, 특정 요소에 포커스를 설정하거나, 요소의 크기를 조절할 때 사용됩니다.
  • 외부 라이브러리와의 통합: D3.js 같은 시각화 도구나 jQuery 플러그인을 사용할 , 해당 DOM 요소에 직접 접근해야 하는 경우가 많습니다. 이때 ref 사용하여 Vue 인스턴스 밖에서 관리되는 DOM 요소에 접근합니다.이 예시에서 ref="inputRef"를 사용하여 버튼 클릭 시 입력 필드에 포커스를 맞춥니다. 이는 Vue의 데이터 바인딩 시스템을 우회하여 직접 DOM에 접근하는 방식입니다.
<template>
  <div>
    <input ref="inputRef" />
    <button @click="focusInput">포커스</button>
  </div>
</template>

<script>
export default {
  methods: {
    focusInput() {
      this.$refs.inputRef.focus();
    }
  }
};
</script>

이 코드에서 updateMessage 메소드가 호출되면, message 데이터가 변경되고, Vue는 자동으로 <p> 태그의 내용을 업데이트합니다.

<template>
  <div>
    <p>{{ message }}</p>
    <button @click="updateMessage">메시지 변경</button>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: "안녕하세요 Vue!"
    };
  },
  methods: {
    updateMessage() {
      this.message = "Vue가 업데이트됨";
    }
  }
};
</script>

 

React 

상태 변경을 명시적으로 관리해야 하며, 상태가 변경되면 render 함수를 통해 UI 업데이트됩니다. 개발자는 상태 관리와 렌더링 과정에  집중합니다.

React 개발자는 상태 관리와 UI 렌더링 사이의 관계에 집중합니다. 상태 변경을 명시적으로 처리해야 하며, 이는 render 함수의 재호출로 이어집니다.

이 코드에서 updateMessage 함수가 호출되면, setMessage를 통해 상태가 변경되고, React는 render 함수를 다시 호출하여 화면을 업데이트합니다.

렌더링 방식

React 역시 가상 DOM을 사용하지만, 데이터의 변경을 감지하기 위해서는 setState 또는 Hooks API를 사용해야 합니다.

렌더링 시 생명주기 흐름

  • constructor: 컴포넌트 생성 및 초기 상태 설정.
  • render: JSX를 반환하여 DOM을 구성합니다.
  • componentDidMount: 컴포넌트가 마운트된 후 실행됩니다.
  • componentDidUpdate: 상태가 변경되고 컴포넌트가 업데이트된 실행됩니다.

DOM 조작

React에서는 JSX를 사용하여 선언적으로 UI를 정의합니다. 상태가 변경되면, render 함수가 다시 호출되어 DOM을 업데이트합니다.

  • 직접적인 DOM 조작: React에서 ref는 DOM 요소에 직접 접근할 필요가 있을 때 사용됩니다. 예를 들어, 입력 필드에 자동으로 포커스를 맞추거나, 애니메이션 효과를 직접 제어할 때 사용됩니다.
  • 외부 라이브러리와의 통합: React 컴포넌트 내부에서 외부 라이브러리를 사용할 ref 통해 DOM 요소에 접근합니다.

이 코드에서 useRef 훅을 사용하여 <input> 요소에 접근하고, 버튼 클릭 시 해당 요소에 포커스를 맞춥니다.

import React, { useRef } from 'react';

function App() {
  const inputRef = useRef(null);

  const focusInput = () => {
    inputRef.current.focus();
  };

  return (
    <div>
      <input ref={inputRef} />
      <button onClick={focusInput}>포커스</button>
    </div>
  );
}

export default App;

이 코드에서 useRef 훅을 사용하여 <input> 요소에 접근하고, 버튼 클릭 시 해당 요소에 포커스를 맞춥니다.

import React, { useState } from 'react';

function App() {
  const [message, setMessage] = useState("안녕하세요 React!");

  const updateMessage = () => {
    setMessage("React가 업데이트됨");
  };

  return (
    <div>
      <p>{message}</p>
      <button onClick={updateMessage}>메시지 변경</button>
    </div>
  );
}

export default App;

 

개발자 경험

Vue.js의 개발자 경험

Vue.js는 간결하고 이해하기 쉬운 문법, 직관적인 데이터 바인딩, 그리고 풍부한 문서와 커뮤니티 지원으로 알려져 있습니다.

초보자에게 친숙하고 쉽게 접근할 수 있는 구조를 제공하며, HTML과 비슷한 템플릿을 사용해 빠르게 개발을 시작할 수 있습니다.

  • 선언적 템플릿: HTML 기반의 템플릿을 사용하여, 뷰의 구조를 쉽게 정의할 수 있습니다.
  • 양방향 데이터 바인딩: v-model과 같은 디렉티브를 사용하여 데이터와 UI 요소를 쉽게 연결할 수 있습니다.
  • 툴링과 문서: Vue CLI, Vuex, Vue Router 같은 강력한 툴링 지원과 상세한 공식 문서가 제공됩니다.

이 예시에서, v-model을 사용하여 입력 필드와 데이터를 쉽게 양방향으로 바인딩할 수 있습니다. 코드는 가독성이 높고 HTML에 가깝습니다.

<template>
  <div>
    <input v-model="message" placeholder="메시지를 입력하세요" />
    <p>입력된 메시지: {{ message }}</p>
  </div>
</template>

<script>
export default {
  data() {
    return {
      message: ""
    };
  }
};
</script>

 

React의 개발자 경험

React는 컴포넌트 기반의 설계, JSX의 사용, 그리고 강력한 커뮤니티 및 에코시스템을 통해 개발자 경험을 제공합니다.

JavaScript 중심의 개발 경험을 제공하며, 컴포넌트 기반의 설계와 JSX 통해  세밀한 UI 제어와 상태 관리를   있습니다. 개발자는 JavaScript   익숙해져야 합니다.

  • 컴포넌트 기반 구조: 재사용 가능한 컴포넌트를 통해 UI를 구성합니다.
  • JSX 사용: JavaScript와 HTML이 혼합된 JSX를 사용하여 UI를 선언적으로 정의합니다.
  • 상태 관리 Hooks: useState, useEffect 같은 Hooks 사용하여 상태 관리와 생명주기를 효과적으로 다룰 있습니다.

이 코드에서는 useState를 사용하여 상태를 관리하고, JSX를 통해 UI를 선언적으로 정의합니다. React의 경우 JavaScript에 좀 더 초점을 맞춘 설계를 가지고 있습니다.

import React, { useState } from 'react';

function App() {
  const [message, setMessage] = useState("");

  return (
    <div>
      <input 
        value={message} 
        onChange={(e) => setMessage(e.target.value)} 
        placeholder="메시지를 입력하세요"
      />
      <p>입력된 메시지: {message}</p>
    </div>
  );
}

export default App;

결론

프레임워크는 각각의 장단점을 가지고 있으며, 프로젝트의 요구사항이나 개발자의 선호에 따라 선택될 있습니다. Vue.js 템플릿 기반의 간결한 문법과 양방향 데이터 바인딩으로 빠른 개발을 가능하게 하지만, 대규모 애플리케이션에서는 데이터 흐름을 추적하기 어려울 있습니다. 반면, React 단방향 데이터 흐름과 상태 관리를 통해 대규모 애플리케이션에서도 유지 보수가 용이하지만, 초보자에게는 다소 어려운 점이 있을 있습니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함