[Youtube 클론코딩] 데이터베이스의 데이터 업데이트, 스키마 미들웨어, 스키마 스태틱

2022. 10. 29. 18:50공부/Javascript

이미 데이터베이스에 존재하는 데이터를 수정하기 위해선 두가지 방법이 존재한다.

1. video를 불러온 뒤 속성을 수정하기

물론 이 방법도 속성 수가 적을 때는 무난하게 사용할 수 있지만,

속성 수가 10개 이상쯤 되면 일일이 타이핑 치는게 불편하다.

 

2. findByIDAndUpdate() 이용하기

Mongoose v6.7.0: (mongoosejs.com)

 

Mongoose v6.7.0:

Parameters: doc «Object» values for initial set [fields] «Object» optional object containing the fields that were selected in the query which returned this document. You do not need to set this parameter to ensure Mongoose handles your query projection

mongoosejs.com

위의 링크를 확인해보면 위처럼 findByID가 있고 findOne이 있다.

findOne은 id 말고도 다른 속성들로 데이터를 찾는 방법이지만, 우리는 이미 id를 이용하고 있으므로 findById를 이용한다.

findByIdAndUpdate()는 첫번째 매개변수로 id를, 두번째 매개변수로는 업데이트 할 내용이 적힌 객체가 필요하다.

따라서 이처럼 작성해주면 된다.

 

그런데 이 함수는 우리가 video 객체를 따로 불러오지 않으므로 페이지에 대한 예외처리문을 사용할 수 없다.

따라서 exists() 를 이용해서 video 객체가 실제로 데이터베이스에 존재하는지를 가져와야 한다.

exists()는 filter라는 객체를 매개변수로 받는데, 이는 검색에 필요한 정보를 가진 객체이다.

이렇게 작성해주면 된다.

 

태그 처리하기

우리는 태그들을 입력할 때 일반적인 문자열에 ,로 구분한 단어들을 받는다.

이를 각각의 단어로 저장된 배열로 저장하기 위해서는 세가지 방법이 존재한다.

1. 일반 함수 이용

2. 미들웨어 이용

3. Model static 이용

1. 일회용 함수 이용

일회용 함수는 위처럼 데이터가 저장할 자리에 함수를 이용해 처리하는 방법이다.

이 방법도 좋지만 여러 군데에서 동일한 함수를 사용할 경우, 유지 보수가 어렵다.

2. Schema.middleware()

Mongoose v6.7.0: Middleware (mongoosejs.com)

 

Mongoose v6.7.0: Middleware

Middleware (also called pre and post hooks) are functions which are passed control during execution of asynchronous functions. Middleware is specified on the schema level and is useful for writing plugins. Mongoose has 4 types of middleware: document middl

mongoosejs.com

mongoose에서도 미들웨어를 지원한다.

express에서 사용하는 것과 모양도 비슷하고 작동 방식도 동일하다.

 

미들웨어는 Model 선언 이전에 선언돼야 하는 특징이 있으므로 mongoose.model() 위에 적어주도록 한다.

미들웨어의 특징은 this 키워드를 사용한다는 점이다.

this는 현재 페이지(document)를 가리키는데, post로 넘겨주는 데이터가  this에 들어가게 된다.

console.log(this)를 통해 출력해보면 다음처럼 저장하려는 객체의 정보가 출력되는 것을 볼 수 있다.

따라서 콜백함수로는 화살표함수가 아닌 일반 함수를 이용해 선언해야 한다.

(화살표 함수는 this가 document가 아닌 자신을 감싸는 함수를 가리키기 때문)

 

그런데 저장할 때는 이게 유효한데, 업데이트할 때는 작동하지 않는다.

그 이유는 findByIdAndUpdate()를 살펴보면 알 수 있는데, findByIdAndUpdate는 findOneAndUpdate와 작동방식이 같다.

그리고 findOneAndUpdate는 'save'이벤트가 아닌 'update'이벤트를 발생하므로 미들웨어가 동작하지 않는 것이다.

이 메소드는 update 미들웨어를 발동한다.

그렇다면 미들웨어만을 이용해서 처리하려면 save와 동일하게 update도 감지를 해야하므로

새롭게 미들웨어를 만들면 1번의 방법과 다를게 없어진다.

따라서 이는 각 이벤트시에만 일어나는 행동을 정의할 경우에 사용하면 된다.

3. Schema.static() 이용

우리는 앞서 비디오 모델의 여러 메소드를 이용했다.

(예를 들면 Video.exists()나 Video.findById()와 같은 것들)

이러한 메소드 들은 커스텀으로 제작할 수도 있는데, 그걸 가능하게 해주는 것이 바로 schema static이다.

Mongoose v6.7.0: Schemas (mongoosejs.com)

 

Mongoose v6.7.0: Schemas

If you haven't yet done so, please take a minute to read the quickstart to get an idea of how Mongoose works. If you are migrating from 5.x to 6.x please take a moment to read the migration guide. Everything in Mongoose starts with a Schema. Each schema ma

mongoosejs.com

스키마명.static('메소드명', 함수)

이런식으로 지정하면 지정한 메소드 명을 통해 지정한 함수를 실행할 수 있다.

실제로 사용은 다음처럼 한다.

 

이 방법은 마치 다음처럼 함수를 만든 뒤 사용하는 것과 유사하다.