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

React 김현묵 sprint6 #103

Conversation

kimhyunmook
Copy link
Collaborator

@kimhyunmook kimhyunmook commented Nov 3, 2024

요구사항

기본

공통

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

프론트엔드 구현 요구사항

랜딩 페이지

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

중고마켓 페이지

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

상품 등록 페이지

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

백엔드 구현 요구사항

중고마켓

  • Product 스키마를 작성해 주세요.
  • id, name, description, price, tags, createdAt, updatedAt필드를 가집니다.
  • 필요한 필드가 있다면 자유롭게 추가해 주세요.
  • 상품 등록 API를 만들어 주세요.
  • name, description, price, tags를 입력하여 상품을 등록합니다.
  • 상품 상세 조회 API를 만들어 주세요.
  • id, name, description, price, tags, createdAt를 조회합니다.
  • 상품 수정 API를 만들어 주세요.
  • PATCH 메서드를 사용해 주세요.
  • 상품 삭제 API를 만들어 주세요.
  • 상품 목록 조회 API를 만들어 주세요.
  • id, name, price, createdAt를 조회합니다.
  • offset 방식의 페이지네이션 기능을 포함해 주세요.
  • 최신순(recent)으로 정렬할 수 있습니다.
  • name, description에 포함된 단어로 검색할 수 있습니다.
  • 각 API에 적절한 에러 처리를 해 주세요.
  • 각 API 응답에 적절한 상태 코드를 리턴하도록 해 주세요.
  • . env 파일에 환경 변수를 설정해 주세요.
  • CORS를 설정해 주세요.
  • render.com로 배포해 주세요.
  • MongoDB를 활용해 주세요.

심화 요구사항

프론트엔드 구현 요구사항

상품 등록 페이지

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

멘토에게

  • 셀프 코드 리뷰를 통해 질문 이어가겠습니다.

@kimhyunmook kimhyunmook requested a review from pers0n4 November 3, 2024 09:13
"dotenv": "^16.4.5",
"express": "^4.21.1",
"mongoose": "^8.7.3",
"nodemon": "^3.1.7"
Copy link
Collaborator

Choose a reason for hiding this comment

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

nodemon 같은 툴은 devDependencies로 들어가는 게 더 적절해보입니다.
무슨 차이인지 모르겠다면 npm 공식문서나 블로그 설명을 찾아보세요!

import product from "./product/controller.js";

const router = express.Router();
router.use("/product", product);
Copy link
Collaborator

Choose a reason for hiding this comment

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

api 경로를 지정할 때 resource collection이 변경된다면 복수형의 이름을 많이 사용합니다.

Copy link
Collaborator

Choose a reason for hiding this comment

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

service 파일은 비즈니스 로직을 구현해놓은 파일인 것 같은데, routes 디렉터리 밑에 두기엔 관심사가 서로 일치하지 않는 것 같네요.

@@ -0,0 +1,106 @@
import Product from "../../model/product.js";
const Items = async (req, res) => {
Copy link
Collaborator

Choose a reason for hiding this comment

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

함수 네이밍이 대문자로 시작하는 건 어색하게 보이네요.

Comment on lines +4 to +6
let pageSize = !!query.pageSize ? Number(query.pageSize) : 10;
let page = !!query.page ? Number(query.page) : 1;
let orderBy = {};
Copy link
Collaborator

Choose a reason for hiding this comment

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

값을 재할당하는 변수가 아니라면 const로 선언하는 게 좋아보입니다.
let으로 선언하면 코드를 읽는 사람들로 하여금 해당 코드 스코프 내에서 변수 값이 언제 바뀌는지 계속 긴장하게 만들 수 있습니다.

},
{ $set: req.bdoy }
);
res.status(203).send({
Copy link
Collaborator

Choose a reason for hiding this comment

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

status code 203은 어떤 의도로 지정하신 건가요?

Comment on lines +94 to +96
} catch (error) {
console.error(error);
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

예외가 발생하는 경우를 처리하기 위해서 try catch 구문을 꼼꼼히 사용하고 있는 부분은 좋은 접근이라고 생각됩니다. 그런데 실제로 에러가 발생한다면 API 관점에서 response는 어떻게 되는지도 고려해보셨을까요?

Copy link
Collaborator

Choose a reason for hiding this comment

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

사용하지 않을 거라면 깔끔하게 지우는 게 좋아 보입니다.

Comment on lines +51 to +75
function HomeSection({ h4, h2, p, img, left }) {
left = left ? "left" : "";
return (
<div className="section">
<div className="content">
{!!!left ? <img src={img} alt={h4} /> : null}
<div className={`txtBox ${left}`}>
<div class="abs">
<h4>{h4}</h4>
<h2>
{h2[0]}
<br />
{h2[1]}
</h2>
<p>
{p[0]} <br />
{p[1]}
</p>
</div>
</div>
{left ? <img src={img} alt={h4} /> : null}
</div>
</div>
);
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

HomeSection이 항상 해당 값들을 props로 받을 거라고 가정하고 있기 때문에 결합도는 높고 확장성은 떨어지는 구조입니다. 이런 형태라면 컴포넌트를 여러 개로 나누고, children으로 컴포넌트를 렌더하는 방식이면 더 괜찮을 것 같습니다.
컴파운드 패턴이라는 것도 참고해보시면 좋을 것 같습니다. (필수로 적용해야 하는 것 아님)

const naviLimit = 5;
const [sellLimit, setSellLimit] = useState(10);
const sellProduct = useItmeList([], sellLimit);
const [sellItmeSize, setSellItemSize] = useState("220px");
Copy link
Collaborator

Choose a reason for hiding this comment

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

사이즈를 string 상태로 관리한다는 게 마음이 조금 불편하네요. px 단위라도 사용하는 곳에서 붙이는 걸로 하고 값은 number 타입으로 보면 어떨까요?
최종적으로는 해당 라인을 CSS 쪽으로 넘기는 방향이면 좋을 것 같습니다.

@pers0n4 pers0n4 merged commit 84a6929 into codeit-sprint-fullstack:react-김현묵 Nov 7, 2024
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants