import { createParamDecorator, ExecutionContext } from "@nestjs/common";
export const UserInfo = createParamDecorator(
(data: unknown, ctx: ExecutionContext) => {
const request = ctx.switchToHttp().getRequest();
if (request.user) {
return request.user;
}
return null;
}
);
data 데코레이터의 인자로 전달되는 데이터ctx 현재 요청의 ExecutionContext(실행 컨텍스트)canActivate 메서드를 구현하는 클래스로 구성됨
canActivate : 라우트 접근을 허용할지 또는 거부할지 결정
여러 부분에 걸쳐서 반복되는 공통 관심사를 분리하고 중앙에서 관리
코드의 모듈성 향상, 중복을 줄일 수 있음
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators';
import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common';
@Injectable()
export class LoggingInterceptor implements NestInterceptor {
intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
const now = Date.now();
return next
.handle()
.pipe(tap(() => console.log(`완료에 걸린 시간: ${Date.now() - now}ms`)));
}
}
import { CallHandler, ExecutionContext, Injectable, NestInterceptor } from '@nestjs/common';
intercept
next.handle()을 호출pipe() 함수로 요청 처리 파이프라인의 다음 단계로 이동 -> tap()이라는 연산자에서 응답 처리 시간을 로그로 찍겠다...동일한 요청이 지속적으로 들어오는 경우에 대해... 캐싱 기능으로 서버 성능을 올림
cache-manager 설치 후 사용
DTO를 사용하는 것의 핵심은 DTO 객체 안에서 클라이언트의 전달 값에 대한 유효성 검사가 자동으로 되어야 하는 것이 핵심........
DTO가 이러한 역할을 할 수 있도록 돕는 것이 바로 ValidationPipe