프로그래밍-Web(96)
-
[정리] graphQL code generator
graphql-code-generator.com/ GraphQL Code Generator | GraphQL Code Generator And more! You can generate your resolvers' signatures, dump schemas, model types, query builders, React Hooks, Angular Services, and much more! graphql-code-generator.com Typescript와 graphQL을 함께 이용하면, type이라는 용어탓에 헷갈리는 경우가 생긴다. 리졸버, MongoDB 모델, graphQL의 타입정의들이 자주 중복되기 때문이다. 이러한 문제때문에 graphQL을 빌드한 산출물에 대한 모든 type이 적절하게 ge..
2021.03.08 -
[aggregate] redact 사용
aggregate에서 자주 사용되지만 꽤 복잡한 쿼리 중 하나라 정리해본다. 사실상 filter와 유사한 operator라고 생각하면 된다. aggregate는 각각의 stage가 존재하는데, filter가 project stage에서 사용되는 커맨드라면 redact는 또 하나의 stage이다. stackoverflow를 찾아보면 filter가 근소하게 성능이 좋다고는 한다 실제로 최신 Mongodb버전에 등장한 filter를 사용하는것이 선호되는것으로 보인다. 나 역시 실제 적용하는 상황에서는 filter를 사용할듯 하다. 무튼 redact는 복잡하게 nested한 document에 대해서 개발자가 원하는 조건에 맞는 결과만 리턴하게 만든다. 해당 설명은 공식문서의 예시를 사용해보겠다. 다음과 같은 n..
2021.03.08 -
[이슈] useEffect에 dependency props이 있을때 cleanup 함수
기본적으로 useEffect의 clean-up함수는 컴포넌트가 unmount 될 때 실행된다. 따라서 컴포넌트가 unmount 될때의 이벤트를 clean up 함수에 걸어주는것이 일반적이다. 그러나 props가 비어있지 않다면 clean up 함수는 우리 기대와 다르게 동작한다. 다음과 같은 예시에서 해당 컴포넌트는 ratingId가 바뀔때 '마운트'라는 콘솔이 찍힐것이다. 그러나 ratingId가 바뀔때마다 cleanup 함수인 '언마운트' 콘솔도 함께 찍힌다 그 이유는 실제 화면에서 테스트해보면 알 수 있다. props가 바뀔때마다 hook이 새로 만들어지기때문에, 항상 이전 useEffect를 unmount하고 다시 새로운 useEffect를 mount하는 것이다. 실제로 ratingId라는 pro..
2021.03.05 -
[정리] Mongoose 쿼리별 트랜잭션 적용방법
session을 공유하는 방법이 쿼리마다 조금씩 달라서 잠깐 정리 일단 하나의 세션을 여러개의 api에서 공유하기 위해서는 함수화가 필요하다. 예시의 경우에는 이전 포스팅에서 짜둔 useTransaction함수를 사용한다. 트랜젝션은 항상 세션을 시작시킨후, 그 세션에 해당하는 트랜젝션을 시작해주어야 한다. 또한 예시처럼 부모 리졸버와 자식 리졸버가 동일한 트랜잭션을 공유하길 원한다면 컨텍스트를 이용하여 세션을 넘겨준다. 따라서 다음과 같은 절차를 거쳐야한다 1) startSession을 통해 새로운 session객체 생성 2) ctx.session을 통해 1에서 생성한 세션을 정의 3) session객체에서 startTransaction으로 트랜잭션 실행 4) api 로직 수행 5) 트랜잭션 commi..
2021.03.05 -
[aggregate] 원하는 element만 가져오기
가장 많이 쓰이는 형태의 aggregate 구문이다. 배열의 element중 조건에 맞는 document를 찾아서, 해당하는 element만 가져오는 것이다. 이는 document단위로 가져오는 mongoose 쿼리로는 해결하지 못하고, aggregate를 이용하는것이 편하다. 이때 주의할부분은 element 조건에 대해선 elemMatch operator를 사용한다는 점.
2021.03.04 -
[aggregate] 서로 다른 collection의 child element 조건으로 lookup하기
콜렉션 A(CBS) { _id: ObjectId('아이디') itemList: [ { _id: ObjectId('아이디'), itemId:ObjectId('아이디'), quantity: 0} ....] }.... 콜렉션 B(Zone) { _id: ObjectId('아이디') itemList: [ { _id: ObjectId('아이디'), itemId:ObjectId('아이디'), quantity: number }.... ] }.... 약간 까다로운 lookup상황을 맞이했다. 위와 같은 두개의 콜렉션이 존재할때, A 컬렉션의 모든 itemList의 itemId를 조회하고 그것과 일치하는 itemId를 가진 콜렉션B의 itemList들을 조회한다. 콜렉션 A의 itemId는 unique하지만, 콜렉션B의 ..
2021.03.03