웹이 동적이게 되면서많은 데이터를 다루게 되는데
기존의 DOM형식으로는 버겁기 때문이다
3세대 웹의 종류
Angular, Vue, React
사용자 인터페이스 UI
를 만들기 위한 자바스크립트 라이브러리
가상 DOM (=Vertual DOM)
이전 UI 상태를 메모리에 유지하고 변경된 UI의 최소집함만을 계산해서 다시 화면에 보여준다 (=랜더링한다)
UI를 자동으로 업데이트
하기 위해 React를 선언적으로 UI를 조작하면페러다임
에 집중하면 된다절차적 | 선언적 | |
---|---|---|
개념 | 해야하는 로직을을 전부 순서대로 프로그래밍 한다 | 선언한다?? |
비유 | 만약 방청소라는 기능을 청소기→빨래세탁→물걸레질→빨래건조 식으로 구현했는데 방이 깨끗해지지 않았다면 어느 구간에서 잘못 처리되었는지 처음부터 끝까지 찾아봐야 한다 에러가 발생할 원인이 너무 많다 | 실제적인 방청소는 선언적으로 안되지만 프로그래밍에서는 선언적이 가능하다 만약 선언적으로 방청소를 했는데 깨끗해지지 않았다면 내가 상상한 방의 모습에서 어떤 것이 다른지 확인만 하고 업데이트 해주면 된다 중간 과정을 따로 생각하지 않아도 된다 |
React로 UI를 조작한다고 하면 더 이상 DOM보다는 다뤄야할 데이터의 변화 (=페러다임)에 집중하면된다
react는 Third Party Library 라고 불리는데
컴포넌트가 생성되고 소멸되기까지의 생애주기
특정 생애주기에 특정동작을 할 수 있도록 실행시키려 하는 것이다
~~컴포넌트가 생성되거나, 커지거나(=성장하거나) 없어질 때
React Project 를 만들기 위해서 설치해야 하는 것
- Node.js
- npm : node package manager
JQuery : DOM의 조작을 쉽게 해주는 메서드의 모음
DOM, UI를 직접 조작하지 않게 도와준다
1. Angular
2. Vue
3. React
const div = document.getElementById('mydiv');
fot (let i = 0; i < 10; i+=1) {
const p = document.createElement('p');
p.textContent = 'Hello world');
div.appendChild(p);
}
const div = $("#mydiv");
fot (let i = 0; i < 10; i+=1) {
div.append("<p>Hello World</p>");
}
Pure Javascript 에 비해서 Jquery는 사용이 편리하다
간결하게 사용할 수 있다
프레임워크는 정해진 규칙이 없고 라이브러리는 규칙이 있긴 하지만 엄격하지는 않아 가져다 쓰는 정도이다
프레임워크 | 라이브러리 | |
---|---|---|
공통점 | 다른 사람이 기존에 만든 코드를 가져다 쓴다 | 다른 사람이 기존에 만든 코드를 가져다 쓴다 |
차이점 | 틀이 잡혀있다 | 내가 쓸수 있는 하나의 도구 |
비유 | 작업하는 사람이 남이 만든 집에 들어가서 작업한다 | 내가 우리집에서 도구를 가지고 와서 사용한다 |
typescript : 엄격하게 검사하는 기능을 추가한 프로그래밍 언어
UI의 변화와 연관된 데이터
예) 기존에 댓글 1개가 있었는데 4개로 변화됨
작은 변화가 생길 때마다 UI를 다시 구현하는 것은 매우 비효율적이라
React에서는 변화가 생겼을 때 바로 UI를 그리는 것이 아니라
자기가 관리하고 있는 가상 DOM 을 봐서
지금의 모습과 어떻게 다른지, 변화된 모습만 확인하고 업데이터 해준다
→ 그래서 불필요한 업데이트를 막아준다
state change → compute diff → re-render
React 작업 세팅
자바스크립트가 서버와 같이 브라우저 밖에서도 동작하게 하는 환경
런타임 환경
자바스크립트의 탈 웹
자바스크립트는 브라우저에서 실행되는 프로그래밍 언어로 만들어진거라 많이 쓰여서 사용자가 많이 늘어났다
브라우저 밖에서도 자바스크립트로 개발하고 싶다는 needs가 생김
→지금의 node.js처럼 브라우저 밖에서도 실행할 수 있는 환경이 필요해짐
리액트는 오로지 보이는 것에만 신경쓰는 UI라이브러리이다
JSX(자바스크립트 확장문법) → 실제로 볼 수 있는 HTML, CSS, JS 문법으로 스타일 분리를 하거나
여러가지 파일로 만들었다가, 배포할 때에는 하나의 파일로 합쳐주는 WebPack
프로젝트 개발환경을 구축하는 주요도구들이 Node.js 기반이라 Node.js가 필요하다
Node.js 설치하면 자동으로 npm 가 설치된다
node 기반의 패키지를 사용하려면 npm이라는 패키지 관리도구가 필요하다
패키지가 워낙 다양해서 각각 관리하기 어려워서 하나로 묶어서 npm을 만들었다
npm을 통해서 다양한 패키지를 설치하고 버전을 관리할 수 있다
비유
스마트폰에서 앱을 실행할 때, 하나하나의 앱들을 패키지라고 부를 수 있다
스마트폰실행환경 (node)
에서 실행 가능한 애플리케이션패키지
이고
이러한 애플리케이션들을 설치하는 웹스토어나 플레이스토어를npm
으로 비유할 수 있다
터미널에서
node -V
혹은npm -v
명령어를 실행하면
버전 체크 및 잘 설치되어있는지 확인이 가능하다
npm create-react-app westagram-react
cd westagram-react
npm start
scripts
package.json 파일 내부에서 패키지에서 사용가능한 명령어
dependencies
package.json 파일 내부의 (의존성) : 우리 프로젝트에서 의존하고 있는 패키지들이 객체형태로 적혀있다
"@testing-library/json-dom" : "^5.11.4"
이런 형태라면 아래와 같이 확인하면 된다
npm start
reacr project 를 git clone을 받아서 npm start 명령어를 실행하게 되면
해당 패키지의 dependencies를 읽고 어떤 패키지의 몇 버전이 필요한지 확인하게 된다
그렇게 필요한 패키지 버전을 npm이 다운해주면서 github에 올리지 않은 node_modules 을 설치해준다
버전관리를 git으로 할 때, git으로 관리하지 않을 것들을 gitignore에 모아서 작성한다
tool chain
<div id="root"></div>
ReactDOM.render(<APP />, document.getElementById('root'));
ReactDOM.render() 함수의 인자는 2개인데
<APP />
: 화면에 보여주고 싶은 컴포넌트
document.getElementById('root')
: 화면에 보여주고 싶은 컴포넌트의 위치
<Login />
컴포넌트, <Main />
컴포넌트를 그 자리에 대체해서 작업을 진행하면 된다CRA를 설치하고 보면 작업하면서 필요없는 파일들도 생기는데 내가 지우면 된다
public 폴더
결과적으로 index.html
하나만 남는다
index.html
파일 내부
<link rel="icon" href="PUBLIC_URL%favicon.ico"/>
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png"/>
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
주석내용
필요없어 보이는 내용도 지운다
<moscript>You need to enable Javascript to run this app.</moscript>
index.html
파일 내부에는<div id="root"></div>
만 있다src 폴더
logo.svg
삭제index.js 파일
import "./index.css' 삭제
import reportWebVituals from './reportWebVitals';
report WebVituals();
주석삭제
<React.StrictMode> <App /> </React.StrictMode>
<ReactDOM.render( <APP />, document.gerElementById("root"));
react, react-dom, <APP />
에서v컴포넌트를 import한다고 되어있어서 실제코드가 이것만 남아도 여러가지가 구현되는 것을 볼 수 있다
경로 입력하기
./
: 현재폴더
../
: 상위폴더
js파일의 경우 활장자의 이름을 생략할 수있다import logo from './logo.svg';
import ReactDOM from "react-dom";
이라고 되었는데 react-dom 이라는 라이브러리 패키지를 가져오는 것인데
라이브러리, 패키지는 node_modules 폴더에 기본적으로 저장되기 때문에
라이브러리 및 패키지를 가져올 때, 따로 경로를 저장하지 않는다면 node_modules 폴더로 가져오게 된다
ReactDOM.render()
ReactDOM은 객체라는 것을 알 수있다
render() : 소괄호가 있다는 것은 함수를 호출한다는 것이지만,
객체 안에 있는 함수는 메서드라고 부르기 때문에 index.js에서는 render() 메소드를 호출하는 역할을 한다