Skip to content

[박수훈] sprint4 리펙토링 및 sprint5#66

Open
mdeeno wants to merge 12 commits intocodeit-sprint-fullstack:react-박수훈from
mdeeno:react-박수훈-sprint5

Hidden character warning

The head ref may contain hidden characters: "react-\ubc15\uc218\ud6c8-sprint5"
Open

[박수훈] sprint4 리펙토링 및 sprint5#66
mdeeno wants to merge 12 commits intocodeit-sprint-fullstack:react-박수훈from
mdeeno:react-박수훈-sprint5

Conversation

@mdeeno
Copy link
Collaborator

@mdeeno mdeeno commented Jan 8, 2026

1. 스프린트 미션 요구사항

기본 요구사항

공통

  • Github에 스프린트 미션 PR을 만들어 주세요.
  • React, Express를 사용해 진행합니다.

프론트엔드 구현 요구사항

랜딩 페이지

  • HTML과 CSS로 구현한 랜딩페이지를 React로 마이그레이션하세요.
  • 랜딩 페이지 url path는 /로 설정하세요.

중고마켓 페이지

  • 중고마켓 페이지 url path를 /items으로 설정하세요.
  • 페이지 주소가 /items 일 때 상단내비게이션바의 "중고마켓" 버튼의 색상은 #3692FF입니다.
  • 중고마켓 페이지 판매 중인 상품은 본인이 만든 GET 메서드를 사용해 주세요.
  • 다만 좋아요 순 정렬 기능은 제외해 주세요.
  • 사진은 디폴트 이미지로 프론트엔드에서 처리해주세요.
  • 베스트 상품 목록 조회는 구현하지 않습니다.
  • '상품 등록하기' 버튼을 누르면 /registration 로 이동합니다. (빈 페이지)

상품 등록 페이지

  • PC, Tablet, Mobile 디자인에 해당하는 상품 등록 페이지를 만들어 주세요.
  • 상품 등록 url path는 /registration입니다.
  • 상품 등록은 본인이 만든 POST 메서드를 사용해 주세요.
  • 등록 성공 시, 해당 상품 상세 페이지로 이동합니다. (빈 페이지)

심화 요구사항

프론트엔드 구현 요구사항

상품 등록 페이지

  • 모든 입력 input box에 빈 값이 있을 경우, 등록 버튼이 비활성화됩니다.
  • 태그를 입력한 후 엔터키를 누르면, 그 태그가 칩 형태로 쌓입니다.
  • 상품명, 상품 소개, 판매 가격, 태그에 대한 유효성 검사 Custom Hook을 만들어주세요.
    • 유효성 검사를 통과하지 않을 경우, 각 input에 빨간색 테두리와, 각각의 Input 아래에 빨간색 에러 메시지를 보여주세요.
    • 유효한 조건
      • 상품명: 1자 이상, 10자 이내
      • 상품 소개: 10자 이상, 100자 이내
      • 판매 가격: 1자 이상, 숫자
      • 태그: 5글자 이내

2. 주요 변경사항

  • sprint4 코드리뷰 주셨던 내용을 반영하여 App.jsx 컴포넌트 분리(Header, Footer, ProductList 등)
  • 모노레포로 벡엔드와 같이 진행하다가 멀티레포로 변경

3. 멘토님에게 남길 메시지

심화 요구사항 및 기본 요구사항 중 모르는 부분은 AI를 통해 클론코딩을 하였습니다..

요구사항 중 반응형 디자인을 맞추다 보니 CSS가 자꾸 어긋나는 부분이 생겨서 어색한 부분이 일부 있습니다.

반응형으로 구현하는 부분이 미약해서 작성하는 방법이나 정리 방법 궁금합니다.
그리고 css 파일은 컴포넌트마다 구분하는게 좋은지, 통합하는게 좋은지 기준을 잘 모르겠습니다.

