몽고디비에서 필드의 존재여부에 따라 상황별 쿼리문 어떻게 만들지? 오랜만에 mongoose와 mongodb 옵션을 활용해보니 다시 어색하고 가물가물했다. nosql의 단점은 sql에 비해 쿼리문이 복잡하다. 그만큼 다큐먼트에 있는 옵션들을 활용할 수록 원하는 데이터를 뽑아내기도하고 관리할 수 있다. 아래코드와 같이, typeorm은 분기를 하여 상황별로 쿼리문을 추가할 수 있다. const query = somehow .createQueryBuilder('users') .where(`user.deletedAt IS NOT NULL`) if (params.hasImage) { query.andWhere(`user.image IS NOT NULL`) } if (params.q != '') { query.an..
RDBMS 와 다르게 몽고디비는 JOIN을 할 수 없을까? populate 가 뭐지? 몽고디비에서의 JOIN과 같은건가? 몽고디비(Document based NoSQL) 에서는 SQL의 JOIN 와 똑같은 기능이 없어도 다른 콜렉션의 다큐먼트 데이터를 불러서 사용해야되는 상황이 필요하기에 유사한 기능은 존재한다. NodeJS 환경에서는 Mongoose를 사용하게되는데 Mongoose는 populate() 라는 함수가 그렇다. Mongoose 다큐먼트를 읽어보고 이해하는 것을 추천한다. Mongoose v6.7.2: Query Population MongoDB has the join-like $lookup aggregation operator in versions >= 3.2. Mongoose has a ..
deletedAt 값을 삭제날짜로 하여 soft-delete 방식으로 데이터를 삭제하려는데 다음과 같은 에러를 발생했다. ERROR [ExceptionsHandler] Cast to date failed for value "[Function: now]" (type function) at path "deletedAt" CastError: Cast to date failed for value "[Function: now]" (type function) at path "deletedAt" at model.Query.exec (/Users/ek/Documents/github/loveAlakazam/4_MarketService/node_modules/mongoose/lib/query.js:4891:21) at m..
- Jest에서 아래와 같이 테스트를 하면, 테스트항목을 나타내준다. 위의 사진은 샘플 프로젝트에서 npm run test 수행 결과이다. 테스트케이스가 너무 많아서 시간이 오래걸리면 안뜬다. 그냥 .spec.ts 테스트 파일 한개만 테스트하면 위의사진과 같이 표기가된다. users.controller.spec.ts 파일만 테스트 $ npm run test users.controller 그런데 본격적으로 사용해야되는 프로젝트에서는 테스트항목이 나타나있지 않다... 왜일까? 그리고 Warning 문구가 있다. 저 문구가 너무 거슬린다! A worker process has failed to exit gracefully and has been force exited. This is likely caused ..
[문제사항] Node.js 버젼이 구버젼(v.14.9.0) 으로 고정되는 현상이 생겼다. 구버젼 노드를 사용하게되면 gitmoji 도 지원하지 않는다. 그런데 현제 노드는 18버젼을 지원한다. 계속 수동으로 현재 lts 버젼으로 Command 명령어를 입력해야되는 귀찮음이 생겼다... $ nvm install --lts 매번 프로젝트마다 zsh을 열때마다 node의 버젼을 수정해야된다... 너무 귀찮아서 결국은 찾게됐다! (1) 내가 갖고 있는 node 버젼을 확인해보자 $ nvm ls (2) 16버젼을 사용하자 $ nvm use 16 nvm 16 이상으로 설정하면 gitmjoi 는 정상동작한다. (3) 구버젼 노드는 uninstall 한다 $ nvm uninstall 14 (4) 이대로 만족하기에는 의..
NestJS Joi 설치 $ npm install --save joi // app.module.ts import Joi from 'joi'; @Module({ imports: [ ConfigModule.forRoot({ envFilePath: '.env', isGlobal: true, validationSchema: Joi.object({ NODE_PORT: Joi.string().required(), SESSION_ID: Joi.string().required(), COOKIE_SECRET: Joi.string().required(), }), }), MongooseModule.forRootAsync({ useFactory: () => ({ uri: process.env.MONGODB_URI, }), }..
패키지 설치 $ npm i @nestjs/config $ npm i @nestjs/mongoose mongoose $ npm i dotenv @types/dotenv - 필자는 몽고디비 altas를 사용한다. 그러므로 .env에서 mongodb uri를 불러와야하는데 이때 꼭 필요한 모듈이 @nestjs/config 이다. process.env.MONGODB_URI 보다는 configService.get('MONGODB_URI') 를 쓰는게 좋다 configs 디렉토리에 module 과 service 생성 - mongodb-config.service.ts // path: /src/config/mongodb-config.service.ts import { Injectable } from '@nestjs/c..
[목적] 지난 프로젝트에서는, 서비스 생성자에 엔티티모델을 주입하여 Service 단에서 데이터베이스를 호출하여 비즈니스로직을 만들었다. 클라이언트 >> 라우터 + 컨트롤러 >> 서비스 >> 데이터베이스 위와 같이 서비스 로직내부에서 데이터베이스를 호출시켜 트랜잭션을 처리하는 것은 여러모로 문제가 있다. 서비스 로직에서 데이터베이스를 호출하여 트랜잭션 처리를 할 수있다만... 비즈니스 로직에 집중하기 어렵다. 비즈니스 로직 자체를 테스트도 어렵고 중복된 코드가 발생한 가능성이 높다. 즉, 비즈니스로직이 길어지기도하고, 가독성이 떨어진다. 아주 바보같은 코드군.... if문안에 if를 넣었어.... 리팩토링마렵다..... // 지난주 프로젝트 : /src/posts/posts.service.ts impor..
- Total
- Today
- Yesterday
- MongoDB
- IT용어
- 스마트폰중독
- TDD
- typeORM
- 개발용어
- git
- MySQL
- 습관개선
- nestjs
- jest
- Nest.js
- nestjs jest
- 바이트디그리
- 한달독서
- 한달어스
- 디지털디톡스
- 클린아키텍쳐
- 미완
- gem
- RDBMS
- Jekyll
- TypeScript
- 갓생살자
- 나도 할 수 있다
- vscode
- Mongoose
- OS
- 참고
- node.js
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |