๐ฌ์์๋ณด๊ธฐ: ํด๋ก ์ฝ๋ฉ ์์ฑ
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
: ์ปดํฌ๋ํธ๋ ์์ ์ ์ถ๋ ฅ์ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ฅผ ์ฐธ์กฐ ํ ์ ์๋ค. ๊ธฐ๋ฅ๋ณ๋ก ๊ฐ์ง๋ฅผ ์น๋ฉด์ ๋ด๋ ค๊ฐ๋ค๋ฉด ๋ถ๋ถ๋ณ๋ก ์ฝ๋๋ฅผ ํ์ธํ๋ฉฐ ๋ฆฌํฉํ ๋งํ๊ธฐ์ ์ ์ฉํ๋ค.
- โญ๏ธ 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์์์ ํด๋ก ์์
์ด์๋ค.๐
์ค: ์ ๋ง
์:์ค์ผ ํ๋ค
๊ตฌ:์