#Clone #Instagram #Review

SANGKU OHยท2020๋…„ 8์›” 15์ผ
4

๐ŸŽฌ์˜์ƒ๋ณด๊ธฐ: ํด๋ก ์ฝ”๋”ฉ ์™„์„ฑ

Wecode ์ธ์Šคํƒ€๊ทธ๋žจ ํด๋ก ์ฝ”๋”ฉ ํ”„๋กœ์ ํŠธ(Front-end)

ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ๐Ÿšจ

  • ์‚ฌ์ง„, ๋™์˜์ƒ, ์ปค๋จธ์Šค ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” SNS์ธ Instagram ํด๋ก  ์ฝ”๋”ฉ

๊ฐœ๋ฐœ ๊ธฐ๊ฐ„๐Ÿ“†

  • 2020/8/3 ~ 2020/8/14(2 Weeks)

๊ฐœ๋ฐœ ๋ชฉ์ ๐Ÿ

  • Vanila JS๋งŒ ๊ฐ€์ง€๊ณ  ์„œ๋น„์Šค ๊ตฌํ˜„์„ ํ†ตํ•œ Vanila JS ๋ฌธ๋ฒ•์— ์ต์ˆ™ํ•ด์ง€๊ธฐ
  • Vanila JS๋กœ๋งŒ ๊ตฌํ˜„ํ•œ ํด๋ก ํŽ˜์ด์ง€์˜ ๊ตฌ์กฐ๋ฅผ React๋ฅผ ํ†ตํ•œ ๊ตฌ์กฐํ™” ์—ฐ์Šต
  • CRA์„ ํ†ตํ•œ ์ดˆ๊ธฐ ํ”„๋กœ์ ํŠธ ์„ธํŒ… ์—ฐ์Šต
  • React ์ปดํฌ๋„ŒํŠธ ๊ณต์œ  ๋ฐ ๊ตฌ์กฐํ™”๋ฅผ ํ†ตํ•œ ํŒ€ ํ”„๋กœ์ ํŠธ ์—ฐ์Šต

์‚ฌ์šฉ ๊ธฐ์ˆ  & ๊ตฌํ˜„ ๊ธฐ๋Šฅโš™๏ธ

์‚ฌ์šฉ ๊ธฐ์ˆ 

  • React.js
  • React Router
  • RESTful API
  • sass

๊ตฌํ˜„ ๊ธฐ๋Šฅ

  • ๋ฐ์ดํ„ฐ์— ๋”ฐ๋ฅธ ๊ฐ€๋ณ€์ ์ธ ๋ ˆ์ด์•„์›ƒ ๊ตฌ์„ฑ
  • ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ(fetch ํ•จ์ˆ˜์˜ ์ ์šฉ)
  • ๋Œ“๊ธ€ ์ถ”๊ฐ€
  • React Router๋ฅผ ์ด์šฉํ•œ ํŽ˜์ด์ง€ ์ด๋™ ๊ธฐ๋Šฅ
  • SVG ์ด๋ฏธ์ง€์˜ ์ „ํ™˜

#code review๐Ÿ”Ž

