[TIL] Node HW 1

김시원·2023년 4월 17일
0

TIL

목록 보기
5/50
post-custom-banner

TIL

Issues encountered

  1. Error:
MongoServerError: E11000 duplicate key error collection: voyage_blog.posts index: postId_1 dup key: { postId: null } ...
    at writeOrBuffer (node:internal/streams/writable:389:12) {        
  index: 0,
  code: 11000,
  keyPattern: { postId: 1 },
  keyValue: { postId: null },
  [Symbol(errorLabels)]: Set(0) {}
}
  1. find하고 내림차순 createdAt을 기준으로 내림차순 sorting
  2. params나 body로 들어오는 request 값들에 대해 string type인지, 값이 잘 들어있는 지에 대한 예외처리를 초반에 if로 하는게 맞나?, schema에 이미 type과 required가 적혀있기 때문에 그냥 try catch문만으로 처리하는 것이 맞나?
const { password, title, content } = req.body;
const { _postId } = req.params;
if (
  typeof password !== "string" ||
  typeof title !== "string" ||
  typeof content !== "string" ||
  !_postId
) {
  return res.status(400).json({
    errorMessage: "데이터 형식이 올바르지 않습니다.",
  });
}

What I tried

  1. mongoDB에서 새로운 document가 생성될 때마다 고유한 id를 부여해주는 ObjectId를 사용하여 각 post와 comment를 구분하였다. 이때 mongoDB에서 자동으로 이 _id를 부여해주기 때문에 schema에는 id에 대한 key를 만들지 않았었다. 그러나, 하나 이상의 document를 POST할 때마다 위와 같은 에러가 떴다.
    1. 에러 분석: posts DB의 postId라는 key에 value로 null이 있고, 다른 document를 등록할 때마다 {postId: null}을 계속 넣어주기 때문에, 즉 첫번째 document의 postId에 대한 duplicate이기 때문에 error가 떴던 것이다.
    2. 문제 원인: 처음에 내가 db를 설계할 때 postId라는 key를 생성했었고 key에 값을 넣지는 않았어서 테이블상에서 보이지 않았지만 null값을 가지고 존재했던 것이었다.
    3. 문제 해결: posts DB를 drop시키고 다시 POST 요청을 하였더니 정상적으로 처리되었다.
  2. Schema에 createdAt을 사용하면 sort({ createdAt: "desc" })을 사용하여 내림차순 sorting을 해줄 수 있다.
  3. 먼저, 모든 에러 사항들을 catch에게 전가하는 것은 좋지 않다. 또한, FE에서도 이런 예외 처리를 다 해줄 것이지만, 서버에서도 최대한 앞에서 처리할 수 있는 부분들은 처리를 해주고 다른 이벤트들을 수행하기 전에 바로 return을 하는 것이 좋다. 즉, 내가 했던 것처럼 하면 된다. 그리고 인풋으로 들어온 값들 중에 error를 일으키지 않고 그냥 조건에만 맞지 않는 경우도 있을 것이기 떄문에 if로 처리해주는 것이 좋다.
    1. 그러나, 앞으로 노드 서버에 대해 더 공부해보면 알게 되는 과정이긴 하지만, 실제로 이런 에러/예외 처리들은 3-layer architecture를 통해 기능별로 layer/module를 나누어서 관리를 해준다. 즉, 지금처럼 router에 모든 에러/예외 처리, 서버 처리 등등을 다 해주는 것이 아니고 router (controller), data access, service layer로 나눠서 서버를 설계하여야 한다. 또한, 여러 파일에 공통된 코드 (boilerplate code)를 처리할 때 사용된다.
      img
    2. Controller는 request를 parsing/validating하고 이를 service layer에 전달해준다.
    3. Service는 비지니스 로직에 따라 application-specific task를 수행한다.
    4. Data Access는 query를 수행하여 db와 상호작용한다.

How I resolved the issues

  1. db의 collection 폴더 아래에 있는 posts, comments 데이터베이스를 drop해주고 다시 POST요청을 하였더니 정상적으로 동작하였다.
  2. const posts = await Posts.find({}).sort({ createdAt: "desc" })
  3. 서버에서 최대한 에러/예외 처리를 해주어 조건에 맞지 않을 경우 빠르게 return하는 것이 필요하다.

What I newly learned

  1. 3-layer architecture
  2. AWS EC2 deployment

What to learn next

  1. Authentication
  2. SQL
  3. Sequelize
post-custom-banner

0개의 댓글