Why React?
- 2013년 Facebook에서 개발한 JavaScript Library
- “지속적으로 데이터가 변화하는 대규모 애플리케이션 구축하는 것"을 목푤로 개발
- Angular, Vue 등의 다른 프레임워크와는 달리 리액트는 오로지 View만 담당하는 라이브러리
- 그만큼 내장되어 있는 기능이 부족해 third-party 라이브러리 (ex. react-router-dom, redux)를 함께 사용한다
- 자기만의 문법을 가진 Angular, Vue와 달리 자바스크립트 문법을 그대로 사용
- 오픈소스 프로젝트이면서 페이스북의 지속적인 관리가 이루어지고 있음
- 많은 사용자수를 기반으로 생태계가 활성화 되어있음
- 컴포넌트를 비교적 더 단순하고 간단하게 정의할 수 있음
- React Navtive 등의 웹이 아닌 플랫폼에서도 활용할 수 있는 기술로 확장 가능
React
React는 사용자 인터페이스를 구축하기 위한 선언적이고 효율적이며 유연한 JavaScript 라이브러리, 사용하는 가장 큰 이유 중 하나는 UI를 자동으로 업데이트해 준다는 점, 선언적인 개발이 가능하게 되며 UI를 자동으로 업데이트 하는 과정에서 Virtual DOM을 통해서 최적화를 구현한다
CRA (Create-React-App)
리액트 프로젝트를 시작하는데 필요한 개발 환경을 세팅 해주는 도구 (toolchain)
- 리액트는 UI 기능만 제공. 따라서 개발자가 직접 구축해야하는 것들이 많음
- 처음 시작하는 단계에서는 직접 개발 환경을 구축하기 어려움
- CRA는 리액트로 웹 애플리케이션을 만들기 위한 환경을 제공
- CRA를 이용하면 하나의 명령어로 리액트 개발환경 구축이 가능
node_modules
- npm으로 다운로드 받은 모든 패키지들이 저장되어 있는 폴더
- gitignore 등록되어 있는 이유는 패키들의 모든 소스코드를 깃에 올리고 관리하게 되면 용량이 너무 커지기 때문이다
package.json
- 우리 프로젝트에 대한 정보들이 기입된 파일
- script : 프로젝트에서 실행할 수 있는 명령어들이 있는 곳
- dependency : 프로젝트에서 의존하고 있는 / 필요로 하는 다른 패키지들에 대한 정보가 있는 곳
.gitignore
- git 으로 관리하지 않을 파일 도는 폴더등을 기입해두는 파일
index.html
- html의 엔트리 포인트
- 사용자가 우리 프로젝트를 요청하며 최초로 보여지는 HTML
index.js
- javascript의 엔트리 포인트
- html과 react 컴포넌트를 연결해주는 역할을 함, 중간다리
app.js
- 실제 화면에 보여지고 있는 컴포넌트
JSX (JavaScript Syntax Extension)
- JavaScript와 HTML을 합쳐놓은 듯한 형태
- 마크업을 편리하게 작성하기 위한 문법
- JSX로 작성한 코드는 자바스크립트가 인식할 수없는 문법이기에 Babel이라는 패키지를 이용해서 변환해줘야 함
<div>Hello World</h1> => React.createElement('div', null, "Hello World")
장점
- HTML tag를 그대로 사용하기 때문에 익숙하다
- HTML마크업과 JavaScript 로직을 같이 구현할 수 있다
- JavaScript 문법을 이용해서 HTML을 생성할 수 있다 (별도의 HTML 파일이 필요하지 X)
특징
- 하나의 부모태그 (반드시 하나의 단일태그로 감싸져 있어야 된다)
- 모든 태그가 셀프 클로징 기능이 있다
- camelCase Property
- JavaScript 동작 기능
JSX element
- HTML문법을 JavaScript 코드 내부에 써주는게 JSX! 변쉐 저장할 수도 있고 함수의 인자로 넘길 수도 있다
const hi = <p>Hi</p>;
const myFavorite = {
food: <li>샐러드</li>,
animal: <li>dog</li>,
hobby: <li>programming</li>};
JSX attribute
- 태그에 attribute(속성)을 주고 싶을 때는 항상 “” 쌍따움표로 감싸줘야 한다. attribute를 추가하고 싶을 때는 실제 HTML에서 쓰는 attribute name(속성명)과는 다를 수 있다
- 예를 들어, class를 주고 싶을 때 원래 속성명은 class이지만 JSX에서는 className을 사용해야 한다
const hi = <input readOnly={true} />;
const myFavorite = {
food: <li>샐러드</li>,
animal: <li>dog</li>,
hobby: <li className="list-item">programming</li>};
Self-Closing Tag
- JSX에서는 어떤 태그라도 self closing tag가 항상 가능하다. <input> 과 같이 하나의 태그가 요소인 경우에는 <input />와 같이 항상 / 으로 끝내줘야 한다
- <div /> 와 <div><div>
Nested JSX
- (필수) 소괄호로 감싸기
const good = (
<div>
<p>hi</p>
</div>);
중첩된 요소를 만들려면 () 소괄호로 감싸줘야 한다
- (필수) 항상 하나의 태그로 시작
const wrong = (
<p>list1</p><p>list2</p>);
위와 같이 제일 처음 요소가 sibling이면 안된다. 무조건 하나의 태그로 감싸져야 한다. 아래처럼 첫 요소는 하나의 태그로 감싸주자!
const right = (
<div>
<p>list1</p>
<p>list2</p>
</div>
);
Rendering
- HTML(element), 또는 React 요소 등의 코드가 눈으로 볼 수 있도록 그려지는 것을 렌더링 (rendering)이라고 한다
- React 요소가 DOM node에 추가되어 화면에 렌더링되려면 ReactDom.render 함수를 사용한다. 첫 번째 인자에는 JSX로 React 요소를 인자로 넘기고, 두 번째 인자는 해당 요소를 렌더하고 싶은 container(부모요소)를 전달한다
ReactDOM.render(
<h1>Hello, world!</h1>,
document.getElementById('root')
);
'Front-End > React' 카테고리의 다른 글
[React] React-Query (0) | 2022.06.06 |
---|---|
[React] useEffect와 Side Effect (0) | 2022.04.19 |
[React] map 함수 적용시 key props를 부여하는 이유 (0) | 2022.04.17 |
[React] Hooks (0) | 2022.04.16 |
[React] Props & State (0) | 2022.04.13 |