프론트엔드 프레임워크는 정적인 웹 페이지에서 동적으로 유저 인터렉션을 처리하는 웹 어플리케이션으로 규모가 커짐에 따라 개발에 용이하게 하기 위해 등장했다.
정적인 페이지는 웹 서버에 미리 저장된 파일을 그대로 전달하는 방식이고 동적인 페이지는 사용자의 요청 정보를 가공 처리후 생성된 웹 페이지를 전달하는 방식이다. 동적으로 페이지를 구성한다면 웹을 더욱 다양하게 활용할 수 있다.
프레임워크는 프로그램 개발을 위한 뼈대를 제공하여 더욱 편리하게 개발할 수 있는 집같은 개념이며, 라이브러리는 개발 도구들의 모음 즉 인테리어 소품들이라고 보면 편할 것 같다.
create-react-app
을 통해 직접 구축해야 하는 번거로움을 줄여준다.리액트를 위해 사용하는 JavaScript의 확장된 문법이지만, 브라우저는 읽을 수가 없다. JavaScript로 읽어야 하는데 브라우저가 이해할 수 있게 코드를 변환 해줘야 한다. 이때 이용하는 것이 Babel
을 사용하여 JavaScript를 컴파일한다.
일반적인 DOM을 개발해야한다면 HTML, CSS, JavaScript를 가지고 개발해야하지만 React DOM을 이용하여 개발을 하게되면 CSS, JSX만을 가지고 웹 애플리케이션을 개발할 수 있다.
일반적으로 꼭 JSX를 사용해야 하는건 아니지만 JSX를 사용하는 이유는 명시적으로 코드를 작성할 수 있으며 코드가 복잡하지않고, 가독성이 좋다는 장점이 존재하기에 우리는 JSX문법을 사용한다.
JS를 이용해 일반적 DOM을 생성하기 위해 creatElement
, textContent
, append
등을 사용하여 생성할 수 있다.
const user = {
firstName: "HTML",
lastName: "DOM"
};
function formatName(user) {
return user.firstName + " " + user.lastName;
}
// h1태그를 생성하여 heading이란 변수에 담는다
const heading = document.createElement("h1");
// heading이란 변수요소에 Hello formatName()를 텍스트를 넣는다
heading.textContent = `Hello, ${formatName(user)}`;
// body안에 위치한다.
document.body.appendChild(heading);
// 결과값 : Hello, HTML DOM
리액트를 사용하여 간단하게 엘리먼트를 생성가능하다.
// react를 js파일에 불러온다.
import React from "react";
function App() {
const user = {
firstName: "React",
lastName: "JSX Activity"
};
function formatName(user) {
return user.firstName + " " + user.lastName;
}
// JSX 없이 활용한 React
return React.createElement("h1", null, `Hello, ${formatName(user)}!`);
// JSX 를 활용한 React
// return <h1>Hello, {formatName(user)}!</h1>;
}
export default App;
// 결과값 : Hello, React JSX Activity!
대문자
로 시작해야한다. 소문자로 시작하게 되면 일반적인 HTML 엘리먼트로 인식을 한다. 대문자로 작성된 JSX 컴포넌트를 따로 사용자 정의 컴포넌트
라고 부른다.map()
함수를 사용한다. map()
사용할 떄 반드시 key
JSX 속성을 넣어야한다. 넣지 않으면 리스트의 각 항목에 key를 넣어야 한다는 경고가 표시된다.map()
을 사용할때 key
속성이 중요하다. 속성을 넣지않으면 경고가 뜨고, key
속성의 위치는 map
메서드 내부에 있는 엘리먼트 즉, 첫 엘리먼트에 넣어주면 된다. 아래 이미지는 key
를 넣지않았을 때 경고가 뜨는 문구다
꼭 key
속성값이 반드시 id
가 되어야 하냐? 존재하지 않다면 어떻게 되나?
가능하면 데이터에서 제공하는 id
를 할당해야하며, key
속성값은 id
와 마찬가지로 변하지 않고, 예상 가능하며,
유일해야 하기 때문이다. 고유한 id
가 없는 경우에만 배열 인덱스를 넣어서 해결할 수 있지만 최후의 수단으로만 사용해야한다.
리액트는 가상DOM을 이용해 렌더링 최적화를 하는데 이 과정에서 각 요소의 key
속성에 지정된 고유한 값들이 사용된다.
key
를 통해 변경된 요소를 식별하는데 전체 요소를 재렌더링하는 대신 변경된 부분만 감지하여 업데이트 하기때문에 key
속성을 사용하여 확인해야한다.
컴포넌트란 “하나의 기능 구현을 위한 여러 종류의 코드 묶음" 이라고 표현한다. 리액트를 이용하면 각자 독립적인 기능을 가지고 UI의 한 부분을 담당하여 컴포넌트를 여러 개 만들고 조합하여 애플리케이션을 만들 수 있다. 각자의 블록 역할을 하여 위치에 구애 받지 않고 수정과 재사용에 용이하다.
모든 리액트 애플리케이션은 최소 한 개의 컴포넌트를 가지고 있다. 이 컴포넌트는 애플리케이션 내부적으로 root
가 되는 역할을 한다. 최상위 컴포넌트는 근원의 역할을 하므로 다른 자식 컴포넌트를 가질 수 있다. 계층적 구조를 트리 구조로 형상화할 수 있다.