jjanmo / react101

Learn react and make movie-app with nomadcoders

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

React101

Learn react and make movie-app with nomadcoders ๐Ÿš€

This repo is react basic course. So I will summarize react basic concept(a.k.a must know concept) here.

This is written based on NomadCoders React Fundemental Course and React Official Site

DEMO


Chapter00 : What is npx?

npm์ด๋ผ๊ณ  ํ•˜๋ฉด Node Package Manager๋ผ๊ณ ํ•˜์—ฌ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌํ•˜๋Š” ๋„๊ตฌ์ด๋‹ค. ํ•˜์ง€๋งŒ npx๋Š” ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ๋„๊ตฌ๊ฐ€ ์•„๋‹ˆ๋‹ค. npm์—์„œ ์ œ๊ณตํ•ด์ฃผ๋Š” ์ƒˆ๋กœ์šด ๋„๊ตฌ์ด๋‹ค. npm์„ ์ข€ ๋” ํŽธํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ๋กœ์„œ npm์„ ํ†ตํ•ด์„œ ์„ค์น˜ํ•˜๋Š” ํŒจํ‚ค์ง€๋ฅผ npx๋ฅผ ํ†ตํ•ด์„œ ์‰ฝ๊ฒŒ ์„ค์น˜ํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค€๋‹ค.

npx์˜ ๋“ฑ์žฅ ๋ฐฐ๊ฒฝ

npm์œผ๋กœ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•  ๋•Œ, ์ „์—ญ์ ์œผ๋กœ ์„ค์น˜ํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ์™€ ๋กœ์ปฌ์— ํ”„๋กœ์ ํŠธ๋ณ„๋กœ ์„ค์น˜ํ•ด์„œ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ์ด ๋•Œ ํŒจํ‚ค์ง€์˜ ๋ฒ„์ „๊ด€๋ฆฌ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ƒํƒœ๊ณ„์˜ ๋น ๋ฅธ ๋ณ€ํ™”๋กœ ์ธํ•ด ๋ฒ„์ „ ์—ญ์‹œ ๋งค์šฐ ๋น ๋ฅด๊ฒŒ ๋ณ€ํ™”ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด์— ๋งž์ถฐ์„œ ๋งค๋ฒˆ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•˜๋Š” ๊ฒƒ์€ ์—ฌ๊ฐ„ ๊ท€์ฐฎ์€ ๊ฒƒ์ด ์•„๋‹ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚˜์˜จ ๊ฒƒ์ด npx์ด๋‹ค.

npx๋Š” ์–ด๋–ป๊ฒŒ ๋ฒ„์ „๊ด€๋ฆฌ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ?

์šฐ์„  ํ•ด๋‹น ํŒจํ‚ค์ง€๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹คํ–‰๋˜์–ด์•ผ ํ•  ์œ„์น˜์— ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ์œ„์น˜์— ํ•ด๋‹น ํŒจํ‚ค์ง€๊ฐ€ ์—†๋‹ค๋ฉด, npm ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์˜ฌ๋ผ๊ฐ€์žˆ๋Š” ์ตœ์‹ ๋ฒ„์ „์œผ๋กœ ์„ค์น˜ํ•˜๊ณ  ์‹คํ–‰ํ•œ๋‹ค. ์ฆ‰ ๋”ฐ๋กœ ๋ฒ„์ „๊ด€๋ฆฌ๋ฅผ ํ•  ํ•„์š”์—†์ด ์–ธ์ œ๋‚˜ ์ผํšŒ์„ฑ์œผ๋กœ ์ตœ์‹ ๋ฒ„์ „์œผ๋กœ ์„ค์น˜ํ•˜๊ณ  ์‹คํ–‰ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.


Chapter01 : What is virtual dom?

Virtial DOM(๊ฐ€์ƒ๋”)์„ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„  ๋จผ์ € SPA(Single Page Application)์— ๋Œ€ํ•ด์„œ ์•Œ์•„์•ผ๋ณด์ž.

