일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 문자열
- dp
- Nestjs
- HTTP
- Algorithm
- 백준
- 레벨 1
- 가천대
- 크롤링
- type challenge
- javascript
- 타입 챌린지
- 타입스크립트
- 알고리즘
- TCP
- Crawling
- 자바스크립트
- socket
- 소켓
- dfs
- typescript
- 그래프
- 프로그래머스
- BFS
- 쉬운 문제
- 프로그래머스 레벨 2
- ip
- HTTP 완벽 가이드
- Node.js
- 수학
- Today
- Total
목록프로그래밍/NestJS (38)
kakasoo
어떤 기능을 구현하다보면 외부 요소에 대한 의존성을 강하게 가지게 되는 경우가 있다. 가장 간단한 예시로, 우리는 어떤 데이터베이스를 사용하느냐에 따라 내부 로직이 변경될 것이다. Postgres나 MySQL을 쓰는 경우에, 그 둘의 내부 함수 명이 다르기 때문에 영향을 받게 될 것이고, 만약 ORM을 사용한다고 하더라도 MongoDB와 같은 NoSQL을 사용하면 또 영향을 받게 된다. 데이터베이스 말고도 유저가 보내는 요청들이 무엇인지에 따라서도 서비스는 영향을 받게 될 것이다. 요청은 우리가 제어하는 것 아니냐 반문할 수 있겠지만, 모바일인지 웹인지에 따라서 처리 방식이 다르다. 우리의 핵심 비즈니스 로직들을 내부 라고 정의할 때, 이런 영향을 주는 요소들을 전부 외부 라고 불러보자. Clean Ar..
내가 적용한 시점에는 일일 다운로드 3만 건이었고, 현재는 5만건인 라이브러리다. 서비스에서도 사용하고 있는데 사용성이 무척 좋아서 공유한다. Installation # with npm npm install @liaoliaots/nestjs-redis ioredis # with yarn yarn add @liaoliaots/nestjs-redis ioredis # with pnpm pnpm add @liaoliaots/nestjs-redis ioredis npm: @liaoliaots/nestjs-redis 라이브러리는 @liaoliaots/nestjs-redis 와 **ioredis 이렇게 두 개를 설치해야 하고, 노드 버전은 12.22 이상, NestJS는 9.0.0 이상, ioredis는 5.0.0..
왜 안 되는데요? Nestia는 NestJS로 작성된 백엔드 코드를 읽고 TypeScript compiler를 이용해서 프론트에서 사용 가능한 SDK를 만든다. 그래서 지금 사용하면 곤란한 TypeScript keyword들이 있는데, 하나는 typeof고 하나는 namespace이다. typeof의 경우 타입의 이름을 추론해낼 수 없게 되는 문제가 있다. namespace는 한 함수가 동일 네임스페이스로부터 두 개 이상의 내부 인터페이스, 타입을 가져올 때 문제가 될 수 있다. 이유는 import 시 두 타입이 하나의 인터페이스로부터 추론된다는 것을 컴파일러가 인지하기 어렵기 때문에 하나만 갖고 오게 되서다. https://kscodebase.tistory.com/663 모든 타입이 추론되는 API 만..
이 글은 다음의 내용을 다룬다. 프론트 개발자들이 눈치채면 곤란한 백엔드 이야기 백엔드 개발자가 프로그래밍 언어가 Node.js 라서 얻을 수 있는 이점 Nestia 라이브러리를 이용한 Swagger 문서 및 SDK 생성 에러를 던지지 않고 값으로 다루는 방식 서버와 프론트가 분리되서 발생하는 문제들 첫째, 서버와 프론트의 중복 개발? 프론트 : 이거 API 호출하면 어떤 결과가 와요? 프론트 개발자가 질문을 한다. 이 질문에 대해서는 응답과, 각 요청 파라미터에 따른 에러 케이스들, 에러일 때 던지는 값들을 말해줘야 한다. 그러면 그 설명을 듣고 프론트 개발자는 그 응답에 맞는 타입 ( JS 라면 값 ) 을 정의해둘 것이다. 이는 Node.js 백엔드 개발자 입장에서는, 백엔드에서 이미 개발한 것들을 ..
잘 만들어진 테스트 코드는 일종의 spec, 즉 명세서의 역할을 수행할 수 있어야 한다. 또한 잘 만들어진 테스트는, 코드 설계에 앞서 개발자 간의 커뮤니케이션을 위한 도구로 사용될 수 있어야 한다. 여기서 말하는 개발자는 백엔드 개발자만이 아니라, API를 다루는 모든 관계자를 말한다. 디자인을 이야기하기 위해서는 기획서가 필요하듯이, 개발자들도 개발을 위한 기반 지식들이 필요하다. 이 지식은 단순히 개발을 위한 도메인 지식이 아니라, 서로 간의 이해가 일치하는지 확인하는 일을 포함한다. 테스트 코드는 여기서 이 일치 확인, 전체 프로그램 작성에 일관성을 확보하는 작업을 위한 것이라 볼 수 있겠다. 테스트 코드 (spec) 작성 /** * 게시글에 대한 좋아요/좋아요 취소 */ describe('PAT..
이번에 테스팅할 API는? import { TypedBody, TypedRoute } from '@nestia/core'; import { Controller } from '@nestjs/common'; import { JwtService } from '@nestjs/jwt'; import { createResponseForm, ResponseForm } from '../interceptors/transform.interceptor'; import { CreateUserDto } from '../models/dtos/create-user.dto'; import { DecodedUserToken } from '../models/tables/user.entity'; import { UsersService }..
Nestia에서는 TypeError가 나와도, 상세한 메시지는 알려주지 않았었다. 그저 간단하게 Request body is not promised type, 또는 Reponse body is not promised type, 정도의 에러만이 나왔다. 이것만 가지고는, Nestia에 익숙하지 않은 사람은 어느 부분으로 인해서 에러가 나오는 건지 알기가 어려웠다. 바로 후술하겠지만, 이건 tsconfig.json에서, nestia에 대한 설정을 바꿔주면 해결되는 문제였다. 일단 Nestia는, 아래 링크에서 주석을 확인하면, 보다시피 stringify, assert, is, validate 4가지 메서드를 설정으로 사용한다. GitHub - samchon/nestia: Superfast validation..
엔티티에 타입 정의하기 export class UserEntity extends CommonCloumns { /** * 이름 칼럼으로 사용자의 이름을 의미 * @minLength 1 * @maxLength 50 */ @Column({ length: 50, select: false }) public name!: string; /** * 사용자의 별칭, 설정하지 않는 경우도 있다. * @minLength 1 * @maxLength 50 */ @Column({ length: 50 }) public nickname!: string; } 각 프로퍼티에는 이처럼, 주석을 통해서 태그를 달 수 있다. 태그가 아닌 주석은 해당 프로퍼티에 대한 description이 되어, 추후 swagger, sdk 생성에 활용된다...
import { Injectable, NestInterceptor, ExecutionContext, CallHandler, RequestTimeoutException } from '@nestjs/common'; import { Observable, throwError, TimeoutError } from 'rxjs'; import { catchError, timeout } from 'rxjs/operators'; @Injectable() export class TimeoutInterceptor implements NestInterceptor { intercept(context: ExecutionContext, next: CallHandler): Observable { return next.handle()..
이 글을 찾아본 것은 이미 Nestia를 알고 온 사람들일 거라 생각되기 때문에 간단한 설명만 적자면, Nestia란? Node.js, TypeScript 서버의 장점인 클라이언트와 동일한 언어 사용을 극대화하는 라이브러리라고 할 수 있다. 동일한 언어를 사용한다는 것은 서버 개발자가 미리 정의한 타입의 중복 개발을 막을 수 있다는 의미가 된다. 이로 인해 프론트 개발자는 이미 개발된 타입과 SDK를 사용해 좀 더 UI/UX 측면에 집중할 수 있게 된다. 프로젝트 생성 $ npm i -g @nestjs/cli $ nest new project-name 프로젝트 생성은 동일하게 진행해주면 된다. Nestia를 만드신 Samchon님의 레포지토리 예제 대부분은 본인 색채가 강하지만, 아래는 참고할 만 했다...
import { SchemaObject } from '@nestjs/swagger/dist/interfaces/open-api-spec.interface'; export const ERROR = { ALREADY_CREATED_EMAIL: { code: 4001, message: '이미 생성된 이메일입니다.' }, NO_AUTH_TOKEN: { code: 4002, message: '인증이 필요합니다.' }, IS_SAME_POSITION: { code: 4003, message: '이미지의 정렬 값이 동일한 경우가 존재합니다.' }, CANNOT_FINDONE_ARTICLE: { code: 4004, message: '게시글을 찾지 못했습니다.' }, SELECT_MORE_THAN_ONE_BODY_IM..
설치해야 하는 패키지 종류 $ npm i aws-sdk/client-s3 # 3.259.0 $ npm i multer # ^1.4.3" $ npm i multer-s3 # ^3.0.1 $ npm i @types/multer-s3 --save-dev # ^.3.0.0 일단 필요한 package들을 install한다. s3 package들의 경우 업데이트를 하면서 기존의 버전이 호환되지 않는 경우가 줄곧 발생한다. 혹시 몰라 버전도 주석으로 달아놓았으니 호환이 되지 않으면 버전을 맞추던가, 아니면 명시된 버전으로 진행하면 된다. NestJS에서 클라이언트로부터 이미지 받기 @Post() async upload(@UploadedFiles() files: Express.MulterS3.File[]) { if (..