강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

hundo1217님의 프로필 이미지
hundo1217

작성한 질문수

따라하며 배우는 리액트 A-Z[19버전 반영]

이미지 배너 생성하기

강의대로 따라갔는데 에러보다 api키로 들어간 넷플릭스? 그런게 렌더링 되지 않습니다 ㅠ

작성

·

38

0

강의대로 따라갔는데 강의처럼 렌더링이 되고 있지 않습니다 ㅠㅠ 어디가 문제일까요

chatgpt는 서버가 없다 뭐 이렇다는데 ㅠㅠ

image.png

 

출력 화면

image.png

 

 

Nav.js

import React, { useEffect, useState } from 'react'
import"./Nav.css"

export default function Nav() {

  const [show, setShow] = useState(false);
  useEffect(() => {
    window.addEventListener("scroll", ()=> {
      console.log('window.scrollY', window.scrollY);
      if(window.scrollY > 50) {
          setShow(true);
      } else {
        setShow(false);
      }
    })

    return () => {
      window.removeEventListener("scroll", ()=> {});
    };
  }, []);
  return (
    <nav className={`nav ${show && "nav__black"}`}>
      <img 
        alt = 'Netflix logo'
        src = "https://upload.wikimedia.org/wikipedia/commons/thumb/0/08/Netflix_2015_logo.svg/960px-Netflix_2015_logo.svg.png" decoding="async" width="799" height="216" srcset="//upload.wikimedia.org/wikipedia/commons/thumb/0/08/Netflix_2015_logo.svg/1198px-Netflix_2015_logo.svg.png 1.5x, //upload.wikimedia.org/wikipedia/commons/thumb/0/08/Netflix_2015_logo.svg/1597px-Netflix_2015_logo.svg.png"
        className='nav__logo'
        onClick={() => window.location.reload()}
      />
      <img 
        alt = "User logged"
        src = "https://occ-0-3077-988.1.nflxso.net/dnm/api/v6/vN7bi_My87NPKvsBoib006Llxzg/AAAABTZ2zlLdBVC05fsd2YQAR43J6vB1NAUBOOrxt7oaFATxMhtdzlNZ846H3D8TZzooe2-FT853YVYs8p001KVFYopWi4D4NXM.png?r=229"
        className="nav__avatar"
      />
    </nav>
  );
}

Nav.css

.nav{
    position: fixed;
    top: 0;
    width: 100%;
    height: 30px;
    z-index: 1;
    padding: 20px;
    display: flex;
    justify-content: space-between;
    align-items: center;
    transition-timing-function: ease-in;
    transition: all 0.5s;
}

.nav__black {
    background-color: #111;

}

.nav__logo{
    position: fixed;
    left: 40px;
    width: 80px;
    object-fit: contain;
}
.nav__avatar {
    position: fixed;
    right: 40px;
    width: 30px;
    object-fit: contain;

}

Banner.js

import axios from "../api/axios";
import React, { useEffect, useState } from 'react'
import requests from '../api/requests';
import "./Banner.css"
export default function Banner() {
    const [movie, setMovie] = useState([]);
    useEffect(() => {
        fetchData();
    }, []);
    const fetchData = async() => {
        //현재 상영중인 영화 정보를 가져오기 (여러 영화)
        const request = await axios.get(requests.fetchNowPlaying);
        //여러 영화 중 영화 하나의 ID를 가져오기
        const movieId = request.data.results[
          Math.floor(Math.random() * request.data.results.length)
        ].id;

        //특정 영화의 더 상세한 정보를 가져오기 (비디오 정보도 포함)
        const {data: movieDetail} = await axios.get(`movie/${movieId}`, 
          {
            params: {append_to_reponse: "videos"}
          });
          setMovie(movieDetail);
    }
const truncate = (str, n) => {
  return str?. length > n ? str.substr(0, n - 1) + "..." : str;
}

  return (
    <header
    className="banner"
    style={{
      backgroundImage: `url("https://image.tmdb.org/t/p/original/${movie.backdrop_path}")`,
      backgroundPosition: "top center",
      backgroundSize: "cover"
    }}>
      <div className="banner__contents">
        <h1 className="banner__title">
          {movie.title || movie.name || movie.original_name} </h1>
          <div className="banner__buttons">
            <button className="banner__button play">Play</button>
            <button className="banner__button info">More Information</button>

          </div>

          <h1 className="banner_description"> {truncate(movie.overview, 100)}
        </h1>
      </div>
      <div className="banner--fadeBottom"></div>
    </header>
  )
}