SPA๋ž€ ์ตœ์ดˆ๋กœ ์ •์ ์ธ ํŽ˜์ด์ง€๊ฐ€ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋žœ๋”๋ง๋˜๊ณ  ์ด ํ›„์˜ ์š”์ฒญ์—์„œ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ƒˆ๋กญ๊ฒŒ ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑํ•ด์„œ ๋‹ค์‹œ ๋žœ๋”๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ, ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์š”์ฒญ๋œ ๋ฐ์ดํ„ฐ๋งŒ์„ JSONํ˜•์‹์œผ๋กœ ๋ฐ›์•„์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด์„œ ํŽ˜์ด์ง€์—์„œ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ์„ ๋™์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ธฐ์ˆ ์„ ๋งํ•œ๋‹ค.

spa

์œ„ ์ด๋ฏธ์ง€๋Š” ์ „ํ†ต์ ์ธ ํŽ˜์ด์ง€ ๋žœ๋”๋ง ๋ฐฉ์‹๊ณผ SPA ๋ฐฉ์‹์„ ๊ทธ๋ฆผ์œผ๋กœ ๋น„๊ตํ•œ ๊ฒƒ์ด๋‹ค.

๋ฆฌ์•กํŠธ๋Š” SPA๋ฐฉ์‹์—์„œ ๋ทฐ์— ์ดˆ์ ์„ ๋งž์ถ˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๊ฐ€์ƒ๋”์€ ์—ฌ๊ธฐ์„œ ์–ด๋–ป๊ฒŒ ์ž‘์šฉ์„ ํ•˜๋Š” ๊ฒƒ์ผ๊นŒ?

์œ„์—์„œ๋„ ๋งํ–ˆ๋“ฏ์ด SPA๋Š” ์ตœ์ดˆ๋กœ ํŽ˜์ด์ง€๊ฐ€ ๋žœ๋”๋ง๋œ ํ›„์— ๋ฐ์ดํ„ฐ ์š”์ฒญ์— ๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ๋งŒ์„ ๋ฐ›๊ณ  ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ DOM์— ์ ‘๊ทผํ•˜์—ฌ ํŽ˜์ด์ง€๋ฅผ ์กฐ์ž‘ํ•œ๋‹ค. ์ฆ‰ ๋ณต์žกํ•œ SPA์—์„œ๋Š” ๋งŽ์€ DOM ์กฐ์ž‘์ด ๋ฐœ์ƒํ•˜๊ณ  ์ด๋กœ ์ธํ•ด ํŽ˜์ด์ง€ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค.

