본문 바로가기

NodeJS

npm 모듈 tgz 형식으로 다운로드 받기 npm 모듈 tgz 형식으로 다운로드 받기 특정 npm 모듈을 로컬에 받으려고 npmjs를 아무리 찾아보아도 못찾고, stackoverflow를 검색하니 명령어를 찾았습니다. 명령어 # 다운로드 url 확인 $ npm view [모듈명@버젼] dist.tarball # 직접 다운로드 $ npm pack [모듈명@버전] 예제 # 다운로드 url 확인 $ npm view react-mui-validation dist.tarball https://registry.npmjs.org/react-mui-validation/-/react-mui-validation-0.2.0.tgz # 직접 다운로드 $ npm pack react-mui-validation npm 명령어를 이용하면 url을 얻거나, 직접 다운 받을 수.. 더보기
nestjs에서 특정 시간동안 게시글 / 댓글 / 대댓글 등록 제한 처리 nestjs에서 특정 시간동안 게시글 / 댓글 / 대댓글 등록 제한 처리 24시간을 기준으로 게시글, 댓글, 대댓글에 대한 등록 제한처리 요청을 어떻게 처리해야 할지 고민을 했습니다. nestjs의 모듈 중에 Rate Limiting를 보게 되었습니다. 해당 모듈의 기능은 brunte-force 공격에서 보호하기 위한 기능이지만, 이를 수정하여 제가 원하는 동작을 하게 처리 하였습니다. 원하는 동작 필요한 라이브러리 설치 # throttler 설치 $ npm i --save @nestjs/throttler ioredis scalout으로 서버가 여러대일 경우에도 제한이 동일하게 하기 위해서 redis에 throttler정보를 적재하도록 하였습니다. throttler-storage-redis.service.. 더보기
nestjs에서 config모듈을 이용한 설정 관리 nestjs에서 config모듈을 이용한 설정 관리 nodejs에서는 dotenv 라는 모듈을 이용해서 설정 파일을 관리 하였습니다. nestjs는 config라는 모듈을 제공하고 있는데요. 간단하게 사용법을 알아봅니다. 설치 @nestjs/config 모듈은 내부적으로 dotenv 모듈을 사용하고 있습니다. $ npm i --save @nestjs/config 사용 사용법은 imports에 ConfigModule.forRoot()을 추가 하면 됩니다. // app.module.ts import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; @Module({ imports: [ConfigModule.forR.. 더보기
nestjs swagger에서 enum validate 처리 하기 문서나 인터넷을 찾아보면 ApiProperty에 enum이용하면 validate가 되는것 처럼 설명되어 있으나 동작하지 않습니다. IsEnum 이라는 Annotation을 이용하면 해결이 되네요. import { ApiProperty } from '@nestjs/swagger'; import { IsEnum, IsNotEmpty, IsNumber, IsString } from 'class-validator'; enum TCD { DQST = 'DQST', DLDR = 'DLDR', DNIF = 'DNIF', DROP = 'DROP', CQST = 'CQST', CLDR = 'CLDR', CNIF = 'CNIF', CROP = 'CROP', } export class CreateCmtPostDDto { @.. 더보기
typeorm에서 페이징 처리시 distinct 실행 문제 typeorm에서 페이징 처리시, distinct 가 실행되는 문제 처리 방법 다음과 같이 typeorm을 사용하여 페이징 처리를 하였습니다. export class CmtCommentDService { async getCommentList(searchCommentDto: SearchCommentDto) { const dataList = await this.cmtReplyDRoRepository.find({ order: { id: 'DESC' }, skip: searchCommentDto.page * searchCommentDto.limit, take: searchCommentDto.limit, }); return dataList; } } 실형 결과를 보면, 아래와 같이 2회 SQL을 질의합니다. -- .. 더보기
bcrypt를 bcryptjs로 전환 bcrypt를 bcryptjs로 전환 처리 bcrypt는 가장 유명한 단방향 해쉬 함수를 제공하는 라이브러리 입니다. bcrypt bcrypt 는 C++기반의 node 라이브러리 입니다. 사용을 위해서 OS에 python과 C++등이 OS에 설치되어야 합니다. bcryptjs bcryptJS 는 javascript로만 만들어진 라이브러리 입니다. 비교 디자인 Bcrypt vs BcryptJS Benchmark with Node.js를 확인해보면, bcrypt의 성능이 bcryptJS의 성능보다 좋습니다. 다만 인터넷이 안되는 환경에서 추가 라이브러리를 설치하기 쉽지 않습니다. 따라서, 필요에 의해 bcryptJS의 설치를 추천 합니다. 참고자료 errorMessage”: “/var/task/node_mo.. 더보기
nestjs에서 jest TIP 정리 전체 테스트 코드 예제 import { Test, TestingModule } from '@nestjs/testing'; import { INestApplication } from '@nestjs/common'; import request from 'supertest'; import { AppModule } from './../src/app.module'; import { CmmCodeMController } from '../src/modules/cmm-code-m/cmm-code-m-adm.controller'; import { ValidationPipe } from '@nestjs/common'; import { AuthAdminGuard } from './../src/commons/modules/a.. 더보기
공통 테이블을 상수로 전환 처리 공통 테이블의 값을 상수로 변환해는 방식을 고민 하다 SQL을 이용해서 처리해 보았습니다. 테이블 구조 CREATE TABLE `cmm_code_m` ( `id` int NOT NULL AUTO_INCREMENT COMMENT 'id', `reg_sytm_nm` varchar(100) NOT NULL COMMENT '등록시스템명', `mod_sytm_nm` varchar(100) NOT NULL COMMENT '수정시스템명', `cmm_grp_cd` varchar(50) DEFAULT NULL COMMENT '공통그룹코드', `cmm_cd_nm` varchar(100) DEFAULT NULL COMMENT '공통코드명', `cmm_cd_val` varchar(300) DEFAULT NULL COMMENT.. 더보기
nestjs에서 멀티 DB 설정 및 셋팅 nestjs에서 멀티 DB 설정 및 셋팅 2개 이상(ex: Main, Read)의 DB를 사용하기 위해서는 AppModule에 TypeOrmModule을 2개 설정해야 합니다. ... @Module({ imports: [ TypeOrmModule.forRootAsync({ // 이름이 없는 default 는 필수로 필요 imports: [ConfigModule], inject: [ConfigService], useFactory: (configService: ConfigService) => ({ type: 'sqlite', database: configService.get('DB_HOST'), dropSchema: configService.get('DB_DROP') === 'true', entities: .. 더보기
typescript 객체 생성 유틸 typescript 객체 생성 유틸 typescript를 사용하여 entity, dto, ro 등을 생성하다 보면, 같은 항목을 가진 객체들이 계속 생겨 납니다. 이때, 하나가 변경되면 모든 항목의 변경을 해줘야 하는데, 이를 쉽게 하는 방법으로 Utility Types를 사용합니다. Partial Type 집합의 모든 프로퍼티를 선택적으로 타입을 생성합니다. 이 유틸리티는 주어진 타입의 모든 하위 타입 집합을 나타내는 타입을 반환합니다. interface Todo { title: string; description: string; } function updateTodo(todo: Todo, fieldsToUpdate: Partial) { return { ...todo, ...fieldsToUpdate .. 더보기