- โญ๏ธ component
: ์ปดํฌ๋„ŒํŠธ๋Š” ์ž์‹ ์˜ ์ถœ๋ ฅ์— ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฐธ์กฐ ํ• ์ˆ˜ ์žˆ๋‹ค. ๊ธฐ๋Šฅ๋ณ„๋กœ ๊ฐ€์ง€๋ฅผ ์น˜๋ฉด์„œ ๋‚ด๋ ค๊ฐ„๋‹ค๋ฉด ๋ถ€๋ถ„๋ณ„๋กœ ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜๋ฉฐ ๋ฆฌํŒฉํ† ๋งํ•˜๊ธฐ์— ์œ ์šฉํ•˜๋‹ค.

  • ๐Ÿšจ renderํ•จ์ˆ˜์˜ return ์•ˆ์— ์ตœ์ƒ์œ„ ๋ถ€๋ชจ๋Š” ํ˜•์ œ์š”์†Œ๊ฐ€ ์—†๋Š” ๋‹จ์ผ ์š”์†Œ์—ฌ์•ผ ํ•œ๋‹ค. ํŠน์ •ํ•œ ํƒœ๊ทธ๋ฅผ ๋„ฃ์„ ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ <>,</>๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž.

    - โญ๏ธ React Routes

    ๐Ÿšจ npm install react-ourter-dom์„ ํ†ตํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์น˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค!

  • react-router-dom์„ ์„ค์น˜ํ•˜๊ณ  Router์™€ Routes๋ฅผ import ํ•ฉ๋‹ˆ๋‹ค.
  • Route๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์†์„ฑ์€ path์™€ component๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • Route์— ์žˆ๋Š” component์†์„ฑ์—๋Š” ํ™”๋ฉด์— ๋ณด์—ฌ์ค„ component๋ฅผ ๊ฐ’์œผ๋กœ ์ค๋‹ˆ๋‹ค.
  • path ์†์„ฑ์€ url ์ฃผ์†Œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ๊ฒฝ๋กœ๋ฅผ ์ œ์–ดํ•  routes.js์— ๋ชจ๋“  ๋ Œ๋”๋ฅผ ํฌ๋งํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ import ํ›„ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•œ๋‹ค.
  • ๋ณด์—ฌ์ฃผ๊ณ ์ž ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” import { withRouter } from 'react-router-dom'์„ ์„ค์ •ํ•œ๋‹ค.
  • export defalut withRouter(์ปดํฌ๋„ŒํŠธ์ด๋ฆ„)์œผ๋กœ export๋ฅผ ์„ค์ •ํ•œ๋‹ค.

- โญ๏ธ setState & e.target.value
: setState๋ฅผ ํ†ตํ•ด input tag๋ฅผ ํ†ตํ•ด ๋“ค์–ด์˜จ value ๊ฐ’์„ state์— ์ €์žฅ ํ•  ์ˆ˜์žˆ๋‹ค.

  • input tag์— onChage๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ๋ฐœ๋™ํ•˜๋„๋ก ์„ค์ •ํ•˜์˜€๋‹ค.
  • ํ•ด๋‹น ํ•จ์ˆ˜๋Š” input tag์—์„œ ๋ฐœ์ƒํ•œ ๋ณ€๊ฒฝ์ƒํ™ฉ์„ name์†์„ฑ์˜ state๋กœ ์„ค์ •ํ•˜๊ฒŒ ๋œ๋‹ค.
  • ๐Ÿ‘ name์ด๋ผ๋Š” target์†์„ฑ์˜ name๊ณผ, state์˜ key๋ฅผ ๋งค์น˜์‹œํ‚จ๋˜๋ฉด ์œ„์˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๋กœ ๊ฐ™์€ ์†์„ฑ์˜ name์„ ๊ฐ€์ง„ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” tip์„ ๋ฐฐ์› ๋‹ค!

- โญ๏ธ ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น(destructuring)
: ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น์€ ๋ฐฐ์—ด/๊ฐ์ฒด ์†์„ฑ์„ ํ•ด์ฒดํ•˜์—ฌ ๊ทธ ๊ฐ’์„ ๊ฐœ๋ณ„ ๋ณ€์ˆ˜์— ๋‹ด๋Š” ํ‘œํ˜„์‹์ด๋‹ค.
๊ตฌ๊ธ€๋ง์„ ํ†ตํ•ด ์–ป์€ ์ง€์‹๋“ค์„ ํ†ตํ•ด ๊ฐœ๋…์ ์ธ ๋ถ€๋ถ„์€ ์•Œ์•˜๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ์ ์šฉํ•ด์•ผ ๋ ์ง€ ์ž˜ ๋ชฐ๋ž๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋งŽ์€ ๋ถ€๋ถ„์—์„œ ๊ฐ€์ด๋“œ๋ฅผ ๋ฐ›๊ณ  ์ ์šฉํ•˜๋ฉด์„œ ์•ž์œผ๋กœ ์œ ์šฉํ•˜๊ฒŒ ์“ฐ์ผ ๊ฐœ๋…์ด๋ž€ ๊ฒƒ์„ ํ™•์ธ!

  • state๊ฐ’์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์•„๋ž˜์˜ ์ฝ”๋“œ์™€ ๊ฐ™์ด ํ•ญ์ƒ this.state.key๋ฅผ ์ž…๋ ฅํ•ด์ค˜์•ผ ํ•œ๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜ ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€์—์„œ this.state์˜ key๋ฅผ ๋ณ€์ˆ˜๋กœ ์„ ์–ธ์„ ํ•ด์ค€๋‹ค๋ฉด,
  • ๐Ÿ‘ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ค„์ด๊ณ , ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์ด ์ฆ๊ฐ€ํ•˜๋Š” ๊ฒฐ๊ณผ๋กœ ์ด์–ด์ง„๋‹ค.

