애플리케이션의 규모가 커지고 다양한 UI(User Interface), UX(User Experience)를 구현하기 위해서 이전의 방법(DOM, jQuery)으로는 애플리케이션을 개발하고 코드를 유지보수 하는 것이 어려워졌다. 그래서 규모가 커지고 복잡한 애플리케이션을 개발하며 생산성을 향상시키고 많은 양의 데이터 관리와 코드 유지보수를 더욱 편리하게 하기 위해 다양한 Frontend Framework(Library)가 등장하게 된다. 그 중 많이 쓰이는 세 가지가 Angular, Vue, React이다.
"지속적으로 데이터가 변화하는 대규모 애플리케이션을 구축하는 것"을 목표로 2013년 Facebook에서 개발한 Library. MVC(Model-View-Controller) Architecture (ex. Angular, Vue)와는 다르게 리액트는 오로지 View만 담당한다. 그만큼 내장되어 있는 기능이 부족해 third-party 라이브러리(ex. React-router, Redux)를 함께 사용한다. 페이스북의 지속적인 관리와 함께 생태계가 활성화 되어 있으며 다양한 자료, 그리고 React Native의 사용으로 인해 사용자가 꾸준히 증가한다.
React는 페이스북에서 개발하고 관리하는 사용자 인터페이스(UI)를 만들기 위한 JavaScript 라이브러리다. 리액트와 같은 프론트엔드 라이브러리 혹은 프레임워크를 사용하는 가장 큰 이유 중 하는 UI를 자동으로 업데이트해 준다는 점이다. 리액트는 가상 돔(Virtual Dom)을 통해 UI를 빠르게 업데이트한다. 가상돔은 이전 UI 상태를 메모리에 유지해서, 변경될 UI의 최소 집합을 계산하는 기술이다. 이 기술 덕분에 불필요한 UI 업데이트는 줄고, 성능은 좋아진다.
$ node -v // Node.js 버전 확인
$ npm -v // npm 버전 확인
리액트 프로젝트를 시작하는데 필요한 개발 환경을 세팅 해주는 도구(toolchain)
리액트는 UI 기능만 제공한다. 따라서 개발자가 직접 구축해야하는 것들이 많아서 처음 시작하는 단계에서는 직접 개발 환경을 구축하기 어려울 수 있다.
CRA는 리액트로 웹 애플리케이션을 만들기 위한 환경을 제공한다. CRA를 이용하면 하나의 명령어로 리액트 개발환경을 구축할 수 있다.
CRA에는 바벨과 웹팩과 같이 리액트 애플리케이션 실행에 필요한 다양한 패키지가 포함되어 있으며, 테스트 시스템, ES6 + 문법, CSS 후처리 등 거의 필수라고 할 수 있는 개발 환경도 구축해 준다. CRAㅇ를 이용하면 개발 환경 세팅을 해주기 때문에 기존 기능을 개선하거나 새로운 기능을 추가했을 때 패키지 버전만 올리면 된다.
// 1. Desktop - 원하는 폴더 진입
$ cd Desktop/원하는 폴더
// 2. something(원하는 프로젝트) 프로젝트 설치
$ cd npx create-react-app something
// npx는 오타가 아닙니다.
// 3. 프로젝트 진입
$ cd something
// 4. 로컬 서버 띄우기
$ npm start
npm start를 입력하면 http://localhost:3000 주소를 확인할 수 있다.
http://localhost:3000 접속 시 보여지는 첫 화면입니다.
위의 화면이 나타나면 본격적으로 리액트랑 놀 수 있어요!
(추후에 정리)
(예시 UI 추후에 업로드)
컴포넌트의 종류, 즉 컴포넌트를 선언하는 방식에는 두 가지가 있다.
1) Class Component
import React from 'react'
class Component extends React.Component {
render() {
return (
<div>
<h1> This is Class Component!</h1>
</div>
)
}
}
export default Component
2) Functional Component
import React from 'react'
const Component = () => {
return (
<div>
<h1>This is Functional Component!</h1>
</div>
)
);
export default Component
{ ... javascript ...}
class
vs. className
Inline Styling:
<div></div> vs. <div />
<div></div> vs. <div />
<> ... </>
)Fragments는 DOM에 별도의 노드를 추가하지 않고 하나의 컴포넌트 안에 여러 요소(자식)들을 간단하게 그룹화 할 수 있는 기능
이다. 요소들을 감싸는 div
태그의 불필요한 생성을 막을 수 있어 유용하게 사용된다.<>
<div className="loginBtn" onClick={() => console.log("click")}>Login</div>
<br />
<div style={{backgroundColor: "grey", height: "10px"}} />
</>