오늘은 NestJS에서 E2E(End-to-End) 테스트를 구성하며 있었던 이야기를 소개해보려고 합니다. Jest로 테스트를 구성하였고, 크게 3가지의 목표를 달성하고 싶었습니다. 1. Mocking을 최소화하여, 최대한 실제 시나리오와 유사하게 동작하도록 하는 것. 2. DB 특성을 가져갈 수 있도록, 테스트에서도 mysql DB를 사용할 것. 3. 자동화된 자체 QA를 수행할 수 있도록, Github Action과 연동되어 CI(지속적통합)를 지원할 수 있어야 할 것. 0. 개발환경 nest : 10.3.0 typescript: 5.3.3 typeorm : 0.3.19 jest : 29.7.0 docker-compose : 1.29.2 1. 문제의 발생 처음에는 테스트용 DB(이하 Test_DB)를..
개발
0. 개발환경 nest : 10.2.1 class-validator: 0.14.0 * 참고 : class-validator - npm (npmjs.com) 1. 문제의 발생 // user.entity.ts @Entity('user') export class User extends CoreEntity { ... @ApiProperty({ example: '홍길동' }) @Column({ type: 'varchar', nullable: true }) @Length(2, 10) @IsString() public username?: string; ... } class-validator 라이브러리를 사용해서 'username' 필드의 Length를 제한하고, 예외의 경우를 넣어서 출력되는 메시지를 확인해보았습니다..
서론 오늘은 NestJS에서 파일을 업로드 받고, AWS S3에까지 저장하는 REST API를 공유해보려합니다. aws-sdk v2로 된 한국어 자료들은 많이 있는데, version3을 사용해서 만들어봤습니다. 일단 필자도 처음에는 aws-sdk v2를 사용해서, 파일 업로드 기능을 만들었습니다. 그런데, 서버를 run 할 때 version3으로 migrate해달라는 굉장히 거슬리는 문구가 뜨는 걸 볼 수 있었습니다. (node:2109) NOTE: We are formalizing our plans to enter AWS SDK for JavaScript (v2) into maintenance mode in 2023. Please migrate your code to use AWS SDK for Jav..
서론 프로세스간 데이터 전달을 위해서 DTO(Data Transfer Object) 사용한다. NestJS에서도 MVC layer간의 데이터 전달이나 request 요청을 받을 때도 DTO를 사용할 수 있다. 이때 한 Domain에 대해서, 여러 layer별로 dto는 조금씩 사용되는데, 모든 dto를 각각의 객체로 관리하는 건 어려운 일이다. 한 예시로 Register DTO와 Login DTO를 생각해보자. // register.dto.ts export class RegisterDto { email!: string; password!: string; username!: string; } // login.dto.ts export class LoginDto { email!: string; password..
왜 winston을 고르게 되었는가? NestJS에서 logging을 구현하는 방법에는 여러가지가 있다. 기본적으로 @nestjs/common에 내장된 logger가 있긴하지만, package에는 편리한 기능들이 구현되어 있다. pino, morgan 등 JS 진영에서 쓸 수 있는 여러 package들이 있는데, 본인은 templete을 만들기 위해 가장 대중적인 패키지를 찾고 싶었고, 'popular node js logging'로 구글링을 해본 결과 아래와 같은 자료를 찾을 수 있었다. 2023년 10월 기준으로 Winston이 많은 download를 기록하고 있었고, typescript를 지원하였기에 많은 레퍼런스를 기대하며 고르게 되었다. 구현 방식 Logger 불러오기 Logger를 불러오는 방..
문제 상황 AWS RDS를 사용하다가 프리티어 기간이 만료되어서 새로운 계정으로 DB를 옮겨야할 일이 생겼다. 문제는 현재 개발 환경상 사지방 PC 자체에서 각종 포트들이 막혀있어서, mysql workbench와 같은 상용프로그램을 사용할 수 없는 상태이다. 그래서 외부 리눅스 서버에 웹콘솔로 접속을해서 해당 DB의 Mysql Dump를 뜨고, 옮겨서 load를 해야하는 상황이다. 해결 방법 1. AWS EC2를 생성 및 mysql-client 설치 sudo apt update sudo apt install mysql-client 2. mysqldump 명령어로 덤프 파일 만들기 mysqldump -u -p -h > 위와 같은 형태로 덤프 파일을 추출할 수 있다. 아래는 예시이다. mysqldump -..
0. 개발환경 @nestjs/typeorm : 10.0.0 nest : 10.1.18 mysql 8.0.xx typescript : 5.1.x 1. 문제의 발생 @Entity('user') export class UserEntity extends CoreEntity { ... @Column({ type: 'enum', enum: Role, array: true, default: [Role.User], }) @IsString() public roles!: Role[]; ... } user.entity를 설계하는 과정에서 Role을 Enum array로 관리하고자 하였고, 코드상으로는 syntax적 문제가 없었다. 그런데 막상 npm run start:dev를 실행하여 mysql 서버상에 table 생성을 ..
최근에 새로운 사이드 프로젝트를 시작했습니다. 조금은 새로운 분야를 개발해보려고 하는데 CLI 프로그래밍입니다. CLI는 Command Line Interface로 '글자를 입력하여 컴퓨터에 명령을 내리는 방식'을 의미합니다. 데스크탑용 프로그램을 개발하려하는데, GUI를 만들기전에 API를 직접 CLI로 만들어서 사용성을 높이는 프로젝트를 해보려합니다.(물론 효용성이 더 떨어질 수도 있겠지만요.) I Programing 테스트해본 개발 환경은 ubuntu22.04, 20.04 클라우드 환경에서 테스트해보았습니다. 언어는 여러 선택지가 있었는데, 일단은 이식성이 좋은 cpp로 개발해보고, 너무 불편하다 싶으면 JS 라이브러리가 괜찮은게 있길래 써볼까도 고려중입니다. -> commander - npm (n..
군대에 와서 싸지방에서 개발을 할 방법을 강구하다가 Github codespaces라는 아주 착한 서비스를 찾아냈다. github에서 서버를 빌려주고 거기서 코드를 돌릴 수 있게 해주는 PaaS였다. (지난번에 aws 행사에 참여하였을 때 AWS에서도 비슷한 기능을 가진 서비스를 내놨었는데 어느게 시장을 선점할 지 궁금하다.) 해당 서비스와 개발 환경 세팅에 대해서는 나중에 따로 글을 적어보겠다. codespaces에서 개발을 하려고 node package를 yarn으로 설치하려고 하는데 node version 에러 메시지가 나왔다. The engine "node" is incompatible with this module. Expected version "20.1.0". Got "18.17.0" 음 노..
지금 하고 있는 프로젝트를 express에서 Nest.js로 리팩토링하면서 있었던 일을 정리해보겠습니다. 공식문서를 기반으로 DTO를 재설계하면서 공부한 내용을 정리해봤습니다. (Nest.js는 9.2.0버전입니다) Mapped types란? CRUD와 같은 기능을 만들 때 기본 Entity Type에 변형해서 생성하는 것이 유용한 경우가 많습니다. Nest는 이 작업을 보다 편리하게 하기 위해 타입 변환을 수행하는 여러 유틸리티 기능(이하 4개의 함수)을 제공합니다. - PartialType, PickType, OmitType, IntersectionType PartialType input validation types(이하 DTOs라 칭함)을 만들 때, 우리는 종종 create와 update vari..