๋‚ด์ผ๋ฐฐ์›€์บ ํ”„

[๊ฐœ์ธ๊ณผ์ œ/TroubleShooting] ์—๋Ÿฌ๋ฅผ ๋˜์กŒ๋Š”๋ฐ ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค..?

Dana10 2025. 1. 15. 15:45

1. ๋ฌธ์ œ๋ฐœ์ƒ

  • ์„œ๋ฒ„์™€์˜ ํ†ต์‹ ์— ์‹คํŒจํ•˜๋ฉด, ์„œ๋ฒ„์—์„œ ๋‚ด๋ ค์ค€ ๋ฉ”์‹œ์ง€๋ฅผ alert๋กœ ๋„์šฐ๊ณ  ์‹ถ์Œ
  • catch(error)๋กœ error๋ฅผ ์žก์•„์„œ return ํ•ด์ฃผ๋ฉด alert(error)๋กœ ๋„์šธ ์ˆ˜ ์žˆ๊ฒ ์ง€?
  • ์–ด๋”” ํ•œ ๋ฒˆ ์ผ๋ถ€๋Ÿฌ ์—๋Ÿฌ๋ฅผ ๋‚ด๋ณผ๊นŒ -> ์˜๋„์ ์œผ๋กœ path๋ฅผ ํ‹€๋ฆฌ๊ฒŒ ํ•จ
  • ์ž‰ ์™œ ๋‚ด๊ฐ€ ๋˜์ง„ ์—๋Ÿฌ๊ฐ€ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ์ด์ƒํ•œ ์—๋Ÿฌ๊ฐ€ ๋œจ์ง€?
<api.js>

const DEFAULT_ERROR_MESSAGE = '์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.';
const DEFAULT_FETCH_ERROR_MESSAGE = '๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.';

const options = {
  method: 'GET',
  headers: {
    accept: 'application/json',
    Authorization: `Bearer ${API_KEY || PUBLIC_KEY}`
  }
}

// ํ˜„์žฌ ์ƒ์˜ ์ค‘์ธ ์˜ํ™”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ด.
export const getMoviesData = async () => {
  try{
     	const res =  await fetch(`${BASE_URL}/movi/now_playing?language=ko-KR&page=1`, options);
     	if(!res.ok) throw new Error(DEFAULT_FETCH_ERROR_MESSAGE);
     	const data = await res.json();
     	return data;
     } catch(error) {
      	return error|| DEFAULT_ERROR_MESSAGE;
     }
}
<index.js>
  
getMovieData(); // ์„œ๋ฒ„์—์„œ data๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค.


 async function getMovieData() {
  loading.create();
  loading.start();
  try{
     const data = await getMoviesData();
     const { results } = data;
     movieData = parseData(results) || [];
     renderMoviCard(movieData);
     loading.end();
   } catch(error) {
     console.error(error);
     alert(error);
     loading.end();
   }
};


// ์„œ๋ฒ„์—์„œ ๋ฐ›์•„์˜จ ๋ฐ์ดํ„ฐ์—์„œ ํ•„์š”ํ•œ ์š”์†Œ๋งŒ ๊ณจ๋ผ ์ •์ œํ•˜๋Š” ํ•จ์ˆ˜
const parseData = (data) => {
  if (!data || data.length === 0) return;
  const parsedData = data.map((_data) => {
    const { id, title, vote_average, poster_path } = _data;
    return { id, title, rate : vote_average.toFixed(1), img :`${IMAGE_BASE_URL}${poster_path}` } 
  });
  return parsedData;
};

 

getMoivesData์—์„œ fetch ์ดํ›„์— !res.ok๋ฉด DEFAULT_FETCH_ERROR_MESSAGE๋ฅผ ์—๋Ÿฌ๋กœ ๋˜์ง€๊ณ  catch์—์„œ ๋ฐ›๊ฒ ์ง€?