DOM ์กฐ์ž‘์€ ๊ต‰์žฅํžˆ ๋น„์‹ผ ์ž‘์—…์ด๋‹ค. ์ด๋Š” ๋žœ๋”๋ง ๊ณผ์ •์„ ์กฐ๊ธˆ๋งŒ ์ดํ•ดํ•˜๋ฉด ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋žœ๋”๋ง ๊ณผ์ •์„ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•˜๋ฉด ์šฐ์„  ๋”ํŠธ๋ฆฌ(๋”๋…ธ๋“œ๋กค ์ด๋ฃจ์–ด์ง„ ํŠธ๋ฆฌ)๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ๋”ํŠธ๋ฆฌ์— ๋”ฐ๋ผ์„œ ๋žœ๋”ํŠธ๋ฆฌ(์Šคํƒ€์ผ ํŠธ๋ฆฌ)๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค. ๋žœ๋”ํŠธ๋ฆฌ๊ฐ€ ์™„์„ฑ๋˜๋ฉด ํŠธ๋ฆฌ์— ๋งž๋Š” ์œ„์น˜๊ฐ€ ๊ณ„์‚ฐ๋˜์–ด ๊ฐ๊ฐ์˜ ๋…ธ๋“œ๋“ค์ด ๋ธŒ๋ผ์šฐ์ €์˜ ์–ด๋Š ์œ„์น˜์— ๋‚˜ํƒ€๋‚˜์•ผํ• ์ง€๊ฐ€ ์ •ํ•ด์ง„๋‹ค.์ด ํ›„ ํŽ˜์ธํŒ… ์ž‘์—…์„ ํ†ตํ•ด์„œ ์‹ค์ œ๋กœ ๋ธŒ๋ผ์šฐ์ €์— ํ‘œํ˜„๋œ๋‹ค. ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ DOM ์กฐ์ž‘์ด๋ผ๋Š” ๋ง๋กœ ์š”์•ฝ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋ฆฌ์•กํŠธ๋Š” ์ด๋Ÿฌํ•œ DOM ์กฐ์ž‘์„ ์ค„์ด๊ณ ์ž, ์‹ค์ œ DOM์„ ์กฐ์ž‘ํ•˜๊ธฐ ์ „์— ๊ฐ€์ƒ์˜ ๋”์— ์š”์ฒญ์— ๋”ฐ๋ฅธ ๋ณ€ํ™”๋ฅผ ๋ฏธ๋ฆฌ ์ ์šฉํ•˜๊ณ  ์‹ค์ œ์ ์ธ ์ตœ์ข… ๋ณ€ํ™”๋งŒ์„ ์‹ค์ œ DOM์— ์ „๋‹ฌํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ์š”์ฒญ์— 10๋ฒˆ ์ผ์–ด๋‚˜์„œ ์ตœ์ข…์ ์ธ ๋ทฐ๋ฅผ ๋ณด์—ฌ์ฃผ๊ฒŒ ๋œ๋‹ค๋ฉด, ๊ฐ๊ฐ์˜ ์š”์ฒญ๋งˆ๋‹ค DOM ์กฐ์ž‘์„ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ 10๋ฒˆ์˜ ์š”์ฒญ์— ๋”ฐ๋ฅธ ๋ณ€ํ™”๋ฅผ ๊ฐ€์ƒ๋”์— ์ ์šฉํ•œ ํ›„ ์ตœ์ข…์ ์ธ ๋ณ€ํ™”์™€ ํ˜„์žฌ DOM๊ณผ์˜ ์ฐจ์ด์ ์„ ๊ณ„์‚ฐํ•˜์—ฌ์„œ ํ•œ ๋ฒˆ๋งŒ DOM ์กฐ์ž‘์„ ํ•˜๊ฒŒ ๋œ๋‹ค. ์ฆ‰ ๊ฐ€์ƒ๋”์€ ๋ธŒ๋ผ์šฐ์ € ๋‚ด์˜ ์—ฐ์‚ฐ์„ ์ค„์ž„์œผ๋กœ์„œ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค.


Chapter02 : JSX and Components

JSX(Javascript XML)

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์•ˆ์— HTML์ด ๋“ค์–ด๊ฐ„ ํ˜•ํƒœ๋กœ ๋ณด์ด๋Š” ์ฝ”๋“œ๋ฅผ ๋งํ•œ๋‹ค. ๋‹จ์ˆœํ•˜๊ฒŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ๋ณ€ํ˜•๋œ ํ˜•ํƒœ๋ผ๊ณ  ๋ณด๋ฉด ์‰ฝ๋‹ค.

JSX์˜ ์—ญํ• ์€ ์‹ค์ œ์ ์œผ๋กœ HTML ํƒœ๊ทธ๋ฅผ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ DOM์— ๋„ฃ์–ด์ค€๋‹ค. ์ฆ‰ ํŽ˜์ด์ง€์— HTML ํƒœ๊ทธ๋ฅผ ๋žœ๋”๋งํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

๊ถ๊ทน์ ์œผ๋กœ JSX๋Š” HTML์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด JSX๋ฅผ ์™œ ์‚ฌ์šฉํ• ๊นŒ?

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‚ด๋ถ€์—์„œ UI๋ฅผ ์ž‘์—…ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋…์„ฑ ์ธก๋ฉด์—์„œ ํšจ์œจ์ ์ด๋‹ค. ์ฆ‰ ๊ธฐ์กด์˜ HTML ํƒœ๊ทธ๋ฅผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•จ์œผ๋กœ์„œ ์ฝ”๋“œ๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€๋ฅผ ์ข€ ๋” ์‹œ๊ฐ์ ์œผ๋กœ ๋ช…ํ™•ํ•˜๊ฒŒ ์ธ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ JSX๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํ•ด์„ํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋ฒจ์— ์˜ํ•ด์„œ ๋ฐ”๋‹๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ ๋ณ€ํ˜•๋˜์–ด ๋ธŒ๋ผ์šฐ์ €๋กœ ๋ณด๋‚ด์ง„๋‹ค.

import React from 'react';

const App = function () {
    return <div class="text">Hello World</div>;
};