- โญ๏ธ fetch function

  • ๋กœ๊ทธ์ธ์„ ํ•œ ๊ฒฝ์šฐ back-end ์„œ๋ฒ„์—์„œ access_token์„ ๋ฐ›์•„์„œ localStorage์— ์ €์žฅํ•œ๋‹ค.
    (localStorage.setItem())
  • POST๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด์„œ body์— ๊ฐ์ฒดํƒ€์ž…์œผ๋กœ ์„œ๋ฒ„๊ฐ€ ์ •ํ•œ key์„ ์•Œ์•„์•ผ ๊ทธ์— ๋งž๋Š” value๊ฐ’์„ ์ „๋‹ฌํ•œ๋‹ค.
    ์•„๋ž˜ ์ฝ”๋“œ์—์„œ๋Š” ์„œ๋ฒ„์˜ key = {email, password}, ๊ทธ์— ๋งž๋Š” value = ๊ตฌ์กฐ ๋ถ„ํ•ด๋ฅผ ํ†ตํ•ด ๊ฐ„์†Œํ™” ์‹œํ‚จ {this.state.userID, userPassword}๋ฅผ ๋„ฃ์–ด์ฃผ์—ˆ๋‹ค.
  • ๊ฐœ๋ฐœ์ž๋„๊ตฌ > application > localStorage์— ๋‚ด๊ฐ€ ์ •ํ•œ ๋ณ€์ˆ˜๋ช… "access_token"์— ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ํ† ํฐ๊ฐ’์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ† ํฐ์ด ์กด์žฌํ•˜๋Š” ์กฐ๊ฑด์—์„œ๋Š” main ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๊ฒŒ ๋œ๋‹ค.

- โญ๏ธ if๋ฌธ๊ณผ boolean์˜ ํ™œ์šฉ
: ์ฒ˜์Œ์—๋Š” userID์— ํŠน์ • ์กฐ๊ฑด์˜ ์ธํ’‹๊ฐ’์ด ๋“ค์–ด์˜ค๋ฉด ํ•จ์ˆ˜๊ฐ€ ๋ฐœ๋™๋˜๋Š” ๋กœ๊ทธ์ธ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

  • ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด password๋ฅผ ์ž…๋ ฅํ•˜๋Š” tag์™€ ๋กœ๊ทธ์ธ๋ฒ„ํŠผ์„ ๋ชจ๋‘ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋กœ๊ทธ์ธ ์กฐ๊ฑด ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํŠน์ • ํ‚ค์˜ ์ž…๋ ฅ ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค.
  • key ์ž…๋ ฅ์ด ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜(๋ฒ„ํŠผ์˜ ํด๋ฆญ & ํ‚ค์˜ ์ž…๋ ฅ) ํ•ด๋‹นํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๋ฒ„ํŠผํด๋ฆญ์„ ์œ„ํ•œ ์กฐ๊ฑด๋ฌธ์„ ์ƒ์„ฑํ•˜์˜€๋‹ค.

