개발 공부/NestJS

공부 한 내용을 정리합니다.
개발 공부/NestJS

Multer를 사용해 ImgBB에 이미지 올리기

개요 쇼핑몰 API 토이 프로젝트를 진행하고 있는데 상품의 이미지 관련 서비스가 필요 했습니다. 이미지를 저장할 서버가 없기에 ImgBB에서 제공하는 API를 통해 이미지를 ImgBB에 업로드하고, 해당 이미지의 정보만 데이터베이스에 저장하려고 합니다. 우선 Multer를 사용하기 위해 프로젝트에 패키지를 설치합니다. $ npm i -D @types/multer 단일 파일 핸들 @UseInterceptors(FileInterceptor('image')) async uploadProduct( @UploadedFile() image: Express.Multer.File, ) { // ... } 파일 핸들을 위해 NestJS에서는 인터셉터를 사용합니다. FileInterceptor의 첫번째 매개변수에 폼 데이..

개발 공부/NestJS

JWT Guard 에러 메세지 커스텀

개요 JWT 인증 에러시 메세지가 "Unauthorized"로 통일 되서 나오는게 싫었다. 스택오버플로우 참고, AuthGuard의 handleRequest 메서드를 사용하여 에러 메세지를 변경하였다. 아래 예제에는 토큰 만료 에러만 분기 처리를 했지만 그 외의 상황도 추가할 예정이다. import { Injectable, UnauthorizedException } from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; import { TokenExpiredError } from 'jsonwebtoken'; @Injectable() export class JwtAuthGuard extends AuthGuard('jwt') { handle..

개발 공부/NestJS

인 메모리 데이터베이스, Redis (2편)

프로젝트에 Nest CLI를 사용해 레디스 모듈을 생성합니다. $ nest g mo redis 그리고 모듈에 캐시 모듈을 동적으로 주입 합니다. import { CacheModule, Module } from '@nestjs/common'; import { ConfigModule, ConfigService } from '@nestjs/config'; import * as redisStore from 'cache-manager-redis-store'; @Module({ imports: [ CacheModule.registerAsync({ imports: [ConfigModule], inject: [ConfigService], useFactory: async (configService: ConfigServi..

개발 공부/NestJS

인 메모리 데이터베이스, Redis (1편)

인 메모리 캐싱은 주로 API 요청의 부하를 줄이기 위해 메모리에 데이터를 저장해놓는 것을 의미 합니다. 먼저 프로젝트에 의존성 패키지를 추가합니다. pnpm을 프로젝트 패키지 매니저로 사용하기 때문에 pnpm cli를 사용합니다. 이 게시글에서는 cache-manager-redis-store 2.0 버전을 사용합니다. $ pnpm install cache-manager cache-manager-redis-store@^2.0 도커 컨테이너에 Redis와 Redis Commander를 설치합니다. Redis Commander는 Redis를 편리하게 관리할 수 있게 도와주는 툴입니다. redis: image: 'redis:alpine' env_file: - .env ports: - ${REDIS_PORT}:..

개발 공부/NestJS

Serialize 직렬화

회원가입 API를 통해 클라이언트에게 응답을 보내줘야 할 때, 엔티티의 패스워드 속성은 숨기고 싶을 때가 있습니다. 우선 class-validator와 class-transformer를 설치합니다. 저는 pnpm을 사용한 프로젝트이므로 pnpm으로 설치합니다. $ pnpm i --save class-validator class-transformer 응답시 숨기고 싶은 엔티티의 속성에 @Exclude 데코레이터를 삽입합니다. import { Exclude } from 'class-transformer'; @Entity() export class User extends BaseEntity { ... @Column({ nullable: false }) @Exclude() password: string; .....

개발 공부/NestJS

인터셉터 Interceptor

먼저 NestJS 요청 생명 주기에 관한 기반 지식이 필요합니다. 여기를 클릭해서 보실 수 있습니다. Interceptor 인터셉터는 메소드 실행 전후에 추가 로직을 바인딩 합니다. 인터셉터는 다음과 같은것들을 수행할 수 있습니다. 함수에서 반환된 결과 변환 함수에서 던져진 예외를 변환 기본 함수 동작 확장 특정 조건에 따라 함수를 완전히 재정의합니다 import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common'; import { Observable } from 'rxjs'; import { tap } from 'rxjs/operators'; @Injectable() export class Logging..

개발 공부/NestJS

파이프 Pipe

Pipe 파이프는 PipeTransform 인터페이스를 구현하는 @Injectable() 데코레이터로 주석이 달린 클래스입니다. 파이프에는 두 가지 일반적인 사용 사례가 있습니다. 변환: 입력 데이터를 원하는 형식으로 변환(예: 문자열에서 정수로) 유효성 검사: 입력 데이터를 평가하여 유효하면 변경하지 않고 그대로 전달하고, 그렇지 않으면 예외를 던집니다. 내장 Pipe를 이용해서 입력값 변환하기 @Get(':id') async findOne(@Param('id', ParseIntPipe) id: number) { return id; } 만약 파라미터가 숫자형으로 변환할 수 없는 경우 ('cats/abc')엔 자동으로 입력값 검증 실패 예외 처리까지 해줍니다. { "success": false, "tim..

개발 공부/NestJS

예외 필터 Exception filter

Exception Filter Nest에는 애플리케이션 전체에서 처리되지 않은 모든 예외를 처리하는 예외 계층이 내장되어 있습니다. 예외가 애플리케이션 코드에서 처리되지 않으면 이 계층에서 예외를 포착하여 적절한 사용자 친화적인 응답을 자동으로 전송합니다. 예외 계층을 완전히 제어하고 싶을 수도 있습니다. 예를 들어 로깅을 추가하거나 일부 동적 요인에 따라 다른 JSON 스키마를 사용하고 싶을 수 있습니다. 예외 필터는 바로 이러한 목적을 위해 설계되었습니다. 예외 필터를 사용하면 정확한 제어 흐름과 클라이언트에 다시 전송되는 응답의 내용을 제어할 수 있습니다. import { ExceptionFilter, Catch, ArgumentsHost, HttpException, } from '@nestjs/c..

개발 공부/NestJS

미들웨어 Middleware

미들웨어는 라우터 핸들러보다 먼저 호출되는 함수, express의 middleware와 동작이 동일하다. 미들웨어 함수는 일반적으로 다음 작업들을 수행할 수 있다. 모든 코드 실행 요청(Request) 및 응답(Response) 객체 변경 요청-응답 주기를 종료 현재 미들웨어에서 요청-응답 주기를 종료하지 않으면 next 함수를 이용해 다음 미들웨어로 제어를 전달하도록 해야한다. 기본 로거 구현 해보기 함수나 @Injectable() 데코레이터가 존재하는 클래스로 구현해야 한다. 해당 클래스는 NestMiddleware를 구현해야 한다. nest cli를 사용해 logger middleware를 생성한다. $ nest g mi logger import { Injectable, Logger, NestMid..

개발 공부/NestJS

Configuration

개요 어플리케이션은 종종 다른 환경에서 실행된다. 그리고 환경에 따라 다른 구성을 사용해야 하는 경우가 있다. Node.js 애플리케이션에서는 각 키가 특정 값을 나타내는 키-값 쌍을 포함하는 파일(.env)을 사용하여 각 환경을 나타내는 것이 일반적이다. Nest에서 이 기술을 사용하는 좋은 방법은 적절한 파일을 로드하는 ConfigModule을 사용하는 것이다. 편의를 위해 Nest에서는 내부적으로 dotenv를 사용하는 기본 패키지를 제공한다. 설치 $ npm i --save @nestjs/config 시작하기 설치가 완료되면 ConfigModule을 가져올 수 있게 된다. 일반적으로 어플리케이션의 최상위 레벨 모듈인 AppModule에 임포트하고 forRoot() 메소드를 통해 환경 변수를 읽어올..

게으른 제이
'개발 공부/NestJS' 카테고리의 글 목록