React 기본 개념들에 대해 정리합니다.
공부하는 목적은 플랫폼 엔지니어링 오픈소스인 https://backstage.io/ 에서 Custom 플러그인을 개발하기 위해 React 지식이 필요한 것 같아 공부하려 해봅니다.
React는 UI를 만들기 위한 Javascript 라이브러리임. Factbook에서 개발했으며 빠르고 효율적인 UI를 만들기 위한 목적으로 만들어졌음
1. Component
- React의 핵심 단위
- UI를 작고 재사용 가능한 단위로 쪼개서 관리
- 함수형 컴포넌트가 많이 사용된다.
function Hello(props) {
return <h1>Hello, {props.name}!</h1>
}
2. JSX (JavaScript XML)
- JavaScript 코드 안에서 HTML 처럼 보이는 코드를 작성할 수 있게 해주는 문법
- JSX는 브라우저가 이해할 수 있도록 React.createElement 형태로 변환함
const element = <h1>Hello, world!</h1>;
->
const element = React.createElement('h1', null, 'Hello, world!');
3. Props
- 부모 컴포넌트가 자식 컴포넌트에 데이터를 전달하는 과정
- 읽기 전용(Immutable)
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
// 사용
<Welcome name="React" />
4. State (상태)
- 컴포넌트 내부에서 관리되는 데이터
- 사용자의 동작이나 API 응답 등으로 변경 가능
- 변경되면 자동으로 재 렌더링 발생
import { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>{count}번 클릭했습니다.</p>
<button onClick={() => setCount(count + 1)}>+1</button>
</div>
);
}
5. React Hooks
- 함수형 컴포넌트에서 상태와 생명주기 기능을 사용할 수 있게 해주는 API
- 주요 Hooks
- useState
- useEffect
- useRef
- useMemo
- useCallback
- useContext
- useReducer
6. Virtual DOM
- 실제 DOM 대신 가상의 DOM을 만들어 최소한의 변경만 적용
- 변경이 발생하면 이전 가상 DOM과 비교 -> 필요한 부분만 실제 DOM에 반영
간단히 사용해보기
아직 React 사용 방법을 잘 모르기에 간단히만 사용해본다.
React 초기 프로젝트를 만들기 위해서는 npx라는 패키지 실행기(Executor)를 활용할 수 있다.
NodeJS와 NPM이 설치되어 있으면 npx도 사용할 수 있다.
npx create-react-app my-app을 통해 초기 구성 가능
❯ npx create-react-app sample-app2
Creating a new React app in /Users/xxxxxxxx/Documents/git/private/sample-app2.
Installing packages. This might take a couple of minutes.
Installing react, react-dom, and react-scripts with cra-template...
added 1322 packages in 41s
...
...
We suggest that you begin by typing:
cd sample-app2
npm start
Happy hacking!
여기서 핵심 파일은 3가지인 것으로 보인다.
- index.html : 최종 HTML 파일이며 <div id="root">를 통해 React가 가상 DOM을 조작할 수 있도록 해줌
- index.js : 브라우저에서 React 앱이 시작되는 첫 번째 파일이다.
id=root 요소를 찾아서 그 자리에 React 앱(App)을 렌더링한다.
- App.js : React 앱의 메인 컴포넌트 역할을 수행한다.
모든 React 컴포넌트 트리의 최상단이며 여러 하위 컴포넌트들을 포함해서 UI를 구성한다.
페이지를 구성하는 컴포넌트들 (<Header />, <Footer />, <Home />, <LoginForm />) 등을 넣을 수 있다.
간단히 사용해보기
https://ip-ranges.amazonaws.com/ip-ranges.json 로부터 regions 들을 조회한 뒤 웹에 보여주는 것을 React로 간단히 구현해봄
[1] API Region을 조회하여 regions(배열)로 region 해주는 단순한 함수
const AWS_IP_RANGE_URL = "https://ip-ranges.amazonaws.com/ip-ranges.json"
const regions = [];
const ipRanges = {};
export async function fetchAWSRegionsAndService() {
if (regions.length > 0) {
// caching data를 응답해준다.
return regions;
}
try {
const response = await fetch(AWS_IP_RANGE_URL);
if (!response.ok) {
throw new Error(`HTTP error when fetching AWS IP range! status: ${response.status}`);
}
const data = await response.json();
// region 추출
for (let i = 0; i < data["prefixes"].length; i++) {
let region = data['prefixes'][i]['region'];
if (!regions.includes(region)) {
regions.push(region);
ipRanges[region] = [];
}
}
return regions;
} catch (err) {
console.error(`Error fetching AWS IP Range regions and services: ` + err);
}
}
[2] 해당 함수를 활용하여 Region을 보여주는 함수형 컴포넌트
import React, { useEffect, useState } from 'react';
import { fetchAWSRegionsAndService } from '../api/aws';
function IpRanges() {
const [regions, setRegions] = useState([]);
const [error, setError] = useState(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
fetchAWSRegionsAndService()
.then(data => {{
setRegions(data);
// setError(null);
}})
.catch(err => {
setError(err.message || 'Unknown error occurs');
// setRegions([]);
})
.finally(() => {
setLoading(false);
})
}, []);
if (loading) {
return <div>Loading ...</div>
}
if (error) {
return <div>Error : {error}</div>
}
return (
<div>
<h2>AWS Regions</h2>
<ul>
{regions.map((region, index) => (
<li key={index}>region : {region}</li>
))}
</ul>
</div>
)
}
export default IpRanges;
[3] Component를 활용하여 AWS Region을 보여줌
import {React, useState} from 'react';
import IpRanges from './components/ipRanges';
function App() {
const [showIpRanges, setShowIpRanges] = useState(false);
const handleClick = () => {
setShowIpRanges(true); // 버튼 클릭 시 컴포넌트 호출
}
return (
<div>
<button onClick={handleClick}>AWS 리전 조회</button>
{showIpRanges && <IpRanges/>}
</div>
)
}
export default App;
css는 하나도 안함.
버튼 클릭해야 한다.
버튼 클릭 시,
다음 목표 : NextJS, TypeScript 공부
'Programming > Javascript' 카테고리의 다른 글
[JavaScript] 비동기, Promise, Async 정리 (0) | 2022.02.23 |
---|---|
[Javascript] 반복문 정리 (0) | 2021.11.14 |