인프런 커뮤니티 질문&답변
그랩님, 상품 상세 페이지 에러와 의문점 질문드립니다.
작성
·
49
0
그랩님, 강의 잘 듣고 있습니다.
다름이 아니라, 상품 상세 페이지 에러와 의문점이 있어서 어떻게 해결해야 하는지 궁금한 사항이 있어 질문 드리게 되었습니다.
일단 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}') 처럼 소스를 달러 중괄호 아이디 입력하면, 아래와 같은 첨부 사진처럼 에러가 납니다.

--> 위 에러 첨부 사진은 어떻게 해결해야 할까요?
3. 하지만, 위 소스대로 입력 안하면
axios.get('제 mock 서버 주소 넣었습니다/products/1') 하면 제대로 데이터를
오류 없이 아래 첨부 사진처럼 받아 오는 것을 알 수 있습니다.
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}')에서 잘못된 문자열 템플릿 사용으로 보입니다. 자바스크립트에서 문자열 템플릿을 사용할 때는 백틱(`)을 이용해야 하는데, 잘못된 작은 따옴표(“)를 사용했습니다. 올바른 방법으로 수정해 주세요:
- 변경해야 할 코드:
axios.get(`제 mock 서버 주소 넣었습니다/products/${id}`)
여기서 핵심은 작은 따옴표가 아닌 백틱(`)을 사용해야 한다는 것입니다. 백틱은 문자열 내에서 변수를 포함하는 문자열 템플릿에 적합합니다.
또한, map 메서드 안에서 구성 요소를 나열할 때 각 요소에 고유한 key를 추가하는 것이 좋습니다. 이는 성능 최적화 및 React에서 리스트의 엘리먼트를 관리하기 위한 일반적인 권장사항입니다. 다음과 같이 수정하시면 됩니다:
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.
도움이 되셨길 바라며, 추가적으로 궁금한 점 있으면 언제든지 문의 주세요!




