할루시네이션 주의...

이윤희·2025년 1월 5일

React/Next 일기

목록 보기
13/52

여태 react 궁금증을 다 GPT한테 물어봤는데, 질문을 여러 번 나눠서 하기도 했고 할루시네이션 안 오게 나름? 잘 ? 했다고 생각했음 (여태 크게 없었기 때문에)
근데 나에게도 오다

아까 리액트로 쇼핑몰 구현중에,,,
foundProduct가 있으면 글을 보여주고 없으면 없다고 뜨게 하려고 했다. GPT가 이렇게 해보래서 음 그렇구나~하고 나름 이해하고 직접 혼자 해봤는데 에러가 뜸. 뭐야?

return (
  foundProduct ? (
    <div className="container">
      <div className="row">
        <div className="col-md-6">
          <img
            src="https://codingapple1.github.io/shop/shoes1.jpg"
            width="100%"
          />
        </div>
        <div className="col-md-6">
          <h4 className="pt-5">{foundProduct.title}</h4>
          <p>{foundProduct.content}</p>
          <p>{foundProduct.price}</p>
          <button className="btn btn-danger">주문하기</button>
        </div>
      </div>
    </div>
  ) : (
    <div>상품이 존재하지 않습니다.</div>
  )
);

콘솔 찍어서 확인해 봤더니 console.log(foundProduct)가 undefined란다.
뭐야?
다시 물어봤다.

이 문제는 두 가지로 나눠볼 수 있습니다:
1. useParams()의 반환값이 객체임
2. 제가 작성 중 실수로 응답을 잘못 전송했네요. 올바른 수정 사항과 설명을 다시 드리겠습니다!

ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅡㅡ;

그래서 다시 달라고함


GPT

네, 제가 이전에 약간 혼란을 드린 점 사과드립니다. 처음부터 명확하고 정확하게 설명드리겠습니다. 상세 페이지에서 URL에 잘못된 값이 들어온 경우를 대비하는 방법을 아래에 단계별로 자세히 설명하겠습니다.


목표

  1. URL의 잘못된 id 값으로 접근한 경우, "상품을 찾을 수 없습니다."라는 메시지를 보여줍니다.
  2. 올바른 id 값으로 접근한 경우, 해당 상품 데이터를 정상적으로 출력합니다.

코드 설명 (재작성)

1. 데이터와 URL 파라미터 연결

React Router의 useParams를 사용하여 URL에서 id 값을 가져옵니다.
예를 들어, /detail/0에 접근하면 id"0" 문자열로 들어옵니다.

2. URL 파라미터를 사용하여 데이터 검색

props.shoes 데이터에서 id 값을 기준으로 상품을 찾습니다. 만약 일치하는 상품이 없다면, undefined를 반환합니다.

3. 잘못된 ID 처리

상품이 없는 경우(undefined)에는 "상품을 찾을 수 없습니다."라는 메시지를 반환하고, 상품이 있는 경우에는 데이터를 화면에 출력합니다.


수정된 코드

Detail.js

import { useParams } from "react-router-dom";
import styled from "styled-components";

let YellowBtn = styled.button`
  background: yellow;
  color: black;
  padding: 10px;
`;

function Detail(props) {
  // URL 파라미터에서 id를 가져옴
  let { id } = useParams();

  // props.shoes 배열에서 id로 상품을 찾음
  let foundProduct = props.shoes.find((product) => {
    return product.id === parseInt(id); // id를 숫자로 변환하여 비교
  });

  // 상품이 없을 때 처리
  if (!foundProduct) {
    return <div>상품을 찾을 수 없습니다.</div>;
  }

  // 상품이 있을 때 화면에 출력
  return (
    <div className="container">
      <YellowBtn>버튼</YellowBtn>
      <div className="row">
        <div className="col-md-6">
          <img
            src="https://codingapple1.github.io/shop/shoes1.jpg"
            width="100%"
          />
        </div>
        <div className="col-md-6">
          <h4 className="pt-5">{foundProduct.title}</h4>
          <p>{foundProduct.content}</p>
          <p>{foundProduct.price}</p>
          <button className="btn btn-danger">주문하기</button>
        </div>
      </div>
    </div>
  );
}

export default Detail;

코드 설명 (중요 부분)

1. URL에서 파라미터를 가져오기

let { id } = useParams();
  • useParams는 URL에서 정의된 파라미터를 객체 형태로 반환합니다.
  • id 값을 꺼내오면 문자열로 제공되므로, 숫자와 비교하려면 변환이 필요합니다.

2. 데이터 검색

let foundProduct = props.shoes.find((product) => {
  return product.id === parseInt(id); // 문자열 id를 숫자로 변환하여 비교
});
  • props.shoes는 데이터 배열입니다.
  • find 메서드는 배열에서 조건에 맞는 첫 번째 요소를 반환합니다. 조건에 맞는 항목이 없다면 undefined를 반환합니다.
  • parseInt(id)를 사용해 문자열로 된 id 값을 숫자로 변환하여 product.id와 비교합니다.

3. 잘못된 ID 처리

if (!foundProduct) {
  return <div>상품을 찾을 수 없습니다.</div>;
}
  • foundProductundefined인 경우에는 잘못된 id 값으로 접근한 것이므로 "상품을 찾을 수 없습니다."라는 메시지를 반환합니다.
  • 이렇게 작성하면 JSX에서 별도의 복잡한 조건문 없이 간단하게 잘못된 경우를 처리할 수 있습니다.

전체 코드 구조 설명

1. App.js

<Route path="/detail/:id" element={<Detail shoes={shoes} />} />
  • URL에 /detail/:id처럼 동적 라우팅을 설정합니다.
  • :id는 변수로, URL의 값이 useParams를 통해 Detail 컴포넌트로 전달됩니다.

2. Detail.js

  • URL 파라미터에서 받은 id 값을 기준으로 데이터를 검색합니다.
  • 데이터가 존재하지 않는 경우에는 에러 메시지를 반환하고, 존재하는 경우에는 데이터를 화면에 렌더링합니다.

정렬이 바뀌는 경우 처리

props.shoes 데이터의 순서가 바뀌더라도, id 값은 고유하다고 가정하면 이 코드는 문제없이 동작합니다. 이유는 다음과 같습니다:
1. 데이터의 순서가 바뀌어도 find 메서드는 id 값으로 정확히 검색합니다.
2. id가 데이터의 유일한 키 역할을 하므로, 다른 요소와 중복되지 않습니다.


요약

  1. useParams를 사용하여 URL에서 id 값을 가져옵니다.
  2. 데이터 배열에서 id 값을 기준으로 검색합니다.
  3. 검색 결과가 없을 경우 에러 메시지를 반환하고, 검색 결과가 있을 경우 데이터를 렌더링합니다.

뭔가 GPT가 여태 코딩 영역에선 그닥 틀리지 않아서, 코딩에서는 처음 겪은 할루시네이션이다. 앞으로는 더 주의깊게 보고 교차검증을 해야할듯.

0개의 댓글