- โญ๏ธ SVG ์ด๋ฏธ์ง€ ์ปจํŠธ๋กค
: ์ข‹์•„์š” ๋ฒ„ํŠผ์„ ํด๋ฆญ ํ–ˆ์„ ๋•Œ ํ•˜ํŠธ์— ์ƒ‰๊น”์„ ์ฃผ๊ธฐ ์œ„ํ•ด SVG์˜ ๋‚ด๋ถ€ path ๋ฐ fill์˜ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•ด์•ผ ํ–ˆ๋‹ค.
ํ•˜์ง€๋งŒ Vanila JS์ฒ˜๋Ÿผ ๊ฐ์ฒด ์†์„ฑ๊ฐ’๋งŒ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ•˜๋‹ˆ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€ํ•˜๋‹ค๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.
๊ทธ๋ž˜์„œ SVG๋ฅผ ์ปดํฌ๋„ŒํŠธํ™” ํ•œ ํ›„, ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ํŠน์ • ์กฐ๊ฑด์—์„œ ๊ต์ฒดํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์˜€๋‹ค.

  • default๋กœ ๋ Œ๋”๋  SVG์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ
  • onClick ์ด๋ฒคํŠธ๋ฅผ ์ปจํŠธ๋กค ํ•  props๋ฅผ ์ง€์ •
  • ๋นจ๊ฐ„ ํ•˜ํŠธ ์ƒํƒœ์˜ SVG ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ
  • onClick ์ด๋ฒคํŠธ ์ œ์–ด๋ฅผ ์œ„ํ•ด props๋ฅผ ์ง€์ •
  • SVG๋ฅผ ๊ต์ฒดํ•  ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑ
  • ๐Ÿ‘ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ์–ดํ•  ๋ถˆ๋ฆฌ์–ธ state ์„ค์ •ํ–ˆ๋‹ค. ๋‘๊ฐ€์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜ ๋ฐ–์— ์—†๊ธฐ์— ๋ถˆ๋ฆฌ์–ธ์ด ์ ๋‹นํ•˜๋‹ค ํŒ๋‹จ๋˜์—ˆ๋‹ค.
  • ํด๋ฆญ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ๋ถˆ๋ฆฌ์–ธ ๊ฐ’์„ ๋ฐ˜๋Œ€๋กœ ์„ค์ •ํ•˜๋Š” ์ œ์–ด ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“  ํ›„, ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋“ค์˜ onClick์ด๋ฒคํŠธ์— ๋ถ€์—ฌํ•˜์˜€๋‹ค.