Banner.css

.banner{
    color: white;
    object-fit: contain;
    height: 448px;
}
@media (min-width : 1500px) {
    .banner{
        position: relative;
        height: 600px;
    }
    .banner--fadeBottom{
        position: absolute;
        bottom: 0;
        width: 100%;
        height: 40rem;
    }
}
@media (max-width : 768px) {
    .banner__contents{
        width: min-content !important;
        padding-left: 2.3rem;
        margin-left: 0px !important;
    }
    .banner--description{
        font-size: 0.8rem !important;
        width: auto !important;
    }
    .info{
        text-align: start;
        padding-right: 1.2rem;
    }
    .space{
        margin-left: 6px;
    }
}

axios.js

import axios from "axios";

const instance = axios.create({
    baseURL: "https://api.themoviedb.org",
    params: {
        api_key: "eea00451962aefe6185011d467944242",
        language: "ko-KR",
    },
});

export default instance;

requests.js

const requests = {
    fetchNowPlaying: "movie/now_playing",
    fetchNetFlixOriginals: "/discover/tv?with_networks=213",
    fetchTrending: "/trending/all/week",
    fetchTopRated: "/movie/top_rated",
    fetchActionMovies: "/discover/movie?with_genres=28",
    fetchComedyMovies: "/discover/movie?with_genres=35",
    fetchHorrorMovies: "/discover/movie?with_genres=27",
    fetchRomanceMovies: "/discover/movie?with_genres=10749",
    fetchDocumentaries: "/discover/movie?with_genres=99",

}
export default requests;

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. hundo1217님께서 언급하신 문제에 대해 몇 가지 조치를 취해볼 수 있습니다. “강의대로 따라갔는데 강의처럼 렌더링이 되고 있지 않습니다” 라는 문제에 대한 디버깅을 위해 다음 몇 가지 사항을 점검해 보시기 바랍니다.

  1. TMDB API 확인:

    • API Key가 만료되지 않았는지, 혹은 올바르게 입력되었는지 확인하세요.
    • 콘솔에서 request.data를 확인하여 실제로 API로부터 데이터를 받는지 체크하세요.
    • API URL과 엔드포인트가 올바른지 (fetchNowPlaying 등) 확인하세요.
  2. 콘솔 에러 확인:

    • 브라우저 콘솔에서 에러 메시지를 확인하여 어떤 부분이 문제인지 더 명확한 정보를 얻으세요.
    • “chatgpt는 서버가 없다”는 메시지가 콘솔에 출력된다면, 이는 mysql 프롬프트상 또는 다른 소프트웨어 관련 문제일 수 있으며, 서버 설정을 점검해야 할 수 있습니다.
  3. 코드 점검:

    • Banner.js에서 append_to_response 파라미터가 잘못 입력되어 있습니다. “videos” 앞의 _가 빠져있어야 합니다. 이 부분을 append_to_response: "videos"로 변경하세요.
    • 이미지의 backgroundImage URL을 콘솔에 출력하여 올바른 URL인지 확인해 주세요.
  4. 디버깅 콘솔 추가:

    • fetchData 함수 내부에서 console.log(movieDetail)을 활용하여 데이터가 올바르게 불러와졌는지 확인하세요.
  5. 스타일링 확인:

    • CSS가 올바르게 적용되고 있는지, 각 클래스가 정상적으로 작동하는지 확인하세요.

관련된 질문에 대한 답변이 유용할 수 있습니다:
- 선생님 질문있습니다.
- Grid, Load More 버튼 클릭시 style error

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

hundo1217님의 프로필 이미지
hundo1217
질문자

Download the React DevTools for a better development experience: https://react.dev/link/react-devtools

react-dom-client.development.js:2995 Invalid DOM property srcset. Did you mean srcSet?

validateProperty @ react-dom-client.development.js:2995Understand this error

api.themoviedb.org/movie/now_playing?api_key=eea00451962aefe6185011d467944242&language=ko-KR:1

Failed to load resource: the server responded with a status of 404 ()Understand this error

Banner.js:25 Uncaught (in promise) AxiosErrorUnderstand this error

api.themoviedb.org/movie/now_playing?api_key=eea00451962aefe6185011d467944242&language=ko-KR:1

Failed to load resource: the server responded with a status of 404 ()Understand this error

Banner.js:25 Uncaught (in promise) AxiosErrorUnderstand this error 추가 에러 발생하고 있습니다 ㅠ

hundo1217님의 프로필 이미지
hundo1217

작성한 질문수

질문하기