프로그래밍-Web(96)
-
[이슈] lookup의 from절
예컨데 lookup의 from절을 설정한다고 해보자. 기존 서버코드에서 따로 모델객체 이름을 설정했다고 하더라도, from은 컬렉션 이름으로 기입하여야 한다. 예시코드의 경우에도 cbs라는 컬렉션에 대해 다양한 이유로 이름을 설정했다고 하더라도, 실제 물리적 DB 스키마의 컬렉션이름으로 써줘야 command가 도달한다.
2021.02.10 -
[aggregate] 기본적인 aggregate 사용 방식 & 배열이 존재하는 경우
aggregate는 복잡한 연산이 필요한 read에 대한 내용이다. find만으로는 데이터 가공에 한계가 있기 때문에, aggregate를 활용하여 복잡한 연산을 수행한다. 가장 흔하게 사용하는 방식은 다음과 같다. match command로 조건에 맞는 document를 filtering해주고, group을 사용하여 필요한 연산을 진행하는 것이다. 이 과정에서 배열이 argument로 존재한다면 까다로워진다. 예시코드의 경우도 itemList가 배열로 존재하는 경우이다. 이 경우에는 unwind 를 통해 배열을 iterate하며 원소 하나당 POJO 객체를 만들어준다 배열을 풀어놓으면 dot command로 접근이 가능하다. 해당 로직은 nested한 document 배열의 cost값들을 읽어 quan..
2021.02.10 -
[정리] Mongoose (2) 도큐먼트와 쿼리
1) Document - 몽구스는 기본단위로 Document를 가진다. 이는 모델의 인스턴스이다. - Model 역시 기본적으로 Document 클래스에 해당된다. 몽구스의 특정 메소드로 쿼리를 처리하고 난 후에도 Document 자료형이 반환된다. 2) save( ) - save의 결과는 promise를 리턴한다. - save는 middleware와 validation을 실행할 수 있지만, findOneAndUpdate나 update구문은 불가능하다. - save( )는 미들웨어다. findOneAndUpdate등의 쿼리는 미들웨어를 실행시키지 않는다. 그래서 save처럼 비동기처리가 불가능하다. 3) SubDocuments - Document 객체의 하나의 컬럼으로 다시 객체를 갖는 경우 - Nest..
2021.02.09 -
[정리] Mongoose (1) 스키마와 모델
1) Schema와 type의 정의 - 모든 스키마는 MongoDB의 콜렉션과 매핑되어 있다. 각 property의 자료형을 지정하여 Schema 객체를 생성한다. 이때 실제로 type과 schema에서 정의하는 type은 다르다. schema에 key를 type으로 설정하고 자료형을 정의한다면, 얘는 API가 스키마에 쉽게 접근하기 위한 방법이 될 뿐이지, 실제로 DB에 type으로 들어간다는 보장은 없다. - 각 type에 대한 다양한 옵션들이 존재한다. (mongoosejs.com/docs/schematypes.html 참고하자) - 그 후 API에서 직접 사용할 모델 인스턴스를 만들어 내보낸다. 실제 API들은 모델 인스턴스(예시코드의 경우 CBSModel)에 접근하여 find 등의 쿼리로직을 수..
2021.02.08 -
[이슈] useCallback의 empty array 조건
켄도 라이브러리를 사용하다가 grid의 cell을 custom으로 가공할 일이 생겼다 예시 코드처럼 이벤트를 받아 ActivityReportButton이라는 컴포넌트를 리턴한다. 그런데 문제는 한칸의 cell만 변경하더라도 모든 cell이 리턴 작업을 수행한다는 것이다. useCallback으로 이를 해결할 수 있다. 사실 함수는 바뀌지 않으므로 매번 동일하게 ActivityReportButton을 리턴하면 된다. 다만 ActivityReportButton 컴포넌트 내부 로직에 state가 있기 때문에, state가 변경되는 cell만 컴포넌트가 리렌더링 된다. useCallback의 두번째 인자로 빈 배열을 설정하면, 항상 바로 직전의 함수를 수행한다. (즉, state가 변하지 않는 이상 mount ..
2021.02.05 -
[이슈] Upsert 옵션 사용시 주의점 - E11000 duplicate key error
1. Upsert 동작 원리 및 문제 발생 상황 upsert는 filter에 정의된 Document를 확인한 후, filter에 해당하는 document가 존재하는 경우 update, 존재하지 않는 경우 insert를 수행하게 하는 옵션이다 Upsert의 수행과정을 나눠보면 조건확인 -> 쿼리실행의 순서로 진행된다. 이렇게 Step을 나누는 이유는 upsert가 모든 절차에 대해 Atomic하지 않고, 각 step마다 atomic하기 때문이다. 따라서 Upsert 옵션이 true인 여러개의 쿼리를 순차적으로 실행하는 경우, 1번 원소의 쿼리실행이 끝나지 않았음에도 2번 원소에 대한 쿼리가 실행될 수 있다. 예시 코드는 itemList에 대한 find를 수행한 후, 조건에 따라 itemList의 value..
2021.02.05