[Nest.js]Controllers

Jimin_Noteยท2022๋…„ 9์›” 6์ผ
0

๐Ÿ›node.js

๋ชฉ๋ก ๋ณด๊ธฐ
5/5
post-thumbnail

๐ŸŒฑControllers

๐Ÿ“Œ Nest์˜ ์ปจํŠธ๋กค๋Ÿฌ = MVCํŒจํ„ด์˜ ์ปจํŠธ๋กค๋Ÿฌ
์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋“ค์–ด์˜ค๋Š” request๋ฅผ ๋ฐ›๊ณ  ์ฒ˜๋ฆฌ๋œ ๊ฒฐ๊ณผ๋ฅผ response๋กœ ๋Œ๋ ค์ฃผ๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์—ญํ• 

  • ์—”๋“œํฌ์ธํŠธ ๋ผ์šฐํŒ… ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ด ๊ฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” request๋ถ„๋ฅ˜
  • ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‚ฌ์šฉ ๋ชฉ์ ์— ๋”ฐ๋ผ ๊ตฌ๋ถ„ํ•˜๋ฉด ๊ตฌ์กฐ์ ์ด๊ณ  ๋ชจ๋“ˆํ™”๋œ ์†Œํ”„ํŠธ์›จ์–ด ์ž‘์„ฑ ๊ฐ€๋Šฅ

๐ŸŒŸnest CLI์ด์šฉํ•˜์—ฌ ์ปจํŠธ๋กค๋Ÿฌ ์ƒ์„ฑ

์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•ด๋„ ๋œ๋‹ค!

nest g controller [name] #๋‚˜๋Š” testing์ด๋ผ๊ณ  ํ•ด๋†จ์Œ

์ž๋™ ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด AppController๋Š”AppModule์— ์„ ์–ธ๋˜์–ด ์žˆ๊ณ , AppService๋ฅผ importํ•ด์„œ ์‚ฌ์šฉ ์ค‘

// ./app.Controllers.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();
  }
}

nest -h : Nest ๊ตฌ์„ฑ์š”์†Œ ๋ณด๊ธฐ

๐ŸŒŸnest CLI์ด์šฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค์˜ CRUD ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ์ƒ์„ฑ

nest g resource [name] //Users๋ผ๊ณ  ์ƒ์„ฑ




๐ŸŒฑrouting

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

@Controller() //๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ํด๋ž˜์Šค์— ์„ ์–ธ : AppController ํด๋ž˜์Šค๋Š” ์ปจํŠธ๋กค๋Ÿฌ์œผ ์—ญํ• ์„ ํ•˜๊ฒŒ๋œ๋‹ค
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get() //๋ฃจํŠธ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ
  getHello(): string {
    return this.appService.getHello();
  }
}


๊ฒฝ๋กœ๋ฅผ /hello ๋กœ ๋ฐ”๊พธ๋ฉด

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

@Controller() //๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ํด๋ž˜์Šค์— ์„ ์–ธ : AppController ํด๋ž˜์Šค๋Š” ์ปจํŠธ๋กค๋Ÿฌ์œผ ์—ญํ• ์„ ํ•˜๊ฒŒ๋œ๋‹ค
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get('/hello') //๋ฃจํŠธ๊ฒฝ๋กœ์—์„œ /hello๋กœ ๋ณ€๊ฒฝ
  getHello(): string {// getHello๋“  returnHello๋“  ์ƒ๊ด€์—†์Œ(์†Œ์†๋˜์–ด์žˆ๋Š” ๋‚ด๊ทœ๋ฅผ ๋”ฐ๋ฅด๋ฉด ๋œ๋‹ค.)
    return this.appService.getHello();
  }
}

๋‹น์—ฐํ•˜๊ฒ ์ง€๋งŒ ๋ฃจํŠธ๊ฒฝ๋กœ์—์„œ ์—๋Ÿฌ๋ฐ˜ํ™˜

/hello์—์„œ ๊ฒฐ๊ณผ response


์™€์ผ๋“œ ์นด๋“œ ์‚ฌ์šฉ

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

@Controller() //๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ํด๋ž˜์Šค์— ์„ ์–ธ : AppController ํด๋ž˜์Šค๋Š” ์ปจํŠธ๋กค๋Ÿฌ์œผ ์—ญํ• ์„ ํ•˜๊ฒŒ๋œ๋‹ค
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get('he*lo') // ๋ฌธ์ž์—ด ๊ฐ€์šด๋ฐ ์–ด๋–ค ๋ฌธ์ž๊ฐ€ ์™€๋„ ์ƒ๊ด€์—†์ด ๋ผ์šฐ๋ง ํŒจ์Šค ๊ตฌ์„ฑ
  getHello(): string {// getHello๋“  returnHello๋“  ์ƒ๊ด€์—†์Œ(์†Œ์†๋˜์–ด์žˆ๋Š” ๋‚ด๊ทœ๋ฅผ ๋”ฐ๋ฅด๋ฉด ๋œ๋‹ค.)
    return this.appService.getHello();
  }
}
  • ์œ„ ์ฝ”๋“œ์—์„œ helo , hello, he__lo ์™€ ๊ฐ™์€ ๊ฒฝ๋กœ๋กœ request ๊ฐ€๋Šฅ
  • * ๋ง๊ณ ๋„ ?,+,(,) ๋˜ํ•œ ์ •๊ทœ ํ‘œํ˜„์‹์—์„œ์˜ ์™€์ผ๋“œ ์นด๋“œ์™€ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘
  • -,.์€ ๋ฌธ์ž์—ด๋กœ ์ทจ๊ธ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ œ์™ธ