์œ„์˜ JSX๋Š” ๋ฐ”๋ฒจ์— ์˜ํ•ด์„œ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€ํ˜•๋œ๋‹ค. ๋˜ํ•œ function(){ } ์ด๋ผ๊ณ  ์ ํ˜€์žˆ๋Š” ๋ถ€๋ถ„์„ ์ปดํผ๋„ŒํŠธ๋ผ๊ณ  ํ•œ๋‹ค. ์‚ฌ์‹ค ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” ํ•จ์ˆ˜์™€ ์œ ์‚ฌํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๋‹ค.

'use strict';

const App = function App() {
    return React.createElement('div', null, 'Hello World');
};

JSX ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด 'div ํƒœ๊ทธ์— Hello World ๋ผ๋Š” ๊ธ€์ž๊ฐ€ ๋“ค์–ด๊ฐ„ ๋ธ”๋Ÿญ์ด ์ƒ๊ธธ๊ฑฐ์•ผ' ๋ผ๋Š” ๊ฒƒ์„ ์ง๊ด€์ ์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐ”๋‹๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(์•„๋ž˜ ์ฝ”๋“œ) ์ฒ˜๋Ÿผ ์ ํ˜€์žˆ์œผ๋ฉด, ๋ญ˜ ๋งŒ๋“ ๋‹ค๋Š” ๊ฑฐ๋Š” ๊ฐ™์€๋ฐ...ํ•˜๋ฉด์„œ ์ฝ”๋“œ๋ฅผ ์ข€ ์‚ดํŽด๋ด์•ผํ•  ๊ฒƒ์ด๋‹ค. ๋˜ํ•œ ์ค‘์ฒฉ๋œ ํƒœ๊ทธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๋Š” React.createElement() ์•ˆ์— ๋˜๋‹ค์‹œ ์ค‘์ฒฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋”์šฑ ์‹œ๊ฐ์ ์œผ๋กœ ๋ณด๋Š” ๊ฒƒ์ด ํž˜๋“ค์–ด์ง„๋‹ค. ์ด๊ฒƒ์ด JSX๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ์ด๋‹ค.


React vs ReactDOM:

import React from 'react';
import ReactDOM from 'react-dom';

์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋ ‡๊ฒŒ ์ž„ํฌํŠธ๋ฅผ ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค. ์ตœ์ข…์ ์ธ ์ปดํผ๋„ŒํŠธ์—์„œ๋Š” ReactDOM์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ด ๋‘˜์˜ ์ฐจ์ด์ ์€ ๋ฌด์—‡์ด๊ธฐ์— ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ• ๊นŒ?

React๋Š” ์ฝ”์–ด ๋ฆฌ์•กํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งํ•œ๋‹ค. ์ด๊ฒƒ์€ ๋ทฐ(UI)๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋‹ค. ๋…๋ฆฝ์ ์ด๊ณ  ์žฌ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ์ปดํผ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๋•Œ ํ•„์š”ํ•œ ๋ฉ”์†Œ๋“œ๋“ค์„ ์ œ๊ณตํ•œ๋‹ค. ์ฆ‰, ์ปดํผ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ํ•„์š”ํ•˜๋‹ค. ๋˜ํ•œ JSX๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š”๋ฐ ํ•„์š”ํ•œ ๋ฉ”์†Œ๋“œ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— JSX๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋ฐ˜๋“œ์‹œ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ๋‹ค.

ReactDOM์€ ์‹ค์ œ๋กœ DOM์— ๋žœ๋”๋ง ํ•  ๋•Œ ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋ชจ๋“  ์ปดํผ๋„ŒํŠธ๋ฅผ ํ†ตํ•ด์„œ ๋งŒ๋“ค์–ด์ง„ ์ตœ์ข… ๊ฒฐ๊ณผ๋ฌผ๋งŒ์„ ํŽ˜์ด์ง€์— ๋žœ๋”๋ง ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.(์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋Ÿฐ ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•œ๋‹ค)

Components

