React를 공부하면서 단순히 React를 사용하는 방법을 아는 것보다 왜 React가 등장하게 되었고, 어떠한 장점이 있어서 생태계가 활성화 됐는지에 대한 React 배경지식을 다뤄보려고 한다.
3세대 웹
으로 들어오면서 웹 페이지의 규모가 굉장히 커지고 웹 페이지
라는 단어보다 웹 애플리케이션
이라는 단어가 많이 사용된다. 규모가 커지다보니 이전의 방법들(DOM, jQuery)로는 애플리케이션을 개발하고 유지보수하는 것이 굉장히 어려워졌다.
만약 한 사이트의 다양한 DOM요소들이 있다고 상상해보자. 기본적인 로그인, 회원가입, 검색 기능만 해도 DOM요소에 직접 접근해서 조작하고 관리하는 것이 쉽지 않다. 하물며 더욱 큰 웹 애플리케이션에 있는 수 많은 DOM요소를 직접 관리하는 것은 매우 힘든 작업이 될 것이다.
그래서 등장한 것이 다양한 Frontend Framework(Library
)이다. 그 중 3대장이라고 불리는 Angular
, Vue
, React
가 있다.
React
는 페이스북에서 개발하고 관리하는 사용자 인터페이스(UI)
를 만들기 위한 JavaScript 라이브러리다. 리액트같은 프론트엔드 라이브러리, 프레임워크를 사용하는 가장 큰 이유는 UI를 자동으로 업데이트 해준다는 점이다. 리액트는 가상 돔(Virtual Dom)
을 통해 UI를 빠르게 업데이트해주고, 가상 돔은 이전 UI 상태를 메모리에 유지해서 변경 될 UI의 최소 집합을 계산하는 기술이다.
과거에는 다른 페이지로 이동할 때마다 새로운 html을 받아오고 페이지를 로딩할 때마다 서버에 리소스를 전달 받아 해석한 뒤 화면에 보여주었다. 하지만 이런 방식은 서버에 그 만큼 View에 대한 메모리를 담고 있어야 하기 때문에 성능적으로 좋지 않다. 반면에 React는 SPA(Single Page Application)
로 한 개의 페이지를 로딩해준 후 사용자와의 인터렉션이 발생하면 기존의 UI와 비교하여 변경 된 부분만 보여주기 때문에 효율적으로 서버를 관리할 수 있다.
내가 React를 공부하게 된 이유도 프론트앤드 개발자가 되기 위해 어떤 기술 스택이 가장 많이 사용되는지 고민하던 중, 가장 많이 들었던 이야기가 리액트였다. 그 만큼 생태계가 활성화되어 있다는 뜻이고, 프레임워크에서는 개발자가 그 안에서 개발을 했다면 리액트는 내가 필요한 라이브러리들을 편하게 불러와서 사용하는 것이 매력적으로 느껴졌다.
Node.js
는 자바스크립트가 브라우자 밖(ex. 서버)에서도 동작하게 하는 환경을 의미한다. 리액트 애플리케이션은 웹 브라우저에서 실행되는 코드이므로 Node.js와 직접적인 연관은 없지만 프로젝트를 개발하는 데 필요한 주요 도구(ex. Bable
, Webpack
)들이 Node.js 기반이기 때문에 반드시 설치해야한다.
Node 기반의 패기지를 사용하기 위해서는 npm(node package manager)
이라는 패키지 도구가 필요하다. npm을 통해 다양한 패키지를 설치하고 버전을 관리할 수 있다. npm은 Node.js를 설치하면 자동으로 함께 설치된다.
CRA(Create-React-App)
는 리액트 프로젝트를 시작하는데 필요한 개발 환경을 세팅해주는 도구이다. 리액트는 UI기능만 제공하기 때문에 개발자가 따로 구축해야하는 환경이 많다. CRA는 리액트로 웹 애플리케이션을 만들기 위한 개발 환경 세팅을 해준다.
그리고 CRA로 설치를 하면 초기 폴더 및 파일 세팅이 되어있다. 이 파일들은 서로 관계가 많으니 조금 더 자세히 알아보겠다.
1. node.modules
2. package.json
3. .gitignore
우리가 github에 프로젝트를 push하고 누군가 clone을 받는다고 상상해보자. 만약 node.modules
에 있는 모든 파일들을 올리고 내려받는다면 용량이 너무 커서 비효율적이고 github DB의 메모리 낭비도 심해진다.
그래서 .gitignore
파일에 올리고 싶지 않은 파일들을 작성해서 push를 할 때 필요한 파일들만 올라가게 하는 것이다.
하지만 팀 프로젝트를 할 때 초기 세팅을 모두 같게 해야하기 때문에 기본 패키지 외 추가로 설치해야하는 라이브러리/패키지도 있을 것이다. 이 때 필요한 파일이 package.json
이다. package.json에는 기본 패키지 외 추가로 설치된 라이브러리/패키지정보가 기록되어 있기 때문에 clone을 받아서 npm install
명령어를 치면 package.json의 기록을 읽어 패키지들을 자동으로 설치해준다.
1. public - index.html
<div id="root"></div>
리액트는 SPA이기 때문에 1개의 html만을 가지고 있다.
2. src - index.js
ReactDOM.render( <App /> , document.getElementById('root'))
3. src - App.js
App.js
컴포넌트를 초기화면이라고 생각하고, index.js
의 ReactDOM.render함수에서 App컴포넌트를 ID가 root인 요소로 전달한다. index.html
에서 id가 root인 곳에 App.js컴포넌트를 보여준다.
짧게 정리하면 App.js -> index.js -> index.html 순으로 우리가 만든 컴포넌트들이 결국 한 페이지에서 랜더링된다.