A library for creating user interfaces
Renders UI and responds to events
페이스북 사에서 만든 자바스크립트
페이스북에서 자체적으로 이용하고 있을 뿐만 아니라, Airbnb, Uber, Netfilx, Instagram
우리가 알고 있는 대체적인 웹 어플리케이션은 리액트로 만들어졌다고 해도 과언이 아님.
조금 복잡한 웹어플리케이션을 만들 때, MVC 패턴을 많이 이용하고 있음.
MVC 패턴: Model, View, Controller로 나눠서 코딩해나갈 수 있는 것.
React는 View역할을 담당한다.
💡 User Interface를 만들 수 있게 도와주는 라이브러리
💡 사용자에게 UI를 보여주고 이벤트를 처리하는 일
프레임워크는 완성된 상태의 집이 있으면, 우리가 할 수 있는 것은 벽돌의 색을 바꿔서 붙이거나, 집 안의 가구를 재배치하는 느낌
라이브러리는 우리가 원하는 재료들을 골라서 벽돌, 도구, 나무 판자 등을 가지고 우리가 원하는 대로 집을 짓는 것을 말함. 그래서 조금 조금의 만들어진 부품 하나들 = 라이브러리
Angular를 사용해서 웹 어플리케이션을 만들려면 Angular에서 제공하는 기능을 이용해서 만든다.
정해진 골격 안에서 우리가 원하는 기능을 구현하는 것
작은 단위, 작은 도메인 안에서 자신들이 원하는 작은 부분을 구현하는 것
따로 정해진 골격이 없기 때문에, 필요한 기능에 따라서 라이브러리를 골라서 사용할 수 있음
Angular만큼 제공하는 기능들이 많이 없다. State 관리X, HTTP Client가 포함되어 있지 않음)
프레임워크와 라이브러리 중간 상태.
React = components
리액트는 컴포넌트로 이루어진 UI 라이브러리
리액트는 컴포넌트들 끼리 모여서 즉 컴포넌트로 이루어진 것!
컴포넌트 = 한가지의 기능을 수행하는 UI 단위
각각의 리액트 어플리케이션은 꼭 하나의 컴포넌트로 이루어져 있음
Testability = Testing을 하기가 좋다! (Unit Test)
Root (최상위 컴포넌트)
- Navbar (logo/button01/button02)
- Content (Article01/Article02/Article03)
각각의 독립적인 컴포넌트를 서로 조립해서 만들어 놓은 것 = React Application
사용자가 우리의 웹 페이지를 보기 위해서는 우리가 작성한 웹페이지가 DOM Tree로 변환됨
Document Object Model의 약자
브라우저가 이해할 수 있도록 우리가 작성한 HTML의 태그들이 DOM Tree로 변환이 되어서 브라우저에 표기됨
React도 DOM Tree와 마찬가지로 이런 컴포넌트도 트리 형식으로 만들어져 있다.
React는 UI를 만들 수 있는 라이브러리
이 React를 이용해서 Web Application을 만든다는 것은 우리가 Component 들을 만드는 것
리액트에서 제공하는 컴포넌트라는 클래스 상속해야함
import React from 'react';
// Component
class FollowButton extends Component {
// state: Component에 들어있는 데이터를 나타내는 Object
state = {
numberOfFollowers: 0,
};
// render 함수: 어떻게 사용자에게 표기될 건지, HTML과 약간 비슷 = JSX
render() {
return <button>
{this.state.numberOfFollowers}
</button>;
}
}
export default FollowButton;
❓ 이렇게 state가 변경이 될 때마다 모든 render함수가 다시 호출이 되는 건 성능이 안좋은거 아닌지??
🔸 브라우저에 페이지가 표시되기 위해서는 돔 트리가 형성이 됨.
🔸 이와 마찬가지로 리액트도 리액트만의 Virtual DOM Tree가 있음.
🔸 가상의 DOM Tree로 리액트의 컴포넌트들이 메모리상에 보관이 되어져 있음.
🔸 즉, 바로 리액트에 모든 구조들이 돔트리에 업데이트 되는 것이 아님.
🔸 컴포넌트에 변동 사항이 생겨서 자식 컴포넌트에 render 함수가 호출이 되면 리액트는 이전의 Virtual Dom Tree와 비교해서 정말 실질적으로 어떤 부분이 업데이트 되어야 하는지 계산을 한 다음에 정말 필요한 부분만 돔트리에 업데이트함.
render함수가 많이 호출이 되어도, 실질적으로 보여지는 데이터가 변동되지 않으면 DOM Tree에는 전혀 영향을 주지 않는다. 그래서 render 함수가 많이 호출이 되어도 성능을 크게 걱정하지 않아도 됨.
🔅 Re-render the whole app on every update 🔅
React는 데이터가 변경이 될 때마다 어플리케이션 전체를 다시 redering 한다.
데이터가 업데이트되면 해당 부분을 업데이트해야 되는 그런 부분을 걱정하지 않고도 state에 맞게 render 함수에서 어떻게 표기될 건지 한번만 정리를 해놓으면 모든 것이 리액트가 알아서, 상태가 변경이 되면 render함수를 다시 호출해준다.
계속 Rendering이 되어도 성능을 걱정하지 않아도 되는 이유는 가상의 DOM Tree를 메모리에 보관해놓고 있기 때문에 업데이트가 일어날 때마다 이전의 트리와 비교해서 정말 업데이트된 내용이 있다면 그때 DOM Tree를 업데이트함.
매번 업데이트 하는 것이 아니라 업데이트 할 내용들을 다 모았다가 한번에 다같이 업데이트함. => 빠른 성능을 보장할 수 있음!
1초 안에 60개의 프레임이 업데이트 될 수 있도록 성능을 신경써서 만들어야 한다. => 리액트는 기본적으로 이것을 보장함, 빠르게 만들 수 있음
Recommend Toolchains
https://reactjs.org/docs/create-a-new-react-app.html#recommended-toolchains
React Github
https://github.com/facebook/create-react-app
Create React App
https://create-react-app.dev/docs/getting-started