1. lib ํด๋” > api.js

export const videoUrl = `https://youtube.googleapis.com/youtube/v3/search?part=snippet&chart=mostPopular&maxResults=30&q=css3®ionCode=kr&type=video&key=๋ณธ์ธํ‚ค`

→ ์ธ์ฆํ‚ค ๋…ธ์ถœ๋˜๋ฉด ์•ˆ๋จ, ๋‚˜์˜ ๊ณ ์œ ํ•œ ์ •๋ณด๋ผ์„œ ํ•ดํ‚น๋˜๊ฑฐ๋‚˜ ๋„์šฉ๋  ์ˆ˜ ์žˆ์–ด์„œ ๊ทธ ๋•Œ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ๋Š” ์ž๊ธฐ ์ฑ…์ž„, ๋”ฐ๋ผ์„œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์ฒ˜๋ฆฌํ•ด์ค˜์•ผ ํ•จ

 

 

 

2. ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋งŒ๋“œ๋Š” ๋ฒ•

react ๊ณต์‹ ๋ฌธ์„œ์— ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • ๋ถ€๋ถ„ ์žˆ๋Š”๋ฐ ๋ชป ์ฐพ์Œ ๋‚˜์ค‘์— ์ฒจ๋ถ€ํ•ด์ฃผ์‹ ๋‹ค๊ณ  ํ•จ

- ์–ด๋–ค ํด๋” ์•ˆ์— ๋ง๊ณ  ์•„์˜ˆ ๋ฐ–์— .env ํŒŒ์ผ ๋งŒ๋“ค๊ธฐ

- API_KEY=๋‚ด ํ‚ค๊ฐ’๋…ธ๋“œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ‚ค๊ฐ’

- REACT_APP_API_KEY=๋‚ด ํ‚ค๊ฐ’ ๋ฆฌ์•กํŠธ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ํ‚ค๊ฐ’

- ๋‘˜ ๋‹ค ๋„์–ด์“ฐ๊ธฐ ์•ˆ๋จ, ๋„์–ด์“ฐ๊ธฐ ๊นŒ์ง€ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์ธ์‹

- api.js ๋กœ ๊ฐ€์„œ const API_KEY=process.env.REACT_APP_API_KEY → import ํ•ด์ค„ ํ•„์š” ์—†๊ณ  ์ด๋ ‡๊ฒŒ ๋„ฃ์–ด์ฃผ๋ฉด ๋ถˆ๋Ÿฌ์˜จ ๊ฑฐ์ž„

- ๊ทธ๋ฆฌ๊ณ  ์œ„์— videoUrl ๋ณ€์ˆ˜ ์ง€์ •ํ•ด์คฌ๋˜ ์ฃผ์†Œ์— ์žˆ๋Š” ํ‚ค๊ฐ’ ์—†์• ๊ณ  ${API_KEY} ์ด๋ ‡๊ฒŒ ๋„ฃ์–ด์ฃผ๋ฉด ํ‚ค ๊ฐ’์ด ๋“ค์–ด๊ฐ€๋Š” ๊ฑฐ์ž„

- videolist ๋กœ ๊ฐ€์„œ import { videoUrl } from '../../lib/api'; ํ•ด์ฃผ๊ณ  dispatch(getVideoList(videoUrl)) ๋กœ ๋„ฃ์–ด์ฃผ๋ฉด ์ฟผ๋ฆฌ๊ฐ’์œผ๋กœ ๋„˜์–ด๊ฐ

- ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ƒ์„ฑ ํ›„์—๋Š” ๊ผญ ์„œ๋ฒ„ ๊ป๋‹ค๊ฐ€ ๋‹ค์‹œ ๋™์ž‘ํ•ด์•ผ ์ ์šฉ์ด ๋จ

 

- searchform ๋ถ€๋ถ„์˜ api ๋„ ๊ฐ€์ ธ์™€์„œ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ฒ˜๋ฆฌํ•ด์ฃผ๊ธฐ ( url ์•ˆ์— ๋ณ€์ˆ˜๊ฐ€ ์žˆ์Œ )

export function searchUrl(input){

  return `https://youtube.googleapis.com/youtube/v3/search?part=snippet&maxResults=30&q=${input}&regionCode=kr&type=video&key=${API_KEY}`

}

api.js ์—์„œ url ์•ˆ์˜ ๋ณ€์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋„ฃ์€ ํ•จ์ˆ˜๋ฅผ ์ƒ์„ฑ

- searchform index ํŒŒ์ผ๋กœ ๊ฐ€์„œ import { searchUrl } from '../../../lib/api';

