20221222Thu_공부 일지
< 복습>
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