#Clone #Tesla #Review

SANGKU OHยท2020๋…„ 8์›” 30์ผ
3
post-thumbnail

๐ŸŽฌ์˜์ƒ๋ณด๊ธฐ: ํ…Œ์Šฌ๋ผ ์˜์ƒ

Wecode ํ…Œ์Šฌ๋ผ ํด๋ก ์ฝ”๋”ฉ ํ”„๋กœ์ ํŠธ(Front-end)

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

  • ์ „๊ธฐ์ฐจ ์‚ฐ์—…์˜ ์„ ๋‘์ฃผ์ž์ธ Tesla์˜ ํŽ˜์ด์ง€๋ฅผ ํด๋ก  ์ฝ”๋”ฉ

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

  • 2020/8/18 ~ 2020/8/28(2 Weeks)

๊ตฌ์„ฑ์› ๐Ÿ‘จโ€๐Ÿ’ป

  • ํ”„๋ก ํŠธ์—”๋“œ 3๋ช…
  • ๋ฐฑ์—”๋“œ 2๋ช…

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

  • CRA์„ ํ†ตํ•œ ์ดˆ๊ธฐ ํ”„๋กœ์ ํŠธ ์„ธํŒ… ์—ฐ์Šต
  • React.js๋ฅผ ํ†ตํ•œ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ
  • git์„ ํ†ตํ•œ ํ”„๋ก ํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ์˜ ํ˜‘์—… ๊ฒฝํ—˜

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

์‚ฌ์šฉ ๊ธฐ์ˆ 

  • React.js(classํ˜• ์ปดํฌ๋„ŒํŠธ)
  • React Router
  • RESTful API
  • sass
  • Git

์ฃผ์š” ๊ตฌํ˜„ ๊ธฐ๋Šฅ

์ง์ ‘ ๊ตฌํ˜„ํ•œ ๊ธฐ๋Šฅ์€ โœ…, ํŒ€์›์ด ๊ตฌํ˜„ํ•œ ๊ธฐ๋Šฅ์€ โœ“ ํ‘œ์‹œ
1) ๐Ÿ“„ ํšŒ์›๊ฐ€์ž… / ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€

  • โœ“์ด๋ฉ”์ผ ๋ฐ ํŒจ์Šค์›Œ๋“œ ์–‘์‹ ํ™•์ธ ๊ธฐ๋Šฅ
  • โœ“ํšŒ์›๊ฐ€์ž… ๊ธฐ๋Šฅ(์•ฝ๊ด€ ๋™์˜ ๋ฐ ํŠน์ • ์กฐ๊ฑด)

2) ๐Ÿ“„ ๋ฉ”์ธํŽ˜์ด์ง€

  • โœ“ํŽ˜์ด์ง€ ๋กœ๋”ฉ์‹œ ์ด๋ฏธ์ง€ ์คŒ์ธ
  • โœ“๋ฒ„ํŠผ ํด๋ฆญ์‹œ ์ด๋ฏธ์ง€์˜ ํŠน์ • ์œ„์น˜ ์คŒ์ธ
  • โœ“scroll์— ๋”ฐ๋ฅธ ๋„ค๋น„๊ฒŒ์ด์…˜ ์ „ํ™˜
  • โœ…ํŠน์ • scroll์— ๋”ฐ๋ฅธ ๋„ค๋น„๊ฒŒ์ด์…˜ ์ƒ‰ ์ „ํ™˜

3) ๐Ÿ“„ ์ฐจ๋Ÿ‰ํŽ˜์ด์ง€

  • โœ…svg์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ
  • โœ“ํŠน์ • ์ˆ˜์น˜๊นŒ์ง€์˜ ์ˆซ์ž๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ
  • โœ…scroll์œ„์น˜์— ๋”ฐ๋ฅธ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋™์ž‘(์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง)
  • โœ…scroll๋™์ž‘์„ ๊ฐ์ง€ ํ›„ ๋ถ€๋“œ๋Ÿฌ์šด view์˜ ์ „ํ™˜
  • โœ…์‚ฌ์ด๋“œ ๋„ค๋น„๊ฒŒ์ด์…˜์„ ํ†ตํ•œ ํŠน์ • ํŽ˜์ด์ง€ ์œ„์น˜ ์ด๋™
  • โœ…ํŠน์ • scroll์— ๋”ฐ๋ฅธ ๋„ค๋น„๊ฒŒ์ด์…˜ ์ƒ‰ ์ „ํ™˜
  • โœ…๋น„๋””์˜ค ์ด๋ฏธ์ง€์˜ ์žฌ์ƒ
  • โœ…ํŽ˜์ด์ง€์˜ ๋™์  ๋ผ์šฐํŒ…