const onSearch = (input) =>{

        const url =searchUrl (input)

        dispatch(getVideoList(url))

        navigate('/')

    }

app.js ์—์„œ ๊ฐ€์ ธ์˜จ searchUrl ์„ input ์„ ๋„ฃ์€ ๋ณ€์ˆ˜๋กœ ์„ค์ •ํ•œ ๋’ค ์ฟผ๋ฆฌ๊ฐ’์œผ๋กœ ํ•ด๋‹น ๋ณ€์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋„˜๊ฒจ์ฃผ๋„๋ก ์ˆ˜์ •

 

 

 

3. pages > search.js ์ƒ์„ฑํ•ด์„œ ๊ฒ€์ƒ‰ํ•˜๋ฉด ์•„์˜ˆ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•˜๋„๋ก

- app.js ์—์„œ <Route path="/search" element={<Search />} />

- search.js์— ๊ธฐ๋ณธ ์„ธํŒ…

import React from 'react';

import SideMenu from '../components/SideMenu';

import VideoList from './../components/VideoList/index';

 

const Search = () => {

  return (

    <>

      <SideMenu />

      <section className='main-content'>

        <VideoList />

      </section>

    </>

  );

};

 

export default Search;

home.js ์™€ ๋˜‘๊ฐ™์ด ๊ตฌ์„ฑ

 

1) ๋ ˆ์ด์•„์›ƒ ๊ด€๋ฆฌ๋ฅผ redex ๋กœ

- videoSlice ๋กœ ๊ฐ€์„œ

- initialState ์— listLayout: 'grid', ์ถ”๊ฐ€

 reducers:{

        videoListLayout: (state, action) =>{

            state.listLayout=action.payload

        }

    },

→ ํ•ด๋‹น grid ๋ ˆ์ด์•„์›ƒ ๋‚˜์˜ค๋„๋ก ๋งŒ๋“œ๋Š” ๊ฒƒ

- ๋งจ ํ•˜๋‹จ์— export const {videoListLayout} = videoSlice.actions

 

2) grid ๋ผ๋Š” ๊ฐ’์„ reducer ๋กœ, url ๋ฟ ์•„๋‹ˆ๋ผ ๋ ˆ์ด์•„์›ƒ๋„ dispatch

- SearchForm ์œผ๋กœ ์™€์„œ onSearch ํ•˜๋ฉด dispatch(videoListLayout('list')) ๊ฐ€ ์ฟผ๋ฆฌ๊ฐ’ ๋„˜์–ด๊ฐ€๋„๋ก ์„ค์ •

- videoListLayout ๋„ import

- list ์ธ์ง€ gird ์ธ์ง€ ์ฝ์–ด์„œ ํ•ด์•ผ ํ•˜๋‹ˆ๊นŒ Search.js ๋กœ ์™€์„œ

- import { useSelector } from 'react-redux';

- const display = useSelector((state)=>state.video.listLayout);

display ๋Š” onsearch ํ•ด์„œ Search ํŽ˜์ด์ง€๋กœ ๋„˜์–ด๊ฐ€๋ฉด ๋ ˆ์ด์•„์›ƒ์„ list ๋กœ css ๋ฅผ ๋ณ€๊ฒฝํ•ด์ค„ ๊ฒƒ์ž„

 

- VideoList ๋กœ ์™€์„œ display props ๋ฐ›์•„์ฃผ๊ณ 

- <ul className={display==='grid'?'videoList VideoGrid':'videoList VideoRowList'} > ๋กœ ์ˆ˜์ •

display ๊ฐ€ gird ์ผ ๊ฒฝ์šฐ VideoGrid' ๋ฅผ, ์•„๋‹ˆ๋ฉด VideoRowList ๋ฅผ ์ ์šฉ

 

- css ๋งŒ๋“ค๊ธฐ

 

- Home.js ๋กœ ๊ฐ€์„œ

import { useEffect } from 'react';

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

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

 

const dispatch = useDispatch();

    const display = useSelector((state) => state.video.listLayout)

 

    useEffect(()=>{

        dispatch(videoListLayout('grid'))

    },[])

 

<VideoList display={display} />

 

 

 

!!!! ์ฃผ์˜ !!!!

ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํŒŒ์ผ ๋ฌด์‹œํ•˜๊ณ  ์˜ฌ๋ ค์•ผ ํ•จ

ignore ํŒŒ์ผ ์•ˆ์— #API_KEY .env ํ•ด์ฃผ๊ธฐ

+ Recent posts