728x90
반응형

 

우리가 만약 getOne으로 데이터를 찾고자 하는데 실수로 입력을 했다고 치면 데이터가 없는지, 어떤 오류가 있는지 에러 핸들링을 해주어야 한다.

 

movies.service.ts

    getOne(id:string): Movie {
        
        const movie = this.movies.find(movie => movie.id === parseInt(id));
        if(!movie) {
            throw new NotFoundException(" ID가 존재하지 않습니다. ")
        }

        return movie;

    }

 

이런 식으로  getOne부분에 movie가 존재하지 않을 경우 error를 내보내도록 했다.

실제로 postman에서 request를 보내보면

 

 

이런식으로 에러가 뜨는 것을 확인할 수 있다.

 

방금 만든 getOne() 함수로 우리가 데이터를 삭제할 때 해당 Id를 가지고 있는 Movie가 존재하는지 먼저 확인해 볼 수 있고 에러 처리를 할 수도 있다. 때문에 코드가 더 깔끔해진다.

 

    deleteOne(id:string) {
        this.getOne(id)
        this.movies = this.movies.filter(movie => movie.id !== parseInt(id))
    }

 

 

이번엔 update service를 만들어보자. 먼저, Controller 부분을 바꿔주자.

    @Patch('/:id')
    patch(@Param('id') movieId:string, @Body() updateData) {
        return this.moviesService.update(movieId,updateData)
    }

 

 

아직 Service부분에서 update 함수를 선언하지 않았기 때문에 당연히 에러가 뜬다. Service부분을 보자.

 

movies.service.ts

import { Injectable, NotFoundException } from '@nestjs/common';
import { NotFoundError } from 'rxjs';
import { Movie } from './entities/movie.entity';

@Injectable()
export class MoviesService {
    private movies: Movie[] = [];

    getAll(): Movie[] {
        return this.movies;
    }

    getOne(id:string): Movie {
        
        const movie = this.movies.find(movie => movie.id === parseInt(id));
        if(!movie) {
            throw new NotFoundException(" ID가 존재하지 않습니다. ")
        }

        return movie;

    } 

    deleteOne(id:string) {
        this.getOne(id)
        this.movies = this.movies.filter(movie => movie.id !== parseInt(id))
    }

    create(movieData) {
        this.movies.push({
            id: this.movies.length + 1,
            ...movieData
        })
        return true;
    }

    update(id: string, updateData) {
        const movie = this.getOne(id);
        this.deleteOne(id)
        this.movies.push({ ...movie, ...updateData})
    }

}

 

 

postman에서 실행해보면 정상작동하는것을 확인할 수 있다.

728x90
반응형
728x90
반응형

 

우리가 클라이언트에서 어떤 데이터를 원할 때는 백엔드에 요청을 해야된다.

 

예를들어 백엔드에서 POST 메소드로 josn body를 요청받아 movie를 create하고 싶다면,

 

    @Post()
    create(@Body() movieData : Object) {
        return movieData;
    }

 

이런식으로 해당 부분을 바꿔주면 된다.

 

 

또한 PATCH 메소드를 통해 update를 하고 싶다면,

    @Patch('/:id')
    patch(@Param('id') movieId:String, @Body() updateData) {
        return {
            updatedMovie : movieId,
            ...updateData
        }
    }

이런식으로 Patch로 받은 데이터를 추가하고 반환할 수 있다.

 

node.js로 json데이터를 주고 받을 때는 따로 설정을 해야될 것들이 있었지만, Nest.js는 이러한 과정을

아주 편리하게 이용할 수 있도록 해준다.

 

 

우리가 Movie에 대해 year이라는 속성으로 데이터를 찾고자 할 때는

    @Get('/:id')
    getOne(@Param('id') movieId: String){
        return `id is ${movieId}`;
    }

    @Get('search') 
    search(@Query('year') searchingYear : string) {
        return `${searchingYear} 이라는 데이터를 찾을 것입니다.`
    }

 

이런식으로 사용할 수 있다. 하지만  위와 같이 /:id를 param으로 갖는 곳 하단에 선언을 해주고, 실행을 해보면

이런 식으로 search를 id로 인식하여 원하는 값을 얻지 못하게 된다. 따라서 GET /:id 상단에 선언을 해야 된다.

 

    @Get('search') 
    search(@Query('year') searchingYear : string) {
        return `${searchingYear} 이라는 데이터를 찾을 것입니다.`
    }

    @Get('/:id')
    getOne(@Param('id') movieId: String){
        return `id is ${movieId}`;
    }

 

이렇게 만들고 다시 실행을 해보면

 

이런 식으로 우리가 원하는 값을 얻을 수 있게 된다.

 

 

참조

https://nomadcoders.co/nestjs-fundamentals/lectures/1946

 

All Courses – 노마드 코더 Nomad Coders

초급부터 고급까지! 니꼬쌤과 함께 풀스택으로 성장하세요!

nomadcoders.co

 

728x90
반응형

'Back-End > Nest.js' 카테고리의 다른 글

Nest.js | REST API | Movies Service(2)  (0) 2021.09.29
Nest.js | REST API | Movies Service(1)  (0) 2021.09.28
Nest.js | REST API | Movies Controller  (0) 2021.09.24
Nest.js | 개요 | Modules  (0) 2021.09.24
Nest.js | 개요 | Service  (0) 2021.09.24
728x90
반응형

일단 먼저 우리만의 모듈을 만들어보자. 이름은 cats라고 하겠다.

 

$ nest g module cats

루트 폴더에서 이 명령어를 실행해주면

 

 

이렇게 자동으로 폴더가 생성된다.

 

전체적인 파일 구조는 이런식이 될 것이다.

 

 

Feature Modules(기능 모듈)

 

먼저 cats.module.ts를 다음과 같이 수정해보자.

 

cat.module.ts

import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Module({
  controllers: [CatsController],
  providers: [CatsService],
})
export class CatsModule {}

이렇게 controllers와 provider를 가지는 모듈을 한 개 생성하였다. ( controller와 provider는 아직 생성 안 함.)

 

그 다음 app.module.ts(루트 모듈) 파일을 수정해주어야 한다.

 

app.module.ts

import { Module } from '@nestjs/common';
import { CatsModule } from './cats/cats.module';

@Module({
  imports: [CatsModule],
})
export class AppModule {}

여기까지가 기능 모듈의 기본적인 예이다. 모듈을 생성하고, 루트 모듈에 연결해주었다.

 

 

Shared Modules( 공유 모듈)

 

Nest에서의 모듈은 기본적으로 싱글톤이다. 여러 모듈간에 쉽게 프로바이더의 인스턴스를 공유할 수 있다.

 

공유를 하기 위해서 만들었던 모듈에 export 옵션을 만들어주어야한다.  여기서 모듈에서 사용하는 용어를 살펴보면,

Providers Nest 인젝터에 의해 인스턴스화 되고 적어도 이 모듈에서 공유될 수 있는 프로바이더
controllers 인스턴스화 되어야 하는 이 모듈에 정의된 컨트롤러 세트
imports 모듈에 필요한 프로바이더를 내보내는 가져온 모듈들
exports 다른모듈에서 import하여 사용되어야 하는 프로바이더의 하위 집합

 

이렇게 되어있다. export를 써보자.

 

cat.module.ts

import { Module } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Module({
  controllers: [CatsController],
  providers: [CatsService],
  exports: [CatsService]
})
export class CatsModule {}

 

이렇게 하면 CatsModule을 가져오는 모든 모듈이 CatService에 액세스 할 수 있다.

( 가져올 때는 import를 써준다. )

 

 

 

Global modules

 

모든 곳에서 동일한 모듈 세트를 가져와야할 때 @Global() 데코레이터를 이용하여 전역 모듈을 생성할 수 있다.

 

import { Module, Global } from '@nestjs/common';
import { CatsController } from './cats.controller';
import { CatsService } from './cats.service';

@Global()
@Module({
  controllers: [CatsController],
  providers: [CatsService],
  exports: [CatsService],
})
export class CatsModule {}

 

이런식으로 exports 옵션에 넣어주면 CatService를 필요로 하는 모듈에서 가져와 쓸 수 있다.

Global 데코레이터는 일반적으로 루트 또는 코어 모듈에서 한번만 등록을 해야한다. 서비스를 가져오려는 모듈에서

가져오기 배열에서 CatModule을 가져올 필요가 없다.

728x90
반응형

'Back-End > Nest.js' 카테고리의 다른 글

Nest.js | REST API | More Routes  (0) 2021.09.28
Nest.js | REST API | Movies Controller  (0) 2021.09.24
Nest.js | 개요 | Service  (0) 2021.09.24
Nest.js | 개요 | Controller(2)  (0) 2021.09.24
Nest.js | 개요 | Controllers(1)  (0) 2021.09.24
728x90
반응형

컨트롤러는 들어오는 request를 처리하고 response를 클라이언트에게 반환하는 역할을 한다.

 

예제를 살펴보면, 

 

cats.controller.ts

import { Controller, Get } from '@nestjs/common';

@Controller('cats') //경로
export class CatsController {
  @Get()
  findAll(): string {
    return 'This action returns all cats';
  }
}

 

컨트롤러를 정의하는 데 필수인 @Controller() 안에 선택적 라우트 경로(path) 접두사인 cats를 지정한다.

이렇게 지정을 해두면 /cats로 들어오는 요청들을 컨트롤 할 수 있다.

 

CLI를 사용하여 컨트롤러를 만들려면 
$ nest g controller cats
 명령을 실행하면 됩니다.

 

findAll() 메서드 앞에 있는 @Get() HTTP 요청 메서드 데코레이터는 Nest에 HTTP 요청에 대한 특정 엔드포인트에 대한 핸들러를 생성하도록 지시한다. 

 

예를 들어 @Get('profile')과 결합된 constomer의 경로 접두사는  GET /customers/profile 과 같은 요청에 대한 라우트 매핑을

생성한다.

 

메소드 핸들러 시그니처(예: findAll(@Res() response))에서 @Res() 데코레이터를 사용하여 삽입할 수 있는 라이브러리별(예: Express) 응답객체를 사용할 수 있습니다. 예를 들어 Express에서는 response.status(200).send() 와 같은 코드를 사용하여 응답을 구성할 수 있습니다.

 

정리해보면,

  • /cats 로 요청을 받을 때 @Controller('cats') 로 지정해준다.
  • GET 메소드로 요청을 받을 때 @Get()을 선언해준다.
  • GET 메소드 하위경로를 지정해줄 땐 @Get() 안에 경로 이름을 지정해준다.
  • 기본적으로 지정된 라우터는 findAll()로 들어오게된다.
  • @Req() 데코레이터를 추가하면 요청객체에 액세스 할 수 있다.

 

 

다음으로 POST 핸들러를 만들어보자.

 

cats.controller.ts

import { Controller, Get, Post } from '@nestjs/common';

@Controller('cats')
export class CatsController {
  @Post()
  create(): string {
    return 'This action adds a new cat';
  }

  @Get()
  findAll(): string {
    return 'This action returns all cats';
  }
}

 

GET 메소드 요청 처리를 이해하면,  POST 핸들러는 아주 쉽게 이해할 수 있다.

@Get()@Post()@Put()@Delete()@Patch()@Options() 및 @Head(). 또한 @All()은 이들 모두를 처리하는 엔드 포인트를 정의한다.

 

 

Route wildcards

패턴 기반 라우트 또한 제공한다. 별표는 와일드카드로 사용되며 모든 문자조합과 일치한다.

@Get('ab*cd')
findAll() {
  return 'This route uses a wildcard';
}

 

 

Status code

201인 POST 요청을 제외하고 상태코드는 기본적으로 항상 200이다. @HttpCode() 데코레이션을 추가하여 변경할 수 있다.

@Post()
@HttpCode(204)
create() {
  return 'This action adds a new cat';
}
@nestjs/common 패키지에서 HttpCode를 가져옵니다.

 

Headers

커스텀 응답헤더를 지정하려면 @Header() 데코레이터를 이용한다. ( res.header()를 직접 호출 )

@Post()
@Header('Cache-Control', 'none')
create() {
  return 'This action adds a new cat';
}
@nestjs/common 패키지에서 Header를 가져옵니다.

 

 

Redirection

응답을 특정 URL로 리디렉션 하려면 @Redirect() 데코레이터를 이용한다. ( res.redirect()를 직접 호출)

@Get()
@Redirect('https://nestjs.com', 301)

 

그럼 이런식으로 반환하게 된다.

{
  "url": string,
  "statusCode": number
}

 

반환된 값은 @Redirect() 데코레이터에 전달된 모든 인수를 재정의 할 수 있다.

@Get('docs')
@Redirect('https://docs.nestjs.com', 302)
getDocs(@Query('version') version) {
  if (version && version === '5') {
    return { url: 'https://docs.nestjs.com/v5/' };
  }
}

 

 

 

728x90
반응형

'Back-End > Nest.js' 카테고리의 다른 글

Nest.js | 개요 | Modules  (0) 2021.09.24
Nest.js | 개요 | Service  (0) 2021.09.24
Nest.js | 개요 | Controller(2)  (0) 2021.09.24
Nest.js | 개요 | 첫 번째 단계  (0) 2021.09.24
Next.js | 소개  (0) 2021.09.24
728x90
반응형

설정

 

우리는 먼저 새 프로젝트를 설정해야 한다. 전 글에서 말했듯이 먼저 npm이 설치되어있는 상태로 진행해보겠다.

$ sudo npm i -g @nestjs/cli
$ nest new project-name

 

먼저 패키지매니저를 설정할 수 있다. ( 저는 npm이 편해서 npm으로 했습니다! )

 

 

그러면 project-name 폴더가 생성되고 다른 몇가지의 상용구 파일들이 설치되며  src/  폴더가 생성되는것을 확인할 수 있다.

 

 

src폴더의 하위파일들을 살펴보면,

 

app.controller.ts ( 하나의 라우트가 있는 기본 컨트롤러 )

import { Test, TestingModule } from '@nestjs/testing';
import { AppController } from './app.controller';
import { AppService } from './app.service';

describe('AppController', () => {
  let appController: AppController;

  beforeEach(async () => {
    const app: TestingModule = await Test.createTestingModule({
      controllers: [AppController],
      providers: [AppService],
    }).compile();

    appController = app.get<AppController>(AppController);
  });

  describe('root', () => {
    it('should return "Hello World!"', () => {
      expect(appController.getHello()).toBe('Hello World!');
    });
  });
});

 

app.controller.spec.ts ( 컨트롤러를 위한 유닛 테스트 )

import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
}

 

app.module.ts ( 애플리케이션의 루트 모듈 )

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
  imports: [],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

 

app.service.ts ( 단일 메소드를 사용하는 기본 서비스 )

import { Injectable } from '@nestjs/common';

@Injectable()
export class AppService {
  getHello(): string {
    return 'Hello World!';
  }
}

 

main.ts ( 핵심기능을 사용하여 Nest 애플리케이션 인스턴스를 생성하는 애플리케이션 엔트리 파일 )

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);
}
bootstrap();

 

 

애플리케이션 실행

$ npm run start

 

script 파일을 살펴보면 nest start와 같다는 것을 확인할 수 있다.

728x90
반응형

'Back-End > Nest.js' 카테고리의 다른 글

Nest.js | 개요 | Modules  (0) 2021.09.24
Nest.js | 개요 | Service  (0) 2021.09.24
Nest.js | 개요 | Controller(2)  (0) 2021.09.24
Nest.js | 개요 | Controllers(1)  (0) 2021.09.24
Next.js | 소개  (0) 2021.09.24
728x90
반응형

소개

 

Nest (NestJS)는 효율적이고 확장 가능한 Node.js 서버측 애플리케이션을 구축하기 위한 프레임워크이다. 프로그레시브 자바스크립트를 사용하고 TypeScript로 빌드되고 완벽하게 지원하며(하지만 여전히 개발자가 순수 자바스크립트로 코딩할 수 있음), OOP (객체 지향 프로그래밍 Object Oriented Programming), FP (함수형 프로그래밍 Functional Programming) 및 FRP (함수형 반응형 프로그래밍 Functional Reactive Programming) 요소를 결합한다.

 

 

설치

 

Next CLI를 사용하여 프로젝트를 스캐폴딩하거나 시작 프로젝트를 복제할 수 있다.

$ npm i -g @nestjs/cli
$ nest new project-name

 

 

Git으로 설치하는 방법

$ git clone https://github.com/nestjs/typescript-starter.git project
$ cd project
$ npm install
$ npm run start

 

 

npm start를 하면 설정해두었던 포트에 정상적으로 서버가 실행되는것을 확인할 수 있다.

 

 

 

참조

https://docs.nestjs.kr/

728x90
반응형

'Back-End > Nest.js' 카테고리의 다른 글

Nest.js | 개요 | Modules  (0) 2021.09.24
Nest.js | 개요 | Service  (0) 2021.09.24
Nest.js | 개요 | Controller(2)  (0) 2021.09.24
Nest.js | 개요 | Controllers(1)  (0) 2021.09.24
Nest.js | 개요 | 첫 번째 단계  (0) 2021.09.24

+ Recent posts