내일배움캠프/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를 조회하는 메서드를 써놓고 이거 웨 안댐? 하고 있었다... 의식의 흐름대로 작성한 듯

 

반응형