์‰ฝ๊ฒŒ ๋งํ•ด์„œ ์ปดํผ๋„ŒํŠธ๋Š” ํ•จ์ˆ˜์ด๋‹ค. (๋ฌผ๋ก  ํด๋ž˜์Šค ์ปดํผ๋„ŒํŠธ๋„ ์žˆ์ง€๋งŒ, ํด๋ž˜์Šค๋„ ๊ฒฐ๊ตญ์—” ํ•จ์ˆ˜์ด๋‹ค.) ํŠน์ • ๋ทฐ(UI)๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ด๋‹ค.

์ปดํผ๋„ŒํŠธ๋Š” UI์˜ ์ผ๋ถ€๋ถ„์„ ํ‘œํ˜„ํ•˜๋Š” ์ž‘๊ณ  ๋…๋ฆฝ์ ์ธ ๊ตฌ์„ฑํ’ˆ(์—”ํ‹ฐํ‹ฐ/๊ฐœ์ฒด)์ด๋‹ค. ๊ฐ๊ฐ์˜ ์ปดํผ๋„ŒํŠธ๋“ค์ด ํ•ฉ์„ฑ๋˜์–ด์„œ ์ตœ์ข…์ ์œผ๋กœ ๋งŒ๋“ค๊ณ ์ž ํ•˜๋Š” ๊ฒฐ๊ณผ๋ฌผ์ด ๋งŒ๋“ค์–ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

//์ปดํผ๋„ŒํŠธ ํด๋ž˜์Šค(ํ•จ์ˆ˜)
function App() {
    return <div>Hello</div>;
}

//์ปดํผ๋„ŒํŠธ ์ธ์Šคํ„ด์Šค(๋ณดํ†ต ๋˜๋‹ค๋ฅธ JSX ์•ˆ์— ํ•ฉ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค)
<App />;

์‹ค์ œ๋กœ ์šฐ๋ฆฌ๊ฐ€ ์ปดํผ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ปดํผ๋„ŒํŠธ์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ์ปดํผ๋„ŒํŠธ ์ธ์Šคํ„ด์Šค??๋ผ๊ณ  ํ•˜๋ฉด ์ข€ ์ƒ์†Œํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ณ„๊ฑฐ ์—†๋‹ค. ๊ทธ๋ƒฅ ์ปดํผ๋„ŒํŠธ๋ฅผ JSX ํ˜•ํƒœ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋ฉด ๊ทธ๊ฒƒ์ด ์ธ์Šคํ„ด์Šค๊ฐ€ ๋œ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ดํŽด๋ณด๋ฉด JSX๊ฐ€ ๋ณ€ํ™˜ ๋  ๋•Œ, React.createElement()๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ์ด๊ฒƒ์€ ์‹ค์ œ์ ์ธ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ด๊ฒƒ์ด ์ƒˆ๋กœ์šด ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด๊ณ  ๊ฒฐ๊ณผ์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๊ทธ ๋ฐ˜ํ™˜๊ฐ’์„ ๋‚˜ํƒ€๋‚ด๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.


Chapter03 : What is props and state?

props์™€ state ๋ชจ๋‘ ๋ฐ์ดํ„ฐ(์ •๋ณด)๋ฅผ ๋งํ•œ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ธก๋ฉด์—์„œ ์ฐจ์ด์ ์ด ์กด์žฌํ•œ๋‹ค. ์ฐจ์ด์ ์— ์ค‘์ ์„ ๋‘๊ณ  ์‚ดํŽด๋ณด์ž

props-state

์œ„ ์ด๋ฏธ์ง€๋Š” props์™€ stats์— ๋Œ€ํ•œ ๊ฐœ๊ด„์„ ๋ณด์—ฌ์ฃผ๋Š” ์ด๋ฏธ์ง€์ด๋‹ค. ๊ฐœ๋…์„ ์ดํ•ดํ•˜๊ณ  ๋ณด๋ฉด ์•„ํ•˜!๋ผ๋Š” ๊ฐํƒ„์‚ฌ๊ฐ€ ๋‚˜์˜ฌ์ง€๋„ ๐Ÿคฉ

Props

State

  • ํŠน์ง•

    ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด์ด๋‹ค

    ํด๋ž˜์Šค ์ปดํผ๋„ŒํŠธ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.(React Hooks์˜ ๋“ฑ์žฅ์œผ๋กœ ํ•จ์ˆ˜ํ˜• ์ปดํผ๋„ŒํŠธ์—์„œ๋„ state๋ฅผ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค.)

    ์ปดํผ๋„ŒํŠธ์—์„œ state๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„  ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ํด๋ž˜์Šค์˜ ์ƒ์„ฑ์ž(constructor)์—์„œ ์ดˆ๊ธฐํ™”์‹œ์ผœ์„œ ์‚ฌ์šฉํ•œ๋‹ค.

  • ์ž‘๋™ ์›๋ฆฌ

    ๊ธฐ๋ณธ์ ์œผ๋กœ this.state = { key : value } ๊ฐ™์€ ํ˜•ํƒœ๋กœ ์ƒ์„ฑ์ž์—์„œ ์ดˆ๊ธฐํ™”์‹œํ‚จ๋‹ค. ํ•˜์ง€๋งŒ ์ƒ์„ฑ์ž๋ฅผ ์ œ์™ธํ•œ ์œ„์น˜์—์„œ ์ง์ ‘ state์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค. state์— ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ setState() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

    ์ƒ์„ฑ์ž๋ฅผ ์ œ์™ธํ•œ ์œ„์น˜์—์„œ this.state.[key]ํ˜•ํƒœ๋กœ ์ฐธ์กฐ๋Š” ๊ฐ€๋Šฅํ•˜๋‹ค.

  • setState()


Chapter04 : event in React

element.addEventListener('click', handler); //์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ : ์ด๋ฒคํŠธ๋ฅผ ๋“ฑ๋กํ•œ๋‹ค.

function handler(e) {
    //์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ : ์ด๋ฒคํŠธ๊ฐ€ ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ ์–ด๋–ค ์ž‘๋™์„ ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์ž‘์„ฑํ•œ๋‹ค. ํ•ธ๋“ค๋Ÿฌ๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜์ด๋‹ค.
    //code here
}