ํ—ค๋”

Nest๋Š” ์‘๋‹ต ํ—ค๋”๋„ ์ž๋™์œผ๋กœ ๊ตฌ์„ฑํ•ด์ค€๋‹ค.

์‘๋‹ต์— ์ปค์Šคํ…€ ํ—ค๋”๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด @Header๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.์ธ์ž๋Š” ํ—ค๋”์ด๋ฆ„๊ณผ ๊ฐ’
์•„๋‹ˆ๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ์‘๋‹ต๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ res.header() ๋ฉ”์„œ๋“œ๋กœ ์ง์ ‘ ์„ค์ •๋„ ๊ฐ€๋Šฅ
ex)

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

@Header('Custom', 'jiminnote')
@Get(':id')
findOneWithHeader(@Param('id') id: string) {
  return this.usersService.findOne(+id);
}

< Custom: jiminnote ์ด๋ ‡๊ฒŒ ๋˜์–ด์žˆ์€ ๊ฒƒ ํ™•์ธ ๊ฐ€๋Šฅ


Redirection

๊ฐ€๋” ์„œ๋ฒ„๋Š” ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ ํ›„ ์š”์ฒญ์„ ๋ณด๋‚ธ ํด๋ผ์ด์–ธํŠธ๋ฅผ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™์‹œํ‚ค๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋Š”๋ฐ ์ด๋•Œ!
1. ์‘๋‹ด ๋ณธ๋ฌธ์— `redirectUrl์„ ํฌํ•จ์‹œ์ผœ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์Šค์Šค๋กœ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ 2. @Redirect`๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„
301 Moved Permanatly๋Š” ์š”์ฒญํ•œ ๋ฆฌ์†Œ์Šค๊ฐ€ ํ—ค๋”์— ์ฃผ์–ด์ง„ ๋ฆฌ์†Œ์Šค๋กœ ์™„์ „ํžˆ ์ด๋™๋๋‹ค๋Š” ๋œป

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

@Redirect('https://nestjs.com', 301)
@Get(':id')
findOne(@Param('id') id: string) {
  return this.usersService.findOne(+id);
}

์ฟผ๋ฆฌ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฒ„์ „ ์ˆซ์ž๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ํ•ด๋‹น ๋ฒ„์ „์˜ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•œ๋‹ค

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

=> http://localhost:3000/redirect/docs?version=5 ์ž…๋ ฅ์‹œ
https://docs.nestjs.com/v5/๋กœ ์ด๋™


๋ผ์šฐํŠธ ํŒŒ๋ผ๋ฏธํ„ฐ(ํŒจ์Šค ํŒŒ๋ผ๋ฏธํ„ฐ)

๐Ÿ“Œ ๋ผ์šฐํŠธ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ „๋‹ฌ๋ฐ›๋Š” ๋ฐฉ๋ฒ•
1. ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์ „๋‹ฌ๋  ๊ฒฝ์šฐ ๊ฐ์ฒด๋กœ ํ•œ๋ฒˆ์— ๋ฐ›๊ธฐ
(paramsํƒ€์ž…์ด any๊ฐ€ ๋˜์„œ ๋˜๋„๋ก ์‚ฌ์šฉ X ์•„๋‹ˆ๋ฉด ๋ผ์šฐํŠธ ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ํƒ€์ž…์ด ํ•ญ์ƒ string์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ช…์‹œ์ ์œผ๋กœ { [key: string]: string } ํƒ€์ž…์„ ์ง€์ •)

@Delete(':userId/memo/:memoId')
deleteUserMemo(@Param() params: { [key: string]: string }) {
  return `userId: ${params.userId}, memoId: ${params.memoId}`;
}
  1. ๋ผ์šฐํŒ… ํŒŒ๋ผ๋ฏธํ„ฐ ๋”ฐ๋กœ๋ฐ›๊ธฐ
@Delete(':userId/memo/:memoId')
deleteUserMemo(
  @Param('userId') userId: string,
  @Param('memoId') memoId: string,
) {
  return `userId: ${userId}, memoId: ${memoId}`;
}
profile
Hello. I'm jimin:)

0๊ฐœ์˜ ๋Œ“๊ธ€