Client Ajax

1. React ๋ฐ์ดํ„ฐ ํ๋ฆ„

  • React์˜ ๊ฐ€์žฅ ํฐ ํŠน์ง•์€ ํŽ˜์ด์ง€๊ฐ€ ์•„๋‹Œ, ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ์‹œ์ž‘ํ•œ๋‹ค๋Š” ์ 

  • ๋ฐ์ดํ„ฐ๋Š” ์œ„์—์„œ ์•„๋ž˜๋กœ ํ๋ฅธ๋‹ค : ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„ (one-way data flow)

  • state ๋Œ์–ด ์˜ฌ๋ฆฌ๊ธฐ๋กœ ์—ญ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„ ์ถ”๊ฐ€ โ†’ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์˜ "์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜" ๊ทธ ์ž์ฒด๋ฅผ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌํ•˜๊ณ , ์ด ํ•จ์ˆ˜๋ฅผ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์‹คํ–‰ํ•จ

(1) Side Effect (๋ถ€์ˆ˜ ํšจ๊ณผ)

let foo = 'hello';

function bar() {
    foo = 'world';
}

bar();
// ์ „์—ญ๋ณ€์ˆ˜ foo๋ฅผ bar ๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์ˆ˜์ •์‹œํ‚ค๊ธฐ์— bar๋Š” Side Effect๋ฅผ ๋ฐœ์ƒ์‹œํ‚ด
  • ํ•จ์ˆ˜ ๋‚ด์—์„œ ์–ด๋–ค ๊ตฌํ˜„์ด ํ•จ์ˆ˜ ์™ธ๋ถ€์— ์˜ํ–ฅ์„ ๋ผ์น˜๋Š” ๊ฒฝ์šฐ

  • React์—์„œ๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ fetch๋ฅผ ์‚ฌ์šฉํ•ด API ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์ด๋ฒคํŠธ๋ฅผ ํ™œ์šฉํ•ด DOM์„ ์ง์ ‘ ์กฐ์ž‘ํ•  ๋•Œ Side Effect๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ํ•จ

(2) Pure Function (์ˆœ์ˆ˜ ํ•จ์ˆ˜)

function upper(str) {
   return str.toUpperCase(); // toUpperCase ๋ฉ”์†Œ๋“œ๋Š” ์›๋ณธ์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š์Œ (Immutable)
} 
upper('hello') // 'HELLO'
  • ์˜ค์ง ํ•จ์ˆ˜์˜ ์ž…๋ ฅ๋งŒ์ด ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ ์˜๋ฏธ

  • ์ˆœ์ˆ˜ํ•จ์ˆ˜๋Š” ์ž…๋ ฅ์œผ๋กœ ์ „๋‹ฌ๋œ ๊ฐ’์„ ์ˆ˜์ •ํ•˜์ง€ ์•Š์Œ

  • ์ˆœ์ˆ˜ํ•จ์ˆ˜์—๋Š” ๋„คํŠธ์›Œํฌ ์š”์ฒญ๊ณผ ๊ฐ™์€ Side Effect์ด ์—†์Œ

  • ์–ด๋– ํ•œ ์ „๋‹ฌ์ธ์ž๊ฐ€ ์ฃผ์–ด์งˆ ๊ฒฝ์šฐ, ํ•ญ์ƒ ๋˜‘๊ฐ™์€ ๊ฐ’์ด ๋ฆฌํ„ด๋จ์„ ๋ณด์žฅํ•˜์—ฌ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜์ž„

(3) React์˜ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ

React์˜ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋Š” props๊ฐ€ ์ž…๋ ฅ์œผ๋กœ, javascript Element๊ฐ€ ์ถœ๋ ฅ์œผ๋กœ ๋‚˜๊ฐ€๋ฉฐ, ์—ฌ๊ธฐ์—” ๊ทธ ์–ด๋– ํ•œ Side Effect๋„ ์—†์œผ๋ฉฐ ์ˆœ์ˆ˜ ํ•จ์ˆ˜๋กœ ์ž‘๋™

