React : ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ์ํ JavaScript ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ
์ ์ธํ (Declarative)
: ํ๋์ ํ์ผ์ ๋ช
์์ ์ผ๋ก ์์ฑํ ์ ์๊ฒ JSX๋ฅผ ํ์ฉํ ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ
=> ๋ฌด์์ ์ง์คํ์ฌ ํ๋ก๊ทธ๋๋ฐ์ ํ๋ ๊ฒ
์ปดํฌ๋ํธ ๊ธฐ๋ฐ (Component-Based)
: ํ๋์ ๊ธฐ๋ฅ ๊ตฌํ์ ์ํด ์ฌ๋ฌ ์ข
๋ฅ์ ์ฝ๋๋ฅผ ๋ฌถ์ด๋ ์ปดํฌ๋ํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐ
=> ๋
๋ฆฝ์ฑ, ์ฌ์ฌ์ฉ์ฑ โ => ๊ธฐ๋ฅ ์๋(์ ์ง ๋ณด์, ์ ๋ ํ
์คํธ)์ ์ง์คํ์ฌ ๊ฐ๋ฐ ๊ฐ๋ฅ
๋ฒ์ฉ์ฑ (Learn Once, Write Anywhere)
: JavaScript ํ๋ก์ ํธ ์ด๋์๋ ์ ์ฐํ๊ฒ ์ ์ฉ ๊ฐ๋ฅ (๋ฆฌ์กํธ ๋ค์ดํฐ๋ธ๋ก ์ฑ ๊ฐ๋ฐ ๊ฐ๋ฅ)
: JavaScript๋ฅผ ํ์ฅํ ๋ฌธ๋ฒ (HTML + JavaScript = JSX) & ๋ณต์ก์ฑโ ๊ฐ๋ ์ฑโ
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;
ํ๋์ ํ์ผ์์ HTML๊ณผ JavaScript๋ก ๋๋์ด์ก๋ ๋ ๊ฐ์ง ์ผ์ ํ ๋ฒ์ ์ฒ๋ฆฌ ํ๋ค.
=> JSX๋ ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ง ๋ฐ๋ผ๋ณด๋๊ฒ ์๋๋ผ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ผ๋ณด๊ฒ ๋๋๋ค.
1) ํ๋์ ์๋ฆฌ๋จผํธ ์์ ๋ชจ๋ ์๋ฆฌ๋จผํธ๊ฐ ํฌํจ๋๋ค.
(์ต์์์์ opening tag์ closing tag๋ก ๊ฐ์ธ์ค์ผ ํ๋ค.)
<div>
<div>
<h1>Hello</h1>
</div>
<div>
<h1>World</h1>
</div>
</div>
2) ์๋ฆฌ๋จผํธ ํด๋์ค ์ฌ์ฉ ์, className ์ผ๋ก ํ๊ธฐํ๋ค.
(class๋ก ์์ฑํ๊ฒ ๋๋ฉด JavaScript ํด๋์ค๋ก ๋ฐ์๋ค์ธ๋ค.)
<div className="greeting">Hi!</div>
3) JavaScript ํํ์ ์ฌ์ฉ ์, ์ค๊ดํธ{}
๋ฅผ ์ฌ์ฉํ๋ค.
(์ค๊ดํธ๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ์ผ๋ฐ ํ ์คํธ๋ก ์ธ์ํ๋ค.)
function App() {
const name = "yejin";
return <div>Hi {name}</div>;
}
4) ์ฌ์ฉ์ ์ ์ ์ปดํฌ๋ํธ๋ ๋๋ฌธ์๋ก ์์ (PascalCase) = ์ฌ์ฉ์ ์ ์ ์ปดํฌ๋ํธ
(์๋ฌธ์๋ก ์์ํ๋ฉด ์ผ๋ฐ์ ์ธ HTML ์๋ฆฌ๋จผํธ๋ก ์ธ์ํ๋ค.)
function Hello() {
return <div>Hi</div>;
}
function HelloWorld() {
return <Hello />;
}
5) ์กฐ๊ฑด๋ถ ๋ ๋๋ง์๋ ์ผํญ์ฐ์ฐ์ ์ฌ์ฉํ๋ค.
(if๋ฌธ์ด ์๋ ์ผํญ์ฐ์ฐ์๋ฅผ ์ด์ฉํด์ผํ๋ค.)
<div>
{1 + 1 === 2 ? <p>์ ๋ต</p> : <p>ํ๋ฝ</p>}
</div>
6) ์ฌ๋ฌ ๊ฐ์ HTML ์๋ฆฌ๋จผํธ๋ฅผ ํ์ํ ๋, map() ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
- map ํจ์๋ฅผ ์ฌ์ฉํ ๋ ๋ฐ๋์ "key" JSX ์์ฑ์ ๋ฃ์ด์ผ ํ๋ค.
const posts = [
{ id: 1, title: "Hello", content: "Welcome" },
{ id: 2, title: "World", content: "Welcome !!" },
];
function App() {
const content = post.map((post) => {
<div key={post.id}>
<h1>{post.title}</h1>
<p>{post.content}</p>
</div>;
});
}
: React์์ ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฅผ ๋ ๋๋ง ํ ๋ ์ฌ์ฉ
=> ๋ฐฐ์ด์ ๊ฐ ์์๋ฅผ ํน์ ๋
ผ๋ฆฌ(ํจ์)์ ์ํด ๋ค๋ฅธ ์์๋ก ์ง์ (map)ํ๋ค.
const posts = [
{ id: 1, title: "Hello", content: "Welcome" },
{ id: 2, title: "World", content: "Welcome!!" },
];
function App() {
const postToElement = (post) => (
<div>
<h3>{post.title}</h3>
<p>{post.content}</p>
</div>
);
const blogs = posts.map(postToElement);
return <div>{blogs}</div>;
}
export default App;
: ๋ณํ์ง ์๊ณ , ์์ ๊ฐ๋ฅํ๋ฉฐ, ์ ์ผํด์ผ ํ๋ค.
React์์ map ๋ฉ์๋ ์ฌ์ฉ ์, key ์์ฑ์ ๋ฃ์ง ์์ผ๋ฉด key๋ฅผ ๋ฃ์ด์ผ ํ๋ค๋ ๊ฒฝ๊ณ ๋ฅผ ์ถ๋ ฅํ๋ค.
const posts = [
{ id: 1, title: "Hello", content: "Welcome" },
{ id: 2, title: "World", content: "!!" }
];
function App() {
const blogs = posts.map((post) => (
<div key={post.id}>
<h3>{post.title}</h3>
<p>{post.content}</p>
</div>
));
return <div>{blogs}</div>;
}
export default App;
: ํ๋์ ๊ธฐ๋ฅ ๊ตฌํ์ ์ํ ์ฌ๋ฌ ์ข ๋ฅ์ ์ฝ๋ ๋ฌถ์ or UI๋ฅผ ๊ตฌ์ฑํ๋ ํ์ ์์
=> ์์ ๊ฐ์ด ์ปดํฌ๋ํธ๋ฅผ ์ฌ๋ฌ๊ฐ ๋ง๋ค๊ณ ์กฐํฉํ๋ฉด ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์๋ค.
๋ชจ๋ React ์ ํ๋ฆฌ์ผ์ด์
์ ์ปดํฌ๋ํธ๋ค์ ๊ด๊ณ๋ฅผ ์์ ๊ฐ์ด ํธ๋ฆฌ ๊ตฌ์กฐ๋ก ํ์ํํ์ฌ ํํํ ์ ์๋ค.
์ต์์ ์ปดํฌ๋ํธ๋ ๊ทผ์(root)์ญํ ์ ํ๋ฏ๋ก ๋ค๋ฅธ ์์ ์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ง ์ ์๋ค.
๊ฐ๊ฐ์ ์ปดํฌ๋ํธ๋ ๊ฐ์ ๊ณ ์ ์ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์ผ๋ฉด์ UI์ ํ ๋ถ๋ถ์ ๋ด๋นํ๋ค.
์ด๋ฌํ ์ปดํฌ๋ํธ๋ค์ ๋ชจ์ ๋ณต์กํ UI๋ฅผ ๊ตฌ์ฑํ ์ ์๊ณ , ๋ณต์กํ ์ดํ๋ฆฌ์ผ์ด์
๋ ๋ง๋ค ์ ์๋ค.
์ปดํฌ๋ํธ ๊ธฐ๋ฐ ๊ฐ๋ฐ์ ํน์ง
- ๊ธฐ์ ์ ์ธ ํน์ง์ด ์๋, ์ค์ ์ฌ์ฉ์๊ฐ ์ฌ์ฉํ๋ ๊ธฐ๋ฅ์ ๊ธฐ์ค์ผ๋ก ์ฝ๋๋ฅผ ๋ชจ์ ๊ฐ๋ฐํ๋ค.
- ๋งํฌ์
, ๋์์ธ, ๋ก์ง์ ์ฐ๊ฒฐํ์ฌ ๊ฐ๋ฐ์ ํ ์ ์๋ค.
- ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ์ฌ ํจ์จ์ ์ธ ๊ฐ๋ฐ์ด ๊ฐ๋ฅํ๋ค.
- ์ปดํฌ๋ํธ ๊ฐ ์์กด์ฑ์ด ๋ฎ๊ณ , ๋
๋ฆฝ์ ์ผ๋ก ์๋ํ๋ค.
: React SPA๋ฅผ ์ฝ๊ณ ๋น ๋ฅด๊ฒ ๊ฐ๋ฐํ ์ ์๋๋ก ๋ง๋ค์ด์ง ํด ์ฒด์ธ
- ํ๋ก์ ํธ ์์ฑ : npx create-react-app ํด๋๋ช
- ์ ํ๋ฆฌ์ผ์ด์
์คํ : npm start