๐Ÿ‘‰ํ”„๋กœ์ ํŠธ ๋ฆฌํŒฉํ† ๋ง

๊น€์ง€ํ™˜ยท2020๋…„ 7์›” 14์ผ
0

์ทจ์—…

๋ชฉ๋ก ๋ณด๊ธฐ
2/3
post-thumbnail

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)

์ „๋ฐ˜์ ์ธ ๋ ˆ์ด์•„์›ƒ

Layout-Children

: Routes.js๋ถ€๋ถ„์—์„œ layout ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ด์šฉํ•˜์—ฌ switch์™€ route ๋ถ€๋ถ„์„ ๊ฐ์‹ธ์ฃผ์–ด ์ „์ฒด์ ์ธ ๋ ˆ์ด์•„์›ƒ์„ ์ •ํ•ด์ค€๋‹ค

Style-Components

: index.js ๋ถ€๋ถ„์—์„œ
import { ThemeProvider } from 'styled-components';
import Common from './Style/Common';
์ด๋Ÿฐ์‹์œผ๋กœ ์ž„ํฌํŠธ๋ฅผ ํ•˜์—ฌ routes ๋ถ€๋ถ„์„ ๊ฐ์‹ธ์„œ css๋ฅผ scss๋ง๊ณ 
styled-component๋กœ ์‚ฌ์šฉํ•œ๋‹ค. ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋ฉด ์Šคํƒ€์ผ์„ ์™ธ๋ถ€cssํŒŒ์ผ์— ๋ถ„๋ฆฌ์‹œํ‚ค์ง€์•Š๊ณ , ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ์ •์˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— css ๋‹จ์ ์ธ ์ „์—ญ์—์„œ์˜ ์ค‘๋ณต๋˜๋Š” ์ผ์ด ์—†์–ด์ง„๋‹ค.

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
    : ๋น„๋””์˜ค ํƒœ๊ทธ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋™์˜์ƒ์„ ์ž…ํ˜”๋‹ค.

  • Slide
    : ์˜ค๋ฅธ์ชฝ ์™ผ์ชฝ ๋ฒ„ํŠผ์„ ๋งŒ๋“ค์–ด์ฃผ๊ณ  onclick ์ด๋ฒคํŠธ๋ฅผ ์ฃผ์–ด์„œ ๋ˆŒ๋ €์„ ๊ฒฝ์šฐ state ๊ฐ’์„ ๋ฐ”๊พธ์–ด์ค€๋‹ค. ๊ทธ ์ปดํฌ๋„ŒํŠธ ๋ถ€๋ถ„์˜ ์„ค์ •ํ•ด์ค€ width ๊ฐ’์„ ๋„˜๊ฒจ์ฃผ๋ฉฐ animation์„ ์ฃผ์–ด์„œ silde ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ ํ•˜์˜€๋‹ค.

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๋กœ ๋ณด๋‚ด์ฃผ์–ด ์„œ๋ฒ„์— ์ €์žฅ์‹œ์ผœ๋†“๋Š”๋‹ค.

  • 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"}}

  • Check List Play
    : ํ”Œ๋ ˆ์ด ๋ฆฌ์ŠคํŠธ ๋‹ด๊ธฐ ์ „์— ์„ ํƒํ•œ ๊ณก๋“ค์„ ๊ฐ€์ง€๊ณ  ์„ ํƒ์žฌ์ƒ์„ ๋ˆŒ๋ €์„ ๊ฒฝ์šฐ ๋ฐฑ์—”๋“œ์— id๊ฐ’๋“ค์„ ๋ฐฐ์—ด๋กœ ๋ณด๋‚ด์ฃผ์–ด ์ €์žฅ์‹œํ‚ค๊ณ  ๋‹ค์‹œ ๋ฎค์งํ”Œ๋ ˆ์ด์–ด์—์„œ api๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ๊ทธ๊ณก์„ ์žฌ์ƒ์‹œํ‚จ๋‹ค.

  • Modal
    : ๋ฐ์ดํ„ฐ๋Š” useEffectํ•จ์ˆ˜์—์„œ fetch๋กœ api๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ data๋ฅผ ๋ฐ›์•„์™€์„œ ๋žœ๋”๋ง ํ•ด์ฃผ๊ณ  ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€ํ•˜์—ฌ mapํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ
    ๋ฒ„ํŠผ์„ ํด๋ฆญํ–ˆ์„ ๊ฒฝ์šฐ์— opacity๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ชจ๋‹ฌ์ฐฝ์„ ๋„์šฐ๊ณ  ๊ทธ ๊ณก์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜จ๋‹ค.

๋งก๊ณ  ์‹ถ์—ˆ๋˜ ๊ธฐ๋Šฅ

  • Music Player
    : ์Œ์•… ์ŠคํŠธ๋ฆฌ๋ฐ ์‚ฌ์ดํŠธ์—์„œ ๋งˆ์ง€๋ง‰์— ๋ฐ์ดํ„ฐ๋“ค์ด ๋‹ค ๋ชจ์ด๋Š” ๊ณณ์œผ๋กœ
    ์Œ์•… ์‚ฌ์ดํŠธ์˜ ์ค‘์ ์ ์ธ ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•œ๋‹ค.

ํ”„๋กœ์ ํŠธ๋ฅผ ๋งˆ์น˜๋ฉฐ

  • ์ฒซ๋ฒˆ์งธ ํ”„๋กœ์ ํŠธ์™€๋Š” ๋‹ฌ๋ฆฌ react hooks๊ณผ style-components๋ฅผ ์ด์šฉํ•˜์—ฌ
    props๋ฅผ ์žฌ์‚ฌ์šฉํ•˜์ง€๋„ ์•Š์œผ๋ฉด์„œ ๋ผ์ดํ”„์‚ฌ์ดํด์„ ์‚ฌ์šฉํ• ์ˆ˜์žˆ์–ด์„œ ๊ฐ„ํŽธํ–ˆ๋‹ค.
    ๊ทธ๋ฆฌ๊ณ  redux๋ฅผ ๋ฐฐ์šฐ๋ฉด์„œ ์ „์ฒด์ ์œผ๋กœ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์—์„œ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ๋‹ค ์‚ฌ์šฉํ•˜๊ณ  ๋ชจ๋“  UI๊ฐ€ ์ผ๊ด€๋œ ๋‚ด์šฉ์„ ์œ ์ง€ํ•œ๋‹ค.
    ๊ทธ๋ฆฌ๊ณ  ๋น„ํšจ์œจ์ ์œผ๋กœ scope์— ๋ฌถ์—ฌ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์˜€๋‹ค๋ฉด Redux๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํ•œ๋ฒˆ ํ˜ธ์ถœ๋œ ๋ฐ์ดํ„ฐ๋Š” store์— ์ €์žฅ๋œ๋‹ค. ๋งˆ์น˜ ์ฐฝ๊ณ ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ ์žฌํ•ด๋‘”๊ฒƒ๊ณผ ๊ฐ™๋‹ค. ์ปดํฌ๋„ŒํŠธ๋“ค์€ ์–ธ์ œ๋“  ์ด ์ฐฝ๊ณ ์— ๋“ค๋ ค ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ๊ฐ€์ง€๊ณ  ๊ฐ€๋ฉด ๋œ๋‹ค๋Š” ๋ถ€๋ถ„์—์„œ ๊ต‰์žฅํžˆ ํšจ์œจ์ ์ด๋ผ๊ณ  ๋Š๊ผˆ๋‹ค.
    ๋‘๋ฒˆ์งธ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งˆ์น˜๋ฉด์„œ ๋งŽ์€ ๋ถ€๋ถ„๋“ค์„ ๋ฐฐ์šฐ๋ฉด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ–ˆ๊ธฐ ๋–„๋ฌธ์—
    ์—ฌ๋Ÿฌ๋ชจ๋กœ ์–ด๋ ค์›€๋„ ๋งŽ์•˜์ง€๋งŒ, ํŒ€์›๋“ค๊ณผ์˜ ์›ํ™œํ•œ ์˜์‚ฌ์†Œํ†ต์œผ๋กœ
    ๊ทธ ํ•œ๊ณ„์ ์„ ๊ทน๋ณตํ•˜์—ฌ ์ข‹์•˜๊ณ  ์›น์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ์žˆ์–ด์„œ ์ „๋ฐ˜์ ์ธ ์ด๋ก ๋“ค์„ ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•˜๊ณ  ๋ฐฐ์šธ์ˆ˜ ์žˆ์–ด์„œ ์ข‹์•˜๋‹ค.

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