์œ„์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ์™€ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋ฆฌ์•กํŠธ์—์„œ๋„ DOM์—์„œ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ๊ณผ ๋˜‘๊ฐ™์ด ์ด๋ฒคํŠธ๊ฐ€ ์ž‘๋™ํ•œ๋‹ค. ๋‹จ์ง€ ๋ช‡๊ฐ€์ง€ ๋ฌธ๋ฒ•์  ์ฐจ์ด๊ฐ€ ์กด์žฌํ•œ๋‹ค.

  • ๋ฆฌ์•กํŠธ์—์„œ๋Š” ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋“ฑ๋กํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋‹จ์ง€ ํŽ˜์ด์ง€๊ฐ€ ์ฒ˜์Œ ๋žœ๋”๋ง ๋  ๋•Œ ๋ฆฌ์Šค๋„ˆ๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ ์ œ๊ณตํ•œ๋‹ค.

    ์ด๋ฒคํŠธ ์œ„์ž„์„ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€์˜ wrapper๊ฐ์ฒด์— ๋‚ด๋ถ€์ ์œผ๋กœ ์ด๋ฒคํŠธ๋ฅผ ๋“ฑ๋กํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.(์ •ํ™•ํ•˜์ง€์•Š๋‹ค...๐Ÿคช ์งง์€ ์ง€์‹์œผ๋กœ ์ฐพ์•„๋ณธ ๊ฒฐ๊ณผ...) ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€์— ๋Œ€ํ•ด์„œ๋Š” ์ข€ ๋” ๋ณต์žกํ•œ ๋ถ€๋ถ„์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

  • ๋ฌธ๋ฒ•์  ์ฐจ์ด

    class App extends React.Component{
    
        handleClick(event){
            const { target } = event;
            //code here
        }
    
        render(){
            return <button onClick={this.handleClick}>;
        }
    }

    ์œ„ ์ฝ”๋“œ๋Š” ๋ฆฌ์•กํŠธ์—์„œ ๋ณดํŽธ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฒคํŠธ ๋ฐฉ์‹์ด๋‹ค. props๋กœ์„œ (์ฝœ๋ฐฑ) ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ์ „๋‹ฌํ•ด์ฃผ๋ฉด ๋œ๋‹ค. ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์ž‘๋™ ํ•  ๊ฒƒ ์ด๋‹ค.

    ํ•˜์ง€๋งŒ ์œ„ ์ฝ”๋“œ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ๋ฐ”๋กœ this ์ด๋‹ค. ์ด ๋ฌธ์ œ๋Š” ๋ฆฌ์•กํŠธ์—์„œ์˜ ๋ฌธ์ œ๊ฐ€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ „๋ฐ˜์— ๊ฑธ์นœ ๋ฌธ์ œ์ด๋‹ค. ๊ทธ๊ฒƒ์€ this์˜ ๋ฌธ๋งฅ์˜ ๊ฒฐ์ •์€ this๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ์ผ์–ด๋‚œ๋‹ค๋Š” ์ ์ด๋‹ค. ์ƒํ™ฉ์— ๋”ฐ๋ผ์„œ this๊ฐ€ undfined๊ฐ€ ๋‚˜์˜ค๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค. ๋ฆฌ์•กํŠธ์—์„œ๋Š ์ด๋ฅผ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š”์ง€์— ์•Œ์•„๋ณด์ž

    ํ™”์‚ดํ‘œํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ ํ•ด๊ฒฐ : ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์—์„œ์˜ this๋Š” ์ƒ์œ„ ์Šค์ฝ”ํ”„๋ฅผ ๋”ฐ๋ผ๊ฐ€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

    ๋ฐฉ๋ฒ•1 : ํ•ธ๋“ค๋Ÿฌ ํ•จ์ˆ˜๋ฅผ props ์•ˆ์—์„œ ํ™”์‚ดํ‘œํ•จ์ˆ˜๋กœ ์ƒ์„ฑ

    class App extends React.Component{
    
        render(){
            return <button onClick={() => console.log(this)}>;
            <!-- this is App -->
        }
    }

    ๋ฐฉ๋ฒ•2

    class App extends React.Component{
    
        handleClick(){
            console.log(this) //App
        }
    
        render(){
            return <button onClick={() => this.handleClick()}>;
        }

    public class syntax๋ฅผ ์‚ฌ์šฉํ•œ ํ•ด๊ฒฐ

    class App extends React.Component{
    
        handleClick = () => {
            console.log(this) //App
        }
    
        render(){
            return <button onClick={this.handleClick}>;
        }

    handleClick ๋ฉ”์†Œ๋“œ๊ฐ€ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ ์ƒ์„ฑ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธ์ถœ๋  ๋•Œ this๋Š” ์ƒ์œ„ ์Šค์ฝ”ํ”„์— ๋ฐ”์ธ๋”ฉ๋œ๋‹ค. ํผ๋ธ”๋ฆญ ํ•„๋“œ์— ์ €๋Ÿฐ ํ˜•ํƒœ๋กœ ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค.

    ์ƒ์„ฑ์ž๋ฅผ ํ™œ์šฉํ•œ ํ•ด๊ฒฐ : ์ปดํผ๋„ŒํŠธ์—์„œ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ์ด ๋ฐฉ๋ฒ•์„ ์ถ”์ฒœํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.(๊ณต์‹ํ™ˆํŽ˜์ด์ง€ ์™ˆ!)

    class App extends React.Component{
        constructor(props){
            super(props);
    
            this.handleClick = this.handleClick.bind(this); //this binding : ()์•ˆ์˜ this == App
        }
    
        handleClick() {
            console.log(this)
        }
    
        render(){
            return <button onClick={this.handleClick}>;
        }

    ์ปดํผ๋„ŒํŠธ๊ฐ€ ๋ถˆ๋ฆด ๋•Œ, ์ฒ˜์Œ๋ถ€ํ„ฐ ์ƒ์„ฑ์ž๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ช…์‹œ์ ์œผ๋กœ this๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.


Chapter05 : Class Component์™€ Function Component

2023๋…„ ํ˜„์žฌ class component๋Š” ๋ ˆ์•Œ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๊ฐ€ ๋˜์—ˆ๋‹ค. ์š”์ƒˆ๋Š” ํ•จ์ˆ˜ํ˜•์ด ๋Œ€์„ธ์ด์ž ์ •์„์œผ๋กœ ์ž๋ฆฌ์žก์•˜๋‹ค. ์•„๋“€ ํด๋ž˜์Šค!

ps. ํ•ด๋‹น ์ฑ•ํ„ฐ์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ์—†์–ด์„œ ์ฑ„์›Œ๋„ฃ์—ˆ๋‹ค.


Chapter06 : react-router-dom

2023๋…„ ํ˜„์žฌ ๋ฆฌ์•กํŠธ ํ”„๋ ˆ์ž„์›Œํฌ(Next.js, Remix, Gatsby ๋“ฑ)์˜ ๋ฐœ์ „์œผ๋กœ ์ธํ•ด pure-react๋งŒ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ ์  ์ค„์–ด๋“ค๊ณ  ์žˆ๋‹ค. ์ฆ‰, ๋ผ์šฐํ„ฐ ํŒจํ‚ค์ง€๋ฅผ ์„ค์น˜ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ ์–ด์กŒ๋‹ค๋Š” ์˜๋ฏธ! ๋˜ํ•œ react-router-dom ์—ญ์‹œ ๋ฒ„์ „ 6๊นŒ์ง€ ์˜ฌ๋ผ๊ฐ€๋ฉด์„œ ๋‚ด๊ฐ€ ์ฒ˜์Œ ๋ฐฐ์šธ ๋•Œ์˜ ๊ทธ react-router-dom๊ณผ๋Š” ๋งŽ์ด ๋‹ฌ๋ผ์ง„ ๋ชจ์Šต์ด๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ณต์‹๋ฌธ์„œ๋ฅผ ์ฝ์–ด๋ณด๊ธธ ๊ถŒ์žฅํ•œ๋‹ค. (๋‚˜ ์—ญ์‹œ ๊ณต์‹๋ฌธ์„œ๋ฅผ ํ†ตํ•œ ํ•™์Šต์„ react-tutorials repo์—์„œ ์ง„ํ–‰ํ–ˆ์—ˆ๋‹ค.)

ps. ํ•ด๋‹น ์ฑ•ํ„ฐ์— ๋Œ€ํ•œ ๋‚ด์šฉ์ด ์—†์–ด์„œ ์ฑ„์›Œ๋„ฃ์—ˆ๋‹ค.


์ฐธ๊ณ 

How to deploy gh-page

  1. npm install -D ghpages

  2. package-json์— homepage ํ”„๋กœํผํ‹ฐ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

    "homepage": "https://jjanmo.github.io/react101"

  3. scripts ๋ช…๋ น์–ด ์„ค์ •

    "scripts": {
        "start": "react-scripts start",
        "build": "react-scripts build",
        "deploy": "gh-pages -d build",
        "predeploy": "npm run build"
    },
    

    ์œ„ ์Šคํฌ๋ฆฝํŠธ ๋ช…๋ น์–ด์— ๋Œ€ํ•œ ์‹คํ–‰ ๊ณผ์ • ์„ค๋ช…

    • npm run deploy ์‹คํ–‰ํ•œ๋‹ค.
    • deploy๋ฅผ ํ•  ๋•Œ ๋งˆ๋‹ค npm์€ ์ž๋™์ ์œผ๋กœ predeploy ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
    • predeploy๊ฐ€ ์ž‘๋™๋˜๋ฉด build ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด์„œ ๋‹ค์‹œ build ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์žฌ์ƒ์„ฑํ•˜์—ฌ ์ตœ์‹ ์˜ ์ฝ”๋“œ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์—…๋กœ๋“œ(?)ํ•œ๋‹ค
    • predeploy๊ฐ€ ๋๋‚˜๋ฉด npm์€ (ํ•˜๊ณ ์žํ–ˆ๋˜) deploy๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
    • gh-pages๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ๊ฑฐ๊ธฐ์— build์— ์žˆ๋Š” ๋‚ด์šฉ์„ ์—…๋กœ๋“œ ํ•œ๋‹ค.
    • ๋งŒ์•ฝ์— ํŽ˜์ด์ง€๋ฅผ ์—…๋ฐ์ดํŠธ ํ–ˆ๋‹ค๋ฉด ๋‹ค์‹œ deploy๋ฅผ ํ•ด์ค˜์•ผํ•œ๋‹ค.(npm run deploy๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•œ๋‹ค.)

Ref

About

Learn react and make movie-app with nomadcoders


Languages

Language:JavaScript 54.2%Language:CSS 29.8%Language:HTML 16.0%