4) ๐Ÿ“„ ์ฃผ๋ฌธํŽ˜์ด์ง€

  • โœ“ํŠน์ • ์ˆ˜์น˜๊นŒ์ง€์˜ ์ˆซ์ž๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜ ํšจ๊ณผ
  • โœ“ํŠน์ • ์ฐจ๋Ÿ‰ ์˜ต์…˜์˜ ์ด๋ฏธ์ง€ ๋ถ€๋ถ„์ ์šฉ ๋ฐ ๊ฐ€๊ฒฉ์ •๋ณด ์ ์šฉ
  • โœ“์˜ต์…˜ ์ ์šฉ์— ๋”ฐ๋ฅธ ์˜ˆ์ƒ ๊ฐ€๊ฒฉ์ •๋ณด ๋ชจ๋‹ฌํŽ˜์ด์ง€ ์ƒ์„ฑ
  • โœ“๋น„๋””์˜ค ์ด๋ฏธ์ง€์˜ ์žฌ์ƒ

#code review๐Ÿ”Ž

- โญ๏ธ ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง
: React์—์„œ๋Š”, ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์›ํ•˜๋Š” ๋™์ž‘์„ ์บก์Šํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‚˜์„œ, ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ƒํƒœ์— ๋”ฐ๋ผ ์ปดํฌ๋„ŒํŠธ์˜ ์ผ๋ถ€๋งŒ ๋ Œ๋”๋ง ํ•  ์ˆ˜ ์žˆ๋‹ค!

  • ํ•„์ž์˜ ๊ฒฝ์šฐ ๊ตฌ๋ถ„ํ•˜๊ธฐ ํŽธํ•˜๊ฒŒ ๊ฐ ์ปดํฌ๋„ŒํŠธ๋ช…๊ณผ ๋™์ผํ•˜๊ฒŒ state๋ฅผ false๋กœ ์„ ์–ธ ํ•˜์˜€๋‹ค.
  • ์„ ์–ธํ•œ state๋“ค์„ ๊ฐ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋“ค์—๊ฒŒ props๋กœ ๋„˜๊ฒจ์ฃผ์—ˆ๋‹ค.
  • ํ•„์ž๋Š” ๊ฐ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ํŽ˜์ด์ง€์˜ ํ•œ ๋ถ€๋ถ„์„ ๋‹ด๋‹นํ•˜๋Š”ํ˜•ํƒœ๋กœ ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑํ•˜์˜€์œผ๋ฉฐ, ํŽ˜์ด์ง€์˜ view๊ฐ€ ์ผ์ • scroll์˜ ์œ„์น˜๋ฅผ ๋„˜์–ด๊ฐ€๋ฉด ๋ Œ๋”๊ฐ€ ๋˜๋„๋ก ํ•˜๋Š” ์กฐ๊ฑด์„ ๋งŒ๋“ค์—ˆ๋‹ค.
  • ๋ถˆ๋ฆฌ์–ธํ˜•ํƒœ์˜ ์กฐ๊ฑด์„ ํ†ตํ•ด ๋ Œ๋”๋ฅผ ํ•˜๊ณ ์žํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•ด๋‹น ์กฐ๊ฑด์ด true๊ฐ€ ๋˜์—ˆ์„ ๊ฒฝ์šฐ ๋ถ€๋ถ„์„ ํŠน์ •์ง€์–ด์„œ ์กฐ๊ฑด๋ถ€ ๋ Œ๋”๋ง์„ ์™„์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค! ๐Ÿ‘

