강의

멘토링

로드맵

Inflearn brand logo image

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

isbcom1004님의 프로필 이미지
isbcom1004

작성한 질문수

비전공자를 위한 진짜 입문 올인원 개발 부트캠프

그랩님, 상품 상세 페이지 에러와 의문점 질문드립니다.

작성

·

36

0

그랩님, 강의 잘 듣고 있습니다.

다름이 아니라, 상품 상세 페이지 에러와 의문점이 있어서 어떻게 해결해야 하는지 궁금한 사항이 있어 질문 드리게 되었습니다.

  1. 일단 src/main/index.js 소스 코드를 첨부합니다.


    import './index.css';
    import axios from "axios";
    import React from 'react';
    import {Link} from 'react-router-dom';
    function MainPage(){
        const [products, setProducts]=React.useState([]);
        React.useEffect(
            function(){
                axios.get("제 mock 서버 주소 넣었습니다/products")
                .then(function(result){
                    const products=result.data.products;
                    setProducts(products);
                }).catch(function(error){
                    console.error("에러 발생:",error);
                });
        },[]); return ( 
            <div>    
            <div id="header">
            <div id="header-area">
                <img src="../images/icons/logo.png" />
            </div>
        </div>
        <div id="body">
            <div id="banner">
                <img src="../images/banners/banner1.png" />
            </div>
            <h1>판매되는 상품들</h1>
            <div id="product-list">
                
                {
                     products.map(function(product, index){
                
                        return ( 
    
                    <div className="product-card">
                    <Link className="product-link" to={`/products/${product.id}`}>
                    <div>
    
                    <img className="product-img" src={product.imageUrl} />
                    </div>
                <div className="product-contents">
                    <span className="product-name">{product.name}
                    </span>
                    <span className="product-price">{product.price}원
                    </span>
                    <div className="product-seller">
                        <img className="product-avatar" src="../images/icons/avatar.png" />
                        <span>{product.seller}</span>
                    </div>
                </div>
                </Link>
    
                </div>
                
                
            ); 
                    }) 
                }
    
            </div>
            </div>
        
        <div id="footer"></div>
        </div>
        );
    }
    
    export default MainPage;

    2.src/product/index.js 소스 첨부합니다.

    import {useParams} from 'react-router-dom';
    import axios from "axios";
    import { useEffect, useState } from 'react';
    function ProductPage(){
        // const params=useParams();
        const {id} = useParams();
        const [product, setProduct] = useState(null);
        useEffect(function(){
            axios.get('제 mock 서버 주소 넣었습니다/products/${id}'
            )
            .then(function (result) {
                setProduct(result.data);
                // console.log(result);
            }).catch(function(error){
                console.error(error);
            }
        );
        },[]);
        console.log(product);
        
        // console.log(params);
    
        return <h1>상품 상세 페이지 {id} 상품</h1>;
    }
    export default ProductPage;


    -->여기서부터 의문점과 문제점이 발생하게 되니 읽어주시고 해결할 수 있는 방법을 알려주시면 좋겠습니다. 위 소스에서

    axios.get('제 mock 서버 주소 넣었습니다/products/${id}') 처럼 소스를 달러 중괄호 아이디 입력하면, 아래와 같은 첨부 사진처럼 에러가 납니다.


    상품 상세 페이지 1 구현 에러 axios get url 슬래시 1하면 되는데 문제는 달러 아이디 중괄호하면 안됨 이미지첨부.jpg.webp


    --> 위 에러 첨부 사진은 어떻게 해결해야 할까요?



    3. 하지만, 위 소스대로 입력 안하면
    axios.get('제 mock 서버 주소 넣었습니다/products/1') 하면 제대로 데이터를
    오류 없이
    아래 첨부 사진처럼 받아 오는 것을 알 수 있습니다.

    상품 상세 페이지 1 구현 에러 아닌 소스코드 슬래시 1일때 정상 화면 달러 중괄호 아이디하지 않을 때 잘 되는 화면.jpg.webp




    3-1. 그랩님, 강의 소스에서 처럼 axios.get('제 mock 서버 주소 넣었습니다/products/${id}')해서 하면 위 첨부 사진 처럼 에러가 나는데요, 성공적으로 오류 없이 불러오고 싶은데요, 어떻게 해야 하나요?

     


    단계별로 어떻게 소스를 수정해야하는지 알려주시면 좋겠습니다.

    확인하시면 답변 부탁 드립니다.

답변 2

0

그랩님의 프로필 이미지
그랩
지식공유자

확인이 늦었습니다!
문자열을 처리하는 방식에 ''(따옴표) 과 ``(벡틱)가 있는데, products/${id} 같이 변수를 넣어야 하는경우
``으로 처리를 해줘야 합니다.

예를들면 const id = 1;

const url = 'https://hello.com/products/${id}'
를 하게되면 실제로 url에는 products/1 이렇게 변수가 들어가는 구조가 아닌 문자열 그대로 처리되어 버립니다.

따라서 따옴표가 아닌 벡틱인 `...` 로 처리해주시면 잘 동작할 것 같습니다! {id}'를 하게되면 실제로 실행시 u{}'

0

안녕하세요, 인프런 AI 인턴입니다.
isbcom1004님, 문의 주신 사항에 대해 답변 드리겠습니다.

에러의 원인은 axios.get('제 mock 서버 주소 넣었습니다/products/${id}')에서 잘못된 문자열 템플릿 사용으로 보입니다. 자바스크립트에서 문자열 템플릿을 사용할 때는 백틱(`)을 이용해야 하는데, 잘못된 작은 따옴표(“)를 사용했습니다. 올바른 방법으로 수정해 주세요:

  1. 변경해야 할 코드:
    
    axios.get(`제 mock 서버 주소 넣었습니다/products/${id}`)
    

여기서 핵심은 작은 따옴표가 아닌 백틱(`)을 사용해야 한다는 것입니다. 백틱은 문자열 내에서 변수를 포함하는 문자열 템플릿에 적합합니다.

또한, map 메서드 안에서 구성 요소를 나열할 때 각 요소에 고유한 key를 추가하는 것이 좋습니다. 이는 성능 최적화 및 React에서 리스트의 엘리먼트를 관리하기 위한 일반적인 권장사항입니다. 다음과 같이 수정하시면 됩니다:

  1. map 메서드 사용 시 수정:
    
    {
       products.map(function(product, index){
           return (
               <div className="product-card" key={product.id}>
                   <Link className="product-link" to={`/products/${product.id}`}>
                       <div>
                           <img className="product-img" src={product.imageUrl} />
                       </div>
                       <div className="product-contents">
                           <span className="product-name">{product.name}</span>
                           <span className="product-price">{product.price}원</span>
                           <div className="product-seller">
                               <img className="product-avatar" src="../images/icons/avatar.png" />
                               <span>{product.seller}</span>
                           </div>
                       </div>
                   </Link>
               </div>
           );
       })
    }
    

위의 수정사항을 반영하신 후, 다시 시도해 보시면 문제가 해결될 것입니다. 문제가 지속된다면 추가 정보를 제공해 주시거나, 코드의 다른 부분에서 실수가 있을 수 있습니다.

추가적으로, 이미지와 관련된 에러는 제공해주신 URL로 확인할 수 있습니다: 이미지 1, 이미지 2.

도움이 되셨길 바라며, 추가적으로 궁금한 점 있으면 언제든지 문의 주세요!

isbcom1004님의 프로필 이미지
isbcom1004

작성한 질문수

질문하기