리액트 → 페이스북에서 개발, 관리하는 사용자 인터페이스(UI)를 만들기 위한 자바스크립트 라이브러리.
개발 방식엔 크게 절차적인 개발과 선언적인 개발이 있다.
절차적 → 이 방향으로 직진해서 두 번째 블록에서 우회전해주시고, 이후 첫 번째 신호등에서 좌회전해주세요. 전방에 다리를 건널 때까지 직진해주시고, 소방서가 있는 블록에서 우회전 후 300m 앞에서 내려주세요.
선언적 → OOO으로 가주세요.
절차적 방식은 목적지보다 목적지에 어떻게 도달하는지에 초점이 맞춰져있고, 선언적 방식은 도달할 목적지에 초점이 맞춰져 있다.
💡 프론트엔드 개발에서
바닐라 자바스크립트의 프로그래밍 방식 = 절차적 프로그래밍 방식.
리액트의 프로그래밍 방식 = 선언적 프로그래밍 방식.
→ React가 내부적으로 DOM을 조작하는 과정에서 브라우저 내에 발생하는 연산의 양을 줄이는 방식을 통해 성능을 개선하는 방법.
리액트에서 UI를 업데이트하고자 할 때, 어떻게 하는지에 대한 중간과정을 처리하기 위해 DOM 요소에 변화를 주기 전, 내부적으로 가상 DOM을 이용해서 실제 DOM에 일어나야 하는 변화를 계산한다.
DOM을 계산
CSS를 계산
화면상에 DOM이 그려질 위치를 계산(Layout)
브라우저에 실제 픽셀을 그림(Paint)
이 과정을 DOM을 조작할때마다 수행하기 때문에 DOM조작이 많아지면 브라우저가 처리해야 할 연산량이 늘어난다.
DOM(Document Object Model) → 웹 페이지를 이루는 태그들을 자바스크립트가 이용할 수 있게끔 브라우저가 트리구조로 만든 객체 모델.
DOM은 HTML과 JS를 이어주는 역할을 한다.
→ 독립적이고 재사용 가능한 UI 단위.
독립적이고 재사용할 수 있다. ⇒ 유지보수에 용이함.
다른 컴포넌트를 포함할 수 있다.
⇒ 컴포넌트간 계층(부모-자식) 관계 형성 가능.
⇒ 컴포넌트를 조합하여 큰 컴포넌트를 만들 수 있음.
UI가 어떻게 구성되었는지 파악하기 용이함.
⇒ 가독성 향상.
⇒ 유지보수에 용이함.
→ 자바스크립트 Class 문법을 이용해서 컴포넌트를 선언하는 방법.
→ 자바스크립트 함수 문법을 이용해서 컴포넌트를 선언하는 방법.
→ 리액트에서 사용하는 자바스크립트 확장 문법.
JSX는 자바스크립트의 값이다.
값 → 특정 변수에 이 값을 담을수도 있고 함수의 인자로 전달하거나 리턴값으로도 사용할 수 있다.
JSX는 자바스크립트의 값을 포함할 수 있다.
function App() {
const name = "김개발";
return <h1>hello {name}</h1>;
}
JSX안에서 태그의 속성을 정의할 수 있다.
JSX안에서 이벤트리스너를 등록할 수 있다.
function App() {
const name = "김개발";
const introduce = () => alert("hello world");
return <h1 className={name} onClick={introduce}>hello {name}</h1>;
}
inline style
// HTML
<h1 style="color:red;background-image:yellow">Welcome to Wecode!</h1>
// JSX
<h1 style={{ color: "red", backgroundImage: "yellow" }}>
Welcome to Wecode!
</h1> 바깥의 {} → JSX 문법을 의미. 안쪽의 {} → 자바스크립트 객체를 의미.Self-Closing Tag
→ 어떤 태그든 Self-Closing Tag로 사용할 수 있다.
<img>처럼 하나의 태그가 요소인 경우, 기존 HTML은 /로 끝내지 않아도 되지만 JSX에선 <img />처럼 항상 /으로 끝내줘야 한다.
Nested JSX
→ 반드시 최상위를 감싸고 있는 하나의 태그가 있어야 한다.
// Bad
const Greetings = () => {
return (
<h1>김개발님!</h1>
<h2>위코드에 오신 걸 환영합니다!</h2>
);
}
// Good
const Greetings = () => {
return (
<div>
<h1>김개발님!</h1>
<h2>위코드에 오신 걸 환영합니다!</h2>
</div>
);
}
Bad의 경우, <h1><h2>를 감싸고 있는 태그가 없기 때문에 에러가 발생한다.
React.Fragment <> ... </>
→ 앞서 JSX에선 반드시 최상위를 하나의 태그로 감싸야 한다고 했는데, 최상위를 감싸고 있는 태그에 특별한 의미나 스타일이 없을 경우 <React.Fragment> 를 사용하면 된다.
Fragment는 추가적인 DOM element를 생성하지 않고 하나의 컴포넌트 안에 여러 요소(자식)를 간단하게 그룹화 할 수 있는 기능이다.
// Before
const Greetings = () => {
return (
<React.Fragment>
<h1>김개발님!</h1>
<h2>위코드에 오신 걸 환영합니다!</h2>
</React.Fragment>
);
//After
const Greetings = () => {
return (
<>
<h1>김개발님!</h1>
<h2>위코드에 오신 걸 환영합니다!</h2>
</>
);
};