개요 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..
필사하듯이 세세한 내용을 기록하지 마라 너무 세세하게 자세한 정보를 기록하려고 하지말고 주제의 핵심이 되는 키워드들 위주로 기록해야 한다고 한다. 핵심이 되는 키워드를 떠올리고 해당 키워드에 대해 떠올리고 생각해나가며 기록 하기 읽거나 보면서 기록하지 마라 그러나 메모 하라 뇌가소성은 뇌의 기능이나 구조가 환경이나 경험, 다르게 말해 훈련에 의해 변화하는 특성이다. 우리는 훈련을 통해 뇌를 바꿀 수 있다는 점을 먼저 알아두자. 무언가를 읽거나 보면서 중요한 내용이라고 생각이 들 때 습관적으로 동영상을 뒤로 돌려 다시 본 경험이 있다. 현대인이라면 대부분 비슷한 경험이 있을 것이다. 그렇지만 이런 방법은 학습한 정보를 기억하는데에 크게 도움이 되지 않는다고 한다. 영상이나 책 또는 이야기의 핵심 키워드를 ..
버퍼 컴퓨터 공학에서 버퍼란 스트림 데이터를 조금씩 저장하고, 처리하고, 비우기를 반복하는 메모리 공간이다. 이런 행위를 버퍼링이라고 하며, 메모리 공간 자체 혹은 메모리에 저장된 데이터를 버퍼라고 부른다. 노드의 버퍼 노드에서 버퍼는 바이너리 데이터를 다루는 데 사용되는 전역 객체다. 문자열은 유니코드 문자의 배열로 표현되지만, 바이너리 데이터는 0과 1의 이진수로 표현된다. Buffer는 바이너리 데이터를 나타내는 데 사용되는 배열과 같은 구조체로, 바이너리 데이터를 다루는 데 필요한 기능을 제공한다. 버퍼 사용해보기 Buffer에 string을 저장하게 하는 경우, 문자열 인코딩 방식을 명시해야 한다. 명시하지 않으면 기본적으로 UTF-8 방식으로 인코딩된다. const stringBuffer = ..
인 메모리 캐싱은 주로 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 요청 생명 주기에 관한 기반 지식이 필요합니다. 여기를 클릭해서 보실 수 있습니다. Interceptor 인터셉터는 메소드 실행 전후에 추가 로직을 바인딩 합니다. 인터셉터는 다음과 같은것들을 수행할 수 있습니다. 함수에서 반환된 결과 변환 함수에서 던져진 예외를 변환 기본 함수 동작 확장 특정 조건에 따라 함수를 완전히 재정의합니다 import { Injectable, NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common'; import { Observable } from 'rxjs'; import { tap } from 'rxjs/operators'; @Injectable() export class Logging..
Pipe 파이프는 PipeTransform 인터페이스를 구현하는 @Injectable() 데코레이터로 주석이 달린 클래스입니다. 파이프에는 두 가지 일반적인 사용 사례가 있습니다. 변환: 입력 데이터를 원하는 형식으로 변환(예: 문자열에서 정수로) 유효성 검사: 입력 데이터를 평가하여 유효하면 변경하지 않고 그대로 전달하고, 그렇지 않으면 예외를 던집니다. 내장 Pipe를 이용해서 입력값 변환하기 @Get(':id') async findOne(@Param('id', ParseIntPipe) id: number) { return id; } 만약 파라미터가 숫자형으로 변환할 수 없는 경우 ('cats/abc')엔 자동으로 입력값 검증 실패 예외 처리까지 해줍니다. { "success": false, "tim..
Exception Filter Nest에는 애플리케이션 전체에서 처리되지 않은 모든 예외를 처리하는 예외 계층이 내장되어 있습니다. 예외가 애플리케이션 코드에서 처리되지 않으면 이 계층에서 예외를 포착하여 적절한 사용자 친화적인 응답을 자동으로 전송합니다. 예외 계층을 완전히 제어하고 싶을 수도 있습니다. 예를 들어 로깅을 추가하거나 일부 동적 요인에 따라 다른 JSON 스키마를 사용하고 싶을 수 있습니다. 예외 필터는 바로 이러한 목적을 위해 설계되었습니다. 예외 필터를 사용하면 정확한 제어 흐름과 클라이언트에 다시 전송되는 응답의 내용을 제어할 수 있습니다. import { ExceptionFilter, Catch, ArgumentsHost, HttpException, } from '@nestjs/c..
미들웨어는 라우터 핸들러보다 먼저 호출되는 함수, express의 middleware와 동작이 동일하다. 미들웨어 함수는 일반적으로 다음 작업들을 수행할 수 있다. 모든 코드 실행 요청(Request) 및 응답(Response) 객체 변경 요청-응답 주기를 종료 현재 미들웨어에서 요청-응답 주기를 종료하지 않으면 next 함수를 이용해 다음 미들웨어로 제어를 전달하도록 해야한다. 기본 로거 구현 해보기 함수나 @Injectable() 데코레이터가 존재하는 클래스로 구현해야 한다. 해당 클래스는 NestMiddleware를 구현해야 한다. nest cli를 사용해 logger middleware를 생성한다. $ nest g mi logger import { Injectable, Logger, NestMid..