20240310

귤금·2024년 3월 10일

Node.js 4기 TIL

목록 보기
52/86

Today?

게시판 만들기 실습

커스텀 데코레이터 적용 예시

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;
  }
);
  • createParamDecorator : 새로운 커스텀 데코레이터를 생성하는 함수
    • 인자 1 : data 데코레이터의 인자로 전달되는 데이터
    • 인자 2 : ctx 현재 요청의 ExecutionContext(실행 컨텍스트)
  • const request = ctx.switchToHttp().getRequest();
    • ctx 변수를 이용해서 현재 HTTP 요청 객체(req)에 접근. req.user에 접근하게 해줌...

Nest.js에서의 인가 : 가드

  • 특정 라우트에 대한 접근을 제어하는 역할
  • 예 : 인증된 사용자만 접근하게 함 / 관리자만 특정 기능을 사용하게 함

작동 방식

canActivate 메서드를 구현하는 클래스로 구성됨
canActivate : 라우트 접근을 허용할지 또는 거부할지 결정

AOP(Aspect-Oriented Programming)

여러 부분에 걸쳐서 반복되는 공통 관심사를 분리하고 중앙에서 관리
코드의 모듈성 향상, 중복을 줄일 수 있음

  • JavaScript에서는 프록시 객체나 헬퍼 객체로 이러한 개념을 구현한다.
  • 예를 들어 에러 처리는 모든 어플리케이션에서 다 쓰는 기능이다. 그러므로 전부 코드 블록마다 작성하지 않고, AOP 방식을 도입하여 한 부분을 수정하면 모든 부분이 수정될 수 있도록 한다.

인터셉터

  • 가로채다! : 특정 작업 수행 전이나 후에 추가 로직 실행하는 코드 블록
  • 주로 HTTP 요청이나 응답을 처리, 로깅, 에러, 데이터 변환 및 인증과 같은 공통 관심사 처리.
  • AOP 개념 구현의 핵심 요소
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';

  • NestInterceptor 인터페이스를 구현하는 것이 필수
  • Nest.js에서 뭔가 만들 땐 여기서 제공하는 인터페이스를 구현하든가, 아니면 명령어를 통해 요소를 만드는 절차가 꼭꼭 필요함

intercept

  • 요청을 가로채고... next.handle()을 호출
    • 요청을 처리하고 응답을 반환하는 컨트롤러 메소드로 이동하는 걸 의미함
  • pipe() 함수로 요청 처리 파이프라인의 다음 단계로 이동 -> tap()이라는 연산자에서 응답 처리 시간을 로그로 찍겠다...

캐싱

동일한 요청이 지속적으로 들어오는 경우에 대해... 캐싱 기능으로 서버 성능을 올림

Nest.js에서의 캐싱

cache-manager 설치 후 사용


개인과제

TS 프로젝트(공연예매)

DTO를 사용하는 것의 핵심은 DTO 객체 안에서 클라이언트의 전달 값에 대한 유효성 검사가 자동으로 되어야 하는 것이 핵심........
DTO가 이러한 역할을 할 수 있도록 돕는 것이 바로 ValidationPipe


회고

0개의 댓글