> Backend/NestJS

20221222Thu_공부 일지

Janku 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