- โญ๏ธ scroll event
:React์—์„œ๋Š”, ํŠน์ • ์˜์—ญ๋งŒํผ scrollํ•  ๋•Œ, compononentDidMount์—์„œ ์Šคํฌ๋กค ์ด๋ฒคํŠธ๋ฅผ ๋“ฑ๋กํ•˜๊ณ , ๋ฉ”์†Œ๋“œ๋ฅผ ํ™œ์šฉํ•ด์„œ state๋ฅผ ์Šคํฌ๋กคํ• ๋•Œ๋งˆ๋‹ค ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์ด๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํŠน์ • ์•ก์…˜์„ ์‹คํ–‰์‹œํ‚ค๋Š” ๋™์ž‘์„ ํ•  ์ˆ˜์žˆ๋‹ค.

  • state์—์„œ scroll์˜ ๋ถˆ๋ฆฌ์–ธ์กฐ๊ฑด, ํ˜„์žฌ scroll์— ๋Œ€ํ•œ ๊ธฐ๋ณธ๊ฐ’์„ ์ •์˜ํ–ˆ๋‹ค.
    (์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌํ™œ์šฉํ•˜๋“ฏ ๊นจ์•Œ๊ฐ™์ด ์Šคํฌ๋ฆฐ์ƒท๋„ ์žฌํ™œ์šฉํ•œ๋‹ค)
  • compononentDidMount์— ์ด๋ฒคํŠธ์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•œ๋‹ค
  • ์œ„์ชฝ๊ณผ ๊ฐ™์ด scroll ์ด๋ฒคํŠธ๋ฅผ ์ ์šฉํ•˜๋Š” ๊ฒƒ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์•„๋ž˜์™€ ๊ฐ™์ด ๋‹ค๋ฅธ EventListener๋ฅผ ์ •์˜ํ•˜์—ฌ ํ™œ์šฉ ํ•  ์ˆ˜์žˆ๋‹ค! ๐Ÿ‘
  • scroll์˜ ์ขŒํ‘œ๊ฐ’์— ๋”ฐ๋ผ ์ ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” ์•ก์…˜์„ ์ •์˜ํ•˜๋ฉด ๋œ๋‹ค.
    (์œ„์˜ ์ฝ”๋“œ์—์„œ๋Š” scrollY์˜ ์ขŒํ‘œ๊ฐ’์„ ํ†ตํ•ด ์•ก์…˜์„ ์ •์˜ํ•˜์˜€๋‹ค)
  • if ๋ฌธ์„ ํ†ตํ•ด ์Šคํฌ๋กค์ด ์›€์ง์ด๋ฉด(ํ•ด๋‹น ์ฝ”๋“œ์—์„œ๋Š” keyCode๋ฅผ ์กฐ๊ฑด์œผ๋กœ ํ•˜์˜€๋‹ค)
  • false์˜€๋˜ scroll์„ true๋กœ ๋ณ€ํ™˜, ๊ธฐ์กด์˜ CurrentPosY state๋ฅผ ์›€์ง์ผ ์Šคํฌ๋กค๋งŒํผ - ํ˜น์€ + ๋กœ ๋ณ€๊ฒฝ
  • ํ•ด๋‹น ์กฐ๊ฑด์—์„œ scrollTo ๋ฉ”์†Œ๋“œ์˜ ์‹คํ–‰์„ CurrentPosY ๋งŒํผ ์ด๋™ ํ•˜๋„๋ก ํ•จ์ˆ˜ ์‹คํ–‰์˜ ์ˆœ์„œ๋กœ ์ง„ํ–‰ํ•˜๋„๋ก ํ•˜์˜€๋‹ค
  • ๐Ÿšจ ๋‹จ์ง€ ์œ„์˜ ์กฐ๊ฑด๋งŒ ์ •์˜ํ•œ๋‹ค๋ฉด ์›€์ง์ด๋Š” ๋งค ์ˆœ๊ฐ„ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ setState ๋œ CurrentPosY์˜ ์ขŒํ‘œ๋งŒํผ ํ˜„์žฌ์˜ scroll์ด ๋„๋‹ฌํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด scroll state๋ฅผ false๋กœํ•˜๋Š” ์กฐ๊ฑด์„ ํ†ตํ•ด ํ•จ์ˆ˜๊ฐ€ ์ค‘๋ณต์‹คํ–‰๋˜์–ด ์ด๋ฒคํŠธ๋ฅผ ๋ฒ—์–ด๋‚˜๋Š” ํ˜„์ƒ์„ ๋ฐฉ์ง€ํ•˜์˜€๋‹ค. ๐Ÿ‘

    ๐Ÿšจ ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ํŠธ๋ž™ํŒจ๋“œ์™€ ๋งค์ง๋งˆ์šฐ์Šค์—์„œ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋‘๋ฒˆ์”ฉ ์‹คํ–‰์ด ๋˜๋Š” ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ๊ฒฌ๋˜์—ˆ๋‹ค..๐Ÿ˜ญ(keyCode๋ฅผ ํ†ตํ•œ ํ•จ์ˆ˜์‹คํ–‰์˜ ๋น„ํ•˜์ธ๋“œ...)
    ๊ฒฐ๊ตญ ์™œ ๊ทธ๋Ÿฐ ํ˜„์ƒ์ด ๋ฐœ๊ฒฌ๋œ์ง€๋Š” ์ฐพ์ง€ ๋ชปํ–ˆ๋‹ค...