- โญ๏ธ mapํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ
: ๋ฐ์ดํ„ฐ์˜ ์–‘์— ๋”ฐ๋ผ์„œ ๊ฐ™์€ ํ˜•์‹์˜ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•ด์•ผ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค. ์ธ์Šคํƒ€ํด๋ก ์—์„œ๋Š” ๋ฉ”์ธํ”ผ๋“œ, ๋Œ“๊ธ€์ƒ์„ฑ, ์‚ฌ์ด๋“œ ์ถ”์ฒœ๊ณ„์ •์ด ์žˆ์—ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์—๋Š” map ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ์˜ ์–‘๋งŒํผ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌ์ƒ์‚ฐ ๊ฐ€๋Šฅํ•˜๋‹ค!

  • ์œ„์—์„œ ์„ค๋ช…ํ–ˆ๋˜ SVG๋ฅผ ๋ฐ”๊พธ๋Š” ๊ธฐ๋Šฅ์€ ๋Œ“๊ธ€์ฐฝ ๋‚ด์—๋„ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์ด๊ธฐ์— ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ ์œ„ํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑ ํ›„ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ import ํ–ˆ๋‹ค.
  • ์ „๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ถˆ๋ฆฌ์–ธ state๋ฅผ ํ†ตํ•œ SVG ์ œ์–ด ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•˜์˜€๋‹ค.
  • ๋‹ค๋งŒ ์ด๋ฒˆ์—๋Š” ๋Œ“๊ธ€์ฐฝ์œผ๋กœ ๊ตฌ์„ฑ๋  ๋ชจ๋“  tag ์š”์†Œ๋“ค์„ ๋ชจ๋‘ renderํ•จ์ˆ˜ ๋‚ด์— ์œ„์น˜์‹œ์ผฐ๋‹ค. ์ด๋Š” ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•ด๋‹น ์š”์†Œ๋ฅผ ๋‹ค์‹œ ํ†ต์งธ๋กœ ๋ฐ˜๋ณต ์‹œํ‚ค๊ธฐ ์œ„ํ•จ์ด๋‹ค.
  • ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋กœ reply ์ปดํฌ๋„ŒํŠธ๋ฅผ import ํ•œ ๋’ค
  • ๋Œ“๊ธ€์„ ์ž…๋ ฅํ•  input์ฐฝ์—์„œ state ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ textChange ํ•จ์ˆ˜์˜ ์„ค์ •, ์—”ํ„ฐ๋ฅผ ๋ˆŒ๋ €์„ ๋•Œ ๋Œ“๊ธ€์ƒ์„ฑ ํ•จ์ˆ˜๋ฅผ ํŠธ๋ฆฌ๊ฑฐ ์‹œํ‚ฌ pressEnter ํ•จ์ˆ˜์˜ ์„ค์ •, ๋Œ“๊ธ€์„ ์ƒ์„ฑํ•˜๋Š” addReply ํ•จ์ˆ˜๋ฅผ ๊ตฌ์„ฑํ–ˆ๋‹ค.
  • ๐Ÿ‘ ๋ฐฐ์—ด๋กœ ๋“ค์–ด์˜ค๋Š” value ๊ฐ’์„ ์ œ๋Œ€๋กœ renderํ•˜๊ธฐ ์œ„ํ•ด concatํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค.
  • ๐Ÿ‘ mapํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ’์„ ๋ฐฐ์—ด์— ๋‹ด์•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๐Ÿ‘ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•˜๊ณ ์ž ํ•˜๋Š” ํƒœ๊ทธ์‚ฌ์ด์— mapํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.
  • ๋ฐฐ์—ด์ธ replies๋ฅผ map ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ธ์ž์™€ ์ธ๋ฑ์Šค๋ฅผ ๋ฐ›์•„ ์ปดํฌ๋„ŒํŠธ์˜ state๋ฅผ ์„ค์ •ํ•ด์ฃผ๋Š” ํ˜•ํƒœ๋‹ค.
  • ๐Ÿ‘ ์ƒˆ๋กœ์šด ํƒœ๊ทธ๋ฅผ map ๋“ฑ์„ ํ†ตํ•ด ์ƒ์„ฑํ•  ๊ฒฝ์šฐ key ๊ฐ’์„ ์š”๊ตฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒ์„ฑ๋˜๋Š” index๋ฅผ key์˜ value๋กœ ์„ค์ •ํ•œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ ์ƒ์„ฑ์˜ ํŠธ๋ฆฌ๊ฑฐ๊ฐ€ ๋˜๋Š” value๊ฐ€ ๋“ค์–ด์˜ค๋Š” input tag์—๋Š” textChangeํ•จ์ˆ˜์™€ '๋Œ“๊ธ€์ƒ์„ฑ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ• ' ์‹คํ–‰ํ•จ์ˆ˜์ธ pressEnter, 'state์˜ ์ดˆ๊ธฐํ™”๋ฅผ ์œ„ํ•œ value ์†์„ฑ์„์ถ”๊ฐ€ ํ•œ๋‹ค.
  • ๋˜ํ•œ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ๋„ ๋Œ“๊ธ€์ด ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๋„๋ก button ํƒœ๊ทธ์— onClick ์ด๋ฒคํŠธ๋กœ ๋Œ“๊ธ€์ƒ์„ฑ ํ•จ์ˆ˜๋ฅผ ์„ค์ •ํ–ˆ๋‹ค.
  • ๐Ÿ‘ ์ผ๋ จ์˜ map ํ•จ์ˆ˜๋ฅผ ํ†ตํ•œ ํ˜•ํƒœ๋Š” ๋งค์ธํŽ˜์ด์ง€์˜ feed๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ, Aside ๋ถ€๋ถ„์˜ ๋‚ด์šฉ์„ ์ƒ์„ฑํ•˜๋Š” ๋ถ€๋ถ„์—๋„ ๋™์ผํ•˜๊ฒŒ ์ ์šฉํ•˜์—ฌ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜์—ˆ๋‹ค.
  • ์•„๋ž˜์™€ ๊ฐ™์ด ํ•จ์ˆ˜ ๋‚ด์—์„œ ๋ชจ๋“  ํƒœ๊ทธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

#Total reivew๐Ÿ‘

๊ฐ๊ฐ์˜ ์žฅ์ , ํ˜‘์—…์˜ ์ค‘์š”์„ฑ

