1. ์ฃผ๋ง ์ˆ™์ œ ์ƒ์„ธํŽ˜์ด์ง€ ์ฑ„๋„ ์ •๋ณด ๋„ฃ๊ธฐ

๊ฐ•์‚ฌ๋‹˜์ด ๋ณด๋‚ด์ค€ api ์ฃผ์†Œ :

https://youtube.googleapis.com/youtube/v3/channels?part=statistics&part=snippet&id=channelId&key=[YOUR_API_KEY]

 

1) api.js

export function channelUrl(channelId){

  return `https://youtube.googleapis.com/youtube/v3/channels?part=statistics&part=snippet&id=${channelId}=${API_KEY}`

}

channelId๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ url ํ•˜๋‚˜ export

 

2) VideoItem

- api ์ฃผ์†Œ ์ •๋ณด์— snippet์•ˆ์— channelId๊ฐ€ ์žˆ์—ˆ์Œ ๊ทธ๊ฑธ ๊บผ๋‚ด์„œ ์ฟผ๋ฆฌ๊ฐ’์œผ๋กœ ๋„˜๊ฒจ์ค„ ๊ฒƒ์ž„

- navigate(`/watch?id=${id}&channelId=${item.channelId}`) ๋กœ ์ˆ˜์ • → id ๋Š” ๋น„๋””์˜ค ์•„์ด๋””, channelId ๋Š” ๋‚ด๊ฐ€ ์„ ํƒํ•œ ๋น„๋””์˜ค์˜ ์ฑ„๋„ ์•„์ด๋””๊ฐ€ ๋“ค์–ด๊ฐ€๋„๋ก

 

3) VideoView

- {id} ๋ฅผ props ๋กœ ๋ฐ›์•„์ค€ ๊ฒƒ์ฒ˜๋Ÿผ ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์ธ Watch ์—์„œ channelId ๋„ ์ฟผ๋ฆฌ๊ฐ’ ๋ฐ›์•„์ฃผ๊ธฐ

 

4) Watch

- const channelId=query.get('channelId') ์ถ”๊ฐ€

- <VideoView id={id} channelId={channelId} /> → channelId={channelId} ์ถ”๊ฐ€ํ•ด์„œ VideoView ์— ๋‚ด๋ ค์ฃผ๊ธฐ

 

5) VideoView

- props channelId ์ถ”๊ฐ€

- import { channelUrl } from '../../lib/api'; → ์ฑ„๋„ ์ •๋ณด ๋ฐ›์•„์˜ฌ api url import

- ์ •๋ณด ๋ฐ›์•„์„œ store ์— ์ €์žฅํ•ด์„œ ์“ธ ๊ฒƒ์ž„

 

6) store > videoSlice

export const getChannelInfo = createAsyncThunk(

    "GET_CHANNEL_LIST",

    async(url)=>{

     try{

         const res=await axios.get(url)

         return res.data.items

     }catch(err){

         console.log(err)

     }

    }

 )

getChannelInfo ๋ผ๋Š” ๋ญ ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€????

- initialState ์— channel ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ '' ๋นˆ์ŠคํŠธ๋ง ์ถ”๊ฐ€

builder.addCase(getChannelInfo.fulfilled,(state,action)=>{

            console.log('๋น„๋””์˜ค์ฑ„๋„์ •๋ณด', action.payload)

            state.channel=action.payload;

        })

→ extraReducers ์— ์ถ”๊ฐ€

 

7) VideoView

import { getChannelInfo } from '../../store/video/videoSlice';

import { useSelector, useDispatch } from 'react-redux/es/exports';

 

const dispatch = useDispatch();

  useEffect(()=>{

    const channelIdInfo = channelUrl(channelId)

    dispatch(getChannelInfo(channelIdInfo))

  },[])

??????

 

- const {channel} =useSelector((state)=>state.channel) ์ถ”๊ฐ€

- return ์•ˆ์— ์ฑ„๋„ ์ •๋ณด ๋“ค์–ด๊ฐˆ ๊ณณ์—

{

        channel && (

          <div className='descriptionContainer'>

            <div className='channel-img'>

              <img src={channel[0].snippet.thumbnails.default.url} alt="" />

            </div>

            <div className='channel-data'>

              <h3 className='channel-title'>

                {channel[0].snippet.title}

              </h3>

              <p className='channel-des'>

                {channel[0].snippet.description}

              </p>

            </div>

          </div>

        )

      }

→ ๊ฐ ์ •๋ณด ๋„ฃ์–ด์„œ ๋งˆํฌ์—…

 

 useEffect(()=>{

    const channelIdInfo = channelUrl(channelId)

    dispatch(getChannelInfo(channelIdInfo))

  },[channelId, dispatch])

→ ์˜์กด ์žก์•„์ค˜์•ผ ์ƒ์„ธํŽ˜์ด์ง€ ๋ชฉ๋ก์„ ํด๋ฆญํ•ด๋„ ์ฑ„๋„์ •๋ณด๊ฐ€ ๋งž๊ฒŒ ๋œธ

 → ๋™์˜์ƒ ํ•˜๋‹จ์— ์ฑ„๋„ ์ •๋ณด๊ฐ€ ๋งž๊ฒŒ ๋œธ ์™„์„ฑ! (์Šคํƒ€์ผ๋ง์€ ์•Œ์•„์„œ)

 

 

 

 

2. ๋นŒ๋”ฉ??? ์ตœ์ ํ™”??? !!!๋‹ค์‹œ!!!

1) ์„ค์น˜

- npm run build

- build ํด๋”๊ฐ€ ์ƒ๊ฒผ์„ ๊ฒƒ์ž„

- ๋นŒ๋”ฉ๋œ ๊ฑธ ๋กœ์ปฌ์—์„œ ๋ณด๋ ค๋ฉด? : npm ์‚ฌ์ดํŠธ ๊ฐ€๋ณด๋ฉด ์„œ๋ฒ„๊ฐ€ ์—†์–ด์„œ ์„œ๋ฒ„๋ฅผ ํ•˜๋‚˜ ์„ค์น˜ํ•ด์•ผํ•จ, npm install -g serve

- ์„œ๋ฒ„ ์‹คํ–‰์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ•? serve -s build

- npm start ๋Š” ๊ฐœ๋ฐœ์ž ๋ชจ๋“œ, ๋นŒ๋“œ๋Š” ๋ฐฐํฌ?

- ๋””ํ”Œ๋กœ์ด ๋ฐฐํฌ?

- git ์— ๋จผ์ € ์˜ฌ๋ฆฌ๊ธฐ

- netlify????

- heroku?????: Config Vars ์— ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •, ํ‚ค๋ž‘ ๋ฐธ๋ฅ˜ ๋„ฃ๊ธฐ .env ์— ํ•ด์ค€ ๊ฒƒ ๋ณต๋ถ™

์ปค๋„ฅํŠธ ๊ฐ€์„œ ๊นƒ์ด๋ž‘ ์—ฐ๊ฒฐ ํ™•์ธํ•˜๊ณ  ๋””ํ”Œ๋กœ์ด ํด๋ฆญ,  

+ Recent posts