๐น 1. ์ ํต์ ์ธ ์ ์ฒด ํ์ด์ง ๋ ๋๋ง ๋ฐฉ์
์์ฒญ โ View(HTML) โ ์ ์ฒด ํ์ด์ง ๋ ๋๋ง
- ์ฌ์ฉ์๊ฐ ์น ํ์ด์ง์ ์ ๊ทผํ๊ฑฐ๋ ๋ฒํผ์ ํด๋ฆญํ์ฌ ์๋ฒ์ ์์ฒญ์ ๋ณด๋.
- ์๋ฒ(๋ฐฑ์๋)๋ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , HTML์ ํฌํจํ ์ ์ฒด ํ์ด์ง๋ฅผ ๋ ๋๋งํ์ฌ ์๋ต์ผ๋ก ๋ณด๋.
- ๋ธ๋ผ์ฐ์ ๋ ๋ฐ์ HTML์ ํด์ํ์ฌ ์๋ก์ด ํ์ด์ง๋ฅผ ํ์ํ๋ฉฐ, ๊ธฐ์กด ํ์ด์ง๋ ์ ํ์ด์ง๋ก ์์ ํ ๋์ฒด๋จ.
โ ํน์ง
- ์์ฒญ์ด ๋ฐ์ํ ๋๋ง๋ค ์ ์ฒด ํ์ด์ง๊ฐ ์๋ก๊ณ ์นจ๋จ.
- ์๋ฒ์์ HTML์ ๋ ๋๋งํ์ฌ ๋ฐํํ๋ฏ๋ก, ํด๋ผ์ด์ธํธ ์ธก์์ ๋ฐ์ดํฐ ๊ฐ๊ณต์ด ํ์ ์์.
- ์ฌ์ฉ์ ๊ฒฝํ(UX)์ด ๋ค์ ๋จ์ด์ง ์ ์์(์๋ก๊ณ ์นจ ์ ๊น๋นก์ ํ์ ๋ฐ์).
- ๋ํ์ ์ธ ๋ฐฉ์: SSR(Server-Side Rendering)
๐น 2. Ajax๋ฅผ ์ด์ฉํ ๋น๋๊ธฐ ์์ฒญ & ๋ถ๋ถ ์ ๋ฐ์ดํธ ๋ฐฉ์
View โ ์์ฒญ(JS) โ Ajax(๋น๋๊ธฐ ์์ฒญ) โ ์๋ต(JSON) โ JS(๋ ๋๋ง)
- ์ฌ์ฉ์๊ฐ ํน์ ๋์(๋ฒํผ ํด๋ฆญ, ๊ฒ์์ด ์ ๋ ฅ ๋ฑ)์ ์ํํ๋ฉด JavaScript์์ ์ด๋ฒคํธ๋ฅผ ๊ฐ์ง.
- JavaScript์์ Ajax ์์ฒญ(์ฃผ๋ก XMLHttpRequest ๋๋ fetch API, Axios ๋ฑ์ ์ด์ฉ)์ ์๋ฒ๋ก ์ ์ก.
- ์๋ฒ๋ ์์ฒญ์ ์ฒ๋ฆฌํ ํ, JSON ๋ฐ์ดํฐ(HTML์ด ์๋ ๋ฐ์ดํฐ๋ง ํฌํจ)๋ฅผ ์๋ต์ผ๋ก ๋ณด๋.
- ํด๋ผ์ด์ธํธ(๋ธ๋ผ์ฐ์ )์์ ๋ฐ์ JSON ๋ฐ์ดํฐ๋ฅผ JavaScript๊ฐ ๊ฐ๊ณตํ์ฌ ํน์ ๋ถ๋ถ์ ์ ๋ฐ์ดํธํ์ฌ ํ๋ฉด์ ๋ฐ์ํจ.
โ ํน์ง
- ์ ์ฒด ํ์ด์ง ์๋ก๊ณ ์นจ ์์ด ์ผ๋ถ ๋ฐ์ดํฐ๋ง ๊ฐฑ์ ๊ฐ๋ฅ โ ๋น ๋ฅธ UX ์ ๊ณต.
- ์๋ฒ์์ JSON์ ๋ฐํํ๋ฏ๋ก, ํด๋ผ์ด์ธํธ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณตํ๊ณ UI๋ฅผ ์ง์ ์ ๋ฐ์ดํธํด์ผ ํจ.
- ์ฃผ๋ก SPA(Single Page Application) ๋๋ ๋์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ง์ด ์ฌ์ฉ๋จ.
โ ์์ : Ajax๋ฅผ ํ์ฉํ ๋๊ธ ์ถ๊ฐ ๊ธฐ๋ฅ
fetch('/api/comments', {
method: 'POST',
body: JSON.stringify({ text: '๋๊ธ ๋ด์ฉ' }),
headers: { 'Content-Type': 'application/json' }
})
.then(response => response.json()) // ์๋ฒ ์๋ต์ JSON์ผ๋ก ๋ณํ
.then(data => {
const commentList = document.getElementById('comment-list');
const newComment = document.createElement('li');
newComment.textContent = data.text;
commentList.appendChild(newComment); // ๋๊ธ ๋ชฉ๋ก์ ์ถ๊ฐ
});
๐น ์ต์ข ์ ๋ฆฌ
โ 1. ์ ์ฒด ํ์ด์ง ๋ ๋๋ง (SSR)
์ฌ์ฉ์ ์์ฒญ โ ์๋ฒ์์ HTML ์์ฑ โ ์ ์ฒด ํ์ด์ง ์๋ก๊ณ ์นจ ๋ฐ ๋ ๋๋ง
- ์ ํต์ ์ธ ๋ฐฉ์, ์๋ฒ์์ ๋ชจ๋ ๋ ๋๋ง์ ์ฒ๋ฆฌ.
- ํ์ด์ง ์ด๋ ์ ๊น๋นก์ ๋ฐ์.
โ 2. Ajax๋ฅผ ์ด์ฉํ ๋น๋๊ธฐ ์์ฒญ (SPA & ๋ถ๋ถ ์ ๋ฐ์ดํธ)
์ฌ์ฉ์ ์ด๋ฒคํธ(JS) โ Ajax ์์ฒญ โ ์๋ฒ์์ JSON ์๋ต โ JS๊ฐ ๋ฐ์ดํฐ ๊ฐ๊ณต ๋ฐ UI ์
๋ฐ์ดํธ
- ์ ์ฒด ํ์ด์ง ์๋ก๊ณ ์นจ ์์ด ํ์ํ ๋ฐ์ดํฐ๋ง ๊ฐ์ ธ์ ์ ๋ฐ์ดํธ.
- ํด๋ผ์ด์ธํธ ์ธก์์ ํ๋ฉด์ ์ง์ ๋ณ๊ฒฝ(JavaScript ์ด์ฉ).
โ 3. ๊ฒฐ๋ก
Ajax ์์ฒญ๋ง์ผ๋ก ๋ณต์กํ ํ๋ฉด์ ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์์ง๋ฉด์, React ๊ฐ์ ํ๋ ์์ํฌ๊ฐ ๋ฑ์ฅํจ.
โ Ajax๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ ์ธ UI ์
๋ฐ์ดํธ๊ฐ ๊ฐ๋ฅํ์ง๋ง, ๊ท๋ชจ๊ฐ ์ปค์ง์๋ก ์ํ ๊ด๋ฆฌ์ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์ํจ.
โ React๋ ๊ฐ์ DOM, ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ๊ฐ๋ฐ, ์ํ ๊ด๋ฆฌ ์ต์ ํ ๋ฑ์ ์ ๊ณตํ์ฌ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํจ.
โ ํ์ฌ๋ React๋ฟ๋ง ์๋๋ผ Vue.js, Svelte, Solid.js ๊ฐ์ ๋ค์ํ ํ๋ ์์ํฌ๋ ๋ฑ์ฅํ์ฌ,
๋์ฑ ํจ์จ์ ์ธ UI ๊ฐ๋ฐ์ด ๊ฐ๋ฅํด์ง.
๐ฅ ์ฆ, Ajax๊ฐ ๋ณต์กํ UI ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์ง ๋ชปํ๋ฉด์ React๊ฐ ๋ฑ์ฅํ๋ค๊ณ ๋ณผ ์ ์์.
โ Ajax vs. ๊ธฐ์กด JavaScript vs. React ๋น๊ต ํ
๊ตฌ๋ถ | ๊ธฐ์กด JS (DOM ์กฐ์) | Ajax (๋น๋๊ธฐ ํต์ ) | React (ํ๋ ์์ํฌ) |
UI ์ ๋ฐ์ดํธ ๋ฐฉ์ | ์ง์ DOM์ ์กฐ์ (innerHTML, getElementById) | ํน์ ๋ถ๋ถ๋ง ์๋ฒ์์ ๊ฐ์ ธ์ ๋ณ๊ฒฝ | ๊ฐ์ DOM(Virtual DOM) ์ฌ์ฉํ์ฌ ํจ์จ์ ์ผ๋ก ๋ณ๊ฒฝ |
๋น๋๊ธฐ ์ฒ๋ฆฌ | ์์ (๊ธฐ๋ณธ์ ์ผ๋ก ๋๊ธฐ ์คํ) | Ajax๋ฅผ ํ์ฉํ์ฌ ๋น๋๊ธฐ ์์ฒญ ๊ฐ๋ฅ | useEffect, React Query ๋ฑ์ผ๋ก ๋น๋๊ธฐ ์ํ ๊ด๋ฆฌ |
DOM ์กฐ์ ๋น์ฉ | ๋์ (์๋ ์กฐ์, ๋ณ๊ฒฝ์ด ๋ง์์ง์๋ก ์ฑ๋ฅ ์ ํ) | ํน์ ๋ถ๋ถ๋ง ๋ณ๊ฒฝํ์ง๋ง, ์ฌ์ ํ ์ง์ ์กฐ์ ํ์ | ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ๋ ๋๋งํ์ฌ ์ฑ๋ฅ ์ต์ ํ |
์ํ ๊ด๋ฆฌ | ์ง์ ๋ณ์๋ก ๊ด๋ฆฌ (์ ์ญ ๋ณ์, localStorage) | ๋น๋๊ธฐ ์์ฒญ ํ DOM์ ์ง์ ์ ๋ฐ์ดํธํด์ผ ํจ | useState, useReducer, Redux ๋ฑ ๋ค์ํ ์ํ ๊ด๋ฆฌ ๋ฐฉ์ ์ ๊ณต |
์ฝ๋ ๊ตฌ์กฐ | ์ ์ฐจ์ ํ๋ก๊ทธ๋๋ฐ (HTML, CSS, JS ๋ถ๋ฆฌ) | JS๋ก ์ด๋ฒคํธ ์ฒ๋ฆฌ + Ajax ์์ฒญ ์ถ๊ฐ | ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ๊ฐ๋ฐ (UI๋ฅผ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋จ์๋ก ๋ถ๋ฆฌ) |
์ ์ง๋ณด์์ฑ | ์ฝ๋๊ฐ ๊ธธ์ด์ง์๋ก ๋ณต์กํด์ง (์ฝ๋ฐฑ ์ง์ฅ ๋ฐ์) | Ajax ์์ฒญ์ด ๋ง์์ง์๋ก ๋ณต์กํด์ง | ์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ผ๋ก ์ฝ๋๊ฐ ๋ช ํํ๊ณ ์ ์ง๋ณด์ ์ฌ์ |
์ฌ์ฉ ์ฌ๋ก | ์ ์ ์ธ ์น ํ์ด์ง, ๊ฐ๋จํ ๊ธฐ๋ฅ ์ถ๊ฐ | ๊ฒ์ ์๋์์ฑ, ๋๊ธ ๋ถ๋ฌ์ค๊ธฐ ๋ฑ ์ผ๋ถ ๋์ ์์ | ๋๊ท๋ชจ SPA(Single Page Application), ๋ณต์กํ UI |
โ ์ ๋ฆฌ:
- ๊ธฐ์กด JavaScript๋ ์ง์ DOM์ ์กฐ์ํด์ผ ํด์ ๋นํจ์จ์ ์ด๊ณ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์
- Ajax๋ ๋น๋๊ธฐ ์์ฒญ์ ํตํด ์ผ๋ถ UI๋ฅผ ๊ฐฑ์ ํ ์ ์์ง๋ง, ์ฌ์ ํ ์๋์ ์ธ DOM ์กฐ์์ด ํ์
- React๋ ๊ฐ์ DOM๊ณผ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ๊ฐ๋ฐ์ ํตํด ์ฑ๋ฅ ์ต์ ํ + ์ ์ง๋ณด์์ฑ์ ๋์
๐ฅ ์ฆ, Ajax๋ก ๋ณต์กํ UI๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ํ๊ณ์ ๋๋ฌํ๋ฉด์ React ๊ฐ์ ํ๋ ์์ํฌ๊ฐ ๋ฑ์ฅํ ๊ฒ!
โ React์ Ajax ์์ฒญ ํ UI ์๋ ์ ๋ฐ์ดํธ๋ฅผ ๋์์ธ ํจํด์ผ๋ก ์ค๋ช
React์์ Ajax ์์ฒญ์ ๋ฐ์ UI๋ฅผ ์๋ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ์์ ๋ํ์ ์ผ๋ก Observer ํจํด, MVVM ํจํด, ํ ํจํด(Hooks Pattern) ๋ฑ
๐น 1. Observer ํจํด (๊ด์ฐฐ์ ํจํด) - ์ํ ๋ณ๊ฒฝ ๊ฐ์ง & UI ์ ๋ฐ์ดํธ
"React๋ ์ํ(State)๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์๋์ผ๋ก UI๋ฅผ ์ ๋ฐ์ดํธํ๋ฏ๋ก, Observer ํจํด๊ณผ ์ ์ฌํ ๋ฐฉ์์ผ๋ก ๋์ํจ."
โ Observer ํจํด ๊ฐ๋
- ์ฃผ์ฒด(Subject): ์ํ(State)
- ๊ด์ฐฐ์(Observer): React ์ปดํฌ๋ํธ (UI)
- ๋ณ๊ฒฝ ๊ฐ์ง (Subscription): ์ํ(State)๊ฐ ๋ณ๊ฒฝ๋ ๋ ์๋์ผ๋ก UI๊ฐ ์ ๋ฐ์ดํธ๋จ
โ React์์ Observer ํจํด ์ ์ฉ ์์
import { useState, useEffect } from "react";
function ObserverPatternExample() {
const [data, setData] = useState([]); // ์ํ(Subject)
useEffect(() => {
fetch("https://jsonplaceholder.typicode.com/posts")
.then((res) => res.json())
.then((json) => setData(json)); // ์ํ ๋ณ๊ฒฝ โ UI ์๋ ์
๋ฐ์ดํธ (Observer ํจํด)
}, []);
return (
<ul>
{data.map((item) => (
<li key={item.id}>{item.title}</li>
))}
</ul>
);
}
โ Observer ํจํด ์ ์ฉ ๋ฐฉ์
- useState๋ก ์ฃผ์ฒด(Subject) ์ญํ ์ ํ๋ ์ํ๋ฅผ ์์ฑ
- useEffect์์ Ajax ์์ฒญ ํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ํ๋ฅผ ์ ๋ฐ์ดํธ
- ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ฉด React๊ฐ ์ด๋ฅผ ๊ฐ์งํ๊ณ , UI(Observer)๊ฐ ์๋์ผ๋ก ์ ๋ฐ์ดํธ๋จ
๐น 2. MVVM ํจํด - UI(View)์ ์ํ(Model) ๋ถ๋ฆฌ
React์ ์ํ ๊ด๋ฆฌ ๋ฐฉ์์ MVVM(Model-View-ViewModel) ํจํด๊ณผ ์ ์ฌํจ.
โ MVVM ํจํด ๊ฐ๋
- Model (๋ฐ์ดํฐ): Ajax ์์ฒญ์ ํตํด ๊ฐ์ ธ์จ ์๋ฒ ๋ฐ์ดํฐ
- ViewModel (์ํ ๊ด๋ฆฌ & ๋ก์ง): useState์ useEffect๋ฅผ ํ์ฉํ์ฌ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
- View (UI): ์ํ(ViewModel)์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ํ๋ฉด์ ๋ ๋๋ง
โ React์์ MVVM ํจํด ์ ์ฉ ์์
function PostViewModel() {
const [data, setData] = useState([]);
useEffect(() => {
fetch("https://jsonplaceholder.typicode.com/posts")
.then((res) => res.json())
.then((json) => setData(json));
}, []);
return { data }; // ViewModel ์ญํ
}
function MVVMExample() {
const { data } = PostViewModel(); // ViewModel์์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ค๊ธฐ
return (
<ul>
{data.map((item) => (
<li key={item.id}>{item.title}</li>
))}
</ul>
);
}
โ MVVM ์ ์ฉ ๋ฐฉ์
- PostViewModel์์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ณ , ์ด๋ฅผ UI ์ปดํฌ๋ํธ(MVVMExample)์์ ๊ฐ์ ธ์ ๋ ๋๋งํจ.
- ๋ฐ์ดํฐ ๋ก์ง๊ณผ UI๊ฐ ๋ถ๋ฆฌ๋๋ฏ๋ก ์ฌ์ฌ์ฉ์ฑ๊ณผ ์ ์ง๋ณด์์ฑ์ด ํฅ์๋จ.
๐น 3. ํ ํจํด (Hooks Pattern) - ๋ฐ์ดํฐ ๋ก์ง์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ๋ถ๋ฆฌ
React์ useState, useEffect๋ฅผ ํ์ฉํ์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ์ฌ์ฌ์ฉํ๋ ํจํด
โ Hooks ํจํด ๊ฐ๋
- Custom Hook์ ๋ง๋ค์ด์ Ajax ์์ฒญ ๋ก์ง์ ๋ถ๋ฆฌ
- ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅ
โ React์์ ํ ํจํด ์ ์ฉ ์์
function useFetchData(url) {
const [data, setData] = useState([]);
useEffect(() => {
fetch(url)
.then((res) => res.json())
.then((json) => setData(json));
}, [url]); // URL์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๋ค์ ์คํ
return data;
}
function HooksPatternExample() {
const data = useFetchData("https://jsonplaceholder.typicode.com/posts");
return (
<ul>
{data.map((item) => (
<li key={item.id}>{item.title}</li>
))}
</ul>
);
}
โ Hooks ํจํด ์ ์ฉ ๋ฐฉ์
- useFetchData(url) ํ ์ ๋ง๋ค์ด์ Ajax ์์ฒญ์ ์ฒ๋ฆฌ
- UI ์ปดํฌ๋ํธ(HooksPatternExample)์์ useFetchData()๋ฅผ ํธ์ถํ์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ๋ ๋๋ง
๐น ์ฅ์ :
- ๋ฐ์ดํฐ ์์ฒญ ๋ก์ง์ด ๋ถ๋ฆฌ๋์ด ์ฌ์ฌ์ฉ์ฑ์ด ๋์์ง
- ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ๋์ผํ ๋ฐ์ดํฐ ๋ก์ง์ ๊ณต์ ํ ์ ์์
โ 4. ๋์์ธ ํจํด๋ณ ๋น๊ต ์ ๋ฆฌ
ํจํด | ๊ฐ๋ | React์์์ ์ ์ฉ ๋ฐฉ์ | ํน์ง |
Observer ํจํด | ์ํ ๋ณ๊ฒฝ์ ๊ฐ์งํ์ฌ UI ์๋ ์ ๋ฐ์ดํธ | useState๋ก ์ํ ๊ด๋ฆฌ, ์ํ ๋ณ๊ฒฝ ์ React๊ฐ ์๋ ๋ ๋๋ง | React์ ๊ธฐ๋ณธ ๋์๊ณผ ์ ์ฌ |
MVVM ํจํด | Model๊ณผ View๋ฅผ ๋ถ๋ฆฌํ์ฌ ์ ์ง๋ณด์์ฑ ํฅ์ | ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ก์ง์ ViewModel๋ก ๋ถ๋ฆฌ (useState, useEffect) | ๋ก์ง๊ณผ UI๋ฅผ ๋ถ๋ฆฌํ์ฌ ์ฌ์ฌ์ฉ์ฑ ์ฆ๊ฐ |
ํ ํจํด | ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํจ์๋ก ๊ด๋ฆฌ | useFetchData() ๊ฐ์ Custom Hook ํ์ฉ | ๋น์ฆ๋์ค ๋ก์ง์ ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ๊ณต์ ๊ฐ๋ฅ |
๐ฅ ๊ฒฐ๋ก
- React์ ์ํ(State)์ UI๋ Observer ํจํด์ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ์ฌ, ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ฉด ์๋์ผ๋ก UI๊ฐ ์ ๋ฐ์ดํธ๋จ.
- MVVM ํจํด์ ์ ์ฉํ๋ฉด ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ก์ง๊ณผ UI๊ฐ ๋ถ๋ฆฌ๋์ด ์ ์ง๋ณด์๊ฐ ์ฌ์์ง.
- Hooks ํจํด์ ํ์ฉํ๋ฉด Ajax ์์ฒญ ๋ก์ง์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ๋ง๋ค ์ ์์.
๐ ์ฆ, React๋ Observer ํจํด์ ๊ธฐ๋ณธ์ผ๋ก ํ๋ฉด์ MVVM๊ณผ Hooks ํจํด์ ์กฐํฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง! ๐
์ฐธ๊ณ
npm vs npx
โ npm๊ณผ npx์ ์ฐจ์ด: ์์กด์ฑ ๋๊ตฌ ๋ฐ ์คํ๊ธฐ
npm๊ณผ npx๋ ๋ชจ๋ Node.js ์ํ๊ณ์์ ์ฌ์ฉ๋์ง๋ง, ๋ชฉ์ ๊ณผ ๋์ ๋ฐฉ์์ ์ฐจ์ด๊ฐ ์์.
์๋ ํ๋ฅผ ํตํด ์ด ๋ ๋๊ตฌ์ ์ฐจ์ด์ ์ ๋ช
ํํ ์ดํดํ ์ ์์.
๐น 1. npm (Node Package Manager)
๊ธฐ๋ฅ | JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํจํค์ง๋ฅผ ์ค์น, ๊ด๋ฆฌ |
์ค์น | npm install <ํจํค์ง> ๋ช ๋ น์ด๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น |
ํ๋ก์ ํธ ๊ด๋ฆฌ | ๊ฐ ํ๋ก์ ํธ๋ง๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น, node_modules ํด๋์ ์ ์ฅ |
๊ธ๋ก๋ฒ ์ค์น | npm install -g <ํจํค์ง>๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ญ์ ์ผ๋ก ์ค์น ๊ฐ๋ฅ |
๋น๋ | ์ค์น๋ ํจํค์ง๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ก์ ํธ๋ฅผ ๋น๋ |
์บ์ฑ | ํ ๋ฒ ์ค์น๋ ํจํค์ง๋ ๋ก์ปฌ ์บ์์ ์ ์ฅ๋์ด ๋ค์ ์ค์น ์ ์ฌ์ฌ์ฉ |
์์ | ํน์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฒ์ ์ ๋ช ์ํ์ฌ ์ค์นํ ์ ์์ (npm install react@17) |
โ 2. npx (Node Package Executor)
๊ธฐ๋ฅ | ํจํค์ง๋ฅผ ๋ค์ด๋ก๋ํ๊ณ ์คํํ๋ ๋๊ตฌ |
์ฌ์ฉ๋ฒ | npx <ํจํค์ง> ๋ช ๋ น์ด๋ก ์ผํ์ฑ ํจํค์ง ์คํ |
์ค์น | ํจํค์ง๋ฅผ ์๋์ผ๋ก ๋ค์ด๋ก๋ํ๊ณ ์คํ, ๋ก์ปฌ์ ์ค์นํ์ง ์์ |
์ฌ์ฌ์ฉ | ์ด๋ฏธ ์ค์น๋ ํจํค์ง๊ฐ ์๋ค๋ฉด ์ด๋ฅผ ์ฌ์ฌ์ฉ, ์์ผ๋ฉด ์๋ก ๋ค์ด๋ก๋ |
์คํ ํ ์ญ์ | ํจํค์ง๋ฅผ ์คํ ํ ์๋์ผ๋ก ์ญ์ ๋๋ฏ๋ก ์์คํ ์ ์์ฌ ํ์ผ์ด ๋จ์ง ์์ |
์์ | npx create-react-app my-app์ผ๋ก React ์ฑ ์์ฑ ํ ๋ฐ๋ก ์คํ ๊ฐ๋ฅ |
๐น 3. npm๊ณผ npx์ ์ฌ์ฉ ์์
โ (1) npm ์ฌ์ฉ ์์
- ์ฌ๋ฌ ํ๋ก์ ํธ์์ React ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ๊ฐ ์ค์น:
# ํ๋ก์ ํธ1
npm install react
# ํ๋ก์ ํธ2
npm install react
# ํ๋ก์ ํธ3
npm install react
- ๊ฐ ํ๋ก์ ํธ์ node_modules์ React๊ฐ ๋ณ๋๋ก ์ค์น๋จ.
โ (2) npx ์ฌ์ฉ ์์
- npx๋ฅผ ์ฌ์ฉํ์ฌ ๋์ผํ ํจํค์ง๋ฅผ ํ ๋ฒ์ ์คํ:
npx create-react-app my-app-1 npx create-react-app my-app-2 npx create-react-app my-app-3
- ํ์ํ ๊ฒฝ์ฐ์๋ง ํจํค์ง๊ฐ ๋ค์ด๋ก๋๋๊ณ , ์ดํ ์ฌ์ฉ์ด ๋๋๋ฉด ์บ์์์ ์ญ์ ๋จ.
๐ฅ ๊ฒฐ๋ก
- npm์ ์ฃผ๋ก ํจํค์ง๋ฅผ ์ค์นํ๊ณ ๊ด๋ฆฌํ๋ ๋๊ตฌ๋ก, ๊ฐ ํ๋ก์ ํธ๋ง๋ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค์ด๋ก๋ํ์ฌ ์ฌ์ฉํ๋ ๋ฐ๋ฉด,
- npx๋ ํจํค์ง๋ฅผ ๋ค์ด๋ก๋ํ์ฌ ์คํํ๋ ๋๊ตฌ๋ก, ์ด๋ฏธ ์ค์น๋ ํจํค์ง๋ฅผ ์ฌ์ฌ์ฉํ๊ฑฐ๋ ์๋ ๊ฒฝ์ฐ์๋ง ๋ค์ด๋ก๋ํ์ฌ ์ผํ์ฑ์ผ๋ก ์ฌ์ฉํจ.
- npx๋ฅผ ์ฌ์ฉํ๋ฉด ์์คํ ์ ๋ถํ์ํ ํ์ผ์ ์ค์ผ ์ ์์ผ๋ฉฐ, ํ๋ก์ ํธ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ด๋ฆฌ๊ฐ ๋์ฑ ์ฉ์ดํด์ง.
๐ ๋ฐ๋ผ์, ํ์์ ๋ฐ๋ผ ๋ ๋๊ตฌ๋ฅผ ์ ์ ํ ํ์ฉํ๋ ๊ฒ์ด ์ค์! ๐
โ ๋ฆฌ์กํธ ์ด๊ธฐ ์ค์ ๋ฒ์ ์ญ์ฌ
๋ฆฌ์กํธ ์ด๊ธฐ ์ค์ ๋ฒ์ ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ณํํด์์ผ๋ฉฐ, ๋ค์ํ ๋๊ตฌ์ ๋ฐฉ๋ฒ์ด ๋ฑ์ฅํ์ฌ ๊ฐ๋ฐ์์๊ฒ ๋ณด๋ค ๋์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
๐น 1. ์ด๊ธฐ ์ค์ (2013-2015)
โ (1) ์ง์ ์ค์ ํ๊ธฐ
- ์ค๋ช : ์ด๊ธฐ์๋ ๋ฆฌ์กํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด Babel, Webpack ๋ฑ์ ๋๊ตฌ๋ฅผ ์๋์ผ๋ก ์ค์ ํด์ผ ํ์ต๋๋ค.
- ๋จ์ : ๋ณต์กํ ์ค์ ๊ณผ์ ์ผ๋ก ์ธํด ๋ง์ ์๊ฐ์ด ์์๋์๊ณ , ์ด๋ณด์์๊ฒ ์ง์ ์ฅ๋ฒฝ์ด ๋์์ต๋๋ค.
๐น 2. Create React App์ ๋ฑ์ฅ (2016)
โ (1) Create React App
- ์ค๋ช : Facebook์์ ์ ๊ณตํ๋ create-react-app ๋ช ๋ น์ด๋ก ๋ฆฌ์กํธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฝ๊ฒ ์์ฑํ ์ ์๊ฒ ๋์์ต๋๋ค.
- ํน์ง: ๊ธฐ๋ณธ์ ์ธ ์ค์ ์ด ๋ฏธ๋ฆฌ ๊ตฌ์ฑ๋์ด ์์ด, ๊ฐ๋ฐ์๋ ์ฝ๋ ์์ฑ์ ์ง์คํ ์ ์๊ฒ ๋์์ต๋๋ค.
- ์ฅ์ : ๋ฒ๋ค๋ฌ, Babel, ESLint ๋ฑ์ ์ค์ ์ด ์๋์ผ๋ก ์ด๋ฃจ์ด์ ธ, ์ด๋ณด์๋ ์ฝ๊ฒ ๋ฆฌ์กํธ ํ๋ก์ ํธ๋ฅผ ์์ํ ์ ์๊ฒ ํด์ฃผ์์ต๋๋ค.
๐น 3. Vite์์ ํตํฉ (2020 ์ดํ)
โ (1) Vite์ ๋ฑ์ฅ
- ์ค๋ช : Vite๋ ์ต์ ํ๋ก ํธ์๋ ๋น๋ ๋๊ตฌ๋ก, ๋น ๋ฅธ ๊ฐ๋ฐ ์๋ฒ์ ํจ์จ์ ์ธ ๋น๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ํน์ง: ES ๋ชจ๋์ ํ์ฉํ ๋น ๋ฅธ Hot Module Replacement(HMR)๋ก ๊ฐ๋ฐ ์๋๋ฅผ ํฅ์์ํต๋๋ค.
โ (2) Create Vite App
- ์ค๋ช : npm create vite@latest ๋ช ๋ น์ด๋ฅผ ํตํด ๋ฆฌ์กํธ ํ๋ก์ ํธ๋ฅผ ๊ฐํธํ๊ฒ ์์ฑํ ์ ์์ต๋๋ค.
- ์ฅ์ : Vite๋ฅผ ํ์ฉํ ์ค์ ์ ์๋๊ฐ ๋น ๋ฅด๊ณ , ์ต์ ๊ธฐ๋ฅ์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ์ง์ํฉ๋๋ค.
๐น 4. ํ๋์ ์ธ ๋๊ตฌ์ ์ ๊ทผ ๋ฐฉ์ (ํ์ฌ)
โ (1) ๋ชจ๋ ํ๋ ์์ํฌ์ ํตํฉ
- ์ค๋ช : Next.js, Remix์ ๊ฐ์ ํ๋์ ์ธ ํ๋ ์์ํฌ๊ฐ ๋ฆฌ์กํธ ์ํ๊ณ์ ํตํฉ๋์ด ๋ ๋ง์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ์์ต๋๋ค.
- ํน์ง: ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง(SSR), ์ ์ ์ฌ์ดํธ ์์ฑ(SSG) ๋ฑ์ ๊ธฐ๋ฅ์ ํตํด SEO์ ์ฑ๋ฅ์ ๊ฐ์ ํฉ๋๋ค.
โ (2) TypeScript์์ ๊ฒฐํฉ
- ์ค๋ช : TypeScript๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ ํ์ ๊ฒ์ฌ๋ฅผ ํตํ ์์ ์ฑ์ ์ ๊ณตํ๋ฉฐ, ์ฝ๋ ํ์ง์ ๋์ ๋๋ค.
- ์ฅ์ : ๋ฆฌ์กํธ์ TypeScript๋ฅผ ํจ๊ป ์ฌ์ฉํ๋ฉด ์ค๋ฅ๋ฅผ ์ฌ์ ์ ๋ฐฉ์งํ๊ณ , ๋ ๋์ ๊ฐ๋ฐ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
๐ฅ ๊ฒฐ๋ก
- ๋ฆฌ์กํธ ์ด๊ธฐ ์ค์ ๋ฒ์ ๋ณต์กํ ์๋ ์ค์ ์์ create-react-app, Vite์ ๊ฐ์ ๊ฐํธํ ๋๊ตฌ๋ก ๋ฐ์ ํด์์ต๋๋ค.
- ํ์ฌ๋ Next.js์ TypeScript์ ๊ฐ์ ์ต์ ๋๊ตฌ๋ฅผ ํตํด ๋์ฑ ํจ์จ์ ์ด๊ณ ๊ฐ๋ ฅํ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค! ๐
โ VSCode ํ์ฅ: ESLint, Prettier, Reactjs Code Snippets
์ด ์ธ ๊ฐ์ง VSCode ํ์ฅ์ ๋ฆฌ์กํธ ๊ฐ๋ฐ์ ๋ณด๋ค ํจ์จ์ ์ด๊ณ ํธ๋ฆฌํ๊ฒ ๋ง๋ค์ด ์ค๋๋ค. ๊ฐ๊ฐ์ ํน์ง๊ณผ ๊ฐ๋จํ ์ฌ์ฉ๋ฒ์ ์๋์์ ์ค๋ช ํฉ๋๋ค.
๐น 1. ESLint
โ (1) ํน์ง
- ์ฝ๋ ํ์ง ๊ฒ์ฌ: JavaScript ๋ฐ JSX ์ฝ๋์์ ์ฝ๋ ์คํ์ผ๊ณผ ์ค๋ฅ๋ฅผ ์๋์ผ๋ก ๊ฒ์ฌํฉ๋๋ค.
- ๊ฐ๋ฐ์ ๋ง์ถค ์ค์ : ํ๋ก์ ํธ์ ๋ง๋ ๊ท์น์ ์ค์ ํ ์ ์์ผ๋ฉฐ, ํ ๋ด ๊ท์น์ ์ผ๊ด๋๊ฒ ์ ์งํ ์ ์์ต๋๋ค.
โ (2) ๊ฐ๋จํ ์ฌ์ฉ๋ฒ
- ํ์ฅ ์ค์น: VSCode์์ 'ESLint'๋ฅผ ๊ฒ์ํ์ฌ ์ค์นํฉ๋๋ค.
- ํ๋ก์ ํธ ์ค์ :
- ํ๋ก์ ํธ ๋ฃจํธ์ .eslintrc.js ๋๋ .eslintrc.json ํ์ผ์ ์์ฑํ๊ณ , ์ํ๋ ๊ท์น์ ์ค์ ํฉ๋๋ค.
- ์์:
{ "extends": "eslint:recommended", "env": { "browser": true, "es2021": true }, "rules": { "no-unused-vars": "warn" } }
- ์๋ ๊ฒ์ฌ: ์ฝ๋ ํ์ผ์ ์ ์ฅํ ๋๋ง๋ค ์๋์ผ๋ก ESLint๊ฐ ์๋ํ์ฌ ์ค๋ฅ๋ฅผ ํ์ํฉ๋๋ค.
๐น 2. Prettier
โ (1) ํน์ง
- ์ฝ๋ ํฌ๋งทํ : ์ฝ๋ ์คํ์ผ์ ์๋์ผ๋ก ์ผ๊ด๋๊ฒ ์ ์งํ์ฌ, ๊ฐ๋ ์ฑ์ ๋์ด๊ณ ๋ถํ์ํ ์คํ์ผ ๋ ผ์์ ์ค์ ๋๋ค.
- ๋ค์ํ ์ธ์ด ์ง์: JavaScript, TypeScript, HTML, CSS ๋ฑ ๋ค์ํ ์ธ์ด๋ฅผ ์ง์ํฉ๋๋ค.
โ (2) ๊ฐ๋จํ ์ฌ์ฉ๋ฒ
- ํ์ฅ ์ค์น: VSCode์์ 'Prettier - Code formatter'๋ฅผ ๊ฒ์ํ์ฌ ์ค์นํฉ๋๋ค.
- ํ๋ก์ ํธ ์ค์ :
- ํ๋ก์ ํธ ๋ฃจํธ์ .prettierrc ํ์ผ์ ์์ฑํ๊ณ , ์ํ๋ ํฌ๋งทํ ๊ท์น์ ์ค์ ํฉ๋๋ค.
- ์์:
{ "semi": true, // ๋ฌธ์ฅ์ ๋์ ์ธ๋ฏธ์ฝ๋ก ์ถ๊ฐ "singleQuote": true, // ๋ฌธ์์ด์ ์ฑ๊ธ ์ฟผํธ ์ฌ์ฉ "tabWidth": 2, // ํญ ํญ ์ค์ "useTabs": false, // ํญ ๋์ ๊ณต๋ฐฑ ์ฌ์ฉ "printWidth": 80, // ์ค ๋๋น ์ค์ "trailingComma": "all", // ์ ํจํ ๊ฐ์ฒด์ ๋ง์ง๋ง ํญ๋ชฉ์ ์ผํ ์ถ๊ฐ "bracketSpacing": true, // ๊ฐ์ฒด ๋ฆฌํฐ๋ด์์ ๊ดํธ ์ฌ์ด์ ๊ณต๋ฐฑ ์ถ๊ฐ "jsxBracketSameLine": false, // JSX์์ ๋ซ๋ ๊ดํธ๋ฅผ ๋ค์ ์ค๋ก ์ด๋ "arrowParens": "always" // ํ์ดํ ํจ์์์ ๊ดํธ ํญ์ ์ฌ์ฉ }
- ์๋ ํฌ๋งทํ : ํ์ผ์ ์ ์ฅํ ๋ Prettier๊ฐ ์๋์ผ๋ก ์ฝ๋๋ฅผ ํฌ๋งทํ ํฉ๋๋ค. ๋๋ Shift + Alt + F๋ก ์๋ ํฌ๋งทํ ์ด ๊ฐ๋ฅํฉ๋๋ค.
๐น 3. Reactjs Code Snippets
โ (1) ํน์ง
- ์ฝ๋ ์ค๋ํซ ์ ๊ณต: ๋ฆฌ์กํธ ๊ฐ๋ฐ ์ ์์ฃผ ์ฌ์ฉํ๋ ์ฝ๋ ํ ํ๋ฆฟ์ ๊ฐํธํ๊ฒ ์ ๋ ฅํ ์ ์๊ฒ ๋์์ค๋๋ค.
- ํจ์จ์ ์ธ ์ฝ๋ ์์ฑ: ์์ฃผ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ๋ ํ , ํจ์ ๋ฑ์ ๋น ๋ฅด๊ฒ ์์ฑํ ์ ์์ต๋๋ค.
โ (2) ๊ฐ๋จํ ์ฌ์ฉ๋ฒ
- ํ์ฅ ์ค์น: VSCode์์ 'ES7+ React/Redux/React-Native snippets'๋ฅผ ๊ฒ์ํ์ฌ ์ค์นํฉ๋๋ค.
- ์ฝ๋ ์ค๋ํซ ์ฌ์ฉ: ์ํ๋ ์ฝ๋ ์ค๋ํซ์ ์
๋ ฅํ๊ณ Tab ํค๋ฅผ ๋๋ฌ ํด๋น ์ค๋ํซ์ ํ์ฅํฉ๋๋ค.
- ์์:
- rafce๋ฅผ ์ ๋ ฅํ๊ณ Tab์ ๋๋ฅด๋ฉด ํ์ดํ ํจ์ํ ์ปดํฌ๋ํธ ์ค๋ํซ์ด ์์ฑ๋ฉ๋๋ค.
- rcc๋ฅผ ์ ๋ ฅํ๊ณ Tab์ ๋๋ฅด๋ฉด ํด๋์คํ ์ปดํฌ๋ํธ ์ค๋ํซ์ด ์์ฑ๋ฉ๋๋ค.
- ์์:
๐ฅ ๊ฒฐ๋ก
- ESLint๋ ์ฝ๋ ํ์ง์ ์ ์งํ๊ณ , Prettier๋ ์ฝ๋ ํฌ๋งทํ ์ ๋ด๋นํ๋ฉฐ, Reactjs Code Snippets๋ ๋ฆฌ์กํธ ๊ฐ๋ฐ์ ๋์ฑ ํจ์จ์ ์ผ๋ก ๋ง๋ค์ด ์ค๋๋ค.
- ์ด ์ธ ๊ฐ์ง ํ์ฅ์ ํ์ฉํ์ฌ ๋ฆฌ์กํธ ํ๋ก์ ํธ์์ ์ผ๊ด๋ ์ฝ๋ ์คํ์ผ๊ณผ ํ์ง์ ์ ์งํ ์ ์์ต๋๋ค! ๐