Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[최제원] Sprint6 #245

Conversation

CJewon
Copy link
Collaborator

@CJewon CJewon commented Dec 2, 2024

요구사항

기본

  • 상품 등록 페이지 주소는 “/additem” 입니다.
  • 페이지 주소가 “/additem” 일때 상단네비게이션바의 '중고마켓' 버튼의 색상은 “3692FF”입니다.
  • 상품 이미지는 최대 한개 업로드가 가능합니다.
  • 각 input의 placeholder 값을 정확히 입력해주세요.
  • 이미지를 제외하고 input 에 모든 값을 입력하면 ‘등록' 버튼이 활성화 됩니다.

심화

  • 이미지 안의 X 버튼을 누르면 이미지가 삭제됩니다.
  • 추가된 태그 안의 X 버튼을 누르면 해당 태그는 삭제됩니다.

주요 변경사항

스크린샷

image

멘토에게

  • 미디어쿼리를 이용한 반응형은 제작하지 못하였습니다.
  • 등록 버튼 활성화에 대한 기능을 구현하지 못하였습니다.
  • 요구사항에 맞는 이미지 등록 버튼을 만들지 못하였습니다.
  • 상품 소개의 placeholder의 위치가 위쪽이 아닌 중앙에서 시작하고 있습니다.
  • 이미지 등록이 1개라는 제한을 걸어두지 못하였습니다.
  • 셀프 코드 리뷰를 통해 질문 이어가겠습니다.

@CJewon CJewon requested a review from kich555 December 2, 2024 02:59
@CJewon CJewon added the 매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. label Dec 2, 2024
Copy link
Collaborator

@kich555 kich555 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다!!

src/Api.js Outdated
Comment on lines 1 to 11
export async function productList({ orderBy = "recent" }) {
const query = `page=1&pageSize=10&orderBy=${orderBy}`;
const response = await fetch(
`https://panda-market-api.vercel.app/products?${query}`
);
if (!response.ok) {
throw new Error("제품목록을 가지고 오는데 실패했습니다.");
}
const date = await response.json();
return date;
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

export async function productList({
  orderBy = "recent",
  page = 1,
  pageSize = 10,
} = {}) {
  try {
    // Query parameters 구성
    const params = new URLSearchParams({
      page: String(page),
      pageSize: String(pageSize),
      orderBy,
    });

    // API 호출
    const response = await fetch(
      `https://panda-market-api.vercel.app/products?${params}`
    );

    // 응답 상태 확인
    if (!response.ok) {
      throw new Error(
        `Failed to fetch product list: ${response.status} ${response.statusText}`
      );
    }

    // JSON 데이터 파싱
    const data = await response.json();
    return data;
  } catch (error) {
    console.error("Error fetching product list:", error);
    throw error; // 필요시 상위 호출부에서 에러 핸들링
  }
}

이렇게 바꿔보시는건 어떤가요? ㅎ orderBy를 파라미터로 받는데 page와 pageSize를 받지 않을 이유는 없을것 같아요 ㅎ
추가로 에러에 대해 보다 유연한 처리등을 도입하면 더 좋을것 같습니다 ㅎ
throw new Error("제품목록을 가지고 오는데 실패했습니다."); 는 직관적이기는 하나 서버에서 내려주는 에러를 버리고 프론트엔드에서 에러를 다시 구성한다는 치명적인 단점을가지고 있어요
api request에서 발생하는 에러에 대한 이해도는 서버가 항상 더 많이 가지고 있기때문에 최대한 서버의 response를 활용하는것이 좋답니다

Comment on lines 12 to 19
const loadAllItems = async () => {
try {
const { list } = await productList({ orderBy: "recent" });
setAllItems(list);
} catch (error) {
console.error("전체 상품 데이터를 불러오는 중 오류 발생:", error.message);
}
};
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

async await 사용하신것 좋습니다 ㅎㅎ

다만 Try catch는 productList 함수 내부에서 처리하는게 좀더 목적성을 명확히 나누는 코드가 될 것 같네요 ㅎ

Comment on lines 36 to 39
useEffect(() => {
loadAllItems();
loadBestItems();
}, []);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

개인적인 추천인데 useEffect를 사용하실 땐 왜 사용하는지에 대해서 주석을 남겨주면 좋아요!

return (
<ul>
{items.map((item) => {
console.log(item);
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이건 아마 개발하다 끼어들어간 console.log인것 같은데 PR올릴때 이런건 다 지워주세요!

추후 미래를위한 좋은 습관으로 ㅎㅎ

src/App.jsx Outdated
path="/"
element={<Navigate to="/items" replace></Navigate>}
></Route>
<Route path="/items" element={<Home></Home>}></Route>
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

<Home></Home> -> <Home/>

Comment on lines 50 to 67
<form className="all-products__search-container">
<input
type="text"
placeholder="검색할 상품을 입력해주세요"
className="all-products__input"
/>
<Link to="/additem" className="all-products__add-button">
상품 등록하기
</Link>
<select
value={selectedOption}
onChange={handleOptionClick}
className="dropDown-products"
>
<option value="최신순">최신순</option>
<option value="인기순">인기순</option>
</select>
</form>
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

form에 submit 버튼이 없네요?

@kich555 kich555 merged commit 8f45f50 into codeit-bootcamp-frontend:React-최제원 Dec 4, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants