노마드 코더/유튜브 클론

[JavaScript, Node.js] 유튜브 클론 정리 6장 (7) - Middleware(mongoose)

LooanCheong 2023. 4. 19. 02:40
반응형

머리글

이번 시간에는 Middleware에 대해서 알아보자.

Middleware

이미 express에서 한 번 사용을 했던 적이 있다.
무언가를 하기 전에 작업을 하고 next() 함수를 호출하여 다음 작업으로 넘어간다.

Mongoose에서도 비슷하게 작동한다.

비디오 스키마에 저장을 하기 전에 작동할 미들웨어를 하나 생성해 보도록 하겠다.

videoSchema.pre("save", async function () {
  this.hashtags = this.hashtags[0]
    .split(",")
    .map((word) => (word.startsWith("#") ? word : `#${word}`));
});

우선 "save"의 경우 우리가 save 할 때, 그리고 'pre'의 경우 저장 전에 미들웨어를 작동하겠다는 것을 의미한다.
(저장을 시도하면 저장이 되기 전)
그리고 function을 실행한다.

function에 보면 'this' 라는 키워드가 있는데,
이는 우리가 '저장하고자 하는 문서'를 의미한다.
위의 경우 비디오 스키마를 의미한다.

동작시킨 함수의 경우 해쉬태그에 입력받은 단어를 콤마를 기준으로 나누고,
나눈 단어들의 앞부분에 #이 있다면 그대로,
그렇지 않다면 #을 붙여서 반환하는 함수이다.

그런데 이 경우에는 저장할 때는 사용이 가능하지만,
업데이트의 경우 사용이 불가능하다.

다른 방법도 알아보자.

Static

static은 스키마에서 사용자 함수를 만드는 방법이다.

videoSchema.static("formatHashtags", function (hashtags) {
  return hashtags
    .split(",")
    .map((word) => (word.startsWith("#") ? word : `#${word}`));
});

이런 식으로 static을 이용해서 함수의 이름을 지정해 주고,
필요한 인자를 function에 넣어서 사용하면 된다.
지금 같은 경우 해시태그를 인자로 받았다.

이렇게 static을 생성해 주고 사용할 때는 다음과 같이 사용하면 된다.

...
    await Video.create({
      title,
      description,
      hashtags: Video.formatHashtags(hashtags),
    });

일반적인 함수의 사용과 크게 다르지 않다.

원하는 파일에서 얼마든지 호출이 가능하다는 장점이 있다.

마무리

이번 시간에는 mongoose의 middleware와 static에 대해서 알아보았다.

다음 시간에는 DB를 삭제하는 방법과 영상을 검색하는 방법을 알아보자.

반응형