๐ป ์ด๋ฒ ์คํ๋ฆฐํธ๋ฅผ ๊ฐ์ฅ ์ฆ๊ฒ๊ฒ ๋ชฐ์ ํ๋ค. ํญ์ ๊ทธ๋ฌํ๋ฏ, ์ฒ์์๋ ์ ๋ง ๋ง๋งํ๋ค. ํ์ง๋ง ์ฒ์์ผ๋ก API๋ ์ ์ฉํด๋ณด๊ณ ๊ณ์ ์๋๋ ๊ฒ์ด ๊ฒฐ๊ตญ ๋ ๋, '์ญ์ ํ๋ฉด ๋๋๊ตฌ๋'๋ฅผ ๋ ํ๋ฒ ๋๋ผ๊ฒ ํด์ค ๊ณ ๋ง์ด ์คํ๋ฆฐํธ์๋ค.
https://reactjs.org/docs/thinking-in-react.html ๊ผญ! ์ฝ์ด๋ณด์.
React
๋ก ๊ตฌํ๋ Front-end
์ ํ๋ฆฌ์ผ์ด์
์ React
์ปดํฌ๋ํธ(์ดํ ์ปดํฌ๋ํธ)๋ก ๊ตฌ์ฑ๋๋ค. ์ปดํฌ๋ํธ์๋ ๋ค๋ฅธ ์ปดํฌ๋ํธ๊ฐ ํฌํจ๋ ์ ์์ง๋ง, ๊ฐ ์ปดํฌ๋ํธ๋ ๋ณดํต ํ๊ฐ์ง ์ผ์ ์ํํด์ผ ํ๋ค. ์ด ์ ํ๋ฆฌ์ผ์ด์
์ ์ปดํฌ๋ํธ๋ค์ ์ํธ์์ฉ์ ๊ตฌํํ๊ณ , YouTube Data API
์ ์ฐ๊ฒฐ๋๋๋ก ์ปดํฌ๋ํธ๋ฅผ ๋ณํํด๋ณด์.
App
- ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์
์ ์ต์์ ์ปจํ
์ด๋, DOM
์ ์ง์ ๋ ๋๋ง๋๋ ์ปดํฌ๋ํธ์ด๋ค.Nav
- ์๋จ ๋ด๋น๊ฒ์ด์
๋ฐ์ ๋ํ ์ปจํ
์ด๋ ์ปดํฌ๋ํธ์ด๋ค.Search
- ๊ฒ์ ์
๋ ฅ ํ๋(<input>
)์ ๋ํ ์ ๋ณด๋ฅผ ์๊ณ ์ ๋ฌํด์ผํ๋ค.VideoPlayer
- ์ ํํ ๋น๋์ค๋ฅผ ์ฌ์ํ๊ณ , ์ด์ ๋ํ ์ ๋ณด๋ฅผ ํ์ํ๋ ์์
์ ๋ด๋นํ๋ค.VideoList
- ๋์์ ๋ชฉ๋ก์ ๋์ดํ๋ ์ปจํ
์ด๋ ์ปดํฌ๋ํธ์ด๋ค.VideoListEntry
- ์ฌ์ํ ๋์์์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ด๋ฏธ์ง๋ฅผ ํ์ํ๋ค. ์ด ๋น๋์ค์ ์ ๋ชฉ์ ํด๋ฆญํ๋ฉด, ํด๋น ๋น๋์ค๊ฐ VideoPlayer
์ปดํฌ๋ํธ์์ ์ฌ์๋๋ค.๋จผ์ React ์ ํ๋ฆฌ์ผ์ด์
์ด ํ๋ฉด์ ์ด๋ป๊ฒ ํ์๋๋์ง ํ์ธํ๋ค. index.js
ํ์ผ์์ App
์ปดํฌ๋ํธ๊ฐ ์ ๋๋ก ๋ ๋๋ง ๋ ์ ์๋๋ก ์์ ํ์๋ค. ์ฌ๊ธฐ๊น์ง๋ ๋น์ฐํ๊ฒ๋ ์ด๋ ต์ง ์์๋ค.
fakeData.js
ํ์ผ๋ก ์ ์ฅ๋์ด ์๋ ์ํ ๋ฐ์ดํฐ๋ฅผ ํตํด VideoList
์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค. fakeData
๋ฅผ import
๋ฅผ ํตํด ๋ถ๋ฌ์ค๊ณ , ๋์ ์ผ๋ก VideoListEntry
์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋ ๊ณผ์ ์ ๊ฑฐ์ณค๋ค.
fakeData
์ด๋ค. ๋ค์๊ณผ ๊ฐ์ด ๋ฐฐ์ด์ ํํ๋ก ๊ฐ๊ฐ์ ๋น๋์ค ์ ๋ณด๋ฅผ ๊ฐ์ฒด๋ก์จ ๋ด๊ณ ์๋ค.VideoListEntry
์ปดํฌ๋ํธ์ fakeData
๋ฅผ import
ํ๊ณ , VideoListEntry
์ปดํฌ๋ํธ props
๊ฐ์ฒด ์์ ๋น๋์ค์ title
, description
, url
์ ๋ณด๋ฅผ ์ถ๊ฐํ๊ณ , map
ํจ์๋ฅผ ํตํด ๋ฆฌ์คํธ๋ฅผ ๋ ๋๋ง ํ๋ค.VideoList
์ปดํฌ๋ํธ๋ก๋ถํฐ props
๋ฅผ ์ ๋ฌ ๋ฐ์ ๊ฐ๊ฐ์ ๋น๋์ค ์ ๋ณด๋ฅผ ๋ฆฌํดํ๋ค.Warning: Each child in a list should have a unique 'key' prop. See https://fb.me/react-warning-keys for more information.
fakeData
์์ ํค๋ก ์ง์ ํ ๋งํ ๊ณ ์ ํ ๊ฐ์ด ์ด๋ค ๊ฒ์ด ์๋์ง ํ์ธํ์ฌ videoId
๊ฐ์ key
๋ก ์ง์ ํ์๋ค. ๋ฆฌ์กํธ ๊ณต์ ๋ฌธ์(https://ko.reactjs.org/docs/lists-and-keys.html)์ 8.Lists and Keys
๋ฅผ ์ดํด๋ณด๋ฉด Key๋ฅผ ์ ํํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ๋ฆฌ์คํธ์ ๋ค๋ฅธ ํญ๋ชฉ๋ค ์ฌ์ด์์ ํด๋น ํญ๋ชฉ์ ๊ณ ์ ํ๊ฒ ์๋ณํ ์ ์๋ ๋ฌธ์์ด์ ์ฌ์ฉํ๋ ๊ฒ ์ด๋ผ๊ณ ๋ช
์๋์ด ์๋ค.๊ฐ๋ฐ ๊ณผ์ ์ ์์ด ์๊ฐ์ ์ผ๋ก ์ปดํฌ๋ํธ ๋จ์๋ฅผ ํ์ธํ๊ธฐ ์ข๋ค. ๋ด๊ฐ ๋ง๋๋ ค๋ ์ปดํฌ๋ํธ๊ฐ ์ด๋ป๊ฒ ํ๋ฉด์ ํ์๋๋์ง ํ์ธํ ์ ์๊ฒ ๋์์ค๋ค.
์ฌ๊ธฐ์๋ถํฐ ๊ฐ์๊ธฐ ์ด๋ ค์ ๋ค. fakeData
๋ฅผ ๋ถ๋ฌ์จ ํ, ํ๋๋ฅผ ์ ํํด์ VideoPlayer
๋ก ์ ๋ฌํด์ผํ๊ณ , ์ ๋ฌํ ๋น๋์ค๋ฅผ ์ฌ์ํ๊ณ ์ ๋ชฉ๊ณผ ์ค๋ช
์ ํ์ํ VideoPlayer
๋ฅผ ์
๋ฐ์ดํธ ํด์ผํ๋ค. ์ผ๋จ์, ์ด๊ฒ์ ๊ตฌํํ๊ธฐ ์ํด App.js
์์ VideoPlayer
์ปดํฌ๋ํธ์๊ฒ props
๋ฅผ ํตํด fakeData
์ ์ฒซ ๋ฒ์งธ ๋น๋์ค ์ ๋ณด๋ฅผ ๋๊ฒจ์ฃผ์ด๋ดค๋ค.
src
, title
, description
์ props
๋ก ์ ๋ฌ ๋ฐ์์ iframe
ํ๊ทธ๋ก ์ฌ์ํ๋ค. ์ผ๋จ ๋ธ๋ผ์ฐ์ ์ ์ฌ์ํ ๋น๋์ค ํ๋๋ฅผ ๋ ๋๋งํ๊ณ ๋น๋์ค ๋ฆฌ์คํธ๊น์ง ๋ ๋๋ง ํ๋๋ฐ๊น์ง๋ ์ฑ๊ณตํ๋ค. ํ์ง๋ง ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ ๋๋ฅผ ๊ณ ๋ คํ์ฌ ๋์ ์ผ๋ก VideoPlayer
์ปดํฌ๋ํธ๋ฅผ ๋ง๋๋ ๊ฒ์ ๋ํด ๊ณ ๋ฏผํด์ผํ๋ค.VideoListEntry
์ ์ ๋ชฉ์ ํด๋ฆญํ๋ฉด ํด๋น ๋์์์ด ํ๋ ์ด์ด์ ํ์๋๋๋ก ํด์ผํ๋ค. React
์์๋ ํ์ ์ปดํฌ๋ํธ๋ ์๋ก ์ง์ ์์ธ์ค ํ ์ ์๊ธฐ ๋๋ฌธ์ stateful
ํ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด ์๋ก ์ํธ์์ฉํ๋๋ก ๋ง๋ค๊ธฐ ์ํด์ ๋ฆฌ์กํธ ๊ณต์๋ฌธ์์ Lifting State Up
์ ๋ณด๊ณ ๋ ๋ด๋ ์ดํด๊ฐ ์ ๊ฐ์ง ์์๋ค. React
์ ํํฅ์ ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ ์ดํดํ๊ธฐ ์ํด ์์ JavaScript
์ฝ๋๋ฅผ ํตํด ์ดํดํด๋ดค๋ค.
๋ํ 3๋ฒ์์ ๋์ ์ธ VideoPlayer
๋ฅผ ์ด๋ป๊ฒ ๊ตฌํํด์ผํ ์ง ์๊ฐํด์ผ ํ๋๋ฐ, ์คํ๋ฆฐํธ ๋ฌธ์์ ๋์์๋ App
์ class
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฆฌํฉํ ๋งํ๊ณ , App
์ state
๋ฅผ ์ด๊ธฐํํ์ฌ, ๋์์ ๋ชฉ๋ก์ ๋ชจ๋ ๋์์๊ณผ ํ๋ ์ด์ด์ ํ์ฌ ๋์์์ ๊ด๋ฆฌํ๋ผ๋ ๋ง์ด ํฐ ํํธ๊ฐ ๋์๋ค.
JSX
์๋ฆฌ๋จผํธ์ ๋๋ถ๋ถ์ props
๋ ์ปดํฌ๋ํธ๋ก ์ ๋ฌ๋์ง๋ง ๋ ๊ฐ์ ํน์ props
(ref
๋ฐ key
)๋ ์ปดํฌ๋ํธ๋ก ์ ๋ฌ๋์ง ์๋๋ค๋ ๊ฒ์ด๋ค! ์๋ฅผ ๋ค์ด, ์ปดํฌ๋ํธ์์ this.props.key
๋ฅผ render
ํจ์์์ ์ ๊ทผํ๋ฉด ๊ทธ ๊ฐ์ undefined
์ด๋ค. ์์ ์ปดํฌ๋ํธ ๋ด์์ key
๊ฐ์ access
ํ๋ ค๋ฉด ๋ค๋ฅธ ํ๋กํผํฐ๋ก ์ ๋ฌํด์ผํ๋ค๋ ์๊ธฐ๋ค. ๊ทธ๋์ ๋๋ key
๊ฐ์ ์ ๋ฌํ๊ธฐ ์ํด id
์ ๋๊ฐ์ ๊ฐ์ผ ๋ฃ์ด์ ์ ๋ฌํ๋ค. ์๋๋ ์ต์ข
์ ์ผ๋ก 4๋ฒ๊น์ง ๊ตฌํํ ์ฝ๋์ด๋ค.App.js
ใ
คโใ
คVideoList.js
ใ
คใ
คใ
คใ
ค โ๏ธ ใ
คใ
คใ
คใ
ค ใ
คใ
คใ
คใ
ค ใ
คใ
คโ๏ธ
ใ
คใ
คใ
คใ
คใ
คใ
คVideoPlayer.js
ใ
คใ
คVideoListEntry.js
App.js
state
์๋ ๋ฐฐ์ด ์ ์ฒด(data
)์ ํ์ฌ ์ฌ์ํ ๋น๋์ค ์ ๋ณด(current
)๋ฅผ ๋ด๊ณ ์๋ค.VideoPlayer
์๋ props.video
๋ก ํ์ฌ ๋น๋์ค๋ฅผ ์ ๋ฌํ๋ค.VideoList
์๋ props.clickTitle
์ ์ ๋ชฉ์ ํด๋ฆญํ์ ๋ ๋์ํ๋ ํจ์๋ฅผ ์ ๋ฌํ๊ณ , props.videos
์๋ ๋ชจ๋ ๋น๋์ค ๋ชฉ๋ก์ ์ ๋ฌํ๋ค.handleChange
๋ฉ์๋๋ ๋น๋์ค์ ๊ณ ์ ํ videoKey
๋ฅผ ๋ฐ์ ์ ์ฒด ๋์์ ๋ชฉ๋ก์์ ์ผ์นํ๋ ๋น๋์ค๋ฅผ ์ฐพ์์ setState
๋ฅผ ํตํด ํด๋น ๋น๋์ค๋ฅผ render
ํ๋ค.VideoPlayer.js
App
์ปดํฌ๋ํธ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ props
๋ฅผ ํตํด ๋น๋์ค๋ฅผ ์ฌ์ํ๊ณ ํด๋น ๋น๋์ค์ ์ ๋ชฉ๊ณผ ์ค๋ช
์ ๋ํ๋ด์ค๋ค.VideoList.js
App
์ปดํฌ๋ํธ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ props
๋ฅผ ํตํด ๋ชจ๋ ๋น๋์ค ๋ชฉ๋ก์ ๋์ ์ผ๋ก ๋ ๋๋งํ๋ค.VideoListEntry
์๋ props.video
์ ๋น๋์ค ์ ๋ณด, props.id
์ key
, props.selectVideo
์๋ goToVideoPlayer
ํจ์๋ฅผ ์ ๋ฌํ๋ค.goToVideoPlayer
ํจ์๋ ์์ ์ปดํฌ๋ํธ์์ ์คํ๋๊ฒ ๋๋๋ฐ ํจ์๊ฐ ํธ์ถ๋๋ฉด props.clickTitle
ํจ์๋ฅผ ํธ์ถํ๋ค. ์ฆ, App.js
์ ์๋ handleChange
๋ฉ์๋๊ฐ ์คํ๋๋ค. ํจ์์ ๋งค๊ฐ๋ณ์๋ก ๋น๋์ค์ ํค๋ฅผ ๋๊ฒจ์ค๋ค.VideoListEntry.js
VideoList
์ปดํฌ๋ํธ๋ก๋ถํฐ ์ ๋ฌ๋ฐ์ props
๋ฅผ ํตํด ๋น๋์ค์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ด๋ฏธ์ง์ ์ ๋ณด๋ฅผ ํ์ํ๊ณ , ํด๋น ๋น๋์ค์ ์ ๋ชฉ์ ํด๋ฆญํ๋ฉด clickTitle
ํจ์๋ฅผ ์คํํ๋ค.clickTitle
ํจ์๋ props.selectVideo
ํจ์์ ๋น๋์ค์ key
๊ฐ(props.id
)์ ๋๊ฒจ ํธ์ถํ๋ค. ์ฆ, VideoList.js
์ ์๋ goToVideoPlayer
ํจ์๊ฐ ์คํ๋๋ค.VideoPlayer
์ปดํฌ๋ํธ๋ฅผ ํตํด ํฐ ํ๋ฉด์ผ๋ก ๋ ๋๋ง ๋์ด ์๊ณ VideoList
์ปจํ
์ด๋์๋ ๋น๋์ค ๋ชฉ๋ก๋ค์ด ์ ๋ํ๋๊ณ ์๋ ๋ชจ์ต์ด๋ค. ์, ์ด์ YouTube API
๋ฅผ ์ ์ฉํด๋ณด์.