티스토리 뷰

Back-end/Nest.js

[Nest.js] Nest.js 기본 구조

poopooreum 2024. 12. 27. 14:55
반응형

 

1) 핵심 요소

Nest.js는 Module, Controller, Service, Provider를 기본 요소 하며, 이들을 조합해 애플리케이션을 구성

(1) 모듈(Module)

  • Nest.js 애플리케이션의 구성 요소를 그룹화하는 단위
  • 모든 애플리케이션은 최소 하나의 루트 모듈(AppModule)이 잇어야 함
  • 모듈은 서비스, 컨트롤러, 레포지토리, 쿼리팩토리, 다른 모듈을 포함
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
  imports: [], // 다른 모듈을 가져올 수 있음
  controllers: [AppController], // 컨트롤러 등록
  providers: [AppService], // 프로바이더 등록
})
export class AppModule {}

 

(2) 컨트롤러(Controller)

  • 클라이언트의 요청(HTTP 요청)을 처리하는 역할
  • 비즈니스 로직을 수행하는 서비스를 호출하고, 응답을 반환
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';

@Controller('app') // 라우트 경로 지정
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get() // GET 요청 핸들링
  getHello(): string {
    return this.appService.getHello();
  }
}

 

 

(3) 서비스(Service)

  • 애플리케이션의 비즈니스 로직을 처리하는 곳
  • DB 엑세스, 외부 API호출, 기타 복잡한 로직을 구현
  • 컨트롤러와 레포지토리 사이의 중간 역할
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
  getHello(): string {
    return 'Hello, World!';
  }
}

 

(4) 프로바이더(Provider)

  • Nest.js에서 의존성 주입을 통해 객체를 관리하는 단위
  • 서비스뿐만 아니라, 레포지토리, 헬퍼, 공통 로직을 구현할 때도 프로바이더를 사용
import { Injectable } from '@nestjs/common';
@Injectable()
export class UtilityService {
  formatDate(date: Date): string {
    return date.toISOString();
  }
}

2) 추가 요소

(1) 레포지토리(Repository)

  • DB와 상호 작용을 위한 Repository 패턴을 지원
  • TypeORM, Mongoose, Prisma 같은 ORM/ODM과 함께 사용
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';
@Entity()
export class User {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  name: string;

  @Column()
  email: string;
}

 

(2) 미들웨어(Middleware)

  • 요청이 컨트롤러에 도달하기 전에 실행되는 함수를 정의
  • 인증, 로깅, 요청 데이터 변환 등을 처리
import { Injectable, NestMiddleware } from '@nestjs/common';

@Injectable()
export class LoggerMiddleware implements NestMiddleware {
  use(req: any, res: any, next: () => void) {
    console.log('Request...');
    next();
  }
}

 

(3) 가드(Guard)

  • 인증, 권한 부여와 같은 특정 조건을 기준으로 요청을 허용하거나 거부할 수 있음
import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';

@Injectable()
export class AuthGuard implements CanActivate {
  canActivate(context: ExecutionContext): boolean {
    const request = context.switchToHttp().getRequest();
    return request.headers.authorization === 'valid_token';
  }
}

 

(4) 인터셉터(Interceptor)

  • 요청과 응답을 가로채서 추가 로직을 수행
  • 로깅, 응답 데이터 가공, 캐싱 등을 처리
import {
  Injectable,
  NestInterceptor,
  ExecutionContext,
  CallHandler,
} from '@nestjs/common';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';

@Injectable()
export class TransformInterceptor implements NestInterceptor {
  intercept(context: ExecutionContext, next: CallHandler): Observable<any> {
    return next.handle().pipe(map(data => ({ success: true, data })));
  }
}
반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
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 29 30 31
글 보관함