본문 바로가기

백엔드/MongoDB

DataBase (2) - callback, promise

 

Mongoose v7.3.1: Queries

Mongoose models provide several static helper functions for CRUD operations. Each of these functions returns a mongoose Query object. A mongoose query can be executed in one of two ways. First, if you pass in a callback function, Mongoose will execute the

mongoosejs.com

 

mongoose는 CRUD를 하기위한 function을 제공한다. 각 함수는 Mongoose 쿼리 객체를 반환하는 형식으로 작동한다. 몽고구스 쿼리는 2가지 방식으로 활용할 수 있다. javascript와 비슷한 callback function, promise

 

 

callback :

module.queryMethod( {filter}, callback)

무언가 발생하고 난 뒤 호출 되는 function, 자바스크립트의 기다리는 방식. 실행과 동시에 적용되지 않고

실행이 완료된 다음에 뒤에 함수가 동작된다. function 안에 function이 들어가 있는 형태..

예) app.listen(PORT, handle), PORT 값의 결과를 도출한 다음 handle 이라는 함수 실행

 

mongoose 6.0 버전 이상부터는 callback 함수를 지원하지 않는다고 한다.

 

 

promise (Async-Await) : callback의 최신 버전

async (req,res) => { await module.quertMethod( {filter} ) } 

 


* callback 방식

 

 

 

module.find( {}, #### )

{} (중괄호) : search terms, 비어있으면 모든 형식을 찾는다는 것을 말한다.

callback : err, docs라는 인수를 가진다. 쿼리가 실행시 에러가 발생하면 err 정보가 입력 result null / 성공하면 err null, result 반환

 

<결과>
--> Start
--> render                                //database 불러오기 전에 렌더됨
--> I should be the last one
--> Finished
<결과>
--> Start
--> I should be the last one
--> finished
--> render

콜백을 사용해서 자바스크립트가 실행되는 순서를 조절할 수 있다. database 검색이 끝나지 않았는데 render 되는 것을 방지하기 위해 render를 callback 하위로 옮겨주었다.

 

에러 발생을 한번에 확인할 수 있게 도와주지만
함수 안에 함수 안에 함수.. 지옥이 펼쳐진다.

callback 방식은 에러들을 바로 볼 수 있는 장점이 있지만 함수안의 함수, 함수가 중첩되면서 가독성 저하, 에러 유발 그래서 보기편한 promise(Async-Await)가 나옴.

 

 

*async-await

 

module 앞에 (Video.find) 앞에 await를 붙이면 더이상 callback하지 않고 찾아낸 데이터를 기다렸다가 바로 출력해 준다. await는 async 함수안에서만 작동한다. try / catch문을 사용해서 에러를 찾을 수 도 있다. try{} 을 실행하다가 에러가 발생하면 (데이터베이스가 종료되거나 포화되거나 등등) catch문으로 이동하여 실행시킨다. callback의 최신 버전으로 코드가 직관적이며 자바스크립트에게 기다려를 알려주기 때문에 많이 사용하는 코드이다.

 

 


 

*동기 처리 방식 / 비동기 처리 방식

자바스크립트는 기다림을 모르는 비동기 방식으로 작동한다. 기본적으로 위에서 아래로 내려오면서 코드를 실행하는데 만약 중간에 setTimeout과 같은 시간이 걸리는 함수가 나오면 코드 완료가 되기 전에 다음 코드를 실행한다. 이 경우 동기 방식보다 빠르게 모든 코드 실행을 마치지만 중간 데이터 베이스를 활용한 코드가 있을 경우 데이터 베이스 값을 불러오기도 전에 해당 코드를 실행해 버리는 문제점이 발생한다. 그래서 자바스크립트에게 callback이나 promise를 알려줘 해당 값이 완료 될 때까지 기다려야한다.

순차적으로 처리 방식 : 동기 처리 방식 (직렬적)
1번~9번까지 요청이 있을 경우 일반서버의 경우 1번 요청이 완료되면 2번 실행.. 2번이 완료되면 3번.... 이런식으로 요청이 완료되면 다음 요청을 실행하게 된다. 중간에 요청 시간이 길어지면 다음 요청 실행 시간이 길어진다.

비순차적으로 처리 방식 : 비동기 처리 방식 (병렬적)
비동기식 처리 방식은 코드가 끝날 때까지 코드 실행을 멈추지 않고 다음 코드를 먼저 실행한다. 상대적으로 시간이 소요되는 Video.fin()의 callback 함수가 끝나기 전에 다음 코드를 실행한다. 모든 코드가 끝난 후 마지막으로 callback 함수가 실행되기 때문에 "Finished Seach" 문구가 마지막으로 출력된다. 비동기처리 방식의 예로 Web API, Ajax, setTimeout 등이 있다.

 

 

반응형

'백엔드 > MongoDB' 카테고리의 다른 글

DataBase (6) - Middlewares  (0) 2023.07.11
DataBase (5) - Edit Data  (0) 2023.07.10
DataBase (4) - 정규식표현, 16진수(24byte) 문자열  (0) 2023.07.05
DataBase (3) - Create Data  (0) 2023.07.03
DataBase (1) - Setting  (0) 2023.06.28