2021. 1. 14. 10:12ㆍ프로그래밍-Web/MongoDB
몽고DB 드라이버의 메소드는 기본적으로 thenable 객체를 리턴한다
(이는 Promise를 사용할 수 없다, then으로 잡히기 때문에 thenable이라고 함)
따라서 이렇게 비동기적으로 실행되는 방식이기 때문에
1. exce() 메소드를 통해 실행 시점을 정해주든가
2. 콜백 처리를 하든가
3. await 처리를 하든가
해야한다.
그렇게 하지 않으면 쿼리 날리는 횟수가 자기 맘대로다
첫번째 처럼 날리면 안된다는 이야기.
(sol에서는 exec() 메소드를 사용했지만, 기타 create( ) , remove( ), save( ) 같은 컬렉션 조작 메소드를 사용해도 비동기 로직이 처리된다. 단, 쿼리만 정의하고 로직을 태우면 안된다는 것)
왜냐하면 내부 로직이 비동기로 돌아가므로, 리턴을 받기도 전에 find() 메소드 태스크를 큐에 계속 쌓기 때문이다
조금 자세히 까보면
기본적으로 ODM을 이용하여 node.js 에서 쿼리를 생성하면 일단 쿼리 구문을 생성하게 된다.
그리고 실제 정의된 쿼리메소드에 맞는 프로토타입 함수를 찾는다
이 과정은 실행큐에 쌓인다.
로그를 찍어보면
'비교' 로그는 쿼리를 만드는 시점이고 '결과' 로그는 리턴받는 시점이다
즉, 쿼리를 만들어 큐에 쌓는 짓을 결과와 상관없이 비동기적으로 하게 되는 것이다'
그러니까 실행타임이 끝날때 까지 쿼리를 만들어 큐에 쌓은만큼을 모두 call한다
그렇기때문에 api에서 ODM을 통해 쿼리를 실행하려면, 비동기 처리를 꼭 염두해야 한다는 것.
'프로그래밍-Web > MongoDB' 카테고리의 다른 글
[aggregate] 기본적인 aggregate 사용 방식 & 배열이 존재하는 경우 (0) | 2021.02.10 |
---|---|
[정리] Mongoose (2) 도큐먼트와 쿼리 (0) | 2021.02.09 |
[정리] Mongoose (1) 스키마와 모델 (0) | 2021.02.08 |
[이슈] Upsert 옵션 사용시 주의점 - E11000 duplicate key error (0) | 2021.02.05 |
[자료정리] push vs addToset, 그리고 배열의 update조작 (0) | 2021.01.11 |