formulous

주니어 개발자의 개발 지식 공유 블로그입니다.

NestJS

[nestjs] URL 유효성 검사를 Middleware 에서 하는 방법

formulous 2022. 12. 6. 19:40
728x90

 

 

안녕하세요.

 

오늘은 API 요청이 왔을 때 request의 URL 유효성 검사를 Middleware에서 하는 방법을 알아보겠습니다.

 

이번 업무 중에 제 프로젝트 관련한 요청받은 것이 하나 있었습니다.

 

그것은 바로 '유효성 검사를 Middleware 단에서 처리하도록 정리해달라' 에요.

 

 

서비스 단이나 컨트롤러 단에 여기저기 흩뿌려져 있던 유효성 검사 코드가 지저분해 보였던 것이죠...

 

여차저차 코드 정리를 마무리하던 와중 제 기준 머리 아픈 문제가 발생했는데요.

 

그것은 바로 다른 유효성 검증과 다르게 API 요청으로 들어온 URL의 유효성은 어떻게 middleware에서 구현하느냐입니다.

 

여기서 제가 발견한 해결책은 Guard의 canActivate() function에서 request 정보에 들어있는 URL을 뽑아오는 것입니다.

 

아래 구현한 코드를 보겠습니다.

 

import { Injectable, CanActivate, ExecutionContext } from '@nestjs/common';
import { Observable } from 'rxjs';

@Injectable()
export class AuthGuard implements CanActivate {
	canActivate(context: ExecutionContext,
    ): boolean | Promise<boolean> | Observable<boolean> {
    	const request = context.switchToHttp().getRequest();
        console.log(request) // 모든 request 정보가 출력됩니다..!
        return validateRequest(request);
	}    
}

 

해당 예시처럼 구현했을 때 request 변수에는 request 정보가 몽땅 다 들어가 있는 것을 확인해볼 수 있습니다.

 

 

물론 가드만 구현해서는 출력은 물론 request 변수에 아무것도 담기지 않습니다.

 

요청이 있어야 요청 데이터를 출력할 수 있겠죠!

 

유효성을 검증하고 싶은 Router Handler에서 가드를 사용하도록 구현해야 하는데요. 해당 내용은 아래에서 자세히 설명합니다.

 

@Controller('user')
@UseGuards(AuthGuard)
export class UserController {}
// 위와 같이 모든 Controller 내로 들어오는 API 요청에 대해 Guard를 걸어줄 수도 있습니다.

/*-----------------------------------------------------------------------*/

@Post('login')
@UseGuards(AuthGuard)
async login(@Body() userDto: UserDto) {
	this.userService.login(userDto);
}
// 아니면 위와 같이 하나의 API에 대해서만 유효성 검사를 시행할 수도 있겠죠.

 

 

이제 구현한 Guard를 Controller 단의 API에 @UseGuards() 데코레이터를 이용해 씌워줍니다.

 

UseGuards 가 붙은 API는 요청이 들어올 때 Guard의 유효성 검사를 먼저 거친 후에 Controller 내의 코드를 실행하게 됩니다.

(Controller 내의 코드라 함은 받아온 데이터를 Service 단으로 전달해주며 함수와 연결해주는 역할을 하는 거겠죠?)

 

이제 Guard는 받아온 request 정보가 담긴 변수에서 유효성 검증에 필요한 URL 정보를 사용하기만 하면 되겠죠.

 

URL 뿐만 아니라 request 변수에 담긴 여러 정보를 이용해 여러 가지 유효성 검사를 진행하게 됩니다.

 

그리고 return 값이 true 일 때 문을 열어주는 방식이죠.

 

 

오늘은 Middleware Guard를 활용한 유효성 검사에 대해 알아보았습니다.

 

저는 업무 지시로 받은 코드 개선 건이었지만, nestjs 공식 문서에서도 역시 유효성 검사의 경우 Route Handler에 진입하기 전 Pipe나 Guard와 같은 Middleware에서 구현하는 것이 좋다고 하네요.

 

막무가내로 개발을 우선하기보단 설계를 우선 시 하고 코드 구조도 생각할 수 있는 개발자가 되도록 합시다!

 

그럼 포스팅을 마치겠습니다.

 

감사합니다.

 

 

 

728x90

'NestJS' 카테고리의 다른 글

[nestjs] module에서 선언하는 provider, 대체 뭘까요?  (2) 2022.12.13