๐Ÿ“† 22.10.03 - React ์ดํ•ดํ•˜๊ธฐ (1)

๋ฒ„๋“คยท2022๋…„ 10์›” 5์ผ
0

โœจToday I Learn (TIL)

๋ชฉ๋ก ๋ณด๊ธฐ
2/62
post-custom-banner

Before the start..๐Ÿš—


์š” ๋ช‡์ผ ๊ฐ„, ๋ฆฌ์•กํŠธ ์ ์‘ํ•˜๊ธฐ ์œ„ํ•ด ๋ธ”๋กœ๊ทธ ์ž‘์„ฑ์ด ๋Šฆ์—ˆ๋Š”๋ฐ ์˜ค๋Š˜์€ ์งฌ์ด ๋‚˜์„œ 2์ผ๊ฐ„์˜ ๋ฆฌ์•กํŠธ ๋Œ€์žฅ์ •์„ ์ •๋ฆฌํ•ด ๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

๋งŽ๊ด€๋ถ€~~ (์ด 2๋ถ€๋กœ ๋‚˜๋ˆˆ ๋ฆฌ์•กํŠธ ๊ธฐ๋ณธ ์ž…๋‹ˆ๋‹ค~)



1. React ์‹œ์ž‘


React

๐Ÿ’ก React๋ž€ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ์„ ์–ธ์ ์ด๊ณ  ํšจ์œจ์ ์ด๋ฉฐ ์œ ์—ฐํ•œ JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ. (Framework x)
๊ทธ๋ฆฌ๊ณ  js + html / xml ์ธ jsxํŒŒ์ผ์„ ์‚ฌ์šฉํ•ด
์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‚ด์— html์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Œ.

serverless

๐Ÿ’ก ์„œ๋ฒ„๋ฆฌ์Šค๋ž€ ๊ฐ€์ƒ๋จธ์‹ ์— ์„œ๋ฒ„๋ฅผ ์„ค์ •ํ•˜์—ฌ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค. 
์ข…๋ฅ˜๋Š” ํฌ๊ฒŒ Baas, FaaS ๋กœ ๋‚˜๋‰˜๋Š”๋ฐ ํ•œ๋ฒˆ ์•Œ์•„๋ณด์ž

- BaaS (Backend as a Service)

ex) firebase
์•ฑ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๋“ค์„ API๋กœ ์ œ๊ณตํ•ด ์คŒ์œผ๋กœ, ์„œ๋ฒ„ ๊ฐœ๋ฐœ ์—†์ด ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. 
ํ•˜์ง€๋งŒ ํด๋ผ์ด์–ธํŠธ ์œ„์ฃผ์˜ ์ฝ”๋“œ๋งŒ ์งค ์ˆ˜ ์žˆ๊ณ , ์•ฑ์˜ ๊ทœ๋ชจ์— ๋”ฐ๋ผ ๊ฐ€๊ฒฉ์ด ๋งŽ์ด ์ปค์ง€๋ฉฐ, 
๋ณต์žกํ•œ ๋กœ์ง์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.


- FaaS (Function as a Service)

ํ”„๋กœ์ ํŠธ๋ฅผ ์—ฌ๋Ÿฌ๊ฐœ์˜ ํ•จ์ˆ˜๋กœ ์ชผ๊ฐœ์„œ ์ปค๋‹ค๋ž€ ์ปดํ“จํŒ… ์ž์›์— ์ค€๋น„ํ•ด๋‘” ํ•จ์ˆ˜๋ฅผ ๋“ฑ๋ก, ๊ทธ ํ›„ ํšŸ์ˆ˜, 
์‹œ๊ฐ„์— ๋”ฐ๋ผ ๋น„์šฉ์„ ๋‚ด๋Š” ๋ฐฉ์‹

์žฅ์ ์œผ๋กœ๋Š” ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์ด๋ผ ๋ถˆํ•„์š”ํ•œ ์ง€์ถœ์„ ๋ง‰์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, 
์ธํ”„๋ผ ๊ด€๋ฆฌ ๋ฐ ํ™•์žฅ์„ฑ๋ฉด์—์„œ ์„ฑ๋Šฅ์ด ์ข‹๋‹ค.

๋‹จ์ ์œผ๋กœ๋Š” ๋ชจ๋“  ์ฝ”๋“œ๋ฅผ ํ•จ์ˆ˜ํ™” ํ•˜๋‹ค ๋ณด๋‹ˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ž์›์ด ์ œํ•œ์ด ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. 
๊ทธ๋ฆฌ๊ณ  aws ๊ฐ™์€ FaaS ์ œ๊ณต์‚ฌ์— ๊ฐ•ํ•œ ์˜์กด์„ ํ•˜๊ฒŒ ๋œ๋‹ค.

React virtual DOM

๐Ÿ’ก JavaScript์—์„œ ๋ฐฐ์› ๋˜ HTML์— ์ ‘๊ทผ๊ฐ€๋Šฅ์ผ€ ํ•ด์ฃผ๋Š” ๊ฐ์ฒด ๋ชจ๋ธ์ธ DOM์„ ์ข€ ๋” ํšจ์œจ์ ์ธ ๋ฒ„์ „(?) ์œผ๋กœ ํƒ„์ƒ์‹œํ‚จ ๊ฒƒ์ด 
์ด React์˜ Virtual DOM ์ด๋ผ๊ณ  ํ•œ๋‹ค.
์„œ๋น„์Šค์— ๋”ฐ๋ผ Web์˜ ๋ณต์žก๋„๊ฐ€ ์ฆ๊ฐ€ํ•˜๋‹ˆ, ๋‹น์—ฐํ•˜๊ฒŒ๋„ DOM ์กฐ์ž‘์ด ์ด์ „๋ณด๋‹ค ๋”์šฑ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์ผ์–ด๋‚˜๊ฒŒ ๋œ ๊ฒƒ์ด 
Virtual DOMํƒ„์ƒ์˜ ๋ฐฐ๊ฒฝ์ด๋‹ค. DOM์„ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉํ• ์ˆ˜๋ก ๋ธŒ๋ผ์šฐ์ €์— ์ ‘๊ทผํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ธŒ๋ผ์šฐ์ € ๋ Œ๋” ๊ณผ์ •์„ ์œ ๋ฐœ์‹œ์ผœ
์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ๋ถˆํŽธํ•œ์„ ์œ ๋ฐœ ์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๋ฅผ ๋ณด์•ˆํ•˜๊ธฐ ์œ„ํ•ด ์„ธ์ƒ์— ๋‚˜์˜จ ์ด ๊ธฐ์ˆ ์€ DOM์— ๋ฐ”๋กœ ๋ฐ˜์˜์„ ์‹œํ‚ค์ง€
์•Š์€ ์ƒํƒœ๋กœ ํ•˜๋‚˜์˜ ๊ฐ€์ƒ ๋ ˆ์ด์–ด์ด๋ฉฐ, ์ ์šฉ๋˜๋Š” ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ชจ์•˜๋‹ค๊ฐ€ ํ•œ๋ฒˆ์— DOM์— ๋ณด๋‚ธ๋‹ค.
์ด๋กœ ์ธํ•ด DOM์€ ๋‹จ ํ•œ ๋ฒˆ์˜ ์—…๋ฐ์ดํŠธ๋กœ ๋‹จ ํ•œ ๋ฒˆ์˜ ๋ Œ๋”๋งŒ ํ•˜๊ฒŒ๋˜์–ด ๋ธŒ๋ผ์šฐ์ €์— ๋ผ์น˜๋Š” ์˜ํ–ฅ์„ ๋Œ€ํญ ์ค„์ด๊ฒŒ ๋œ๋‹ค.

๋ฌผ๋ก  DOM์œผ๋กœ ํ•œ ๋ฒˆ์— ์ ์šฉ๊ฐ€๋Šฅํ•œ ๊ฒƒ์„ Virtual DOM์ด๋ผ๋Š” ๊ฐ€์ƒ ๋ ˆ์ด์–ด๋ฅผ ํ•œ ๋ฒˆ ๊ฑฐ์น˜๊ณ  ์ ์šฉ์„ ํ•˜๋‹ˆ, DOM์„ ์“ด ๊ฒƒ๋ณด๋‹จ ๋Š๋ฆฌ๊ธด 
ํ•˜์ง€๋งŒ, ์‚ฌ์‹ค์ƒ ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ์ ์šฉ๋˜๋Š” ์†๋„๊ฐ€ ๊ทธ๋ ‡์ง€ ์‹ค์ œ๋กœ ์‚ฌ์šฉ์ž๋“ค์ด ๋Š๋ผ๊ธฐ์—๋Š” DOM์ด๋‚˜ Virtual DOM ์ด๋‚˜ ์†๋„์˜ ์ฐจ์ด๋ฅผ 
๋ชป ๋Š๋‚„ ์ •๋„๋ผ๊ณ  ํ•œ๋‹ค.

[์ •๋ณด ์ถœ์ฒ˜](https://velog.io/@woohm402/virtual-dom-and-react)

๊ทธ๋ž˜์„œ ๊ฒฐ๋ก  react๊ฐ€ ํ˜„ ์‹œ์  ๊ฐ€์žฅ ์ธ๊ธฐ์žˆ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋œ ์ด์œ ๋Š” ์•„๋งˆ๋„ ์ด Virtual DOM์˜ ๋ง›์„ ์•Œ์•„๋ฒ„๋ ธ๊ธฐ ๋•Œ๋ฌธ์ด ์•„๋‹๊นŒ..?

React์—์„œ ํ•จ์ˆ˜ ์จ๋ณด๊ธฐ

// ๊ธฐ๋ณธ
function sayHello () {
	return "hello world!"
}

// ์˜ˆ์‹œ 1 - ๊ธฐ๋ณธ์ ์ธ ํ•จ์ˆ˜ ํ‘œํ˜„ ๋ฐฉ์‹
const sayHelloOnClick = () => {
	console.log('hello friend')
}
<App onClick={sayHelloOnClick} />

// โ—๏ธ ์˜ˆ์‹œ 1 - ์ต๋ช… ํ•จ์ˆ˜
<App onClick={() => console.log('hello friend')} />


// ์˜ˆ์‹œ 2 - ๊ธฐ๋ณธ์ ์ธ ํ•จ์ˆ˜ ํ‘œํ˜„ ๋ฐฉ์‹
const ReturnItem = (item) => {
	return <div>{item}</div>
}
{array.map(ReturnItem)}

// โ—๏ธ ์˜ˆ์‹œ 2 - ์ต๋ช… ํ•จ์ˆ˜
{array.map((item)=> <div>{item}</div>))}

React์—์„œ ํ•จ์ˆ˜ ์จ๋ณด๊ธฐ

  • ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น : ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์„ ๊ตฌ์กฐ๋ถ„ํ•ด

  • ๊ฐ์ฒด ๊ตฌ์กฐ๋ถ„ํ•ด ํ• ๋‹น ์ฝ”๋“œ ๋น„๊ต

//๊ตฌ์กฐ๋ถ„ํ•ด ํ• ๋‹น์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ

const user = {name: "์†์„๊ตฌ", age: 10};

console.log(user.name) // ์†์„๊ตฌ
console.log(user.age) // 10
// ๊ตฌ์กฐ๋ถ„ํ•ด ํ• ๋‹น์„ ์‚ฌ์šฉ
const { name, age } = user

console.log(name) // ์†์„๊ตฌ
console.log(age) // 10 
  • ๋ฐฐ์—ด ๊ตฌ์กฐ๋ถ„ํ•ด ํ• ๋‹น ์ฝ”๋“œ ๋น„๊ต
//๊ตฌ์กฐ๋ถ„ํ•ด ํ• ๋‹น์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ

    const games = ['๋ฐฐํ‹€๊ทธ๋ผ์šด๋“œ', '๋ฆฌ๊ทธ์˜ค๋ธŒ๋ ˆ์ „๋“œ'];
    
    console.log(game[0]) // ๋ฐฐํ‹€๊ทธ๋ผ์šด๋“œ
    console.log(game[1]) // ๋ฆฌ๊ทธ์˜ค๋ธŒ๋ ˆ์ „๋“œ

// ๊ตฌ์กฐ๋ถ„ํ•ด ํ• ๋‹น์„ ์‚ฌ์šฉ

const games = ['๋ฐฐํ‹€๊ทธ๋ผ์šด๋“œ', '๋ฆฌ๊ทธ์˜ค๋ธŒ๋ ˆ์ „๋“œ'];

console.log(game[0]) // ๋ฐฐํ‹€๊ทธ๋ผ์šด๋“œ
console.log(game[1]) // ๋ฆฌ๊ทธ์˜ค๋ธŒ๋ ˆ์ „๋“œ
  • ํ•จ์ˆ˜ ๋‚ด ๊ตฌ์กฐ๋ถ„ํ•ด ํ• ๋‹น ์ฝ”๋“œ ๋น„๊ต
