๐ผ Udmey: React ์๋ฒฝ ๊ฐ์ด๋ 2024 with React Router & Redux
์ทจ์ค ๋(์ฝ 2๋ ์ ์ฏค) ๊ตฌ๋งคํด์ ๋ค์๋ Udemy React ๊ฐ์ข๊ฐ ์๋ 10์์ฏค์ ๊ฐ์ ๋ด์ฉ ๋๋ถ๋ถ์ด ์ ๋ฐ์ดํธ๊ฐ ๋์๋ค๊ณ ํด์ ์ด์ฌ ์ฐพ์ ๊ฒธ ๋ค์ ๋ฃ๊ธฐ ํ๋ก์ ํธ !
์ผ๋ ๋ฑ๋ 1๋ 4๊ฐ์์ฐจ ํ๋ก ํธ ๊ฐ๋ฐ์๊ฐ ๋์์ง๋ง ๋ง์ ์ฝ๋ ๋ก์ง ์๋ฆฌ๋ฅผ ๋๊ตฐ๊ฐ์๊ฒ ์ค๋ช ํด์ค ์ ์์ ๋งํผ ๊ธฐ์ด๋ฅผ ์ ์๊ณ ์๋ค๊ณ ์๊ฐํ์ง ์์์ ์ฒจ๋ถํฐ ๊พธ์คํ ์๊ฐํด๋ณด๊ธฐ๋ก,,
(์ฌ์ค ์ ๋ฐ๋ฏธ ๋ฆฌ์กํธ ๊ฐ์ ์ฌ์๋ 2024 ์ฐ์ด ๋ชฉํ์๋๋ฐ ๋ฒ์จ 2024๋ ๋ฐ๋ ํ์ฉ ๋์ ์์ ์ ๋ฃ๊ธฐ ์์,, ๐ฅฒ)
React
๋? ์น ๋ฐ ๋ค์ดํฐ๋ธ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฆ, ์ฌ์ฉ์ ์ธํฐํ์ด์ค ๊ตฌ์ถ์ ์ํ JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ
โย JS
: ๋ช
๋ นํ์ผ๋ก ์ฝ๋ ์์ฑ vs React
: ์ ์ธํ์ผ๋ก ์ฝ๋ ์์ฑ
๐กย TIP !
๋ธ๋ผ์ฐ์ ์ฐฝ์react.new
๋ฅผ ๊ฒ์ํ๋ฉด ์๋์ผ๋กCodeSandbox
์ new reat project playground๊ฐ ์์ฑ๋๋ค
npm create vite@lastest [project_name]
npm run dev
<script src="assets/scripts/app.js" defer type="module"></script>
defer
: HTML ๋ฌธ์๋ฅผ ์ฝ์ด์ ํ์ฑํ ํ ์คํฌ๋ฆฝํธ๊ฐ import๋๊ณ ๋์ ์คํ๋๋๋ก ํ๋ ์์ฑ
โ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๊ฐ ์คํ๋๊ธฐ ์์ํ ๋ HTML ์์๊ฐ ์ด๋ฏธ ๋ก๋๋๋๋ก ๋ณด์ฅ
- src ์์ฑ์ด ๋ช ์๋ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ,
<script>
์์๊ฐ ์ธ๋ถ ์คํฌ๋ฆฝํธ๋ฅผ ์ฐธ์กฐํ๋ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉ ๊ฐ๋ฅ !- defer ์์ฑ์ด ์์ ๊ฒฝ์ฐ ๋ฐ๋ก ์คํ
type=โmoduleโ
: ํด๋น ์คํฌ๋ฆฝํธ ํ์ผ์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ชจ๋๋ก ์ทจ๊ธ (import, export ์ฌ์ฉ ๊ฐ๋ฅ)
React์์๋ ๋น๋ ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉํ๋ค
โ ์ด๋ง์ฆ์จ, ์์ฑํ ์ฝ๋๊ฐ ๊ทธ๋๋ก ์คํ๋๋๊ฒ ์๋๋ผ ๊ทธ ์ ์ ๋ด๋ถ์ ์ผ๋ก ์ฝ๋๊ฐ ์์ ๋๋ค๋ ๋ป
โ ์ด ๊ณผ์ ์์ ๋น๋์ ์๋์ผ๋ก script
ํ๊ทธ๋ฅผ html
ํ์ผ์ ์ถ๊ฐํด์ค๋ค
- ๋ค์์ ์์ค ์ฝ๋ ํ์ธ
- ์์ค ์ฝ๋ ๋ณํ
- HTML ํ์ผ ์์
- script ์์ ์ถ๊ฐ
- ๋ณํ๋ ์์ค ์ฝ๋ ๋ก๋
- ์นํ์ด์ง์์ ๋ณํ๋ ์์ค ์ฝ๋ ์คํ
๐โโ๏ธย ๊ทธ๋ผ ์ React์์ ๋น๋ ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉํ๋๊ฑธ๊น?
๐ข
1) ๋ฆฌ์กํธ ์ฝ๋์๋ JSX ์ฝ๋๋ ํฌํจ๋์ด ์์ด์ ์ฒ๋ฆฌ๋์ง ์์ ๋ฆฌ์กํธ ๋ณธ์ฐ์ ์ฝ๋๋ ๋ธ๋ผ์ฐ์ ์์ ์ฌ์ฉ์ด ๋ถ๊ฐํ๊ธฐ ๋๋ฌธ!
2) ๋ฆฌ์กํธ ์ฝ๋๋ production์ ์ํ ์ต์ ํ๊ฐ ์ด๋ฃจ์ด์ง์ง ์์๊ธฐ ๋๋ฌธ!
โ ๊ทธ๋ฌ๋ฏ๋ก ๋น๋ ํ๋ก์ธ์ค๋ฅผ ํตํด ๋ณ์ ์ด๋ฆ ๋จ์ถ ๋ฐ ๊ณต๋ฐฑ์ ์ ๊ฑฐํ์ฌ ์น์ฌ์ดํธ ๋ฐฉ๋ฌธ์๊ฐ ๋ค์ด๋ก๋ํด์ผ ํ๋ ์ฝ๋์ ์์ ์ต์ ํํจ
default export
// ํ์ผ๋ณ ์ค์ง ํ๋์ default export ์กด์ฌ ๊ฐ๋ฅ
export default 'AComponents';
// default export์ ๊ฒฝ์ฐ {} ์ค๊ดํธ ์์ด import
import AComponents from './util.ts'
named export
export const BComponents = () => {...}
import { BComponents } from './util' // ๋์ผ ํด๋ ๋ด ๋ค๋ฅธ ํ์ผ import ํ๋ ๊ฒฝ์ฐ์ import path
๐ก React์์ import ํ์ผ๋ช ์์ฑ์ ํ์ฅ์๋ช ์ ๊ฑฐ ๊ฐ๋ฅ ! โ ๋น๋ ํ๋ก์ธ์ค์์ ์๋์ผ๋ก ํ์ฅ์๋ช ์ถ๊ฐํด์ฃผ๋ฏ๋ก
as import
import * as util form './util.js';
import { apikey as ak } from './util.ts'
๐ ํ๋์ ํ์ผ์ ์ค์ง ํ๋์ default exports
์ ๋ฌดํํ named exports
๋ฅผ ๊ฐ์ง ์ ์๋ค
โฃ ๋ณ์๋ฅผ ์ฌ์ฉํ๋ฉด ์ข์ ์ โ๏ธ ๊ฐ ์ฌ์ฌ์ฉ์ฑ โ โ๏ธ ์ฝ๋ ๊ฐ๋ ์ฑ โ โ๏ธ
โฃ ๋ณ์๋ช , ํจ์๋ช ์ ๋ณดํตcamelCase
๋ก ์์ฑ
โฃconst
๊ฐ ์ฌํ ๋น ๋ถ๊ฐ(read-only) vslet
๊ฐ ์ฌํ ๋น ๊ฐ๋ฅ
// default ๊ฐ ์ง์ ๊ฐ๋ฅ
function createGreeting(username, message = "Hello!") {
return "Hi, I am" + userName + message;
}
// message์ default๊ฐ์ด ์กด์ฌํ๋ฏ๋ก ์๋ต ๊ฐ๋ฅ
const greeting1 = createGreeting("Max");
// โฃ Hi, I am Max Hello!
// message ๊ฐ์ ๋ฐ๋ก ์ ์ธํด์คฌ์ผ๋ฏ๋ก default๊ฐ์ override
const greeting2 = createGreeting("Manuel", "Hello, what's up?");
// โฃ Hi, I am Manuel Hello, what's up?
// ์ต๋ช
ํจ์ (์ฃผ๋ก ํ์ดํ ํจ์ ์ฌ์ฉ)
export default function() {...} // ๊ธฐ๋ณธ ํจ์
export default () => {...} // ํ์ดํ ํจ์ -> function ํค์๋ ์์ฑ ์ํด๋ ๋์ ์ข ๋ ๊ฐ๋จ!
// ํ์ดํ ํจ์์ ๋งค๊ฐ๋ณ์๊ฐ ์์ผ๋ฉด ๊ดํธ ์๋ต X
export default () => {...}
// ๋งค๊ฐ๋ณ์๊ฐ ํ๋๋ง ์๋ ๊ฒฝ์ฐ์๋ง ๊ดํธ ์๋ต O
export default username => {...}
// ๋งค๊ฐ๋ณ์๊ฐ ๋ ๊ฐ ์ด์ ์๋ ๊ฒฝ์ฐ์ ๊ดํธ ์๋ต X
export default (userName, userAge) => {...}
// ํ์ดํ ํจ์์ ๋ฐํ๋ฌธ๋ง ์กด์ฌํ๋ ๊ฒฝ์ฐ, return๊ณผ {} ์๋ต O
const callMe = number => number * 3;
// ๊ฐ์ฒด ๋ฐํ์ ์ถ๊ฐ ๊ดํธ() ๋ด ๊ฐ์ฒด ์์ฑ
const callMe = number => ({ age: number })
// โ ์ค๊ดํธ๋ง ์๋ต, return ์์ฑํ๋ ๊ฒฝ์ฐ error!! โ
const callMe = number => return number * 3;
const user = {
name: 'MAX',
age: 26,
greet(userName) {
console.log(this.age); // 26
}
}
user.greet();
class User { // ํด๋์ค๋ช
์ ๋๋ฌธ์๋ก ์์
// ์์ฑ์ ํจ์
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
console.log('Hello!');
}
} // ๊ตฌ์ old ๊ตฌ๋ฌธ
// ----------------------------
// ์ต์ new ๊ตฌ๋ฌธ
class User {
name = 'Max';
age = 26;
}
// ----------------------------
// new ๊ฐ์ฒด ์์ฑ
const user1 = new User('Manuel', 35);
user1.greet(); // Hello!
์ฃผ๋ก ๊ฐ ๋ชฉ๋ก ์ง์ ํ ๋ ์ฌ์ฉ
const hobbies = ['Sports', 'Cooking', 'Reading'];
// ํจ์๋ฅผ ์
๋ ฅ ๋ฐ์
const index = hobbies.findIndex((item) => {
return item === 'Sports';
});
// โฃ 0
// {}, return ์๋ตํด์ ์ข ๋ ๊ฐ๋จํ ์์ฑํ๋ ๋ฐฉ๋ฒ
const index = hobbies.findIndex((item) => item === 'Sports'); // โฃ 0
๋ชฉ๋ก ๋ด์ฉ๋ฌผ ์ถ๋ ฅ ๋ฐ ๋ฐ์ดํฐ๋ฅผ jsx ์์๋ก ๋งคํํ ๋ ๋ฑ ์ฌ์ฉ
โ ๊ธฐ์กด ๋ฐฐ์ด ์์ โ, ์ ๋ฐฐ์ด ๋ฐํ โญ๏ธ
const editedHobbies = hobbies.map((item) => item + '!');
const editedHobbies = hobbies.map((item) => ({text: item})); // ๊ฐ์ฒด ๋ฐํ
๐ก findIndex()
, map()
์ธ์๋ find()
, filter()
, reduce()
, concat()
, slice()
, splice()
๋ฉ์๋ ๊ธฐ๋ฅ ์์๋๋ฉด ์ข์ !
- ์์น์ ๋ฐ๋ผ ์์๋ฅผ ๊ฐ์ ธ์ค๋ฏ๋ก ์ํ๋ ์ด๋ฆ ์ฌ์ฉ ๊ฐ๋ฅ
const [firstName, lastName] = ['Hal Chalamet', 'Timothee'];
- ํ๋กํผํฐ ์ด๋ฆ ๊ธฐ์ค์ผ๋ก ๊ฐ์ ธ์ค๋ฏ๋ก ๋์ผํ ํ๋กํผํฐ ์ด๋ฆ์ ์ฌ์ฉํด์ผ ํจ
- ๋ณ์นญ์ธ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ํ ๋น ๊ฐ๋ฅ
const {name: userName, age} = {name: 'bean', age: 26}
// ๊ฐ ๋ฐฐ์ด์ ๊ฐ์ ๊ฐ์ ธ์ด
const hobbies = ['Cooking', 'Sports'];
const newHobbies = ['Reading'];
const mergedHobbies = [...hobbies, ...newHobbies];
console.log(mergedHobbies); // ['Cooking', 'Sports', 'Reading']
const password = prompt('Your password'); // ์ฌ์ฉ์๊ฐ ์
๋ ฅ ๋ฐ๋ ์ฐฝ ํ์
const hobbies = ['Cooking', 'Sports'];
// ๋ฐฐ์ด ์์ ์ํ
for (const hobby of hobbies) {
console.log(hobby);
}
// โฃ Cooking
// โฃ Sports
const list = document.querySelector("ul");
list.remove();
๋ฏธ๋ฆฌ ์ ์๋ ํจ์๋ฅผ ๋ค๋ฅธ ํจ์์ ์ ๋ฌํ ๋ ์ด๋ฆ๋ง ์ ๋ฌํ๋ฉด ํจ์ ์์ฒด๋ฅผ ๊ฐ์ผ๋ก ์ ๋ฌํ๊ฒ ๋๋ค
function handleTimeout() {
consoel.log("Time out!");
}
setTimeout(handleTimeout);
// ํจ์ ์์ฒด๋ฅผ ์ ๋ฌํ ๋ ํจ์๋ช
๋ง ์ ๋ฌ!
function greeter(greetFn) {
greetFn();
}
greeter(() => console.log('Hi');
()
์๊ดํธ๋ฅผ ํฌํจํ ํจ์๋ฅผ ์ ๋ฌํ๋ฉด ํจ์๊ฐ ๋ฐ๋ก ์คํ๋๋ฉฐ, ํด๋น ํจ์์ ๋ฐํ๊ฐ์ด ์ ๋ฌ๋๋ค
// ํ์ด๋จธ๊ฐ ์ค์ ๋ ๋ handleTimeout ํจ์๊ฐ ๋ฐ๋ก ์คํ๋ ๋ค์
// ์ด ๋, handleTimeout ๋ฐํ๊ฐ์ด ์ ๋ฌ๋จ
setTimeout(handleTimeout());
โ setTimeout() ๋ฉ์๋์ ๋งค๊ฐ๋ณ์ ์ค์ ์์๋ ๋ฐํ๊ฐ์ด ์๋ ํจ์ ์์ฒด๋ฅผ ์ ๋ฌํด์ผ ํ๋ฏ๋ก ํจ์๋ช ๋ง ์ ๋ฌํด์ผ ํ๋ค
setTimeout(handleTimeout, 2000);
// ์ต๋ช
ํจ์๋ฅผ ์ ๋ฌํ ๋๋ ์ด๋ฅผ ๋ฐ๋ก ์คํํ๋ ๊ฒ์ด ์๋๋ผ
// ์ ์๋ง ํ๊ณ ์ ์ํ ํจ์๋ฅผ setTimeout์ ์ ๋ฌํ ๋ฟ !
setTimeout(() => {
console.log('More timing out...');
}, 4000)
e.g.
string
,number
,boolean
- ๊ธฐ์กด ๊ฐ ๋ณ๊ฒฝ ๋ถ๊ฐ โ โ ์๋ก์ด ๊ฐ์ ์์ฑํ๋ ๊ฒ !
let msg = 'Hello!';
msg = 'Hello there!'; // ๋ฎ์ด์จ์ ์๋ก์ด ๋ฌธ์์ด์ ์ ์ฅ -> ์ฆ, ์๋ก์ด string ์์ฑ
// ์ด๋ ๊ธฐ์กด ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋ string 'Hello!'๋ ์ญ์
// => ์ฆ, ๋ณ๊ฒฝ๋์ด string์ด ๋๋๊ฒ ์๋๋ผ ์๋ก์ด string์ด ์์ฑ๋๋ ๊ฒ!!
e.g.
object
,array
- ๊ธฐ์กด ๊ฐ ์์ โญ๏ธ
โ ๋ณ์์ ๊ฐ ์ ์ฅํ ๋ ๊ฐ ์์ฒด๋ฅผ ์ ์ฅํ๋ ๊ฒ ์๋๋ผ ํด๋น ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ์ ์ฅ
โ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐฐ์ด์ ์์ ๋์ง๋ง ์ฃผ์๋ ๋ณํ์ง ์์
๐ค
const
๋ก ์ ์ธ๋ ๋ฐฐ์ด์ ์์ ์ด ๊ฐ๋ฅํ ๊น?
๐ข ๊ฒฐ๋ก ์ YES โญ๏ธ !!!
๋ณดํต ์๊ณ ์๋ ์ฌ์ค์const
๋ก ์ ์ธํ๋ฉด ์์ ํ ์ ์๋ค๊ณ ์๊ณ ์๋ค
๊ทธ์น๋ง ์๋ฐํ ๋งํ์๋ฉด ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋ค๋๋ป์ด ์๋๋ผ ๋ณ์๋ฅผ ๋ฎ์ด์ธ ์ ์๋ค ๋ ๋ป!
โ ๊ทธ๋๊น ์ฆ, ์ ๊ฐ์ ํ ๋นํ ์๋ ์๋ค !!
โ But!const
์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๊ณ ๊ฐ์ฒด๋ ์ฃผ์๋ฅผ ์ฐธ์กฐํ์ฌ ์์ธ์ค๋๋ค๋ ์ ์ ํ์ฉํด์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ์๋ ๊ฐ์ ์กฐ์ํ ์๋ ์๋คconst array = ['a', 'b']; const newArray = []; // ์ ๊ฐ ํ ๋น์ ๋ถ๊ฐ array.push('c'); // ์ด์ ๊ฐ์ด ๋ฉ์๋๋ฅผ ํ์ฉํด์ ๋ฐฐ์ด ์์ ์ ๊ฐ๋ฅํ๋ค๋ ์ ์ฃผ์!! // const๋ก ์ ์ธํ ๋ฐฐ์ด๋ ์กฐ์์ ๊ฐ๋ฅํ๋ค๋ ์ ~.~