- โญ๏ธ ๋™์  ๋ผ์šฐํŒ…

  • Route ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ†ตํ•ด ๋ผ์šฐํŠธ์˜ ๊ฒฝ๋กœ์— ํŠน์ • ๊ฐ’์„ ๋„ฃ์–ด ํ•ด๋‹น ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค!
  • ๊ทธ ์ค‘ ์•„๋ž˜์—์„œ๋Š” URL parameters๋ฅผ ํ†ตํ•œ ๋™์  ๋ผ์šฐํŒ…์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž
  • ์œ„์™€ ๊ฐ™์ด Routes.js ์—์„œ path์—์„œ :id๋ฅผ ํ†ตํ•œ path๋ฅผ ์ง€์ •ํ•œ๋‹ค.
  • ์ง€์ •ํ•  ๊ฒฝ์šฐ, CarModel,Order ์ปดํฌ๋„ŒํŠธ์—์„œ this.props.match.params.model๋ฅผ ํ†ตํ•ด ํ•ด๋‹น ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • CarModel์˜ render์—์„œ ์œ„์™€ ๊ฐ™์ด ์ฝ˜์†”์„ ์ฐ์–ด๋ณธ๋‹ค๋ฉด
  • ์ด๋ ‡๊ฒŒ this.props.match.params๊ฐ€ ๋‚˜ํƒ€๋‚œ๋‹ค!(๋‘๋‘๋‘ฅ์žฅ!๐Ÿ˜Ž)
  • state์— this.props.match.params.path์— ์ง€์ •ํ•œ id๋ฅผ ์ง€์ •ํ•œ ๋’ค
  • ์ž์‹์ปดํฌ๋„ŒํŠธ๋“ค์—๊ฒŒ ๊ตฌ์กฐ ๋ถ„ํ•ด ํ• ๋‹น ํ›„ props๋กœ ๋„˜๊ฒจ์ฃผ์—ˆ๋‹ค.
  • ์ž์‹์ปดํฌ๋„ŒํŠธ์˜ componentDidMount์—์„œ fetchํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ๋‹ค
  • ํ•ด๋‹น fetch์˜ url์˜ id ๋ถ€๋ถ„์„ {this.props.model}๋กœ ์ง€์ •ํ•ด์ค€๋‹ค.
    (์œ„์˜ ์ฝ”๋“œ์—์„œ๋Š” mock data๊ฒฝ๋กœ๋กœ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค)
  • fetch๋ฅผ ํ†ตํ•ด ๋ฐ›์€ ์ •๋ณด๋ฅผ setState๋ฅผ ํ†ตํ•ด state์— ๋‹ด์•„ ์ค€๋‹ค.
  • ์œ„์˜ ํ•จ์ˆ˜์—์„œ๋Š” ๋‚ด๋ ค๋ฐ›์€ ๋ฐ์ดํ„ฐ ์ค‘ exterior.img์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ background ์ด๋ฏธ์ง€ url์˜ ์ •๋ณด๋กœ ํ™œ์šฉํ•œ ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์„œ ์œ ๋™์ ์ธ ๋ฐฐ๊ฒฝํ™”๋ฉด์„ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.
  • ์ธ๋ผ์ธ ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด์ค€ ํ•จ์ˆ˜๋ฅผ ์›ํ•˜๋Š” ๋ถ€๋ถ„์˜ inline style์˜ ํ˜•ํƒœ๋กœ ์‹คํ–‰์‹œํ‚ค๋„๋ก ๊ตฌ์„ฑํ•˜์˜€๋‹ค.

