Controlers
Last updated
Last updated
์ปจํธ๋กค๋ฌ๋ ๋ค์ด์ค๋ requests์ ์ฒ๋ฆฌํ๊ณ responses์ ํด๋ผ์ด์ธํธ์๊ฒ ๋ฐํํฉ๋๋ค..
์ปจํธ๋กค๋ฌ์ ๋ชฉ์ ์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ํ ํน์ ์์ฒญ์๋ฐ๋ ๊ฒ์ ๋๋ค. routing ๋ฉ์ปค๋์ฆ์ ์ด๋ค ์ปจํธ๋กค๋ฌ๊ฐ ์ด๋ค ์์ฒญ์ ๋ฐ๋์ง ์ ์ดํฉ๋๋ค. ์ข ์ข ๊ฐ ์ปจํธ๋กค๋ฌ์๋ ํ๋ ์ด์์ ๊ฒฝ๋ก๊ฐ ์์ผ๋ฉฐ ๋ค๋ฅธ ๊ฒฝ๋ก๋ ๋ค๋ฅธ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
๊ธฐ๋ณธ ์ปจํธ๋กค๋ฌ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ํด๋์ค์ Decorators๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ฐ์ฝ๋ ์ดํฐ๋ ํด๋์ค๋ฅผ ํ์ํ ๋ฉํ ๋ฐ์ดํฐ์ ์ฐ๊ฒฐํ๊ณ Nest๊ฐ ๋ผ์ฐํ ๋งต์ ์์ฑ ํ ์ ์๋๋กํฉ๋๋ค (์์ฒญ์ ํด๋น ์ปจํธ๋กค๋ฌ์ ์ฐ๊ฒฐ).
๋ค์ ์์์๋ ๊ธฐ๋ณธ ์ปจํธ๋กค๋ฌ๋ฅผ ์ ์ํ๊ธฐ ์ํด ํ์ ์ธ@Controller()
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ ํ์ ๊ฒฝ๋ก ๊ฒฝ๋ก ์ ๋์ฌ cats
๋ฅผ ์ง์ ํฉ๋๋ค. @Controller()
๋ฐ์ฝ๋ ์ดํฐ์์ ๊ฒฝ๋ก ์ ๋์ฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ด๋ จ๋ ๊ฒฝ๋ก ์ธํธ๋ฅผ ์ฝ๊ฒ ๊ทธ๋ฃนํํ๊ณ ๋ฐ๋ณต ์ฝ๋๋ฅผ ์ต์ํ ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด /customers
๊ฒฝ๋ก์์ ๊ณ ๊ฐ ์ํฐํฐ์์ ์ํธ ์์ฉ์ ๊ด๋ฆฌํ๋ ๊ฒฝ๋ก ์ธํธ๋ฅผ ๊ทธ๋ฃนํํ๋๋ก ์ ํํ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ@Controller()
๋ฐ์ฝ๋ ์ดํฐ์์ ๊ฒฝ๋ก ์ ๋์ด customers
๋ฅผ ์ง์ ํ ์ ์์ผ๋ฏ๋ก ํ์ผ์ ๊ฐ ๊ฒฝ๋ก์ ๋ํด ๊ฒฝ๋ก์ ํด๋น ๋ถ๋ถ์ ๋ฐ๋ณต ํ ํ์๊ฐ ์์ต๋๋ค.
info ํํธ CLI๋ฅผ ์ฌ์ฉํ์ฌ ์ปจํธ๋กค๋ฌ๋ฅผ ๋ง๋ค๋ ค๋ฉด ๊ฐ๋จํ
$ nest g controller cats
๋ช ๋ น์ ์คํํ์ญ์์ค.
findAll()
๋ฉ์๋ ์์์๋ @Get()
HTTP ์์ฒญ ๋ฉ์๋ ๋ฐ์ฝ๋ ์ดํฐ๋ Nest์๊ฒ HTTP ์์ฒญ์ ๋ํ ํน์ ์๋ ํฌ์ธํธ์ ๋ํ ํธ๋ค๋ฌ๋ฅผ ์์ฑํ๋๋ก ์ง์ํฉ๋๋ค. ์๋ ํฌ์ธํธ๋ HTTP ์์ฒญ ๋ฐฉ๋ฒ (์ด ๊ฒฝ์ฐ GET) ๋ฐ ๋ผ์ฐํธ ๊ฒฝ๋ก์ ํด๋นํฉ๋๋ค. ๋ผ์ฐํธ ๊ฒฝ๋ก๋ ๋ฌด์์
๋๊น? ํธ๋ค๋ฌ์ ๋ผ์ฐํธ ๊ฒฝ๋ก๋ ์ ์ด๊ธฐ์ ์ ์ธ๋ (์ ํ์ ) ์ ๋๋ถ์ ์์ฒญ ๋ฐ์ฝ๋ ์ดํฐ์ ์ง์ ๋ ๊ฒฝ๋ก๋ฅผ ์ฐ๊ฒฐํ์ฌ ๊ฒฐ์ ๋ฉ๋๋ค. ๋ชจ๋ ๊ฒฝ๋ก์ ๋ํ ์ ๋์ฌ (cats
)๋ฅผ ์ ์ธํ๊ณ ๋ฐ์ฝ๋ ์ดํฐ์ ๊ฒฝ๋ก ์ ๋ณด๋ฅผ ์ถ๊ฐํ์ง ์์๊ธฐ ๋๋ฌธ์ Nest๋ GET/cats
์์ฒญ์ ์ด ํธ๋ค๋ฌ์ ๋งคํํฉ๋๋ค. ์ธ๊ธ ํ ๋ฐ์ ๊ฐ์ด, ๊ฒฝ๋ก์๋ ์ ํ์ ์ปจํธ๋กค๋ฌ ๊ฒฝ๋ก ์ ๋์ฌ ์ ์์ฒญ ๋ฉ์๋ ๋ฐ์ฝ๋ ์ดํฐ์ ์ ์ธ๋ ๊ฒฝ๋ก ๋ฌธ์์ด์ด ๋ชจ๋ ํฌํจ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฐ์ฝ๋ ์ดํฐ @Get('profile')
๊ณผ ๊ฒฐํฉ๋ customers
์ ๊ฒฝ๋ก ์ ๋์ฌ๋ GET/customers/profile
๊ณผ ๊ฐ์ ์์ฒญ์ ๋ํ ๊ฒฝ๋ก ๋งคํ์ ์์ฑํฉ๋๋ค.
์์ ์์ ์์ GET ์์ฒญ์ด ์ด ์๋ ํฌ์ธํธ์ ์ด๋ฃจ์ด์ง๋ฉด Nest๋ ์์ฒญ์ ์ฌ์ฉ์ ์ ์ findAll()
๋ฉ์๋๋ก ๋ผ์ฐํ
ํฉ๋๋ค. ์ฌ๊ธฐ์ ์ ํํ ๋ฉ์๋ ์ด๋ฆ์ ์์ ํ ์์์ ์
๋๋ค. ๊ฒฝ๋ก๋ฅผ ๋ฐ์ธ๋ฉ ํ ๋ฉ์๋๋ฅผ ์ ์ธํด์ผ ํ์ง๋ง Nest๋ ์ ํํ ๋ฉ์๋ ์ด๋ฆ์ ์๋ฌด๋ฐ ์๋ฏธ๋ ๋ถ์ฌํ์ง ์์ต๋๋ค. ์ด ๋ฉ์๋๋ 200 ์ํ ์ฝ๋ ๋ฐ ์ฐ๊ด๋ ์๋ต (์ด ๊ฒฝ์ฐ ๋ฌธ์์ด)์ ๋ฆฌํดํฉ๋๋ค. ์ ๊ทธ๋ฐ ์ผ์ด ๋ฐ์ํฉ๋๊น? ์ค๋ช
ํ๊ธฐ ์ํด ๋จผ์ Nest๊ฐ ์๋ต์ ์กฐ์ํ๊ธฐ ์ํด ๋ ๊ฐ์ง ๋ค๋ฅธ ์ต์
์ ์ฌ์ฉํ๋ค๋ ๊ฐ๋
์ ์๊ฐํฉ๋๋ค.
warning ๊ฒฝ๊ณ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ๋์์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. Nest๋ ํธ๋ค๋ฌ๊ฐ
@Res()
๋๋@Next()
๋ฅผ ์ฌ์ฉํ๋ ์๊ธฐ๋ฅผ ๊ฐ์งํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ณ ์ต์ ์ ์ ํํ์์ ๋ํ๋ ๋๋ค. ๋ ๋ฐฉ๋ฒ์ ๋์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ด ๋จ์ผ ๊ฒฝ๋ก์ ๋ํด ํ์ค ๋ฐฉ๋ฒ์ด ์๋์ผ๋ก ๋นํ์ฑํ ๋์ด ๋ ์ด์ ์์๋๋ก ์๋ํ์ง ์์ต๋๋ค.
ํธ๋ค๋ฌ๋ ์ข
์ข
ํด๋ผ์ด์ธํธ ์์ฒญ ์ธ๋ถ ์ฌํญ์ ์ก์ธ์คํด์ผํฉ๋๋ค. Nest๋ ๊ธฐ๋ณธ ํ๋ซํผ์ ์์ฒญ ๊ฐ์ฒด์ ๋ํ ์ก์ธ์ค๋ฅผ ์ ๊ณตํฉ๋๋ค (๊ธฐ๋ณธ์ ์ผ๋ก Express). ์ฒ๋ฆฌ๊ธฐ์ ์๋ช
์ @Req()
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ถ๊ฐํ์ฌ Nest์๊ฒ ์์ฒญํ๋๋ก ์์ฒญ ๊ฐ์ฒด์ ์ก์ธ์ค ํ ์ ์์ต๋๋ค.
info ํํธ
express
ํ์ดํ์ ์ด์ฉํ๋ ค๋ฉด (์์request: Request
ํ๋ผ๋ฏธํฐ ์์ ์ ๊ฐ์ด)@types/express
ํจํค์ง๋ฅผ ์ค์นํ์ญ์์ค.
์์ฒญ ๊ฐ์ฒด๋ HTTP ์์ฒญ์ ๋ํ๋ด๋ฉฐ ์์ฒญ ์ฟผ๋ฆฌ ๋ฌธ์์ด, ๋งค๊ฐ ๋ณ์, HTTP ํค๋ ๋ฐ ๋ณธ๋ฌธ์ ๋ํ ์์ฑ์ ๊ฐ์ต๋๋ค (๋ ์์ธํ ๋ด์ฉ์ ์ฌ๊ธฐ). ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ด๋ฌํ ์์ฑ์ ์๋์ผ๋ก ๊ฐ์ ธ์ฌ ํ์๋ ์์ต๋๋ค. @Body()
๋๋ @Query()
์ ๊ฐ์ ์ ์ฉ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋๋ ์ ๊ณต๋ ๋ฐ์ฝ๋ ์ดํฐ์ ์ด๋ค์ด ๋ํ๋ด๋ ์ผ๋ฐ ํ๋ซํผ ๋ณ ์ค๋ธ์ ํธ ๋ชฉ๋ก์
๋๋ค.
*์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ณ ์น์
์์ ์ธ๊ธํ๋ฏ์ด Response
๊ฐ์ฒด์๋ ๋ ๊ฐ์ง ์ข
๋ฅ๊ฐ ์์ต๋๋ค. standard one์@Response()
๋ฐ์ฝ๋ ์ดํฐ๋ก ์ก์ธ์คํฉ๋๋ค. @Res()
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ ๋ค์ดํฐ๋ธ ํ๋ซํผ Response
๊ฐ์ฒด์ ์ก์ธ์ค ํ ์ ์์ต๋๋ค. ํด๋น ์น์
์ ๊ฒํ ํ์ฌ ์ฐจ์ด์ ์ ์ดํดํ์ญ์์ค.
info ํํธ ๋๋ง์ ์ปค์คํ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์ฐ๋ ค๋ฉด ์ฌ๊ธฐ ์ฅ์ ๋ฐฉ๋ฌธํ์ญ์์ค.
์ด์ ์๋ Cats ์์์ ๊ฐ์ ธ ์ค๋ ์๋ ํฌ์ธํธ๋ฅผ ์ ์ํ์ต๋๋ค (GET ๊ฒฝ๋ก). ๋ํ ์ผ๋ฐ์ ์ผ๋ก ์ ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ์๋ ํฌ์ธํธ๋ฅผ ์ ๊ณตํ๋ ค๊ณ ํฉ๋๋ค. ์ด๋ฅผ ์ํด POST ํธ๋ค๋ฌ๋ฅผ ๋ง๋ญ๋๋ค.
๊ทธ๋ ๊ฒ ๊ฐ๋จํฉ๋๋ค. Nest๋ ๋๋จธ์ง ํ์ค HTTP ์์ฒญ ์๋ ํฌ์ธํธ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ ๊ณตํฉ๋๋ค - @Put()
, @Delete()
, @Patch()
, @Options()
, @Head()
๋ฐ @All()
๊ฐ๊ฐ์ ํด๋น HTTP ์์ฒญ ๋ฐฉ๋ฒ์ ๋ํ๋
๋๋ค.
ํจํด ๊ธฐ๋ฐ ๊ฒฝ๋ก๋ ์ง์๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ณํ๋ ์์ผ๋ ์นด๋๋ก ์ฌ์ฉ๋๋ฉฐ ๋ชจ๋ ๋ฌธ์ ์กฐํฉ๊ณผ ์ผ์นํฉ๋๋ค.
'ab*cd'
๋ผ์ฐํธ ๊ฒฝ๋ก๋ abcd
, ab_cd
, abecd
๋ฑ๊ณผ ์ผ์นํฉ๋๋ค. ?
, +
, *
๋ฐ ()
๋ฌธ์๋ ๋ผ์ฐํธ ๊ฒฝ๋ก์ ์ฌ์ฉ๋ ์ ์์ผ๋ฉฐ ์ ๊ท ํํ์์ ํ์ ์งํฉ์
๋๋ค. ํ์ดํ (-
)๊ณผ ์ (.
)์ ๋ฌธ์ ๊ทธ๋๋ก ๋ฌธ์์ด ๊ธฐ๋ฐ ๊ฒฝ๋ก๋ก ํด์๋ฉ๋๋ค.
์ธ๊ธ ํ๋๋ก Status Code๋ผ๋ ์๋ต์ 201 ์ธ POST ์์ฒญ์ ์ ์ธํ๊ณ ๊ธฐ๋ณธ์ ์ผ๋ก ํญ์ 200์
๋๋ค. ํธ๋ค๋ฌ ๋ ๋ฒจ์์ @HttpCode(...)
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ถ๊ฐํ์ฌ์ด ๋์์ ์ฝ๊ฒ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค.
์ํ ์ฝ๋๋ ์ ์ ์ด์ง ์์ง๋ง ๋ค์ํ ์์ธ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ์ด ๊ฒฝ์ฐ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํน์ Response์ ์ฌ์ฉํ ์ ์์ต๋๋ค ( @Res()
๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์ฃผ์
) (๋๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ ์์ธ ๋ฐ์).
์ปค์คํ
์๋ต ํค๋๋ฅผ ์ง์ ํ๊ธฐ ์ํด @Header()
๋ฐ์ฝ๋ ์ดํฐ ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํน์ ์๋ต ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๊ณ res.header()
๋ฅผ ์ง์ ํธ์ถ ํ ์ ์์ต๋๋ค.
์ ์ ๊ฒฝ๋ก๊ฐ์๋ ๊ฒฝ๋ก๋ ์์ฒญ์ ์ผ๋ถ๋ก ๋์ ๋ฐ์ดํฐ๋ฅผ ์๋ฝํด์ผํ๋ ๊ฒฝ์ฐ ์๋ํ์ง ์์ต๋๋ค (์: GET /cats/1)
๋ฅผ ์ฌ์ฉํ์ฌ ID๊ฐ 1
์ธ Cat์ ๊ฐ์ ธ์ต๋๋ค. ๋งค๊ฐ ๋ณ์๋ก ๊ฒฝ๋ก๋ฅผ ์ ์ํ๊ธฐ ์ํด ๋ผ์ฐํธ ๊ฒฝ๋ก์ ๊ฒฝ๋ก ๋งค๊ฐ ๋ณ์ ํ ํฐ์ ์ถ๊ฐํ์ฌ ์์ฒญ URL์ ํด๋น ์์น์์ ๋์ ๊ฐ์ ์บก์ฒ ํ ์ ์์ต๋๋ค. ์๋์ @Get()
๋ฐ์ฝ๋ ์ดํฐ ์์ ์์ ๊ฒฝ๋ก ๋งค๊ฐ ๋ณ์ ํ ํฐ์ ์ด ์ฌ์ฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. ์ด ๋ฐฉ๋ฒ์ผ๋ก ์ ์ธ ๋ ๊ฒฝ๋ก ๋งค๊ฐ ๋ณ์๋ ๋ฉ์๋ ์๋ช
์ ์ถ๊ฐ๋์ด์ผ ํ๋ @Param()
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ก์ธ์ค ํ ์ ์์ต๋๋ค.
@Param()
์ ๋ฉ์๋ ๋งค๊ฐ ๋ณ์ (์์ ์์ ์์ params
)๋ฅผ ์ฅ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ route ๋งค๊ฐ ๋ณ์๋ฅผ ๋ฉ์๋ ๋ณธ๋ฌธ ๋ด์์ ์ฅ์ ๋ ๋ฉ์๋ ๋งค๊ฐ ๋ณ์์ ํน์ฑ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์ ์ฝ๋์์ ์ ์ ์๋ฏ์ด params.id
๋ฅผ ์ฐธ์กฐํ์ฌ id
๋งค๊ฐ ๋ณ์์ ์ก์ธ์ค ํ ์ ์์ต๋๋ค. ํน์ ๋งค๊ฐ ๋ณ์ ํ ํฐ์ ๋ฐ์ฝ๋ ์ดํฐ์ ์ ๋ฌํ ๋ค์ ๋ฉ์๋ ๋ณธ๋ฌธ์์ ์ด๋ฆ์ผ๋ก ์ง์ ๊ฒฝ๋ก ๋งค๊ฐ ๋ณ์๋ฅผ ์ฐธ์กฐ ํ ์๋ ์์ต๋๋ค.
๊ฒฝ๋ก ๋ฑ๋ก ์์ (๊ฐ ๊ฒฝ๋ก์ ๋ฐฉ๋ฒ์ด ํด๋์ค์ ํ์๋๋ ์์)๊ฐ ์ค์ํฉ๋๋ค. ์๋ณ์ (cats/:id
)๋ก Cat๋ฅผ ๋ฐํํ๋ ๊ฒฝ๋ก๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๋ชจ๋ cats๋ฅผ ํ ๋ฒ์ (cats
) ๋ฆฌํดํ๋ ํด๋์ค ์ ์์์ ๋ค๋ฅธ ์๋ ํฌ์ธํธ๋ฅผ ์๋์ ๋ฑ๋กํ๋ฉด , GET /cats
์์ฒญ์ ๋ชจ๋ ๊ฒฝ๋ก ๋งค๊ฐ ๋ณ์๊ฐ ์ ํ์ ์ด๋ฏ๋ก ์ํ๋ ๋ ๋ฒ์งธ ํธ๋ค๋ฌ์ ์ ๋ ๋๋ฌํ์ง ์์ต๋๋ค. ๋ค์ ์๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์ด๋ฌํ ๋ถ์์ฉ์ ํผํ๋ ค๋ฉด findAll()
์ ์ธ (๋ฐ์ฝ๋ ์ดํฐ ํฌํจ)์ findOne()
์๋ก ์ฎ๊ธฐ์ญ์์ค.
๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ๋ฐฐ๊ฒฝ์ ๊ฐ์ง ์ฌ๋๋ค์ ๊ฒฝ์ฐ Nest์์ ๊ฑฐ์ ๋ชจ๋ ๊ฒ์ด ๋ค์ด์ค๋ ์์ฒญ์์ ๊ณต์ ๋๋ค๋ ๊ฒ์ ๋ฐฐ์ฐ๋ ๊ฒ์ ์์์น ๋ชปํ ์ผ์ ๋๋ค. ์ฐ๋ฆฌ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ฐ๊ฒฐ ํ, ์ ์ญ ์ํ๋ฅผ ๊ฐ์ง ์ฑ๊ธ ํค ์๋น์ค ๋ฑ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. Node.js๋ ๋ชจ๋ ์์ฒญ์ด ๋ณ๋์ ์ค๋ ๋์ ์ํด ์ฒ๋ฆฌ๋๋ ์์ฒญ/์๋ต ๋ค์ค ์ค๋ ๋ ์ํ ๋น ์ ์ฅ ๋ชจ๋ธ์ ๋ฐ๋ฅด์ง ์์ต๋๋ค. ๋ฐ๋ผ์ ์ฑ๊ธ ํค ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ํฉ๋๋ค.
๊ทธ๋ฌ๋ ์ปจํธ๋กค๋ฌ์ ์์ฒญ ๊ธฐ๋ฐ ์๋ช ์ด ์ํ๋ ๋์, ์๋ฅผ ๋ค์ด GraphQL ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฒญ ๋ณ ์บ์ฑ, ์์ฒญ ์ถ์ ๋๋ ๋ค์ค ํ ๋์๊ฐ ๋ ์์๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ฌ๊ธฐ ๋ฒ์๋ฅผ ์ ์ดํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด์ญ์์ค.
์ฐ๋ฆฌ๋ ํ๋ JavaScript๋ฅผ ์ข์ํ๋ฉฐ ๋ฐ์ดํฐ ์ถ์ถ์ด ๋๋ถ๋ถ ๋น๋๊ธฐ๋ผ๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. ์ด๊ฒ์ด Nest๊ฐ async
๊ธฐ๋ฅ์ ์ง์ํ๊ณ ์ ์๋ํ๋ ์ด์ ์
๋๋ค.
info ํํธ
async / await
๊ธฐ๋ฅ์ ๋ํด ์์ธํ ์์๋ณด๊ธฐ ์ฌ๊ธฐ
๋ชจ๋ ๋น๋๊ธฐ ํจ์๋ Promise
๋ฅผ ๋ฐํํด์ผ ํฉ๋๋ค. ์ฆ, Nest๊ฐ ์์ฒด์ ์ผ๋ก ํด๊ฒฐํ ์ ์๋ ์ง์ฐ๋ ๊ฐ์ ๋ฆฌํด ํ ์ ์์ต๋๋ค. ์ด๊ฒ์ ์๋ฅผ ๋ณด๊ฒ ์ต๋๋ค:
์์ ์ฝ๋๋ ์์ ํ ์ ํจํฉ๋๋ค. ๋ํ Nest ๊ฒฝ๋ก ์ฒ๋ฆฌ๊ธฐ๋ RxJS ๊ด์ธก ๊ฐ๋ฅํ ์คํธ๋ฆผ์ ๋ฐํํ ์ ์์ด ํจ์ฌ ๊ฐ๋ ฅํฉ๋๋ค. Nest๋ ์๋์ ์์ค๋ฅผ ์๋์ผ๋ก ๊ตฌ๋ ํ๊ณ ๋ง์ง๋ง์ผ๋ก ๋ฐฉ์ถ๋ ๊ฐ์ ์ทจํฉ๋๋ค (์คํธ๋ฆผ์ด ์๋ฃ๋๋ฉด).
์์ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ ๋ชจ๋ ์๋ํ๋ฉฐ ์๊ตฌ ์ฌํญ์ ๋ง๋ ๊ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
POST ๊ฒฝ๋ก ์ฒ๋ฆฌ๊ธฐ์ ์ด์ ์์์๋ ํด๋ผ์ด์ธํธ ๋งค๊ฐ ๋ณ์๋ฅผ ํ์ฉํ์ง ์์์ต๋๋ค. ์ฌ๊ธฐ์ @Body()
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ถ๊ฐํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ฒ ์ต๋๋ค.
๊ทธ๋ฌ๋ ๋จผ์ (TypeScript๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ) DTO (๋ฐ์ดํฐ ์ ์ก ๊ฐ์ฒด) ์คํค๋ง๋ฅผ ๊ฒฐ์ ํด์ผ ํฉ๋๋ค. DTO๋ ๋คํธ์ํฌ๋ฅผ ํตํด ๋ฐ์ดํฐ๊ฐ ์ ์ก๋๋ ๋ฐฉ์์ ์ ์ํ๋ ๊ฐ์ฒด์ ๋๋ค. TypeScript ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๊ฐ๋จํ ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ DTO ์คํค๋ง๋ฅผ ๊ฒฐ์ ํ ์ ์์ต๋๋ค. ํฅ๋ฏธ๋กญ๊ฒ๋ ์ฌ๊ธฐ์ ํด๋์ค ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค. ์? ํด๋์ค๋ JavaScript ES6 ํ์ค์ ์ผ๋ถ์ด๋ฏ๋ก ์ปดํ์ผ ๋ JavaScript์์ ์ค์ ์ํฐํฐ๋ก ์ ์ง๋ฉ๋๋ค. ๋ฐ๋ฉด, ๋ณํ ๊ณผ์ ์์ TypeScript ์ธํฐํ์ด์ค๊ฐ ์ ๊ฑฐ๋๋ฏ๋ก Nest๋ ๋ฐํ์์ ์ธํฐํ์ด์ค๋ฅผ ์ฐธ์กฐ ํ ์ ์์ต๋๋ค. ํ์ดํ ์ ๊ฐ์ ๊ธฐ๋ฅ์ ๋ฐํ์์ ๋ณ์์ ๋ฉํ ํ์ ์ ์ก์ธ์ค ํ ๋ ์ถ๊ฐ ๊ฐ๋ฅ์ฑ์ ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ ๋๋ฌธ์ ์ค์ํฉ๋๋ค.
CreateCatDto
ํด๋์ค๋ฅผ ๋ง๋ค์ด ๋ด
์๋ค :
์ธ ๊ฐ์ง ๊ธฐ๋ณธ ์์ฑ๋ง ์์ต๋๋ค. ๊ทธ ํ์ ์ฐ๋ฆฌ๋ CatsController
์์์ ์๋ก ์์ฑ๋ DTO๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค:
์ค๋ฅ ์ฒ๋ฆฌ (์: ์์ธ ์์ ) ์ฌ๊ธฐ์ ๋ํ ๋ณ๋์ ์ฅ์ด ์์ต๋๋ค.
์๋๋ ์ฌ์ฉ ๊ฐ๋ฅํ ์ฌ๋ฌ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ ์ปจํธ๋กค๋ฌ๋ฅผ ๋ง๋๋ ์์ ๋๋ค. ์ด ์ปจํธ๋กค๋ฌ๋ ๋ด๋ถ ๋ฐ์ดํฐ์ ์ก์ธ์คํ๊ณ ์กฐ์ํ๋ ๋ช ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
์์ ์ปจํธ๋กค๋ฌ๊ฐ ์์ ํ ์ ์๋ ์ํ์์ Nest๋ ์ฌ์ ํ CatsController
๊ฐ ์กด์ฌํ๋ค๋ ๊ฒ์ ์์ง ๋ชปํ๋ฏ๋ก ๊ฒฐ๊ณผ์ ์ผ๋ก ์ด ํด๋์ค์ ์ธ์คํด์ค๋ฅผ ๋ง๋ค์ง ์์ต๋๋ค.
์ปจํธ๋กค๋ฌ๋ ํญ์ ๋ชจ๋์ ์ํ๋ฏ๋ก @Module()
๋ฐ์ฝ๋ ์ดํฐ ๋ด์ ์ปจํธ๋กค๋ฌ
๋ฐฐ์ด์ ํฌํจ์ํต๋๋ค. ๋ฃจํธAppModule
์ ์ ์ธํ ๋ค๋ฅธ ๋ชจ๋์ ์์ง ์ ์ํ์ง ์์์ผ๋ฏ๋ก ์ด๋ฅผ ์ฌ์ฉํ์ฌ CatsController
๋ฅผ ์๊ฐํฉ๋๋ค.
์ฐ๋ฆฌ๋@Module()
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ํด๋์ค์ ์ฒจ๋ถํ์ผ๋ฉฐ Nest๋ ์ด์ ์ด๋ค ์ปจํธ๋กค๋ฌ๋ฅผ ๋ง์ดํธํด์ผ ํ๋์ง ์ฝ๊ฒ ๋ฐ์ ํ ์ ์์ต๋๋ค.
์ง๊ธ๊น์ง ์ฐ๋ฆฌ๋ Nest ํ์ค ์๋ต ์กฐ์ ๋ฐฉ๋ฒ์ ๋ํด ์ค๋ช
ํ์ต๋๋ค. ์๋ต์ ์กฐ์ํ๋ ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ณ ์๋ต ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. ํน์ ์๋ต ๊ฐ์ฒด๋ฅผ ์ฃผ์
ํ๋ ค๋ฉด @Res()
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. ์ฐจ์ด์ ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด CatsController
๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ค์ ์์ฑํด ๋ด
์๋ค :
์ด ๋ฐฉ๋ฒ์ ํจ๊ณผ๊ฐ ์์ผ๋ฉฐ ์ค์ ๋ก ์๋ต ๊ฐ์ฒด (ํค๋ ์กฐ์, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ณ ๊ธฐ๋ฅ ๋ฑ)๋ฅผ ์๋ฒฝํ๊ฒ ์ ์ดํ์ฌ ๋ ๋ง์ ์ ์ฐ์ฑ์ ํ์ฉํ์ง๋ง ์ฃผ์ํด์ ์ฌ์ฉํด์ผํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ด ์ ๊ทผ ๋ฐฉ์์ ํจ์ฌ ๋ ๋ช
ํํ๋ฉฐ ๋ช ๊ฐ์ง ๋จ์ ์ด ์์ต๋๋ค. ์ฃผ์ ๋จ์ ์ ์ธํฐ์
ํฐ ๋ฐ @HttpCode()
๋ฐ์ฝ๋ ์ดํฐ์ ๊ฐ์ Nest ํ์ค ์๋ต ์ฒ๋ฆฌ์ ์์กดํ๋ Nest ๊ธฐ๋ฅ๊ณผ์ ํธํ์ฑ์ด ์์ค๋๋ค๋ ๊ฒ์
๋๋ค. ๋ํ ์ฝ๋๋ ํ๋ซํผ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ฉฐ (๊ธฐ๋ณธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์๋ต ๊ฐ์ฒด์ ๋ํด ๋ค๋ฅธ API๋ฅผ ๊ฐ์ง ์ ์์) ํ
์คํธํ๊ธฐ๊ฐ ๋ ์ด๋ ต์ต๋๋ค (์๋ต ๊ฐ์ฒด๋ฅผ ์์ฌ์ผ ํจ).
๊ฒฐ๊ณผ์ ์ผ๋ก ๊ฐ๋ฅํ ๊ฒฝ์ฐ Nest ํ์ค ์ ๊ทผ ๋ฐฉ์์ด ํญ์ ์ ํธ๋ฉ๋๋ค.
ํ์ค (๊ถ์ฅ)
์ด ๋ด์ฅ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒญ ํธ๋ค๋ฌ๊ฐ JavaScript ์ค๋ธ์ ํธ ๋๋ ๋ฐฐ์ด์ ๋ฆฌํดํ๋ฉด ์๋์ผ๋ก JSON์ผ๋ก ์ง๋ ฌํ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ฌธ์์ด์ ๋ฐํํ๋ฉด Nest๋ ์๋ํ์ง ์๊ณ ๋ฌธ์์ด ๋ง ๋ณด๋
๋๋ค. ์ง๋ ฌํํ์ญ์์ค. ๋ฐ๋ผ์ ์๋ต ์ฒ๋ฆฌ๊ฐ ๊ฐ๋จ ํด์ง๋๋ค. ๊ฐ์ ๋ฐํํ๋ฉด Nest๊ฐ ๋๋จธ์ง๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. ๋ํ 201์ ์ฌ์ฉํ๋ POST ์์ฒญ์ ์ ์ธํ๊ณ ์๋ต์ Status code๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํญ์ 200์
๋๋ค. @HttpCode(...)
ํธ๋ค๋ฌ ์์ค์ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ถ๊ฐํ์ฌ์ด ๋์์ ์ฝ๊ฒ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. (Status codes๋ฅผ ๋ณด์ธ์).
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ณ ์ต์
๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ณ (์: Express) ์๋ต ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฉ์๋ ํธ๋ค๋ฌ ์๋ช
์ @Res()
๋ฐ์ฝ๋ ์ดํฐ (์: findAll(@Res() response)
)๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ์
ํ ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ํด๋น ๊ฐ์ฒด์ ์ํด ๋
ธ์ถ๋ ๊ธฐ๋ณธ ์๋ต ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค (๋ฐ ์ฑ
์). ์๋ฅผ ๋ค์ด Express๋ฅผ ์ฌ์ฉํ๋ฉด response.status(200).send ()
์ ๊ฐ์ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ์๋ต์ ๊ตฌ์ฑ ํ ์ ์์ต๋๋ค.
@Request()
req
@Response()
res
*
@Next()
next
@Session()
req.session
@Param(key?: string)
req.params
/ req.params[key]
@Body(key?: string)
req.body
/ req.body[key]
@Query(key?: string)
req.query
/ req.query[key]
@Headers(name?: string)
req.headers
/ req.headers[name]