내일배움캠프/TIL
TIL. API 명세서 개인 과제
PachyuChepe
2023. 11. 3. 15:53
반응형
백엔드 기술 스택
- 웹 프레임 워크: Express.js
- 패키지 매니저 npm || yarn
- 모듈 시스템: ES6 모듈 || CommonJS 모듈
- 데이터베이스: MongoDB Atlas
- ODM: mongoose
- AWS EC2 배포
프로젝트 요구사항
- .env 파일을 이용해서 환경변수 관리
- .gitignore 파일을 생성하여 .env 파일과 node_modules 폴더가 Github에 올라가지 않도록 설정
- .prettierrc 파일을 생성하여 일정한 코드 포맷팅 유지
API 구현
- 상품 작성 API
상품명, 작성 내용, 작성자명, 비밀번호를 request에서 전달받기
상품은 두 가지 상태 판매 중(FOR_SALE), 판매완료(SOLD_OUT)를 가질 수 있음
상품 등록 시 기본 상태는 판매 중(FOR_SALE) - 상품 목록 조회 API
상품명, 작성자명, 상품 상태, 작성 날짜 조회
상품 목록은 작성 날짜를 기준으로 내림차순(최신순) 정렬 - 상품 상세 조회 API
상품명, 작성 내용, 작성자명, 상품 상태, 작성 날짜 조회 - 상품 정보 수정 API
상품명, 작성내용, 상품 상태, 비밀번호를 request에서 전달받기
수정할 상품과 비밀번호 일치 여부를 확인한 후 동일할 때만 수정
선택한 상품이 존재하지 않을 경우, "상품 조회에 실패하였습니다" 메시지 반환 - 상품 삭제 API
비밀번호를 request에서 전달받기
수정할 상품과 비밀번호 일치 여부를 확인한 후 동일할 때만 글이 삭제
선택한 상품이 존재하지 않을 경우, 상품 조회에 실패하였습니다 메시지 반환
Error Handling?
1. Issue
- 고유한 값을 가진 컬럼을 만들려고 시도했으나, 기본으로 생성되는 _id는 사용하기에 부적합하다고 판단

- 별도의 컬럼을 생성한 후 mongoose-auto-increment를 설치해서 자동으로 값이 상승하게 만들고 싶었으나 의존성 문제로 에러 발생

1. Solution
- 현재 DB에 들어있는 값을 추적하여 새로운 아이템이 등록되었을 때 +1씩 상승시켜서 입력해 주는 미들웨어 구현
...
userItemId: {
type: Number,
required: true,
unique: true,
default: 0,
},
...
userItemSchema.pre("save", async function (next) {
if (!this.userItemId) {
try {
const maxUserItemId = await this.constructor.findOne({}, { userItemId: 1 }, { sort: { userItemId: -1 } });
this.userItemId = maxUserItemId ? maxUserItemId.userItemId + 1 : 1;
} catch (error) {
return next(error);
}
}
next();
});
2. Issue
- 등록한 아이템 상세 조회가 안 되는 에러 발생

2. Solution
- findById는 테이블의 _id를 조회하며, 특정 컬럼을 조회하기 위해선 findOne를 사용
// 문제 코드
const product = await UserItem.findById(userItemId);
//해결 코드
const product = await UserItem.findOne({ userItemId });
회고
MongoDB엔 어째서 auto_increment 설정이 없는걸까? NoSQL만의 무언가가 있나 보다
지금 userItemId를 params에 우겨넣어서 사용 중이라 사실상 Primary Key와 흡사한 상태인데
그래서 그런가.. _id를 조회하는 메서드를 써놓고 이거 웨 안댐? 하고 있었다... 의식의 흐름대로 작성한 듯
반응형