[React] ๐Ÿ“œSPA _Single Page Application

TATAยท2023๋…„ 1์›” 24์ผ
0

React

๋ชฉ๋ก ๋ณด๊ธฐ
2/32

โœ”๏ธ SPA๋ž€?

Single Page Application

SPA๋ž€ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ,
ํ™”๋ฉด์„ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์„œ๋ฒ„์—์„œ ์ „๋‹ฌ๋ฐ›์•„ ๋ธŒ๋ผ์šฐ์ €์—์„œ
ํ•ด๋‹นํ•˜๋Š” ๋ถ€๋ถ„๋งŒ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ ์›น ์‚ฌ์ดํŠธ๋ฅผ ๋งํ•œ๋‹ค.


๐Ÿ“œ SPA์˜ ์žฅ์ 

๋น ๋ฅธ ์—…๋ฐ์ดํŠธ์™€ ๋ Œ๋”๋ง ์†๋„, ์ž์—ฐ์Šค๋Ÿฌ์šด UI
DOM์„ ์ง์ ‘ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์—…๋ฐ์ดํŠธํ•ด์•ผ ํ•  ์ตœ์†Œํ•œ์˜ ๋ถ€๋ถ„๋งŒ ์ฐพ์•„์„œ ๋ณ€๊ฒฝํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅธ ์—…๋ฐ์ดํŠธ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ , ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ์—…๋ฐ์ดํŠธ ํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ์— ๊นœ๋นก์ž„์ด ์—†๋‹ค.

์žฌ์‚ฌ์šฉ์„ฑ
๋ฆฌ์•กํŠธ๋Š” ๋ชจ๋“  ํŽ˜์ด์ง€๊ฐ€ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌ์„ฑ๋˜์–ด์ ธ ์žˆ๊ณ , ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๋Š” ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ ˆ๊ณ  ๋ธ”๋ก์„ ์กฐ๋ฆฝํ•˜๋“ฏ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ์— ์žฌ์‚ฌ์šฉ์„ฑ์ด ์ข‹๋‹ค.

ํ™œ๋ฐœํ•œ ์ง€์‹๊ณต์œ  ๋ฐ ์ปค๋ฎค๋‹ˆํ‹ฐ
๋‹ค์ˆ˜๊ฐ€ ์‚ฌ์šฉํ•˜๊ธฐ์— ๋ชจ๋ฅด๋Š” ๊ฒƒ์„ ๋ฐ”๋กœ๋ฐ”๋กœ ์ฐพ์•„์„œ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

React Native
๋ณ„๋„์˜ ์–ธ์–ด๋ฅผ ๋ฐฐ์›Œ ๋ชจ๋ฐ”์ผ ์•ฑ์„ ๊ฐœ๋ฐœํ•˜์ง€ ์•Š๊ณ ,
React Native๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ ๊ฐœ๋ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.
(์•ˆ๋“œ๋กœ์ด๋“œ ์•ฑ๊ณผ IOS ๋™์‹œ์— ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ)


๐Ÿ“œ SPA์˜ ๋‹จ์ 

๋ฌด๊ฑฐ์šด JavScript ํŒŒ์ผ
์ฒซ ํ™”๋ฉด ๋กœ๋”ฉ ์‹œ ์ฝ์–ด๋“ค์ธ HTML ํŒŒ์ผ์€ ๊ฑฐ์˜ ๋น„์–ด์žˆ๊ณ , ๋Œ€๋ถ€๋ถ„์˜ ์ฝ”๋“œ๋Š” JavaScript ํŒŒ์ผ ์•ˆ์— ๋“ค์–ด์žˆ๋‹ค ๋ณด๋‹ˆ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ JavaScript ํŒŒ์ผ์ด ๋ฌด๊ฑฐ์›Œ์ง„๋‹ค. ์ฆ‰, JavaScript ํŒŒ์ผ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„์œผ๋กœ ์ธํ•ด ์ฒซ ํ™”๋ฉด ๋กœ๋”ฉ ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง„๋‹ค๋Š” ๊ฒƒ.

๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”(SEO)์— ๋ถˆ๋ฆฌ
๊ฒ€์ƒ‰ ๋กœ๋ด‡์€ ์ž๋ฃŒ๋ฅผ ์ˆ˜์ง‘ํ•  ๋•Œ์— ์›น ํŽ˜์ด์ง€์˜ URL์€ ๋ฌผ๋ก ์ด๊ณ  HTML ๋ฌธ์„œ ๋‚ด์˜ ๊ฐ์ข… ํƒœ๊ทธ๋‚˜ ๋งํฌ ๋“ฑ์„ ๋ถ„์„ํ•œ๋‹ค. SPA๋Š” HTML์ด ๊ฑฐ์˜ ๋น„์–ด์žˆ๋‹ค ๋ณด๋‹ˆ ๊ฒ€์ƒ‰ ๋กœ๋ด‡์ด ์ถฉ๋ถ„ํ•œ ์ž๋ฃŒ๋ฅผ ์ˆ˜์ง‘ํ•˜์ง€ ๋ชปํ•œ๋‹ค. (ํ•˜์ง€๋งŒ, SSR๋กœ ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•˜๋‹ค.)