๊ทธ๋Ÿผ ๊ทธ๊ฑธ ๊ทธ๋Œ€๋กœ return ํ•ด์ฃผ๊ณ  getMovieData์˜ catch์—์„œ error๋กœ ๋ฐ›๊ณ , ๊ทธ๊ฑธ alert๋กœ ์ง ~ ํ•˜๊ณ  ๋„์šฐ๋ฉด ๋˜๋Š”๋ฐ..

์™œ ์•„๋ฌด๊ฒƒ๋„ ์•ˆ ๋œจ์ง€??? 


2. ์›์ธ ์ถ”๋ก 

  • ๊ทธ๋ž˜ 404์—๋Ÿฌ๊ฐ€ ๋‚˜๋Š” ๊ฑด ๋‚˜๋„ ์•Œ์ง€. ๊ทธ ์—๋Ÿฌ๋ฅผ ๋‚ด๊ฐ€ ๋ƒˆ์œผ๋‹ˆ๊นŒ !
  • ์–ด๋ผ..? ์ž์„ธํžˆ ๋ณด๋‹ˆ ์—๋Ÿฌ๊ฐ€ ์ฐํžŒ ์œ„์น˜๊ฐ€ index.js์˜ console.error(error) ๋ถ€๋ถ„์ด ์•„๋‹ˆ๋ผ api.js๋„ค?
  • ๊ทธ๋ ‡๋‹ค๋ฉด ์™œ index.js์—์„œ ์ฝ˜์†” ์—๋Ÿฌ๊ฐ€ ์•ˆ ์ฐํžˆ์ง€? catch ๋ฌธ์„ ์•ˆ ํƒ€๋„ค?
  • ๋‚ด๊ฐ€ returnํ•œ error๋Š” ๋„๋Œ€์ฒด ์–ด๋””๋กœ ๊ฐ„ ๊ฑธ๊นŒ..
  • javascript catch ๋ฌธ return.. ๊ตฌ๊ธ€๋งํ•ด ๋ณด์ž
  • ์•„ํ•˜! return์€ ๋ชจ๋“  ๋ธ”๋ก์„ ๊ฑฐ์น˜๊ณ  ์ •์ƒ ์ข…๋ฃŒํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๊ตฌ๋‚˜!! throw๋Š” ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋”์ด์ƒ ํ˜„์žฌ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  catch ๋ธ”๋ก์œผ๋กœ ์ œ์–ด ํ๋ฆ„์ด ๋„˜์–ด๊ฐ€๋Š”๊ตฌ๋‚˜!!
  • ๊ทธ๋Ÿฌ๋ฉด ๋‚ด๊ฐ€ returnํ•œ error๋Š” ์ •์ƒ ์ข…๋ฃŒ๋˜์–ด์„œ ๊ฐ’์ด ๋ฐ˜ํ™˜๋˜์—ˆ๊ฒ ๋„ค
  • ํ•ด๋‹น ๊ฐ’์„ ๋ฐ›๋Š” ๋ถ€๋ถ„์ด.. index.js์—์„œ getMovieData()์˜ try๋ฌธ.. data..? data์— ๋‹ด๊ฒจ์žˆ๋‹ค๊ณ ? ์ฝ˜์†” ์ถœ๋ ฅ ๊ณ ๊ณ 

์ฐพ์•˜๋‹ค ๋‚ด ์—๋Ÿฌ.


3. ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

    • error๋ฅผ return์ด ์•„๋‹Œ throw๋กœ ๋˜์ ธ์„œ catch์—์„œ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜์ž.
// ํ˜„์žฌ ์ƒ์˜ ์ค‘์ธ ์˜ํ™”์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ด.
export const getMoviesData = async () => {
  try{
    const res =  await fetch(`${BASE_URL}/movi/now_playing?language=ko-KR&page=1`, options);
    if(!res.ok) throw new Error(DEFAULT_FETCH_ERROR_MESSAGE);
    const data = await res.json();
    return data;
  } catch(error) {
    throw error|| DEFAULT_ERROR_MESSAGE;
  }
}

 


4. ๊ฒฐ๊ณผ

 

์ด์ œ์•ผ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•œ๋‹ค.