์ฒ˜์Œ ์ผ์ฃผ์ผ๋™์•ˆ Vanila JS๋กœ ํŽ˜์ด์ง€๋ฅผ ๊ตฌํ˜„ํ•˜๋ผ๋Š” ๋ฏธ์…˜์„ ๋ฐ›์„ ๋•Œ, ๋˜ํ•œ React๋กœ ๋‹ค์‹œ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌ์„ฑํ•˜๋ผ๋Š” ๋ฏธ์…˜์„ ๋ฐ›์„ ๋•Œ, ์ด๊ฑธ ์ง€๊ธˆ์˜ ๋‚ด ์‹ค๋ ฅ์œผ๋กœ ์ผ์ฃผ์ผ๋งŒ์— ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๊ต‰์žฅํžˆ ํฐ ๋„์ „์œผ๋กœ ๋‹ค๊ฐ€์™”์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ๋žŒ์€ ์ ์‘์˜ ๋™๋ฌผ์ด๋ฉฐ, ์‚ฌํšŒ์„ฑ์ด ์žˆ๋Š” ์กด์žฌ์˜€๋‹ค.
์šฐ๋ฆฌ๋“ค์€ ์ตœ๋Œ€ํ•œ ๋ฏธ์…˜์„ ์™„์ˆ˜ํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅ์„ ํ•จ๊ณผ ๋™์‹œ์— ์˜†์ž๋ฆฌ์—, ๋’ท์ž๋ฆฌ์— ์žˆ๋Š” ๋™๊ธฐ๋“ค๊ณผ ์„œ๋กœ๊ฐ€ ๋ง‰ํžˆ๋Š” ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์ •๋ณด๋ฅผ ๊ณต์œ ํ•˜๊ณ  ๋ฐฐ์›Œ๋‚˜๊ฐ€๋ฉฐ ๊ฒฐ๊ตญ ๊ธฐ๊ฐ„ ๋‚ด์— ํ”„๋กœ์ ํŠธ๋ฅผ ์™„์„ฑ์‹œ์ผฐ๋‹ค. ํŠนํžˆ ์ด ๊ณผ์ •์—์„œ ๊ฐ ๊ฐœ๊ฐœ์ธ์ด ์žฅ์ ์ด ์žˆ๋‹ค๋Š” ๊ฑธ ๊นจ๋‹ฌ์•˜๋Š”๋ฐ, ์–ด๋–ค ๋™๊ธฐ๋Š” css๋ฅผ ๊ต‰์žฅํžˆ ์ž˜ํ•˜๋ฉฐ, ๋˜ ๋ˆ„๊ตฐ๊ฐ€๋Š” JS DOM ์ œ์–ด๋ฅผ ์ž˜ํ•œ๋‹ค. ๋˜ ๋‹ค๋ฅธ ๋™๊ธฐ๋Š” ํŽ˜์ด์ง€ ๋ ˆ์ด์•„์›ƒ์„ ๊ต‰์žฅํžˆ ๊น”๋”ํ•˜๊ฒŒ ๊ตฌ์„ฑํ•˜๊ธฐ๋„ ํ•œ๋‹ค.
๋ฌผ๋ก  ๋ชจ๋“  ๋ถ€๋ถ„์„ ์ž˜ํ•˜๋Š” ๋™๊ธฐ๋„ ์žˆ์—ˆ์ง€๋งŒ, ๊ฐœ๋ฐœ์€ ํ˜ผ์žํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋Š” ๊ฒƒ. ๋‚˜๋งŒ์˜ ๊ฐ•์ ์ด ์žˆ๋‹ค๋ฉด ์ถฉ๋ถ„ํžˆ ํ˜‘์—…์„ ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ถ€์กฑํ•œ ๋ถ€๋ถ„์€ ํŒ€์›๋“ค๊ณผ ํ•จ๊ป˜ ์ฑ„์›Œ ๋‚˜๊ฐ€๋ฉฐ ๋”์šฑ ์„ฑ์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ๋ฐœ์ž๋กœ์จ ๋ฐฉํ–ฅ์„ ์žก์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“œ๋Š” ์ฒซ wecode์—์„œ์˜ ํด๋ก ์ž‘์—…์ด์—ˆ๋‹ค.๐Ÿ‘

profile
Prof.Google์„ ํ†ตํ•ด ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ด ๊ณณ์— insert ๐Ÿธ

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

comment-user-thumbnail
2020๋…„ 8์›” 15์ผ

์˜ค: ์ •๋ง
์ƒ:์ค˜์•ผ ํ•œ๋‹ค
๊ตฌ:์š”

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2020๋…„ 8์›” 16์ผ

์˜ค์ƒ๊ตฌ์ƒ๊ตฌ์ƒ

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