//๊ตฌ์กฐ๋ถ„ํ•ด ํ• ๋‹น์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์„ ๋•Œ

    // user๊ฐ€ ๊ฐ์ฒด์ผ ๋•Œ
const getUserName = (user) => {
	return user.name
}

// user๊ฐ€ ๋ฐฐ์—ด์ผ ๋•Œ
const getUserName = (user) => {
	return user[0]
}

// ๊ตฌ์กฐ๋ถ„ํ•ด ํ• ๋‹น์„ ์‚ฌ์šฉ

// ๊ฐ์ฒด์ผ ๋•Œ
const getUserName = ({name, age}) => {
	return name;
};

// ๋ฐฐ์—ด์ผ ๋•Œ
const getUserName = ([name, age]) => {
	return name
};

์ „๊ฐœ ์—ฐ์‚ฐ์ž

๊ธฐ์กด์˜ ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์˜ ๊ฐ’์„ ์†์ƒ์‹œํ‚ค์ง€ ์•Š๊ณ  ๋ณต์‚ฌํ•˜๋Š” ๋ฐฉ๋ฒ• (๊นŠ์€ ๋ณต์‚ฌ)

const box = {size: "big", color: "red"};

const newBox = { ...box}; // {size: "big", color: "red"}
const newBlueBox = {...box, color: "blue" }; // {size: "big", color: "blue"}

๋‚˜๋จธ์ง€ ๋งค๊ฐœ๋ณ€์ˆ˜

๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์—์„œ ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น์„ ํ–ˆ์„ ๋•Œ ๋‚˜๋จธ์ง€ ์ •๋ณด๋ฅผ ๋ฌถ์–ด์„œ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

const user ={id: 1, name: "๋‘˜๋ฆฌ", age: 10, location: "seoul"};

// rest ์‚ฌ์šฉ
const {name, ...rest} = user;

// ์ฝ˜์†”์— rest๋ฅผ ์ฐ์–ด๋ณด๋ฉด, ๊ตฌ์กฐ๋ถ„ํ•ด ํ• ๋‹น์„ ํ•œ ์ •๋ณด๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ๊ฐ’์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. 
console.log(rest) // {id: 1, age: 10, location: "seoul"}

2. Component

์ปดํฌ๋„ŒํŠธ

๐Ÿ’ก ์ปดํฌ๋„ŒํŠธ๋ž€ ํ•˜๋‚˜์˜ ๋ธ”๋ก -> ํ•จ์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง -> ์ฝ”๋“œ์˜ ์œ ์ง€๋ณด์ˆ˜ ๋ฐ ๊ฐ€๋…์„ฑ์ด ์ข‹์•„์ง€๋Š” ํšจ๊ณผ๋ฅผ ๋ณด์—ฌ์คŒ

์ปดํฌ๋„ŒํŠธ ์ฝ”๋“œ ํ™•์ธ

ํ•ญํ•ด99 3์ฃผ์ฐจ ์ž๋ฃŒ ์ฐธ๊ณ 

์ปดํฌ๋„ŒํŠธ์˜ ๋ถ€๋ชจ ์ž์‹ ๊ด€๊ณ„

  • ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ : ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ’ˆ๋Š” ์ปดํฌ๋„ŒํŠธ

  • ์ž์‹ ์ปดํฌ๋„ŒํŠธ : ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ํ’ˆ์–ด์ง€๋Š” ์ปดํฌ๋„ŒํŠธ

  • ์˜ˆ์ œ๋กœ ํ™•์ธ

    // src/App.js
    import React from "react";
    
    function Child() {
      return <div>์—ฐ๊ฒฐ ์„ฑ๊ณต</div>;
    }
     // Mother > Child
    function Mother() {
      return <Child />;
    }
     // GrandFather > Mother
    function GrandFather() {
      return <Mother />;
    }
     // App > GrandFather
    function App() {
      return <GrandFather />;
    }
    
    export default App;
    
profile
ํƒœ์–ด๋‚œ ๊น€์— ๋งŽ์€ ๊ฒฝํ—˜์„ ํ•˜๋ ค๊ณ  ์•„๋“ฑ๋ฐ”๋“ฑ ์• ์“ฐ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž
post-custom-banner

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