✍️ 오름캠프 프론트엔드 3기 두번째 미니프로젝트 회고
⚠️ 구구절절 주의 ⚠️
수영복 쇼핑몰
Swim360 🔗
GitHub Repository 🔗
총 기간: 4주(12/2~12/27)
팀명: KBS-WIN(케이비스윈), 총 4인 구성
나의 담당
그리고.. 팀장역할도 맡게 되었다.
React를 사용할 것, 백엔드는 자유이나 사용할 경우 Node.js 또는 Deno에 기반한 코드만 사용할 것, 타입스크립트는 필수는 아니나 권장
우리 팀은 현업에서 많이 사용되는지를 중점을 두었고, 그 외에는 학습한 것을 위주로 선택했다.


쇼핑몰의 주요 기능들을 모두 구현하고, 추가적으로 3D 구현까지 진행했다.
백엔드에 seedData를 작성해서 서버가 실행될때마다 db에 저장되도록 했다.
이외에도 더 구현하고 싶은 기능들이 정말 많았었는데, 시간이 부족해서 선택과 집중을 할수밖에 없었다.
메인 페이지의 동영상과 이미지, 상품정보들은 후그와 가나스윔 사이트에서 가져왔다.
컴포넌트 분리
문제상황까지는 아니었지만... 리액트를 처음 사용해보고 팀과제이다 보니까 컴포넌트 분리 기준에 대해 이야기를 많이 나누고 시작했다.
팀원분이 잘 정리되어있는 영상들을 공유해주셔서 모두 시청하고 같은 이해수준을 가질수 있어서 도움이 되었다.
공통으로 사용되는 컴포넌트들을 미리 정해서 다른 담당자들끼리 공유해서 사용했다.
특히, 기획때부터 페이지의 세부 기능들에대해 정말 많은 이야기들을 나눠서 본인 담당이 아닌 부분에 대해서도 잘이해하고 있던것도 도움이 되었다고 생각한다.
모델 관계 설정
관계 설정이 은근히 헷갈렸다.
관계의 주인이 foreign key를 갖는다를 계속 떠올리면서 설정했다.
예를들어 회원과 리뷰의 경우, 회원 한명이 여러 리뷰를 쓸수 있으므로 회원이 리뷰id를 외부키로 갖는다.
가장 이해하기 어려운 부분은 주문 - 주문상품 - 상품 관계였다.
주문과 상품은 다대다의 관계인데, 다대다는 데이터 설계상 어려움이 있으므로 주문상품 모델을 추가하여 주문과 주문상품, 주문상품과 상품을 다대일의 관계로 설정한다고 한다.
팀원분과 정말 많은 사례를 찾아보고 정리했다.
추후에는 팀원들과 함께 보기 편리하게 ERD cloud 까지 생성했다.
ERD Cloud🔗
seedData
초기에는 각자의 pc에 필요한 데이터들을 입력하면서 작업을 했는데, 데이터가 공유되지 않다보니 번거로워서, seedData를 추가해보았다.
//seedData.js
const {
User,
Review,
Order,
Product,
Cart,
OrderItem,
Category,
Discount,
syncAll,
} = require(`./models`);
const seedData = async () => {
try {
await syncAll({ force: true });
const categories = await Category.bulkCreate([
{ name: `woman`, parent_id: null },
...,
]);
...
console.log(`더미 데이터 생성 완료!`);
} catch (error) {
console.error(`더미 데이터 생성 중 오류 발생:`, error);
}
};
module.exports = seedData;
seedData.js 폴더에 필요한 데이터들을 작성하고 app.js에서 실행하는 코드를 추가했다.
//app.js
const seedData = require("./seedData");
const startServer = async () => {
...
await db.init();
await models.syncAll({ force: true });
// force: true 옵션을 추가 -> db가 실행될때마다 기존 테이블 삭제 후 새로 생성
await seedData();
...
};
그런데 이렇게 했을 때 자꾸 오류가 났는데, 그 이유는 모델들간의 관계설정 때문에 삭제될때와 생성될때의 순서가 다르기 때문이었다.
챗gpt한테 관계설정한 것을 보여주고 순서 정리해달라고해서 수정했다.
//models/index.js
const syncAll = async () => {
try {
// Drop tables in reverse order of dependencies
await Review.drop({ force: true })
await OrderItem.drop({ force: true })
await Cart.drop({ force: true })
await Order.drop({ force: true })
await Product.drop({ force: true })
await Category.drop({ force: true })
await Discount.drop({ force: true })
await User.drop({ force: true })
// Recreate tables in order of dependencies
await User.sync({ force: true })
await Category.sync({ force: true })
await Discount.sync({ force: true })
await Product.sync({ force: true })
await Order.sync({ force: true })
await Cart.sync({ force: true })
await OrderItem.sync({ force: true })
await Review.sync({ force: true })
console.log('All tables synchronized successfully')
} catch (error) {
console.error('Error synchronizing tables:', error)
throw error
}
};
순서를 정리하고나니 정상적으로 seedData가 db에 저장되었다.
aws ec2, s3
우리팀은 하나의 레포지토리에 백엔드와 프론트엔드의 프로젝트가 함께 있었고, ec2로도 각 서버를 실행할 수 있을 줄 알았다. 결론적으로는 불가능했다.
다른 오류도 있었을 수 있지만 일단 ec2가 너무 느려서 엄청 버벅댔기 때문에 뭘 수정하려고해도 먹통이 되어서 ec2를 삭제하고 다시 생성하는 걸 몇번 반복했다.
시간은 없고 ec2에서 두 서버를 돌리는 게 가능한건지 자체도 확신이 없어서 강사님께 질문을 드렸고, 강사님께서는 프론트서버를 s3로 배포하라고 말씀해주셨다.
따라서 ec2에서는 Mysql 설치, 레포지토리 클론, 백엔드 실행(백엔드를 계속 커두기 위해서 추후에는 npm run start가 아닌 pm2 start npm --name "backend" --run start로 실행했다)
s3로 로컬에서 생성한 .dist파일 업로드, 권한 및 엑세스 설정을 통해 배포에 성공했다.
classnames: 조건부 스타일링
className={`h-full w-1/2 ${tab === "review" ? "border-black" : ""}`}
className={cn('h-full w-1/2', {'border-black':tab})}
Link/Navigate/useNavigate
Link : 사용자가 클릭해서 페이지를 이동할 때
Navigate: 특정 경로에서 렌더링 시점에 이동시키고 싶을때(리다이렉트)
useNavigate 훅: 페이지 이동시 추가 로직이 필요한 경우, 특정 코드 실행이후 페이지 이동(결제하기 버튼 클릭 -> 결제 완료이후 -> 페이지 이동)
react-hook-form/zod
회원정보수정 기능을 구현할 때 사용해보았는데, 처음에는 기능이 너무 많아서 조금 막막하기도 했는데 하나씩 뜯어보면서 기능을 구현해볼 수 있었다. 유용한 기능들이 많아서 더 공부해보고 싶다!
axios import
services/index.ts에 base url을 정의해두어서 api 호출을 할 때 전체 url을 입력하지 않아도 된다. 그런데 나는 왜인지 전체 url을 입력하지 않으면 오류가 났다. 다른 팀원이 작성한 코드랑 비교해보니 axios를 import 할때 우리가 정의해둔 services/index.ts가 아닌 axios를 import해서 생긴 문제였다. import할 때 자동 완성되는 것을 선택해왔는데 앞으로는 더 주의해야겠다.
상을 수상한 것도 기뻤지만, 팀원들과 각자 작업한 코드들을 합쳐서 하나의 서비스가 완성되어갈 때 재미있었고, 특히 배포까지 성공했을 때 굉장히 뿌듯했다.
정말 열심히 했고, 재미있었던 프로젝트였다. 크리스마스에도 회의하고, 새벽까지 하는 날도 많았고, 토의도 정말 많이했다. 배포까지 된 사이트를 보니 뿌듯함도 많이 느꼈고, 더 성장해서 더 좋은 서비스를 만들고 싶다는 생각도 들었다. 또, 공부할 것도 아직 한참 많겠구나라는 생각도... 🫠
크리스마스 이브에 9시까지 개발하고 크리스마스에도 만난 우리팀 🫶