ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 006_NestJS_Pipes를 활용한 Validation Check
    > Backend/NestJS 2022. 5. 16. 13:49

    ****** Pipe 진행 전, 접힌 글을 확인해주세요.

    더보기

    ========================================================================

    우선, import {Controller, Get,Post} 에 더해, import {Body, Param} from '@nestjs/common' 를 import합니다. 

    만약 들어오는 Request Body에 데이터를  넣어서 오는 경우 Body를, Param에 데이터를 넣어서 오는 경우는 Param를 활용하면 된다.

     

    createMessage 활용 방법

     

    createMessage의 경우 POST를 활용해서, @Body에 데이터를 넣어서 보내줄 예정이기에, 아래의 사진과 같이 설정한다.

     

    messages.controller.ts

     

    ========================================================================

     

     

     

    이제, Pipes를 통해 validation check를 진행해봅시다.

    본 글에서, 아래와 같은 순서로 Validation Check를 진행할 예정입니다.

     

     

    Validation Pipe 순서

     

     

    1) ValidationPipe를 main.ts에 설정하여 global 사용 가능하게 설정. 

     

    main.ts에서 ValidationPipe를 import하고, app.useGlobalPipes( new ValidationPipe())에서 해당 내용을 글로벌에서 사용할 수 있게 설정해주면 된다.  

     

    main.ts

     

    이렇게 되면, 위 사진에서 new ValidationPipe()가 incoming Request에 대해 일일히 유효성 검사를 진행할 것입니다.

    이제 어떤 방식으로 유효성 검사를 진행할 지 한번 만들어봅시다. 

     

     

    2&3) request가 가져야 할 properties를 선언해주는 Class 생성 → Data Transfer Object (DTO)라 칭함.

    우선, src 내에, dtos 라는 디렉토리를 만들고, 그 안에, create-message.dto.ts라는 파일을 생성합니다.

    이후, CreateMessageDto라는 이름을 가진 class를 생성하고, 안에 아래와 같이 작성합니다.

    (Content가 string type이고, @IsString() 라는 decorator를 사용해서, string이 아닌경우 바로 탈출하고, error 발생) 

    해당 라인을 작성하면, class-validator라는 라이브러리가 없다고 에러가 날텐데, 해당 부분을 install 해주면 됩니다. 

     

     

    create-message.dto.ts

     

     

     terminal에 npm install class-validatior class-transformer​ 작성하면 됩니다. class-validator 이외에 class-transformer라는 라이브러리도 추가적으로 설치해줄 예정입니다. 

     

     

    4) 이제, Controller에서 incoming 되는 데이터를 Validation Check를 해주려고 하기 때문에, Controller 에 방금 만든 DTO를 import 해주시고, 사용할 부분에 CreateMessageDto로 변경해줍니다.

    messages.controller.ts

    저는 CreateMessage에서 String인지 확인하기위해 Pipes를 우선적으로 사용할 예정이기 떄문에, Any였던 부분을 CreateMessageDto로 변경해줍니다. 

     

    그러면, 이제 /message로 CreateMessage- Post 형식으로 들어오는 body는  애들은 String type으로 지정되기 때문에, 다른 데이터 ({content:123})를 보내면, 아래와 같이 에러가 발생되게 됩니다. 

    Content가 Number인 경우, 에러

     

     

    중요하지 않치만, 좀 더 자세히 보기

    더보기

    ========================================================================

    여기서, 중요하지는 않치만, 일전에 설치한 class-transformer는 어디에 쓰냐는 궁금증이 생길 수 있습니다. 

    데이터가 넘겨져 오면 class-tranformer가 해당 데이터를 DTO 로 변경해는데 사용되고, DTO로 변경된 데이터를 Class-validator를 사용해서 Validation-check를 진행하게 됩니다. 

     

    또한, TS에서 JS로 변환되는 과정에서 기본적으로는 Decorator까지 가져가지는 않치만, 일전에 tsconfig.ts에 작성된 아래 두코드가 이를 가능하게 해줍니다. 

     

    tsconfig.ts
    node_modules 내에있는, messages.controller.ts

     

    전환되는 과정에서, node_modules안에있는 messages.controller.ts 내에 보시면( metatdata("design:paramtypes",[create_message_dto....), paramtypes가 create_message_dto라는 조건?을 가져야된다고 명시되어있습니다. 

    ========================================================================

     

    다음 장에는 Service 와 Repository를 통해서 Bussiness-Logic 과 DB에서 데이터 가져오는 것에대해 알아보겠습니다. 

    '> Backend > NestJS' 카테고리의 다른 글

    009_TypeORM을 NestJS에 연결 - 1  (0) 2022.05.27
    007_NestJS_Service 와 Repository  (0) 2022.05.18
    005_NestJS_NestJS CLI를 사용한 Controller 만들기  (0) 2022.05.16
    004_NestJS_BasicSetup(using NestCLI)  (0) 2022.05.16
    003_NestJS_Scratch  (0) 2022.05.16

    댓글

Designed by Tistory.