- โญ๏ธ keyFrames & Common.scss
: ๋งŽ์€ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์ ์šฉ๋˜๋Š” ํŽ˜์ด์ง€๋ฅผ ์ž‘์—…ํ•˜๋Š” ๋งŒํผ common.scss์— keyFrames์„ ์„ ์–ธ ํ›„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ์ฝ”๋“œ ๊ฐ„์†Œํ™”์— ์„ฑ๊ณตํ•˜์˜€๋‹ค. ๐Ÿ‘

  • common.scss์— ๊ฐ์ข… keyFrames์„ ๊ตฌ์„ฑํ•œ๋‹ค.
    (๋ณธ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” https://animista.net/ ์˜ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ฐธ๊ณ ํ•˜์˜€๋‹ค.)
  • ์›ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์˜ scssํŒŒ์ผ์—์„œ ํ•ด๋‹น keyFrames์„ animation ์†์„ฑ์„ ํ†ตํ•ด ์ ์šฉํ•ด์ฃผ๋ฉด ๋!๐Ÿ‘

#Total reivew๐Ÿ‘

์†Œํ†ต, ์†Œํ†ต, ๋˜ ์†Œํ†ต..!

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

trello๋ฅผ ์ข€ ๋” ์ž˜ ์‚ฌ์šฉํ–ˆ๋”๋ผ๋ฉด..


์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” trello๋ผ๋Š” ํ˜‘์—… ํˆด์„ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜์˜€๋‹ค.
to do list์˜ ์นด๋“œ๋ฅผ ์ƒ์„ฑ ํ›„ ํ• ์ผ์„ ์ œ๊ฑฐํ•ด ๋‚˜๊ฐ€๋ฉฐ, ์ผ์ •์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ถ€๋ถ„์—์„œ๋Š” ๋ฌด๋ฆฌ๊ฐ€ ์—†์—ˆ์ง€๋งŒ ํ•ญ์ƒ ์ผ์ •์— ์ซ“๊ธฐ๋Š” ๋“ฏํ•œ ๊ธฐ๋ถ„์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ์ œ๋Œ€๋กœ trello๋ฅผ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•œ ๋Š๋‚Œ์ด ๋“ค์—ˆ๋‹ค.
์•„๋งˆ ์œ„์—์„œ ๋งํ•œ ์†Œํ†ต์˜ ๋ถ€์žฌ๊ฐ€ ์ด ๋ถ€๋ถ„์—์„œ๋ถ€ํ„ฐ ์‹œ์ž‘์ด ๋œ ๊ฒƒ์ด ์•„๋‹๊นŒ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค๊ธฐ๋„ ํ•œ๋‹ค.
๋‹ค์Œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์กฐ๊ธˆ ๋” ์†Œํ†ต๊ณผ ํ˜‘์—…ํˆด์˜ ์‚ฌ์šฉ์— ๋Œ€ํ•ด ์‹ ๊ฒฝ์„ ์จ์•ผ๊ฒ ๋‹ค๋Š” ๋‹ค์ง์„ ํ•ด๋ณด๋ฉฐ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งˆ๋ฌด๋ฆฌ ํ•œ๋‹ค...๐Ÿ™

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

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