Vibe Streaming Site | Team Project
- Front-End
: React Hooks & Styled-Component, Redux, Social Login
: Layout-Children
- Back-End
: Django, MySQL
- Deployment
: AWS
Purpose
- interface๋ฅผ ๊ฐ๋ฅํ ๋๊ฐ์ด ๋ณด์ด๋๋ก ์์ฑ๋ ์๊ฒ ๊ตฌํ
- ๋ชจ๋ ์ปดํฌ๋ํธ์์ Styled-Components๋ฅผ ์ ์ฉ
- ๋ชจ๋ ์ปดํฌ๋ํธ๋ฅผ Function ์ผ๋ก ๋ง๋ค์ด Hooks๋ก Lifecycle Methods๋ค์ ์๋ฒฝํ๊ฒ ๋์ฒด
- Redux๋ฅผ ํ์ฉํ ์ ์ญ ์ํ ๊ด๋ฆฌ ์ ์ฉ
- ์ค์ ์น์๋น์ค ์์ค์ ์ธ์ฆ/์ธ๊ฐ ๊ตฌํ
- ์์
๋ก๊ทธ์ธ ๊ตฌํ
- Redux๋ฅผ ํ์ฉํ ์ ์ญ ์ํ ๊ด๋ฆฌ ์ ์ฉ
- Music Player ๊ธฐ๋ฅ ์ต๋ํ ์๋ฒฝํ๊ฒ ๊ตฌํ
Explain
- ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ด ์์ CSS๋ฅผ ํ์ฉํ ์ ๋๋ฉ์ด์
- ํ์๊ฐ์
/ ๋ก๊ทธ์ธ / ๋ก๊ทธ์์ (๋ค์ด๋ฒ ๋ก๊ทธ์ธ์ผ๋ก ๋์ฒด ๊ฐ๋ฅ)
- ์ ์ญ ์ํ ๊ด๋ฆฌ (์์
์ ๋ํ ์ ํ ์ต์
๋ฐ Wish & List ๊ด๋ฆฌ) - Redux, React-Redux
- ๋ฎค์ง ํ๋ ์ด์ด ์ ์ญ ์ํ ๊ด๋ฆฌ(์ ํ ์ต์
๋ฐ Wish & List ์ฌ์) - Redux, React-Redux
- ๋ฎค์ง ํ๋ ์ด์ด ์ ์ญ ์ํ ๊ด๋ฆฌ(์๋ฆฌ ์กฐ์ ๋ฐ ์์
์ฌ์ ์ํ ๊ด๋ฆฌ) - Redux, React-Redux
๐ ์์์ ๋ณด๋ ค๋ฉด ์ฌ์ง ํด๋ฆญ!(youtube)
![IMAGE ALT TEXT HERE](https://velog.velcdn.com/images%2Fjihs2113%2Fpost%2F3b180e2e-e2c4-4e48-84e1-6afb8ee121e1%2Ftube.png)
์ ๋ฐ์ ์ธ ๋ ์ด์์
Layout-Children
: Routes.js๋ถ๋ถ์์ layout ์ปดํฌ๋ํธ๋ฅผ ์ด์ฉํ์ฌ switch์ route ๋ถ๋ถ์ ๊ฐ์ธ์ฃผ์ด ์ ์ฒด์ ์ธ ๋ ์ด์์์ ์ ํด์ค๋ค
![](https://velog.velcdn.com/images%2Fjihs2113%2Fpost%2F93a59e9f-f52b-46b3-ac4b-5ec012192089%2Fmi.png)
Style-Components
: index.js ๋ถ๋ถ์์
import { ThemeProvider } from 'styled-components';
import Common from './Style/Common';
์ด๋ฐ์์ผ๋ก ์ํฌํธ๋ฅผ ํ์ฌ routes ๋ถ๋ถ์ ๊ฐ์ธ์ css๋ฅผ scss๋ง๊ณ
styled-component๋ก ์ฌ์ฉํ๋ค. ์ด๊ฒ์ ์ฌ์ฉํ๋ฉด ์คํ์ผ์ ์ธ๋ถcssํ์ผ์ ๋ถ๋ฆฌ์ํค์ง์๊ณ , ์ปดํฌ๋ํธ ๋ด๋ถ์์ ์ ์ํ๊ธฐ ๋๋ฌธ์ css ๋จ์ ์ธ ์ ์ญ์์์ ์ค๋ณต๋๋ ์ผ์ด ์์ด์ง๋ค.
![](https://velog.velcdn.com/images%2Fjihs2113%2Fpost%2F4a589f43-7e3d-44e6-a413-493fbe760974%2Fmi.png)
Function Components
: ์ผ๋ฐ react์์๋ state๊ด๋ฆฌ๋ฅผ ํด์ฃผ์๋๋ฐ, hooks๋ฅผ ์ด์ฉํ๋ฉด
ํด๋์ค ์ปดํฌ๋ํธ์์ react component์ ๋ผ์ดํ ์ฌ์ดํด์ ์ฌ์ฉํ ์์์ง๋ง, props๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ค๋ณต๋์ด ์ค๋ฅ๊ฐ ๋ฐ์ํ ์์๋ค.
ํจ์ํ์ปดํฌ๋ํธ์์๋ react component ์ฌ์ฉ์ด ๋ถ๊ฐํ์ฌ hooks๋ฅผ ์ด์ฉํด ๋ผ์ดํ์ฌ์ดํด์ ์ฌ์ฉํ๋ค. ๊ทธ๋ฆฌ๊ณ props๋ฅผ ์ฌ์ฌ์ฉํ์ง ์์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
Hooks
- state
: hook์์๋ state๋ฅผ ์ฌ์ฉํ ์์๋ useStateํจ์๊ฐ ์ถ๊ฐ๋์ด
์ธ์๋ก ์ด๊ธฐ state ๊ฐ์ ์ค์ ํ๊ณ state๋ฅผ ์
๋ฐ์ดํธ ์์ผ ํจ์๊ฐ ๋ฐฐ์ด ํํ๋ก ๋ฐํํ๊ฒ๋๋ค.
- effect hooks
:๊ฐ๋จํ ๋ผ์ดํ์ฌ์ดํด์ ์ํ useEffect ํจ์๊ฐ ์ถ๊ฐ๋์๋ค.
์ปดํฌ๋ํธ๊ฐ ๋ง์ดํธ ๋์์๋ (componentDidMount) ๊ทธ๋ฆฌ๊ณ ์
๋ฐ์ดํธ ๋์์๋(componentDidUpdate) ๊ทธ๋ฆฌ๊ณ ๋ง์ดํธ๊ฐ ํด์ ๋ ๋ (componentWillUnmount)์ธ๊ฐ์ง ๊ฒฝ์ฐ์ ๋ผ์ดํ ์ฌ์ดํด์ ์ฌ์ฉํ ์์๋ค.
๊ธฐ๋ณธ์ ์ธ effect hook์ ์ปดํฌ๋๋ํธ๊ฐ ๋๋๋ง ๋ ๋๋ง๋ค ํธ์ถํด์ฃผ๋๋ฐ
๋ฐํ๊ฐ์ผ๋ก ํจ์๋ฅผ ๋ฐํํด์ฃผ๋ฉด ๊ทธ ํจ์๋ ์ปดํฌ๋ํธ์ ๋ง์ดํธ๊ฐ ํด์ ๋ ๊ฒฝ์ฐ
์ปดํฌ๋ํธ ์
๋ฐ์ดํธ ๋์ด ๋ค์ effect๊ฐ ํธ์ถ๋๊ธฐ ์ด์ ์ ํธ์ถ๋๋ค.
๋ด๊ฐ ๊ตฌํํ ๊ธฐ๋ฅ
Main Page
- Video
: ๋น๋์ค ํ๊ทธ๋ฅผ ์ด์ฉํ์ฌ ๋์์์ ์
ํ๋ค.
![](https://velog.velcdn.com/images%2Fjihs2113%2Fpost%2Ff6bee2d2-42d4-4df9-9430-43572ea2aff5%2Fmi.png)
- Slide
: ์ค๋ฅธ์ชฝ ์ผ์ชฝ ๋ฒํผ์ ๋ง๋ค์ด์ฃผ๊ณ onclick ์ด๋ฒคํธ๋ฅผ ์ฃผ์ด์ ๋๋ ์ ๊ฒฝ์ฐ state ๊ฐ์ ๋ฐ๊พธ์ด์ค๋ค. ๊ทธ ์ปดํฌ๋ํธ ๋ถ๋ถ์ ์ค์ ํด์ค width ๊ฐ์ ๋๊ฒจ์ฃผ๋ฉฐ animation์ ์ฃผ์ด์ silde ๊ธฐ๋ฅ์ ๊ตฌํ ํ์๋ค.
![](https://velog.velcdn.com/images%2Fjihs2113%2Fpost%2F6f0502ad-a6d3-4f57-a9e0-d5c657e64edd%2Fmi.png)
Chart Page
- Like List
: toggle์์ ๋ฒํผ์ ๋๋ ์๋ ,
์ฌ๊ธฐ์์ ModalWrapper์ styled-component๋ฅผ ์ฃผ์ด์
likeBackground์ likeShowing์ true false ๊ฐ์ ์ฃผ๊ณ true์ผ ๊ฒฝ์ฐ
likeState๊ฐ์ ๋ฐ๊พธ์ด์ค์ opacity : 1๋ก ๋ณด์ฌ์ค์ผ๋ก์ SmallModal์ฐฝ์ ๋์ด๋ค. ๊ทธ๋ฆฌ๊ณ SmallModal ์ปดํฌ๋ํธ์ ํจ์๋ฅผ props๋ก ํ ๋นํด ์ค๋ค.
SmallModal ์ปดํฌ๋ํธ์์ ํํธ๋ฅผ ๋๋ ์๊ฒฝ์ฐ์ ๊ทธ checkbox์ ๋ํ index๊ฐ์ ํจ์๋ก ๋ค์ ๋ถ๋ชจ์๊ฒ ์ฌ๋ ค์ค๋ค.
๊ทธ๋ฌ๋ฉด heart ํจ์๋ก ์ด๋ํ์ฌ ์ํ๊ฐ์ ๋ฐ๊ฟ์ฃผ๊ณ header ๋ถ๋ถ์๋
๋ด ์ฌ์ดํธ ์์ด๋์ ๋ํ ํค๊ฐ์ผ๋ก fetchํจ์๋ก ๋ฐฑ์๋์
api ์ํตํ์ฌ toggle๊ฐ์ ๋ํ method๋ฅผ post๋ก ๋ณด๋ด๊ฑฐ๋ ํํธ๊ฐ ์ทจ์
๋์์ ๊ฒฝ์ฐ delete ํด์ค๋ค. ๊ทธ๋ฆฌ๊ณ body๋ถ๋ถ์์ props ๋ฐ์ index๊ฐ์
๋ฐฑ์๋์ music_id๋ก ๋ณด๋ด์ฃผ์ด ์๋ฒ์ ์ ์ฅ์์ผ๋๋๋ค.
![](https://velog.velcdn.com/images%2Fjihs2113%2Fpost%2F33a03c5a-f230-4571-8e26-a00a10b1af52%2Fmi.png)
![](https://velog.velcdn.com/images%2Fjihs2113%2Fpost%2F0f65a7d9-d754-4d1e-a653-1a3726e3cedf%2Fmi.png)
- Play List
: top100์ฐจํธ ํ์ด์ง๋ฅผ ์คํฌ๋กค ํ์๊ฒฝ์ฐ width์ heigh๋ฅผ x, y์ขํ๋ก ๋๊ณ ์คํฌ๋กค์ ๋ด๋ ธ์๊ฒฝ์ฐ nav๋ฐ๊ฐ ๋ณด์ด๊ฒ ํ์๊ณ ,
๊ณก์ ์ฒดํฌํ์๊ฒฝ์ฐ redux๋ฅผ ์ด์ฉํ์ฌ ์ฒดํฌํ ๊ณก๋ค์ id๊ฐ์ ์ต์์ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ state๋ฅผ ์ ์ฅ์ํค๊ณ ๊ทธ๊ฒ์ ๋ฐฑ์๋์ post๋ก api์ ์ํตํ์ฌ
์ด๋ ํ๋ ์ด๋ฆฌ์คํธ์ ๋ฃ์ด์ค์ง ๊ฒฐ์ ํ์ฌ ๋ฐ์์จ๋ค.
๊ทธ ๋ค์ body ๋ถ๋ถ์์ ์ด๋ฏธ ๋ด์๊ณก์ธ์ง or ์ฌ๋ฌ๊ณก์ ๋ด์์ผ๋ฉด ์ค๋ณต๋๊ฑธ ๋นผ๊ณ ๋ด๊ฒจ์ง ๊ณก์ ์นด์ดํธ๋ฅผ ์๋ฆผ์ผ๋ก ๋์์ค๋ค.
Nav style={{opacity: y> 80 && props.mkList.length===0 ? "1" : "0"}}
![](https://velog.velcdn.com/images%2Fjihs2113%2Fpost%2Ff04b5f8d-64b6-454f-9826-3413d1687833%2Fmi.png)
![](https://velog.velcdn.com/images%2Fjihs2113%2Fpost%2Fe75d6980-7afc-4066-87cc-1b2f62f6219d%2Fmi.png)
-
Check List Play
: ํ๋ ์ด ๋ฆฌ์คํธ ๋ด๊ธฐ ์ ์ ์ ํํ ๊ณก๋ค์ ๊ฐ์ง๊ณ ์ ํ์ฌ์์ ๋๋ ์ ๊ฒฝ์ฐ ๋ฐฑ์๋์ id๊ฐ๋ค์ ๋ฐฐ์ด๋ก ๋ณด๋ด์ฃผ์ด ์ ์ฅ์ํค๊ณ ๋ค์ ๋ฎค์งํ๋ ์ด์ด์์ api๋ฅผ ํธ์ถํ์ฌ ๊ทธ๊ณก์ ์ฌ์์ํจ๋ค.
-
Modal
: ๋ฐ์ดํฐ๋ useEffectํจ์์์ fetch๋ก api๋ฅผ ํธ์ถํ์ฌ data๋ฅผ ๋ฐ์์์ ๋๋๋ง ํด์ฃผ๊ณ ์ปดํฌ๋ํธ๋ฅผ ํ๋ ๋ ์ถ๊ฐํ์ฌ mapํจ์๋ฅผ ์ฌ์ฉํ์ฌ
๋ฒํผ์ ํด๋ฆญํ์ ๊ฒฝ์ฐ์ opacity๋ฅผ ์ด์ฉํ์ฌ ๋ชจ๋ฌ์ฐฝ์ ๋์ฐ๊ณ ๊ทธ ๊ณก์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์จ๋ค.
![](https://velog.velcdn.com/images%2Fjihs2113%2Fpost%2F15996503-6246-45bf-bd0d-0b2c2c324b00%2Fmi.png)
๋งก๊ณ ์ถ์๋ ๊ธฐ๋ฅ
- Music Player
: ์์
์คํธ๋ฆฌ๋ฐ ์ฌ์ดํธ์์ ๋ง์ง๋ง์ ๋ฐ์ดํฐ๋ค์ด ๋ค ๋ชจ์ด๋ ๊ณณ์ผ๋ก
์์
์ฌ์ดํธ์ ์ค์ ์ ์ธ ๊ธฐ๋ฅ์ ๋ด๋นํ๋ค.
ํ๋ก์ ํธ๋ฅผ ๋ง์น๋ฉฐ
- ์ฒซ๋ฒ์งธ ํ๋ก์ ํธ์๋ ๋ฌ๋ฆฌ react hooks๊ณผ style-components๋ฅผ ์ด์ฉํ์ฌ
props๋ฅผ ์ฌ์ฌ์ฉํ์ง๋ ์์ผ๋ฉด์ ๋ผ์ดํ์ฌ์ดํด์ ์ฌ์ฉํ ์์์ด์ ๊ฐํธํ๋ค.
๊ทธ๋ฆฌ๊ณ redux๋ฅผ ๋ฐฐ์ฐ๋ฉด์ ์ ์ฒด์ ์ผ๋ก ๋ชจ๋ ์ปดํฌ๋ํธ์์ ๋์ผํ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ๋ค ์ฌ์ฉํ๊ณ ๋ชจ๋ UI๊ฐ ์ผ๊ด๋ ๋ด์ฉ์ ์ ์งํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋นํจ์จ์ ์ผ๋ก scope์ ๋ฌถ์ฌ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ์๋ค๋ฉด Redux๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ฒ ํธ์ถ๋ ๋ฐ์ดํฐ๋ store์ ์ ์ฅ๋๋ค. ๋ง์น ์ฐฝ๊ณ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฌํด๋๊ฒ๊ณผ ๊ฐ๋ค. ์ปดํฌ๋ํธ๋ค์ ์ธ์ ๋ ์ด ์ฐฝ๊ณ ์ ๋ค๋ ค ํ์ํ ๋ฐ์ดํฐ๋ง ๊ฐ์ง๊ณ ๊ฐ๋ฉด ๋๋ค๋ ๋ถ๋ถ์์ ๊ต์ฅํ ํจ์จ์ ์ด๋ผ๊ณ ๋๊ผ๋ค.
๋๋ฒ์งธ ํ๋ก์ ํธ๋ฅผ ๋ง์น๋ฉด์ ๋ง์ ๋ถ๋ถ๋ค์ ๋ฐฐ์ฐ๋ฉด์ ์ฌ์ฉํด์ผ ํ๊ธฐ ๋๋ฌธ์
์ฌ๋ฌ๋ชจ๋ก ์ด๋ ค์๋ ๋ง์์ง๋ง, ํ์๋ค๊ณผ์ ์ํํ ์์ฌ์ํต์ผ๋ก
๊ทธ ํ๊ณ์ ์ ๊ทน๋ณตํ์ฌ ์ข์๊ณ ์น์ฌ์ดํธ๋ฅผ ๋ง๋๋ ๊ฒ์ ์์ด์ ์ ๋ฐ์ ์ธ ์ด๋ก ๋ค์ ๋ ๊น๊ฒ ์ดํดํ๊ณ ๋ฐฐ์ธ์ ์์ด์ ์ข์๋ค.