React의 정의
React는 페이스북에서 개발하고 관리하는 사용자 인터페이스(UI)를 만들기 위한 JS 라이브러리이다. 리액트를 사용하는 가장 큰 이유는 UI를 자동으로 업데이트 해준다는 점이다. 이로인해 우리는 데이터 기반의 선언적 개발이 가능해지고, 자동으로 UI를 업데이트하는 과정에서 Virtual DOM을 통해 최적화 된 업데이트를 할 수 있다. 또한 Component 기반의 개발을 통해 복잡한 UI를 효과적으로 구성할 수 있으며 JSX문법으로 컴포넌트를 편리하게 작성할 수 있다.
React의 특징
개발 방식에는 크게 절차적인 개발과 선언적인 개발이 있다.
절차적인 개발은 문제를 어떻게 해결할 것인가?에 중점을 두는 방식이고,
선언적인 개발은 무엇을 해결할 것인가?에 중점을 두는 방식이다.
Ex.
프론트엔드 개발에서 VanilaJS 프로그래밍 방식이 절차적인 프로그맹 방식이고, React의 프로그래밍 방식은 선언적 프로그래밍 방식이다. 우리가 원하는 결과, 화면에 그려지는 View에만 초점을 두고 우리가 원하는 모습을 선언해서 리액트에 전달해주면 "어떻게"에 대한 중간과정은 리액트가 알아서 처리해준다.
이렇듯, 선언적인 방식으로 개발하게 된다면 개발 과정에서도 최종 결과물만 고려하면 되기 때문에 훨씬 편리하고, 효율적으로 개발할 수 있게되어서 기존의 DOM 절차로 개발하는 방식의 패러다임을 새로운 패러다임으로의 전환이 되었다.리액트에서 UI를 업데이트하고자 할 때, "어떻게"하는지에 대한 중간과정을 처리하기 위해 DOM요소에 변화를 주기 전, 내부적으로 가상 DOM을 이용해서 실제DOM에 일어나야하는 변화를 계산한다. 왜 이런 과정이 추가됐을까?
Component란 재활용 가능한 UI 구성 단위를 의미한다. UI를 여러 조각으로 나누고, 각 조각을 개별적으로 사용할 수 있다. 쉽게 말해서 각 Component는 레고블럭이고, 여러 레고블럭을 조합해 새로운 레고블럭을 만들거나 동일한 레고블럭을 여러번 사용해서 조립할 수 있다.
<GNB/>
Component와 하단의 페이지 Component<LNB/>
Component와 우측의 <Session/>
Component<Session/>
Component = <SessionTitle/>
Component+ <SessionContent/>
Component<LNB/>
Component는 <CourseBox/>
Component를 여러번 재사용함import React from 'react';
class App extends React.Component {
render() {
return <h1>This is Class Component!</h1>;
}
}
export default App;
Class Component에서는 위와 같이 render()메서드가 있어야하고, 그 안에서 화면에 보여줄 JSX(JavaScripteXtension)를 반환한다. state 및 lifecycle API를 통해 관련 기능을 사용할 수 있다.
// App.js
import React from 'react';
const App = () => {
return <h1>This is Function Component!</h1>;
};
export default App;
Function Component는 render()메서드 없이 JSX를 반환하는 방식으로, Class형컴포넌트보다 훨씬 간단하고, 단순하지만 State와 LifeCycle을 관리하지 못한다는 단점으로 잘 사용되지 않았으나 Hook 기능이 추가되면서 함수형 컴포넌트에도 state를 사용할 수 있게 되었고, 그 후 클래스형보다는 함수형 컴포넌트가 더 많이 사용되게 되었다.
리액트는 소문자로 시작하는 요소를 HTML 태그로 인식하기 떄문에, 컴포넌트명은 항상 첫 글자가 대문자가 되어야 한다. 선언한 컴포넌트는 다른곳에서 import해서 사용할 수 있다.
import GNB from '../components/GNB/GNB';
import LNB from './LNB/LNB';
import Session from './Session/Session';
const Curriculum = () => {
return (
<>
<GNB />
<div className="curriculum">
<LNB />
<Session />
</div>
</>
);
};
export default Curriculum;
import SessionTitle from './SessionTitle/SessionTitle';
import SessionContent from './SessionContent/SessionContent';
const Session = () => {
return (
<>
<SessionTitle />
<SessionContent />
</>
);
};
export default Session;
JSX란 리액트에서 사용하는 자바스크립트 확장 문법이다. 기존에 VanilaJS를 통해 기능 구현을 할 때, HTML에서 MarkUp된 부분들을 확인하면서 직접 해당 DOM에 접근하고 EventListner를 부착하는 등 HTML과 JS 로직은 긴밀하게 연결되어 있다. 그래서 JSX는 HTML과 JS로직을 하나의 JS파일 안에서 모두 처리하기 위해서 확장한 문법이다.
JSX는 HTML태그와 유사한 형태로 사용하기 때문에 보기 쉽고 익숙하다. 별도의 html, js 파일이 아닌 하나의 js파일에서 html마크업과 js로직을 동시에 작성할 수 있어서 편리하다.
const hi = <p>Hi</p>;
// Greetings.js
import React from 'react';
const Greetings = () => {
const name = '김개발';
return <h1>{name}님, Welcome to Wecode!</h1>;
};
export default Greetings;
class
는 className
으로 사용해야한다.HTML
<h1 class="greetings">Welcome to Wecode!</h1>
JSX
<h1 className="greetings">Welcome to Wecode!</h1>
JS
const title = document.getElementsByClassName("title")[0];
title.addEventListener("click", handleClick);
JSX
<h1 className="title" onClick={handleClick}>
Welcome to Wecode!
</h1>
HTML
<h1 style="color:red;background-image:yellow">Welcome to Wecode!</h1>
JSX
<h1 style={{ color: "red", backgroundImage: "yellow" }}>
Welcome to Wecode!
</h1>
Self-Closing Tag
어떤 택라도 Self-closing tag로 사용할 수 있다.
Nested JSX
반드시 최상위를 감싸는 태그가 존재해야 한다.
// Bad
const Greetings = () => {
return (
<h1>김개발님!</h1>
<h2>위코드에 오신 걸 환영합니다!</h2>
);
}
// Good
const Greetings = () => {
return (
<div>
<h1>김개발님!</h1>
<h2>위코드에 오신 걸 환영합니다!</h2>
</div>
);
}
JSX를 하나의 태그로 감싸야 하는 이유는, 리액트의 Virtual DOM에서 컴포넌트 변화를 효율적으로 비교할 수 있도록 한 컴포넌트는 하나의 DOM 트리 구조로 이루어져야 한다는 규칙이 있기 때문입니다)
const Greetings = () => {
return (
<React.Fragment>
<h1>김개발님!</h1>
<h2>위코드에 오신 걸 환영합니다!</h2>
</React.Fragment>
);
};
const Greetings = () => {
return (
<>
<h1>김개발님!</h1>
<h2>위코드에 오신 걸 환영합니다!</h2>
</>
);
};
Summary
: 리액트는 UI를 만들기 위한 JS 라이브러리이다.
: 리액트는 선언적,가상돔,JSX, 컴포넌트 특징이 있다.
Reference: Wecode