Pipes
Pipes
ํ์ดํ๋ @Injectable()
๋ฐ์ฝ๋ ์ดํฐ๋ก ์ฃผ์์ด ๋ฌ๋ฆฐ ํด๋์ค์
๋๋ค. ํ์ดํ๋ PipeTransform
์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผ ํฉ๋๋ค.

ํ์ดํ์๋ ๋ ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์์ต๋๋ค.
transformation: ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ํ๋ ์ถ๋ ฅ์ผ๋ก ๋ณํ
validation: ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ํ๊ฐํ๊ณ ์ ํจํ๋ค๋ฉด ๋ณ๊ฒฝ์์ด ๊ทธ๋๋ก ์ ๋ฌํ์ญ์์ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋ฐ์ดํฐ๊ฐ ์ ํํ์ง ์์ ๋ ์์ธ๋ฅผ ๋์ง๋๋ค
๋ ๊ฒฝ์ฐ ๋ชจ๋ ํ์ดํ๋ ์ปจํธ๋กค๋ฌ ๊ฒฝ๋ก ์ฒ๋ฆฌ๊ธฐ์ ์ํด ์ฒ๋ฆฌ๋๋ ์ธ์
์์ ์๋ํฉ๋๋ค. Nest๋ ๋ฉ์๋๊ฐ ํธ์ถ๋๊ธฐ ์ง์ ์ ํ์ดํ๋ฅผ ์ฝ์
ํ๊ณ ํ์ดํ๋ ๋ฉ์๋๋ก ํฅํ๋ ์ธ์๋ฅผ ์์ ํฉ๋๋ค. ์ด ์์ ์์ ๋ชจ๋ ๋ณํ ๋๋ ์ ํจ์ฑ ๊ฒ์ฌ ์์
์ด ์ํ ๋ ํ (์ ์ฌ์ ์ผ๋ก) ๋ณํ ๋ ์ธ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฝ๋ก ์ฒ๋ฆฌ๊ธฐ๊ฐ ํธ์ถ๋ฉ๋๋ค.
info ํํธ ํ์ดํ๋ ์์ธ ์์ญ ๋ด์์ ์๋ํฉ๋๋ค. ์ด๊ฒ์ ํ์ดํ๊ฐ ์์ธ๋ฅผ ๋์ง ๋ ์์ธ ๊ณ์ธต (์ ์ญ ์์ธ ํํฐ ๋ฐ ํ์ฌ ์ปจํ ์คํธ์ ์ ์ฉ๋๋ ์์ธ ํํฐ์ ์ํด ์ฒ๋ฆฌ๋จ์ ์๋ฏธํฉ๋๋ค. ์์ ๊ฐ์ด ํ์ดํ์์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ์ดํ์ ์ปจํธ๋กค๋ฌ ๋ฉ์๋๊ฐ ์คํ๋์ง ์์ต๋๋ค.
Built-in pipes
Nest์๋ ์ฆ์ ์ฌ์ฉ ๊ฐ๋ฅํ 3 ๊ฐ์ง ํ์ดํ (ValidationPipe), ParseIntPipe ๋ฐ ParseUUIDPipe๊ฐ ์์ต๋๋ค. ๊ทธ๊ฒ๋ค์ @nestjs/common
ํจํค์ง์์ ๋ด๋ณด๋ด์ง๋๋ค. ๊ทธ๋ค์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ๋ ์ ์ดํดํ๊ธฐ ์ํด ์ฒ์๋ถํฐ ๋ค์ ๋ง๋ค์ด ๋ด
์๋ค.
ValidationPipe
๋ถํฐ ์์ํ๊ฒ ์ต๋๋ค. ์ฒ์์๋ ๋จ์ํ ์
๋ ฅ ๊ฐ์ ๊ฐ์ ธ ์์ ๋์ผ ๊ธฐ๋ฅ์ผ๋ก ๋์ํ๋ ๊ฐ์ ๊ฐ์ ์ฆ์ ๋ฐํํฉ๋๋ค.
info ํํธ
PipeTransform <T, R>
์T
๊ฐ ์ ๋ ฅvalue
์ ์ ํ์ ๋ํ๋ด๊ณR
์transform()
๋ฉ์๋์ ๋ฆฌํด ์ ํ์ ๋ํ๋ด๋ ์ผ๋ฐ ์ธํฐํ์ด์ค์ ๋๋ค.
๋ชจ๋ ํ์ดํ๋ transform()
๋ฉ์๋๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค. ์ด ๋ฐฉ๋ฒ์๋ ๋ ๊ฐ์ง ๋งค๊ฐ ๋ณ์๊ฐ ์์ต๋๋ค.
value
metadata
value
๋ ํ์ฌ ์ฒ๋ฆฌ ๋ ์ธ์ (๋ผ์ฐํธ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ์ํด ์์ ๋๊ธฐ ์ ์)์ด๋ฉฐ metadata
๋ ๋ฉํ ๋ฐ์ดํฐ์
๋๋ค. ๋ฉํ ๋ฐ์ดํฐ ๊ฐ์ฒด์๋ ๋ค์๊ณผ ๊ฐ์ ์์ฑ์ด ์์ต๋๋ค.
์ด๋ฌํ ์์ฑ์ ํ์ฌ ์ฒ๋ฆฌ ๋ ์ธ์๋ฅผ ์ค๋ช ํฉ๋๋ค.
type
์ธ์๊ฐ body @Body()
, query @Query()
, param @Param()
๋๋ ์ฌ์ฉ์ ์ ์ ๋งค๊ฐ ๋ณ์์ธ์ง ์ฌ๋ถ๋ฅผ ๋ํ๋
๋๋ค (์ฌ๊ธฐ์์ ์์ธํ ์์๋ณด์ญ์์ค).
metatype
์ธ์์ ๋ฉํ ํ์
(์: String
)์ ์ ๊ณตํฉ๋๋ค. ์ฐธ๊ณ : ๋ผ์ฐํธ ํธ๋ค๋ฌ ๋ฉ์๋ ์๋ช
์์ ์ ํ ์ ์ธ์ ์๋ตํ๊ฑฐ๋ ๋ฐ๋๋ผ JavaScript๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ฐ์ undefined
์
๋๋ค.
data
๋ฌธ์์ด์ด ๋ฐ์ฝ๋ ์ดํฐ์ ์ ๋ฌ๋์์ต๋๋ค (์: @Body('string')
). ๋ฐ์ฝ๋ ์ดํฐ ๊ดํธ๋ฅผ ๋น์๋๋ฉด ์ ์๋์ง ์์ต๋๋ค(undefined)
.
warning ๊ฒฝ๊ณ ๋ณํ ์ค์ TypeScript ์ธํฐํ์ด์ค๊ฐ ์ฌ๋ผ์ง๋๋ค. ๋ฐ๋ผ์ ๋ฉ์๋ ๋งค๊ฐ ๋ณ์์ ์ ํ์ด ํด๋์ค ๋์ ์ธํฐํ์ด์ค๋ก ์ ์ธ๋๋ฉด
metatype
๊ฐ์Object
๊ฐ๋ฉ๋๋ค.
Validation use case
CatsController
์ create()
๋ฉ์๋๋ฅผ ์์ธํ ์ดํด ๋ณด์.
createCatDto
๋ณธ๋ฌธ ๋งค๊ฐ ๋ณ์์ ์ด์ ์ ๋ง์ถ๊ฒ ์ต๋๋ค. ์ ํ์ CreateCatDto
์
๋๋ค.
create ๋ฉ์๋๋ก ๋ค์ด์ค๋ ๋ชจ๋ ์์ฒญ์ ์ ํจํ ๋ณธ๋ฌธ์ด ํฌํจ๋๋๋ก ํฉ๋๋ค. ๋ฐ๋ผ์ createCatDto ๊ฐ์ฒด์ ์ธ ๋ฉค๋ฒ๋ฅผ ํ์ธํด์ผํฉ๋๋ค. ๋ผ์ฐํธ ํธ๋ค๋ฌ ๋ฉ์๋ ๋ด์์ ์ด๋ฅผ ์ํ ํ ์ ์์ง๋ง SRP (๋จ์ผ ์ฑ ์ ๊ท์น)๋ฅผ ์๋ฐํฉ๋๋ค. ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ์ ํจ์ฑ ๊ฒ์ฌ ํด๋์ค๋ฅผ ์์ฑํ๊ณ ๊ฑฐ๊ธฐ์์ ์์ ์ ์์ํ๋ ๊ฒ์ด์ง๋ง ๊ฐ ๋ฐฉ๋ฒ์ ์์ ๋ถ๋ถ์์ ์ด ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค. ์ ํจ์ฑ ๊ฒ์ฆ ๋ฏธ๋ค์จ์ด๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ด๋ป์ต๋๊น? ์ด ๋ฐฉ๋ฒ์ ์ข์ ์์ด๋์ด์ผ ์ ์์ง๋ง ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ ์์๋ ์ผ๋ฐ ๋ฏธ๋ค์จ์ด๋ฅผ ์์ฑ ํ ์๋ ์์ต๋๋ค (๋ฏธ๋ค์จ์ด๋ ํธ์ถ๋ ํธ๋ค๋ฌ ๋ฐ ๊ทธ ๋งค๊ฐ ๋ณ์ ์ค ํ๋).
์ด๊ฒ์ ํ์ดํ์ ์ด์์ ์ธ ๊ฒฝ์ฐ ์ธ ๊ฒ์ผ๋ก ํ๋ช ๋์์ต๋๋ค. ๊ณ์ํด์ ํ๋ ๋ง๋ค์ด ๋ด ์๋ค.
Object schema validation
๊ฐ์ฒด ์ ํจ์ฑ ๊ฒ์ฌ์ ์ฌ์ฉํ ์์๋ ๋ช ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ํ ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ์คํค๋ง ๊ธฐ๋ฐ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. Joi ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ์ ์ ์๋ API๋ฅผ ์ฌ์ฉํ์ฌ ๋งค์ฐ ๊ฐ๋จํ ๋ฐฉ์์ผ๋ก ์คํค๋ง๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. Joi ๊ธฐ๋ฐ ์คํค๋ง๋ฅผ ์ฌ์ฉํ๋ ํ์ดํ๋ฅผ ์ดํด ๋ณด๊ฒ ์ต๋๋ค.
ํ์ํ ํจํค์ง๋ฅผ ์ค์นํ์ฌ ์์ํ์ญ์์ค.
์๋ ์ฝ๋ ์ํ์์ ์คํค๋ง๋ฅผ ์์ฑ์
์ธ์๋ก ์ทจํ๋ ๊ฐ๋จํ ํด๋์ค๋ฅผ ๋ง๋ญ๋๋ค. ๊ทธ๋ฐ ๋ค์ Joi.validate()
๋ฉ์๋๋ฅผ ์ ์ฉํ๋ฉด ์ ๊ณต๋ ์คํค๋ง์ ๋ํด ๋ค์ด์ค๋ ์ธ์์ ์ ํจ์ฑ์ ๊ฒ์ฌํฉ๋๋ค.
์์์ ์ธ๊ธํ๋ฏ์ด ์ ํจ ํ์ดํ(Validation Pipe)๋ ๊ฐ์ ๋ณ๊ฒฝํ์ง ์๊ณ ๋ฐํํ๊ฑฐ๋ ์์ธ๋ฅผ ๋ฐ์์ํต๋๋ค.
๋ค์ ์น์
์์๋ @UsePipes()
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ฃผ์ด์ง ์ปจํธ๋กค๋ฌ ๋ฉ์๋์ ์ ์ ํ ์คํค๋ง๋ฅผ ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ ์ดํด ๋ด
๋๋ค.
Binding pipes
ํ์ดํ๋ฅผ ๋ฐ์ธ๋ฉ (์ ์ ํ ์ปจํธ๋กค๋ฌ ๋ ํธ๋ค๋ฌ์ ์ฐ๊ฒฐ)ํ๋ ๊ฒ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค. ์ฐ๋ฆฌ๋ @UsePipes()
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ณ ํ์ดํ ์ธ์คํด์ค๋ฅผ ์์ฑํ์ฌ Joi ์ ํจ์ฑ ๊ฒ์ฌ ์คํค๋ง๋ฅผ ์ ๋ฌํฉ๋๋ค.
Class validator
warning ๊ฒฝ๊ณ ์ด ์น์ ์ ๊ธฐ์ ์๋ TypeScript๊ฐ ํ์ํ๋ฉฐ ์ฑ์ด vanilla JavaScript๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋ ๊ฒฝ์ฐ์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๊ฒ์ฆ ๊ธฐ์ ์ ๋์ฒด ๊ตฌํ์ ์ดํด ๋ด ๋๋ค.
Nest๋ class-validator ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ์๋ํฉ๋๋ค. ์ด ๋๋ผ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ฝ๋ ์ดํฐ ๊ธฐ๋ฐ ๊ฒ์ฆ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฐ์ฝ๋ ์ดํฐ ๊ธฐ๋ฐ ๊ฒ์ฆ์ ์ฒ๋ฆฌ๋ ์์ฑ์ ๋ฉํ ํ์
(metatype)
์ ์ก์ธ์คํ ์ ์๊ธฐ ๋๋ฌธ์ ํนํ Nest์ ํ์ดํ ๊ธฐ๋ฅ๊ณผ ๊ฒฐํฉ๋ ๋ ๋งค์ฐ ๊ฐ๋ ฅํฉ๋๋ค. ์์ํ๊ธฐ ์ ์ ํ์ํ ํจํค์ง๋ฅผ ์ค์นํด์ผํฉ๋๋ค.
์ด๊ฒ๋ค์ด ์ค์น๋๋ฉด, CreateCatDto
ํด๋์ค์ ๋ฐ์ฝ๋ ์ดํฐ ๋ช ๊ฐ๋ฅผ ์ถ๊ฐ ํ ์ ์์ต๋๋ค.
Info ํํธ ํด๋์ค ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ ๋ฐ์ฝ๋ ์ดํฐ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
์ด์ ValidationPipe
ํด๋์ค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
warning ์๋ฆผ ์์์, ์ฐ๋ฆฌ๋ class-transformer ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ต๋๋ค. class-validator ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋์ผํ ์ ์์ ์ํด ๋ง๋ค์ด ์ก์ผ๋ฏ๋ก ๊ฒฐ๊ณผ์ ์ผ๋ก ๋งค์ฐ ์ ์๋ํฉ๋๋ค.
์ด ์ฝ๋๋ฅผ ์ดํด ๋ณด๊ฒ ์ต๋๋ค. ๋จผ์ , transform()
ํจ์๋ async
์
๋๋ค. Nest๋ ๋๊ธฐ์ ํ์ดํ์ ๋น๋๊ธฐ์ ํ์ดํ๋ฅผ ๋ชจ๋ ์ง์ํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํฉ๋๋ค. ์ฐ๋ฆฌ๋ ํด๋์ค ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ ์ ํจ์ฑ ๊ฒ์ฌ ์ค ์ผ๋ถ๊ฐ ๋น๋๊ธฐ ์ผ ์ ์๊ธฐ ๋๋ฌธ (์ฝ์ ํ์ฉ)์ ์ด๋ฅผ ์ํํฉ๋๋ค.
๋ค์์ผ๋ก ์ฐ๋ฆฌ๋ ๋ฉํ ํ์
ํ๋ (ArgumentMetadata
์์ ์ด ๋ฉค๋ฒ๋ฅผ ์ถ์ถ)๋ฅผ metatype
ํ๋ผ๋ฏธํฐ๋ก ์ถ์ถํ๊ธฐ ์ํด ๊ตฌ์กฐ ์กฐ์ ์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ด๊ฒ์ ์์ ํ ArgumentMetadata
๋ฅผ ์ป์ ๋ค์ ๋ฉํ ํ์
๋ณ์๋ฅผ ํ ๋นํ๊ธฐ ์ํ ์ถ๊ฐ ๋ช
๋ น๋ฌธ์ ๊ฐ๋ ๊ฒ์ ๋ํ ๊ฐ๋จํ ์ค๋ช
์
๋๋ค.
๋ค์์ผ๋ก ํฌํผ ํจ์ toValidate()
์ ์ฃผ๋ชฉํ์ญ์์ค. ์ฒ๋ฆฌ์ค์ธ ํ์ฌ ์ธ์๊ฐ ๊ธฐ๋ณธ JavaScript ์ ํ์ธ ๊ฒฝ์ฐ ์ ํจ์ฑ ๊ฒ์ฆ ๋จ๊ณ๋ฅผ ์๋ตํด์ผ ํฉ๋๋ค (์คํค๋ง๋ฅผ ์ฒจ๋ถ ํ ์ ์์ผ๋ฏ๋ก ์ ํจ์ฑ ๊ฒ์ฆ ๋จ๊ณ๋ฅผ ํตํด ์คํค๋ง๋ฅผ ์คํํ ์ด์ ๊ฐ ์์ต๋๋ค).
๋ค์์ผ๋ก ํด๋์ค ๋ณํ๊ธฐ ํจ์ plainToClass()
๋ฅผ ์ฌ์ฉํ์ฌ ์ผ๋ฐ JavaScript ์ธ์ ๊ฐ์ฒด๋ฅผ ์ ํ์ด ์ง์ ๋ ๊ฐ์ฒด๋ก ๋ณํํ์ฌ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ ์ฉ ํ ์ ์์ต๋๋ค. ๋คํธ์ํฌ ์์ฒญ์์ ์ญ ์ง๋ ฌํ๋๋ ์์ ๋ณธ๋ฌธ์๋ ์ ํ ์ ๋ณด๊ฐ ์์ต๋๋ค. ํด๋์ค ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ๋ ์ด์ ์ DTO์ ๋ํด ์ ์ํ ์ ํจ์ฑ ๊ฒ์ฌ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํด์ผ ํ๋ฏ๋ก ์ด ๋ณํ์ ์ํํด์ผ ํฉ๋๋ค.
๋ง์ง๋ง์ผ๋ก ์์์ ์ธ๊ธํ๋ฏ์ด ์ ํจ ํ์ดํ(Validation Pipe)์ด๋ฏ๋ก ๋ณ๊ฒฝ๋์ง ์์ ๊ฐ์ ๋ฐํํ๊ฑฐ๋ ์์ธ๋ฅผ ๋ฐ์์ํต๋๋ค.
๋ง์ง๋ง ๋จ๊ณ๋ ValidationPipe
๋ฅผ ๋ฐ์ธ๋ฉํ๋ ๊ฒ์
๋๋ค. ์์ธ ํํฐ์ ์ ์ฌํ ํ์ดํ๋ ๋ถ์๋ฒ ๋ฒ์, ์ปจํธ๋กค๋ฌ ๋ฒ์ ๋๋ ์ ์ญ ๋ฒ์์ผ ์ ์์ต๋๋ค. ๋ํ ํ์ดํ๋ฅผ ๋งค๊ฐ ๋ณ์ ๋ฒ์๋ก ์ง์ ํ ์ ์์ต๋๋ค. ์๋ ์์์ ํ์ดํ ์ธ์คํด์ค๋ฅผ ๊ฒฝ๋ก ๋งค๊ฐ ๋ณ์ @Body()
๋ฐ์ฝ๋ ์ดํฐ์ ์ง์ ์ฐ๊ฒฐํฉ๋๋ค.
๋งค๊ฐ ๋ณ์ ๋ฒ์ ํ์ดํ๋ ์ ํจ์ฑ ๊ฒ์ฆ ๋ก์ง์ด ํ๋์ ์ง์ ๋ ๋งค๊ฐ ๋ณ์์๋ง ๊ด๋ จ๋ ๋ ์ ์ฉํฉ๋๋ค.
๋๋ ๋ฉ์๋ ๋ ๋ฒจ์์ ํ์ดํ๋ฅผ ์ค์ ํ๋ ค๋ฉด @UsePipes()
๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ญ์์ค.
info ํํธ
@UsePipes()
๋ฐ์ฝ๋ ์ดํฐ๋@nestjs/common
ํจํค์ง์์ ๊ฐ์ ธ์ต๋๋ค.
์์ ์์์ ValidationPipe
์ธ์คํด์ค๊ฐ ์ฆ์ ์์ฑ๋์์ต๋๋ค. ๋๋ ํด๋์ค (์ธ์คํด์ค ์๋)๋ฅผ ์ ๋ฌํ์ฌ ์ธ์คํด์คํ๋ฅผ ํ๋ ์ ์ํฌ์ ๋จ๊ฒจ๋๊ณ ์ข
์ ์ฃผ์
์ ํ์ฑํํฉ๋๋ค.
ValidationPipe
๋ ๊ฐ๋ฅํ ํ ์ผ๋ฐ์ ์ผ๋ก ๋ง๋ค์ด ์ก์ผ๋ฏ๋ก ์ ์ฒด ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ชจ๋ ๊ฒฝ๋ก ์ฒ๋ฆฌ๊ธฐ์ ์ ์ฉ๋๋ global-scoped ํ์ดํ๋ก ์ค์ ํด ๋ด
์๋ค.
warning ์๋ฆผ ํ์ด๋ธ๋ฆฌ๋ ์ฑ์ ๊ฒฝ์ฐ
useGlobalPipes()
๋ฉ์๋๋ ๊ฒ์ดํธ์จ์ด ๋ฐ ๋ง์ดํฌ๋ก ์๋น์ค์ ๋ํ ํ์ดํ๋ฅผ ์ค์ ํ์ง ์์ต๋๋ค. "ํ์ค"(ํ์ด๋ธ๋ฆฌ๋๊ฐ ์๋) ๋ง์ดํฌ๋ก ์๋น์ค ์ฑ์ ๊ฒฝ์ฐuseGlobalPipes()
๋ ํ์ดํ๋ฅผ ์ ์ฒด์ ์ผ๋ก ๋ง์ดํธํฉ๋๋ค.
์ ์ญ ํ์ดํ๋ ๋ชจ๋ ์ปจํธ๋กค๋ฌ์ ๋ชจ๋ ๊ฒฝ๋ก ์ฒ๋ฆฌ๊ธฐ์ ๋ํด ์ ์ฒด ์์ฉ ํ๋ก๊ทธ๋จ์์ ์ฌ์ฉ๋ฉ๋๋ค. ์์กด์ฑ ์ฃผ์
์ ๊ด์ ์์, ๋ชจ๋ ์ธ๋ถ์์ ๋ฑ๋ก๋ ์ ์ญ ํ์ดํ (์์ ์์์์ ๊ฐ์ด useGlobalPipes()
๋ก)๋ ๋ชจ๋์ ์ปจํ
์คํธ ๋ฐ์์ ์ํ๋๊ธฐ ๋๋ฌธ์ ์์กด์ฑ์ ์ฃผ์
ํ ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ค์ ๊ตฌ์ฑ์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ๋ชจ๋์์ ์ง์ ๊ธ๋ก๋ฒ ํ์ดํ๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
info ํํธ ํ์ดํ์ ๋ํ ์์กด์ฑ ์ฃผ์ ์ ์ํํ๊ธฐ ์ํด ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ ๋, ์ด ๊ตฌ์ฑ์ด ์ฌ์ฉ๋๋ ๋ชจ๋์ ๊ด๊ณ์์ด ํ์ดํ๋ ์ค์ ๋ก ๊ธ๋ก๋ฒ์ ๋๋ค. ์ด๋์์ ํด์ผ ํฉ๋๊น? ํ์ดํ (์์ ์์์๋
ValidationPipe
)๊ฐ ์ ์๋ ๋ชจ๋์ ์ ํํ์ญ์์ค. ๋ํ ์ปค์คํ ํ๋ก ๋ฐ์ด๋ ๋ฑ๋ก์ ๋ค๋ฃจ๋ ์ ์ผํ ๋ฐฉ๋ฒ์useClass
๊ฐ ์๋๋๋ค. ์ฌ๊ธฐ์ ๋ํด ์์ธํ ์์๋ณด์ญ์์ค.
Transformation use case
ํ์ดํ(Pipes)์ ์ ์ผํ ์ฌ์ฉ ์ฌ๋ก๋ ์๋๋๋ค. ์ด ์ฅ์ ์์ ๋ถ๋ถ์์ ํ์ดํ๋ ์
๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ํ๋ ์ถ๋ ฅ์ผ๋ก ๋ณํ ํ ์ ์๋ค๊ณ ์ธ๊ธํ์ต๋๋ค. transform
ํจ์์์ ๋ฐํ๋ ๊ฐ์ด ์ธ์์ ์ด์ ๊ฐ์ ์์ ํ ๋ฌด์ํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํฉ๋๋ค. ์ธ์ ์ ์ฉํ๊ฐ์? ๊ฒฝ์ฐ์ ๋ฐ๋ผ ํด๋ผ์ด์ธํธ์์ ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ ๊ฒฝ๋ก ์ฒ๋ฆฌ๊ธฐ ๋ฉ์๋์์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๊ธฐ ์ ์ ๋ฌธ์์ด์ ์ ์๋ก ๋ณํํ๋ ๊ฒ๊ณผ ๊ฐ์ด ์ฝ๊ฐ์ ๋ณ๊ฒฝ์ด ํ์ํฉ๋๋ค. ๋ํ ์ผ๋ถ ํ์ ๋ฐ์ดํฐ ํ๋๊ฐ ๋๋ฝ๋์ด ๊ธฐ๋ณธ๊ฐ์ ์ ์ฉํ๋ ค๊ณ ํฉ๋๋ค. ๋ณํ๊ธฐ ํ์ดํ๋ ํด๋ผ์ด์ธํธ ์์ฒญ๊ณผ ์์ฒญ ํธ๋ค๋ฌ ์ฌ์ด์ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ์ฝ์
ํ์ฌ ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ํ ํ ์ ์์ต๋๋ค.
๋ค์์ ๋ฌธ์์ด์ ์ ์ ๊ฐ์ผ๋ก ๊ตฌ๋ฌธ ๋ถ์ํ๋ ParseIntPipe
์
๋๋ค.
์ด ํ์ดํ๋ฅผ ์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ์ ํํ ๋งค๊ฐ ๋ณ์์ ๊ฐ๋จํ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค.
์ํ๋ ๊ฒฝ์ฐ ๋ฌธ์์ด์ ๊ตฌ๋ฌธ ๋ถ์ํ๊ณ UUID์ธ์ง ํ์ธํ๋ ParseUUIDPipe
๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
info ํํธ
ParseUUIDPipe()
๋ฅผ ์ฌ์ฉํ ๋ ๋ฒ์ 3, 4 ๋๋ 5์์ UUID๋ฅผ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ์ค์ ๋๋ค. ํน์ ๋ฒ์ ์ UUID ๋ง ํ์ํ ๊ฒฝ์ฐ ํ์ดํ ์ต์ ์์ ๋ฒ์ ์ ์ ๋ฌํ ์ ์์ต๋๋ค.
์ด๋ฅผ ์ฌ์ฉํ๋ฉด ์์ฒญ์ด ํด๋น ํธ๋ค๋ฌ์ ๋๋ฌํ๊ธฐ ์ ์ ParseIntPipe
๋๋ ParseUUIDPipe
๊ฐ ์คํ๋์ด id
๋งค๊ฐ ๋ณ์์ ๋ํด ํญ์ ์ฌ์ฉ๋ ํ์ดํ์ ๋ฐ๋ผ ์ ์ ๋๋ uuid๋ฅผ ์์ ํฉ๋๋ค.
๋ ๋ค๋ฅธ ์ ์ฉํ ๊ฒฝ์ฐ๋ id๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๊ธฐ์กด ์ฌ์ฉ์ ์ํฐํฐ๋ฅผ ์ ํํ๋ ๊ฒ์ ๋๋ค.
์ด ํ์ดํ์ ๊ตฌํ์ ๋
์์๊ฒ ๋งก๊ธฐ์ง๋ง ๋ค๋ฅธ ๋ชจ๋ ๋ณํ ํ์ดํ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์
๋ ฅ ๊ฐ (id
)์ ์์ ํ๊ณ ์ถ๋ ฅ ๊ฐ (UserEntity
์ค๋ธ์ ํธ)๋ฅผ ๋ฆฌํดํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ณด์ผ๋ฌ ํ๋ ์ดํธ ์ฝ๋๋ฅผ ์ฒ๋ฆฌ๊ธฐ์์ ์ผ๋ฐ ํ์ดํ๋ก ์ถ์ํํ์ฌ ์ฝ๋๋ฅผ๋ณด๋ค ์ ์ธ์ ์ด๊ณ ๊ฑด์กฐํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
The built-in ValidationPipe
๋คํ์ค๋ฝ๊ฒ๋, ValidationPipe
์ ParseIntPipe
๋ Nest out-of-the-the-box์์ ์ ๊ณต๋๋ฏ๋ก ์ด ํ์ดํ๋ฅผ ์ง์ ๋ง๋ค ํ์๋ ์์ต๋๋ค. ( ValidationPipe
์๋ class-validator
๋ฐ class-transformer
ํจํค์ง๊ฐ ๋ชจ๋ ์ค์น๋์ด ์์ด์ผ ํฉ๋๋ค.)
๋ด์ฅ๋ ValidationPipe
๋ ์ด ์ฅ์์ ๊ตฌ์ถํ ์ํ๋ณด๋ค ๋ ๋ง์ ์ต์
์ ์ ๊ณตํฉ๋๋ค. ์ด ์ต์
์ ํ์ดํ์ ๊ธฐ๋ณธ ๋ฉ์ปค๋์ฆ์ ์ค๋ช
ํ๊ธฐ ์ํด ๊ธฐ๋ณธ์ผ๋ก ์ ์ง๋์์ต๋๋ค. ์ฌ๊ธฐ ์์ ๊ฐ ๋ง์ด ์์ต๋๋ค.
๊ทธ๋ฌํ ์ต์
์ค ํ๋๋ transform
์
๋๋ค. ์ญ ์ง๋ ฌํ๋ ๋ฐ๋ ์ค๋ธ์ ํธ์ ๋ํ ์ด์ ๋
ผ์๋ ๋ฐ๋๋ผ JavaScript ์ค๋ธ์ ํธ (DTO ์ ํ์ด ์์)์
๋๋ค. ์ง๊ธ๊น์ง ํ์ดํ๋ฅผ ์ฌ์ฉํ์ฌ ํ์ด๋ก๋์ ์ ํจ์ฑ์ ๊ฒ์ฌํ์ต๋๋ค. ์ด ๊ณผ์ ์์ ์ฐ๋ฆฌ๋ class-transform
์ ์ฌ์ฉํ์ฌ ํ๋ฒํ ๊ฐ์ฒด๋ฅผ ์ ํ์ด ์ง์ ๋ ๊ฐ์ฒด๋ก ์์ ๋ณํํ์ฌ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํํ ์ ์์์ ์๊ธฐํ ์ ์์ต๋๋ค. ๋ด์ฅ๋ ValidationPipe๋ ์ ํ์ ์ผ๋ก ์ด ๋ณํ ๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ ์๋ ์์ต๋๋ค. ๊ตฌ์ฑ ๊ฐ์ฒด๋ฅผ ํ์ดํ๋ก ์ ๋ฌํ์ฌ ์ด ๋์์ ํ์ฑํํฉ๋๋ค. ์ด ์ต์
์ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ด ๊ฐ์ด true
์ธ transform
ํ๋๊ฐ์๋ ๊ตฌ์ฑ ์ค๋ธ์ ํธ๋ฅผ ์ ๋ฌํ์ญ์์ค.
info ํํธ
ValidationPipe
๋@nestjs/common
ํจํค์ง์์ ๊ฐ์ ธ์ต๋๋ค.
์ด ํ์ดํ๋ class-validator
๋ฐ class-transformer
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฏ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ ์ถ๊ฐ ์ต์
์ด ๋ง์ด ์์ต๋๋ค. ์์ transform
์ต์
๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ํ์ดํ์ ์ ๋ฌ๋ ๊ตฌ์ฑ ๊ฐ์ฒด๋ฅผ ํตํด ์ด๋ฌํ ์ค์ ์ ๊ตฌ์ฑํฉ๋๋ค. ๋ค์์ ๊ธฐ๋ณธ ์ ๊ณต ์ต์
์
๋๋ค.
์ด์ธ์๋ ๋ชจ๋ ํด๋์ค ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ ์ต์ (ValidatorOptions ์ธํฐํ์ด์ค์์ ์ ์๋จ)์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Option
Type
Description
skipMissingProperties
boolean
true๋ก ์ค์ ํ๋ฉด ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ๋ ์ ํจ์ฑ ๊ฒ์ฌ ๊ฐ์ฒด์ ์๋ ๋ชจ๋ ์์ฑ์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ๊ฑด๋ ๋๋๋ค.
whitelist
boolean
true๋ก ์ค์ ํ๋ฉด ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ๋ ์ ํจ์ฑ ๊ฒ์ฌ ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ์ฌ์ฉํ์ง ์๋ ์์ฑ์ ์ ํจ์ฑ ๊ฒ์ฌ (๋ฐํ ๋) ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
forbidNonWhitelisted
boolean
true๋ก ์ค์ ํ๋ฉด ํ์ดํธ๋ฆฌ์คํธ์ ์๋ ์์ฑ์ ์ ๊ฑฐํ๋ ๋์ ์ ํจ์ฑ ๊ฒ์ฌ๊ธฐ๊ฐ ์์ธ๋ฅผ throwํฉ๋๋ค.
forbidUnknownValues
boolean
true๋ก ์ค์ ํ๋ฉด ์ ์ ์๋ ๊ฐ์ฒด์ ์ ํจ์ฑ ๊ฒ์ฌ ์๋๊ฐ ์ฆ์ ์คํจํฉ๋๋ค.
disableErrorMessages
boolean
true๋ก ์ค์ ํ๋ฉด ์ ํจ์ฑ ๊ฒ์ฆ ์ค๋ฅ๊ฐ ํด๋ผ์ด์ธํธ์ ๋ฆฌํด๋์ง ์์ต๋๋ค.
exceptionFactory
Function
๊ฒ์ฆ ์๋ฌ์ ๋ฐฐ์ด์ ์ทจํด, throw๋๋ ์์ธ ๊ฐ์ฒด๋ฅผ ๋๋ ค์ค๋๋ค.
groups
string[]
๊ฐ์ฒด์ ์ ํจ์ฑ์ ๊ฒ์ฌํ๋ ๋์ ์ฌ์ฉํ ๊ทธ๋ฃน์ ๋๋ค.
dismissDefaultMessages
boolean
true๋ก ์ค์ ํ๋ฉด ์ ํจ์ฑ ๊ฒ์ฌ๋ ๊ธฐ๋ณธ ๋ฉ์์ง๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค. ๋ช
์ ์ ์ผ๋ก ์ค์ ๋์ง ์์ ๊ฒฝ์ฐ ์ค๋ฅ ๋ฉ์์ง๋ ํญ์ ์ ์๋์ง ์์ต๋๋ค
.
validationError.target
boolean
ValidationError
์ ๋์์ ๋
ธ์ถํด์ผ ํ๋์ง ์ฌ๋ถ๋ฅผ ๋ํ๋
๋๋ค.
validationError.value
boolean
ValidationError
์ ๊ฒ์ฆ๋ ๊ฐ์ ํ์ํด์ผ ํ๋์ง ์ฌ๋ถ๋ฅผ ๋ํ๋
๋๋ค.
info ์๋ฆผ
class-validator
ํจํค์ง์ ๋ํ ์์ธํ ์ ๋ณด๋ repository์์ ์ฐพ์ผ์ญ์์ค.
Last updated
Was this helpful?