function SingleTweet({writer, body, createdAt}) {
   return <div>
      <div>{writer}</div>
      <div>{body}</div>
      <div>{createdAt}</div>
   </div>
}

๋‹ค๋งŒ, ๋ณดํ†ต React ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž‘์„ฑ ์‹œ, AJAX ์š”์ฒญ์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ fetch API, LocalStorage ๋˜๋Š” ํƒ€์ด๋จธ์™€ ๊ฐ™์€ React์™€ ์ƒ๊ด€์—†๋Š” API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐœ์ƒ ๊ฐ€๋Šฅํ•˜๊ณ , ์ด๋Š” React ์ž…์žฅ์—์„œ๋Š” ๋ชจ๋‘ Side Effect์ž„

2. Effect Hook

(1) Effect Hook

  • useEffect๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ Side Effect๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” Hook์ž„.

  • useEffect์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋Š” ํ•จ์ˆ˜์ด๋ฉฐ, ํ•ด๋‹น ํ•จ์ˆ˜ ๋‚ด์—์„œ Side Effect๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋จ

  • ์‹คํ–‰๋˜๋Š” ๋•Œ: ๋งค๋ฒˆ ์ƒˆ๋กญ๊ฒŒ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋  ๋•Œ Effect Hook์ด ์‹คํ–‰๋จ

    • ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ ํ›„ ์ฒ˜์Œ ํ™”๋ฉด์— ๋ Œ๋”๋ง

    • ์ปดํฌ๋„ŒํŠธ์— ์ƒˆ๋กœ์šด props๊ฐ€ ์ „๋‹ฌ๋˜๋ฉฐ ๋ Œ๋”๋ง

    • ์ปดํฌ๋„ŒํŠธ์— ์ƒํƒœ(state)๊ฐ€ ๋ฐ”๋€Œ๋ฉฐ ๋ Œ๋”๋ง

  • ์ฃผ์˜ํ•  ์ 

    • ์ตœ์ƒ์œ„์—์„œ๋งŒ Hook์„ ํ˜ธ์ถœ

    • React ํ•จ์ˆ˜ ๋‚ด์—์„œ Hook์„ ํ˜ธ์ถœ

(2) ์กฐ๊ฑด๋ถ€ effect ๋ฐœ์ƒ (dependency array)

  • useEffect์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” ๋ฐฐ์—ด์ด๋ฉฐ, ์ด ๋ฐฐ์—ด์€ ์กฐ๊ฑด์„ ๋‹ด๊ณ  ์žˆ์Œ.

  • ์—ฌ๊ธฐ์„œ ์กฐ๊ฑด์€ ์–ด๋–ค ๊ฐ’์˜ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚  ๋•Œ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ ํ•ด๋‹น ๋ฐฐ์—ด์—๋Š” ์–ด๋–ค ๊ฐ’์˜ ๋ชฉ๋ก์ด ๋“ค์–ด๊ฐ โ†’ ์ข…์†์„ฑ ๋ฐฐ์—ด

(3) API

  • useEffect์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋Š” ์ข…์†์„ฑ ๋ฐฐ์—ด

  • ๋ฐฐ์—ด ๋‚ด์˜ ์ข…์†์„ฑ 1, ๋˜๋Š” ์ข…์†์„ฑ 2์˜ ๊ฐ’์ด ๋ณ€ํ•  ๋•Œ ์ฒซ ๋ฒˆ์งธ ์ธ์ž์˜ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋จ

  • ๋ฐฐ์—ด ๋‚ด์˜ ์–ด๋–ค ๊ฐ’์ด ๋ณ€ํ•  ๋•Œ๋งŒ (effect๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”) ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋จ

(4) ๋‹จ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๋Š” Effect ํ•จ์ˆ˜