@mdeeno mdeeno requested a review from reach0908 January 8, 2026 13:48
@mdeeno mdeeno self-assigned this Jan 8, 2026
@mdeeno mdeeno added 매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. 미완성 스프린트 미션 제출일이지만 미완성했습니다. 죄송합니다. 진행중 아직 스프린트 미션 제출일이 아닙니다. 새로 커밋된 내용에 대해 코드리뷰 해주세요! (2주 이상의 스프린트 미션 중간점검 PR 제출시 사용합니다.) and removed 미완성 스프린트 미션 제출일이지만 미완성했습니다. 죄송합니다. 매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. labels Jan 8, 2026
@mdeeno mdeeno force-pushed the react-박수훈-sprint5 branch from 94d6c53 to f099d6d Compare January 16, 2026 08:42
@mdeeno mdeeno added the 매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. label Jan 17, 2026
- 상품 등록 유효성 검사 (Custom Hook) 및 태그 칩 기능 구현
- 상품 등록 페이지 반응형 레이아웃(Mobile/Tablet/PC) 적용
- Header 및 RegistrationPage CSS 파일 분리 (스타일 충돌 해결)
- App.jsx 상세 페이지 라우팅 오류 수정
@mdeeno mdeeno added 최종제출 스프린트 미션 최종 제출 PR입니다. 코드리뷰 및 평가해주세요! 진행중 아직 스프린트 미션 제출일이 아닙니다. 새로 커밋된 내용에 대해 코드리뷰 해주세요! (2주 이상의 스프린트 미션 중간점검 PR 제출시 사용합니다.) and removed 진행중 아직 스프린트 미션 제출일이 아닙니다. 새로 커밋된 내용에 대해 코드리뷰 해주세요! (2주 이상의 스프린트 미션 중간점검 PR 제출시 사용합니다.) 최종제출 스프린트 미션 최종 제출 PR입니다. 코드리뷰 및 평가해주세요! labels Jan 17, 2026
@mdeeno mdeeno added 최종제출 스프린트 미션 최종 제출 PR입니다. 코드리뷰 및 평가해주세요! and removed 진행중 아직 스프린트 미션 제출일이 아닙니다. 새로 커밋된 내용에 대해 코드리뷰 해주세요! (2주 이상의 스프린트 미션 중간점검 PR 제출시 사용합니다.) labels Jan 17, 2026
@@ -0,0 +1,46 @@
import React from 'react';
Copy link
Collaborator

Choose a reason for hiding this comment

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

React 17+ 버전에서는 JSX 변환이 자동으로 처리되므로 React import가 필요하지 않습니다.

// 판다마켓 공식 서버
// const BASE_URL = 'https://panda-market-api.vercel.app/products';

// 구축한 백엔드 서버(sprint5)
Copy link
Collaborator

Choose a reason for hiding this comment

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

API URL이 하드코딩되어 있어 배포 환경에서 문제가 발생합니다.

.env 파일에 VITE_API_URL을 설정하고 import.meta.env.VITE_API_URL을 사용하세요.


const response = await fetch(`${BASE_URL}?${query}`);

if (!response.ok) {
Copy link
Collaborator

Choose a reason for hiding this comment

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

에러 메시지에 상태 코드를 포함하면 디버깅이 수월합니다.

throw new Error(`데이터 로딩 실패: ${response.status}`);

<nav className={styles.navMenu}>
<Link to="/" className={styles.navItem}>
자유게시판
</Link>
Copy link
Collaborator

Choose a reason for hiding this comment

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

/items로 가는 Link가 두 번 렌더링되고 있습니다. 이 빈 Link와 아래의 중고마켓 Link가 중복됩니다. 이 빈 Link를 삭제해주세요.

<div className={styles.imgBox}>
{/* 이미지가 없을 경우 default 이미지 사용 */}
<img
src={product.images[0] || '/img/default_product.png'}
Copy link
Collaborator

Choose a reason for hiding this comment

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

Default 이미지 경로가 ProductList.jsx의 /img/img_default.png와 불일치합니다. 상수로 통일하세요.

e.preventDefault(); // 폼 제출 방지
const newTag = tagValue.trim();

// 태그 유효성: 빈값 아니고, 중복 아니면 추가
Copy link
Collaborator

Choose a reason for hiding this comment

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

태그 5글자 이내 유효성 검사가 누락되어 있습니다.

if (newTag.length > 5) {
  setTagError('태그는 5글자 이내로 입력해주세요.');
  return;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

매운맛🔥 뒤는 없습니다. 그냥 필터 없이 말해주세요. 책임은 제가 집니다. 최종제출 스프린트 미션 최종 제출 PR입니다. 코드리뷰 및 평가해주세요!

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants