ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 20221222Thu_공부 일지
    > Backend/NestJS 2022. 12. 23. 02:21

    < 복습> 

    1. Controller: 들어오는 요청을 받고, 처리된 결과를 응답으로 돌려주는 인터페이스 역할을 한다. 

     

    < 공부 내용> 

    2. Header:

       => @Header  decorator를 사용하여 커스텀 헤더 추가할 수 있다. 

    //커스텀 Header: @Header데커레이터를 사용 (혹은, res.header()로 직접 설정 가능)
    @Header('key', "value")
    @Get('header/:id')
    findOne_Header(@Param('id') id: string) {
      if(+id < 1){
        //문자로 받은 id앞에 +붙여주면, 숫자로 변환
        throw new BadRequestException('id값은 0보다 큰 값이어야 합니다.')
      }
      return this.usersService.findOne(+id);
    }
    

     

    3. Redirection:

       => 종종 서버가 요청을 처리한 후, 요청을 보낸 클라이언트를 다른 페이지로 이동하고 싶을 경우, redirection 사용. 

       => @Redirection decorator의 첫번째 인수는 이동한 URL, 두번째 인수는 status를 의미(사용된 300번대 status는 이동됨을 의미)

    @Get('redirect/:id')
    @Redirect('https://nestjs.com', 301)
    findOne_Redirect(@Param('id') id: string) {
      if(+id < 1){
        //문자로 받은 id앞에 +붙여주면, 숫자로 변환
        throw new BadRequestException('id값은 0보다 큰 값이어야 합니다.')
      }
      return this.usersService.findOne(+id);
    }
    
    // Query 매개변수로, 버전 숫자를 전달받아 해당 버전의 페이지로 이동시,
    @Get('redirect/docs')
    // @Redirect('https://docs.nestjs.com', 302)
    example_Redirect(@Query('version') version) {
      if(version && +version === 5)
        // version이 있고, 그 version이 5인 경우에만 이동.
        return {
          url: 'http://docs.nestjs.com/v5/'
        }
    }

     

    4. Routing Param: 라우팅 매개변수 === 패스 매개변수

        => 경로를 구성하는 매개변수.

    // Routing:
    @Get(':userId/memo/:memoId')
    getUserMemo(
        @Param('userId') userId: string,
        @Param('memoId') memoId: string
    ) {
      return `userId : ${userId}, memoId : ${memoId}`
    }
    
    

     

    5. 하위 도메인 라우팅

       => 서버에서 제공하는 기능을 API로 외부에 공개한 경우, 들어온 요청을 서로 다르게 처리하고 싶을 경우 + 하위 도메인에서 처리하지 못하는 요청은 원래 도메인에서 처리되도록 할 때, 사용

     

    순서: 

    1) nest g controller Api

    2) 등록 (app.module.ts)

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

     

    3) 작성 (1번째는 기본, 2번째는 서브 도메인을 변수로 받아서 사용, 이때 /etc/hosts 파일에 추가 필요 => 헤맨내용(4) 참조)

    => 사용할때 마다, Controller 위아래로 바꿔줄 것 

     

    import { Controller, Get, HostParam } from '@nestjs/common';
    
    
    @Controller({ host: 'api.localhost' })
    // @Controller({ host: ':version.api.localhost' })
    export class ApiController {
        @Get()
        example1(): string {
            return 'Hello, API'
        }
        // curl http://v1.api.localhost:3000
        // Hello, API%
        @Get()
        example2(@HostParam('version') version: string): string {
            return `Hello, ${version}`;
        }
        // curl http://v1.api.localhost:3000
        // Hello, v1%
    }
    
    import { Controller, Get, HostParam } from '@nestjs/common';
    
    
    @Controller({ host: 'api.localhost' })
    // @Controller({ host: ':version.api.localhost' })
    export class ApiController {
        @Get()
        example1(): string {
            return 'Hello, API'
        }
        // curl http://v1.api.localhost:3000
        // Hello, API%
        @Get()
        example2(@HostParam('version') version: string): string {
            return `Hello, ${version}`;
        }
        // curl http://v1.api.localhost:3000
        // Hello, v1%
    }
    
    import { Controller, Get, HostParam } from '@nestjs/common';
    
    
    @Controller({ host: 'api.localhost' })
    // @Controller({ host: ':version.api.localhost' })
    export class ApiController {
        @Get()
        example1(): string {
            return 'Hello, API'
        }
        // curl http://v1.api.localhost:3000
        // Hello, API%
        @Get()
        example2(@HostParam('version') version: string): string {
            return `Hello, ${version}`;
        }
        // curl http://v1.api.localhost:3000
        // Hello, v1%
    }
    

    => 해당 내용에 관해서는 헤맨 내용(4) 참조. 

     

     

    6. payload 다루기: 

       => 대부분 요청은 처리가 필요한 데이터(payload)를 담아서 보냄. @Param으로 처리할 수 있지만, DTO에 담아서 처리할 수 있음. 

     

     

    1) 기생성된 create.user.dto에 세부 내용 작성

    // NestJS에서 payload 를 처리하기 위해서는 데이터 전송 객체 (DTO)를 구현하면 된다.
    export class CreateUserDto {
        name: string
        email: string
    }
    

    2) 작성

    @Post('')
    create(@Body() createUserDto: CreateUserDto) {
      // return this.usersService.create(createUserDto);
      return `유저를 생성했습니다. ${JSON.stringify(createUserDto)}`
    }
    // 결과 예시 curl 로 구현
    // curl -X POST http://localhost:3000/users -H "Content-Type: application/json" -d '{"name":"example name", "email":"example@gmail.com"}'
    // 유저를 생성했습니다. {"name":"example name","email":"example@gmail.com"}%
    

     

    <헤맨 내용>

    3. 터미널에서 그냥 curl 명령어를 실행하면, api 를 편하게 확인할 수 있다.
        =>     curl http://v1.api.localhost:3000
               Hello, v1%
    
    4.  MacOS 로컬에서 테스트를 하기 위해 하위 도메인을 api.localhost 로 지정하면 curl 명령어가 제대로 동작 안됨
        이는 api.localhost가 로컬 요청을 받을 수 있도록 설정되어 있지 않기 때문입니다. 이를 해결하기 위해 /etc/hosts 파일의 마지막에 127.0.0.1 api.localhost을 추가하고 서버를 다시 구동
        /private/etc/hosts에 127.0.0.1 api.localhost
                            127.0.0.1 v1.api.localhost 삽입 (vim사용)
        => 구동방법: https://blog.stories.pe.kr/530
        => hosts 파일은 도메인의 IP를 찾을 때 컴퓨터가 맨 처음 조사하는 파일이다(그러니깐 DNS 파일인 것이다).

     

    <GIT>

    https://github.com/HeathChang/personal_work/commits?author=HeathChang&since=2022-12-23&until=2022-12-23

     

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

    221228수_공부일지  (0) 2022.12.29
    20221227화_공부 일지  (0) 2022.12.28
    20221221Wed_공부 일지  (0) 2022.12.22
    009_TypeORM을 NestJS에 연결 - 1  (0) 2022.05.27
    007_NestJS_Service 와 Repository  (0) 2022.05.18

    댓글

Designed by Tistory.