์ข…์†์„ฑ ๋ชฉ๋ก์— ์•„๋ฌด๋Ÿฐ ์ข…์†์„ฑ๋„ ์—†๋‹ค๋ฉด?

  • ๋นˆ ๋ฐฐ์—ด ๋„ฃ๊ธฐ useEffect(ํ•จ์ˆ˜, []): ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ์ƒ์„ฑ๋  ๋•Œ๋งŒ effect ํ•จ์ˆ˜ ์‹คํ–‰๋˜๋ฉฐ, ์™ธ๋ถ€ API๋ฅผ ํ†ตํ•ด ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐ›์•„์˜ค๊ณ  ๋”์ด์ƒ API ํ˜ธ์ถœ์ด ํ•„์š”ํ•˜์ง€ ์•Š์„ ๋•Œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

  • ์•„๋ฌด๊ฒƒ๋„ ๋„ฃ์ง€ ์•Š๊ธฐ useEffect(ํ•จ์ˆ˜)

(5) Data Fetching: ๋ชฉ๋ก ๋‚ด ํ•„ํ„ฐ๋ง ๊ตฌํ˜„ํ•˜๊ธฐ

์ปดํฌ๋„ŒํŠธ ๋‚ด ํ•„ํ„ฐ๋ง

  • ์ „์ฒด ๋ชฉ๋ก ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ณ , ๋ชฉ๋ก์„ ๊ฒ€์ƒ‰์–ด๋กœ filtering

  • ์žฅ์ : HTTP ์š”์ฒญ ๋นˆ๋„๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ์Œ

  • ๋‹จ์ : ๋ธŒ๋ผ์šฐ์ €(ํด๋ผ์ด์–ธํŠธ)์˜ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์— ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๋ฏ€๋กœ ํด๋ผ์ด์–ธํŠธ ๋‹จ์˜ ๋ถ€๋‹ด ์ฆ๊ฐ€

์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€์—์„œ ํ•„ํ„ฐ๋ง: ์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€๋กœ API ์š”์ฒญ ์‹œ, ํ•„ํ„ฐ๋งํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ›์•„์˜ค๊ธฐ

  • ์žฅ์ : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•„ํ„ฐ๋ง ๊ตฌํ˜„ ํ•„์š” X

  • ๋‹จ์ : ๋นˆ๋ฒˆํ•œ HTTP ์š”์ฒญ์ด ์ผ์–ด๋‚˜ ์„œ๋ฒ„๊ฐ€ ํ•„ํ„ฐ๋ง์„ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ ์„œ๋ฒ„์˜ ๋ถ€๋‹ด ์ฆ๊ฐ€

3. AJAX

(1) AJAX ์š”์ฒญ ๋ณด๋‚ด๊ธฐ

fetch API๋ฅผ ์จ์„œ ์„œ๋ฒ„์— ์š”์ฒญํ•˜๋ฉด, API ์ ‘์†์ด ๋Š๋ฆด ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•ด ๋กœ๋”ฉ ํ™”๋ฉด(loading Indicator) ๊ตฌํ˜„ ํ•„์ˆ˜

const [isLoading, setIsLoading] = useState(true);

// ์ƒ๋žต, LoadingIndicator ์ปดํฌ๋„ŒํŠธ๋Š” ๋ณ„๋„๋กœ ๊ตฌํ˜„ํ–ˆ์Œ์„ ๊ฐ€์ •
return {isLoading ? <LoadingIndicator /> : <div>๋กœ๋”ฉ ์™„๋ฃŒ ํ™”๋ฉด</div>}

fetch ์š”์ฒญ ์ „ํ›„๋กœ setIsLoading์„ ์„ค์ •ํ•ด ๋ณด๋‹ค ๋‚˜์€ UX ๊ตฌํ˜„

useEffect(() => {
setIsLoading(true);
fetch(`http://์„œ๋ฒ„์ฃผ์†Œ/proverbs?q=${filter}`)
  .then(resp => resp.json())
  .then(result => {
     setProverbs(result);
     setIsLoading(false);
  });
}, [filter]);

Last updated