๋†’์€ ์ƒํƒœ๊ด€๋ฆฌ ๋ณต์žก๋„
React ์—์„œ๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” State๋ฅผ ์ž˜ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.
์›น์‚ฌ์ดํŠธ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ ธ์„œ ์ปดํฌ๋„ŒํŠธ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋งŽ์•„์ง€๋ฉด ์ƒํƒœ๊ด€๋ฆฌ์˜ ๋ณต์žก๋„๋„ ์ฆ๊ฐ€ํ•˜๊ธฐ์— State๋ฅผ ์ž˜ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์–ด๋ ต๋‹ค. ๊ทธ๋ž˜์„œ ๋ณดํ†ต ํฐ ๊ทœ๋ชจ์˜ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ Redux, Recoil , Mobx ์™€ ๊ฐ™์€ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ƒˆ๋กœ์šด ๋ฒ„์ „์— ๋Œ€ํ•œ ํ•™์Šต ์š”๊ตฌ
์ƒˆ๋กญ๊ฒŒ ๊ณต๋ถ€ํ• ๊ฒŒ ๋งŽ๋‹ค..


โœš ์ฐธ๊ณ 

๐Ÿ“œ Dynamic Import

dynamic import๋Š” thenํ•จ์ˆ˜๋ฅผ
์‚ฌ์šฉํ•ด ํ•„์š”ํ•œ ์ฝ”๋“œ๋งŒ ๊ฐ€์ ธ์˜จ๋‹ค.

์ด ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ฒˆ๋“ค๋ง ์‹œ ๋ถ„ํ• ๋œ ์ฝ”๋“œ(์ฒญํฌ)๋ฅผ
์ง€์—ฐ ๋กœ๋”ฉ์‹œํ‚ค๊ฑฐ๋‚˜ ์š”์ฒญ ์‹œ์— ๋กœ๋”ฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๋ ‡๊ฒŒ ์‚ฌ์šฉ์ž๊ฐ€ from์„ ํ†ตํ•ด ์–‘์‹์„
์ œ์ถœํ•œ ๊ฒฝ์šฐ์—๋งŒ ๊ฐ€์ ธ์˜ค๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

form.addEventListener("submit", e => {
  e.preventDefault();
	/* ๋™์  ๋ถˆ๋Ÿฌ์˜ค๊ธฐ๋Š” ์ด๋Ÿฐ ์‹์œผ๋กœ ์ฝ”๋“œ์˜ ์ค‘๊ฐ„์— ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ๋‹ค. */
  import('library.moduleA')
    .then(module => module.default)
    .then(someFunction())
    .catch(handleError());
});

const someFunction = () => {
    /* moduleA๋ฅผ ์—ฌ๊ธฐ์„œ ์‚ฌ์šฉํ•œ๋‹ค. */
}

dynamic import๋Š” React.lazy ์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ“œ createRoot API

React 18 ๋ฒ„์ „์—์„œ๋Š” createRoot API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์—
๋” ์ด์ƒ ReactDOM.render๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋‹ค.

/* React 18์ด์ „์˜ index.js */
const rootElement = document.getElementById("root");
ReactDOM.render(<AppTest />, rootElement);

-------
/* ๋ฐ”๋€ index.js */
import { createRoot } from "react-dom/client";

const rootElement = document.getElementById("root");
const root = createRoot(rootElement);

root.render(
    <App />
);

์ง€๊ธˆ๊นŒ์ง€๋Š” Concurrent Mode๋ผ๊ณ  ๋ถˆ๋ ธ์ง€๋งŒ,
์ด๋ฒˆ์— Concurrent Feature๋กœ ๋ฐ”๋€Œ๋ฉด์„œ ํ•˜๋‚˜์˜ ๊ธฐ๋Šฅ์œผ๋กœ ๋“ค์–ด์˜ค๊ฒŒ ๋˜์—ˆ๋‹ค.

๊ทธ ์ค‘์—๋Š” Suspense ๊ธฐ๋Šฅ์ด ์žˆ๋Š”๋ฐ, React 18 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š”
์ด Suspense ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜์—ฌ ๋…๋ฆฝ์ ์œผ๋กœ ๋ Œ๋”๋ง์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

profile
๐Ÿพ

0๊ฐœ์˜ ๋Œ“๊ธ€