VUE3.0을 빠르게 시작하는 방법:
Nest.js는 Nodejs의 백엔드 프레임워크로 아키텍처 문제를 해결하기 위해 Express 및 기타 http 플랫폼을 캡슐화합니다. Express에는 없는 MVC, IOC, AOP 및 기타 아키텍처 기능을 제공하여 코드를 더 쉽게 유지 관리하고 확장할 수 있습니다.
여기서 MVC, IOC, AOP는 무엇을 의미하나요? 별도로 살펴보겠습니다.
MVC는 Model View Controller의 약어입니다. MVC 아키텍처에서 요청은 먼저 컨트롤러로 전송되며, 컨트롤러는 비즈니스 로직을 완료하기 위해 모델 계층의 서비스를 디스패치한 다음 해당 뷰를 반환합니다.
Nest.js는 컨트롤러를 선언하기 위해 @Controller 데코레이터를 제공합니다.
서비스는 @Injectable 데코레이터를 사용하여 선언됩니다.
@Controller 및 @Injectable 데코레이터를 통해 선언된 클래스는 Nest.js에 의해 스캔되고 해당 객체가 생성되어 컨테이너에 추가됩니다. 이 모든 객체는 생성자에 선언된 종속성, 즉 DI(종속성)에 따라 자동으로 주입됩니다. 주입) ), 이 아이디어를 IOC(Inverse Of Control)라고 합니다.
IOC 아키텍처의 장점은 수동으로 개체를 생성하고 종속성에 따라 이를 다른 개체의 생성자에 전달할 필요가 없다는 것입니다. 모든 것이 자동으로 검색, 생성 및 주입됩니다.
또한 Nest.js는 관점 지향 프로그래밍(Aspect Oriented 프로그래밍)의 능력인 AOP(Aspect Oriented 프로그래밍) 기능도 제공합니다.
AOP는 무엇을 의미하나요? 관점 지향 프로그래밍이란 무엇입니까?
요청은 컨트롤러, 서비스 및 저장소(데이터베이스 액세스)의 논리를 거칠 수 있습니다.
이 호출 링크에 몇 가지 일반적인 논리를 추가하려면 어떻게 추가해야 합니까? 로깅, 권한 제어, 예외 처리 등
생각하기 쉬운 것은 Controller 레이어 코드를 직접 변환하고 이 로직을 추가하는 것입니다. 이는 작동하지만 이러한 공통 논리가 비즈니스 논리를 침범하기 때문에 우아하지 않습니다. 이러한 비즈니스 로직에 로그, 권한 등을 투명하게 추가할 수 있습니까?
Controller 호출 전후에 공통 로직을 실행하는 단계를 추가할 수 있나요?
예를 들어:
이러한 수평 확장 지점을 관점(Aspect)이라고 하며, 일부 관점 논리를 투명하게 추가하는 이러한 프로그래밍 방법을 AOP(관점 지향 프로그래밍)이라고 합니다.
AOP의 장점은 일부 일반 로직을 측면으로 분리하고 비즈니스 로직을 순수하게 유지할 수 있다는 것입니다. 이러한 방식으로 측면 로직을 재사용하고 동적으로 추가 및 삭제할 수 있습니다.
실제로 Express 미들웨어의 양파 모델도 구현입니다. AOP의 이유는 외부 레이어를 투명하게 래핑하고 일부 로직을 추가할 수 있으며 내부 레이어는 인식할 수 없기 때문입니다.
Nest.js에는 AOP를 구현하는 방법이 더 다양하며 Middleware, Guard, Pipe, Inteceptor, ExceptionFilter:, 미들웨어 등 총 5가지가 있습니다.
Nest.js는 Express를 기반으로 하며 자연스럽게 미들웨어를 사용할 수 있지만 더 세분화되었습니다. , 글로벌 미들웨어와 라우팅 미들웨어로 구분:
글로벌 미들웨어는 Express의 미들웨어입니다. 각 요청은 여기로 전달됩니다.
라우팅 미들웨어는 더 작은 범위의 특정 경로용입니다.
이 개념은 Express를 직접 상속받았으며 이해하기 더 쉽습니다.
Guard와 같은 일부 Nest.js 확장 개념을 살펴보겠습니다
.Guard는 컨트롤러를 호출하기 전에 권한을 결정하고 릴리스 여부를 결정하기 위해 true 또는 false를 반환하는 데 사용할 수 있습니다.
Guard를 생성하는 방법은 다음과 같습니다.
Guard는 CanActivate 인터페이스와 canActive 메서드를 구현해야 하며 컨텍스트에서 요청된 정보를 가져온 다음 true 또는 false를 반환하기 전에 일부 권한 확인 및 기타 처리를 수행할 수 있습니다.
@Injectable 데코레이터를 통해 IOC 컨테이너에 추가한 다음 컨트롤러에서 활성화합니다.
Controller 자체는 수정할 필요가 없지만 권한 판단 논리가 투명하게 추가되는 것이 AOP 아키텍처의 장점입니다.
그리고 미들웨어가 전역 및 경로 수준을 지원하는 것처럼 Guard도 전역적으로 활성화할 수 있습니다.
Guard는 라우팅의 액세스 제어 논리를 추상화할 수 있지만 요청 및 응답을 수정할 수는 없습니다. 이 논리는 인터셉터를 사용할 수 있습니다.
인터셉터는 대상 컨트롤러 메서드 앞뒤에 몇 가지 논리를 추가할 수 있습니다.
인터셉터를 생성하는 방법은 다음과 같습니다.
인터셉터는 NestInterceptor 인터페이스를 구현해야 하며 next.handle()을 호출하면 대상 컨트롤러가 호출되기 전후에 일부 처리 로직을 추가할 수 있습니다.
컨트롤러 전후의 처리 논리는 비동기식일 수 있습니다. Nest.js는 rxjs를 통해 정리하므로 rxjs의 다양한 연산자를 사용할 수 있습니다.
Interceptor는 특정 컨트롤러에만 영향을 미치는 개별적으로 활성화되는 각 경로를 지원하며 모든 컨트롤러에 영향을 미치는 전역 활성화도 지원합니다.
모두 공통 로직인 Route의 권한 제어와 대상 Controller 전후 처리 외에 매개변수 처리도 공통 로직이므로 Nest.js도 해당 측면, 즉 Pipe:
파이프(Pipe)는 파이프를 의미하며 매개변수의 일부 확인 및 변환에 사용됩니다.
파이프를 생성하는 방법은 다음과 같습니다.
파이프는 형식과 유형이 올바른지 여부와 같이 수신 매개변수 값에 대한 매개변수 확인을 수행할 수 있는 PipeTransform 인터페이스와 변환 메소드를 구현해야 합니다. 변환을 수행하고 변환된 값을 반환할 수도 있습니다.
8개의 내장 파이프가 있으며 그 의미는 이름에서 볼 수 있습니다.
ValidationPipe
ParseIntPipe
ParseBoolPipe
ParseArrayPipe
ParseUUIDPipe
DefaultValuePipe
ParseEnumPipe
ParseFloatPipe
마찬가지로 파이프는 특정 경로에만 영향을 미칠 수 있거나 모든 경로에 영향을 미칠 수 있습니다.
최종적으로 호출되는 것이 Pipe, Guard, Interceptor 또는 Controller인지 여부에 관계없이 프로세스 중에 일부 예외가 발생할 수 있습니다. 특정 예외에 어떻게 대응합니까?
이러한 예외를 응답에 매핑하는 것도 일반적인 논리입니다. Nest.js는 다음을 지원하기 위해 ExceptionFilter를 제공합니다.
ExceptionFilter는 발생한 예외를 처리하고 해당 응답을 반환할 수 있습니다.
ExceptionFilter를 생성하는 형식은 다음과 같습니다.
먼저 예외를 가로채기 위해 ExceptionFilter 인터페이스와 catch 메서드를 구현해야 합니다. 그러나 가로채기를 원하는 예외는 @Catch 데코레이터를 사용하여 선언해야 하며, 해당 예외를 제공하도록 응답할 수 있습니다. 사용자에게 더욱 친근한 메시지를 전달합니다.
물론 모든 예외가 처리되는 것은 아닙니다. HttpException을 상속하는 예외만 ExceptionFilter에 의해 처리됩니다. Nest.js에는 HttpException의 내장 하위 클래스가 많이 있습니다
InternalServerErrorException
UnprocessableException
BadRequestException
UnauthorizedException
NotFoundException
ForbiddenException
NotAcceptableException
RequestTimeoutException
ConflictException
GoneException
PayloadTooLargeException
UnsupportedMediaTypeException
NotImplementedException
BadGatewayException
ServiceUnavailableException
GatewayTimeoutException
물론 직접 확장할 수도 있습니다.
Nest.js는 이러한 방식으로 예외와 응답 간의 대응 관계를 인식합니다. 코드에 서로 다른 HttpException이 발생하는 한 해당 응답이 반환되므로 매우 편리합니다.
마찬가지로 ExceptionFilter는 전역적으로 적용되도록 선택할 수도 있고 특정 경로에 적용되도록 선택할 수도 있습니다
.
글로벌:
Nest.js에서 제공하는 AOP 메커니즘을 이해하지만 순서 관계는 무엇입니까?
특정 경로 또는 모든 경로에 특정 처리 논리를 투명하게 추가할 수 있습니다.
그러나 그들 사이의 순차적 관계는 무엇입니까?
호출 관계는 소스 코드에 따라 다릅니다.
해당 소스코드는 다음과 같습니다.
분명히 이 경로에 들어갈 때 Guard가 먼저 호출되어 권한이 있는지 등을 확인합니다. 권한이 없으면 여기에서 예외가 발생합니다.
발생한 HttpException은 ExceptionFilter에 의해 처리됩니다.
권한이 있으면 인터셉터가 호출됩니다. 인터셉터는 체인을 구성하고 하나씩 호출하며 마지막으로 컨트롤러 메서드를 호출합니다.
컨트롤러 메소드를 호출하기 전에 파이프를 사용하여 매개변수를 처리합니다.
각 매개변수는 다음과 같이 변환됩니다.
응답하기 전에 예외를 처리하는 ExceptionFilter의 호출 타이밍을 생각하면 쉽습니다.
미들웨어는 Express의 개념이고 Nest.js는 이를 상속받아 가장 바깥쪽 레이어에서 호출됩니다.
이는 이러한 AOP 메커니즘의 호출 순서입니다. 이러한 사항을 정리하면 Nest.js를 잘 이해할 수 있습니다.
Nest.js는 Express http 플랫폼을 기반으로 캡슐화되어 있으며 MVC, IOC, AOP와 같은 아키텍처 아이디어를 적용합니다.
MVC는 Model과 View Controller의 분할로, 요청은 먼저 Controller를 통과한 다음 Model 계층의 Service와 Repository를 호출하여 비즈니스 로직을 완성하고 마지막으로 해당 View를 반환합니다.
IOC는 Nest.js가 @Controller 및 @Injectable 데코레이터를 사용하여 클래스를 자동으로 스캔하고, 해당 객체를 생성하고, 종속성을 기반으로 의존하는 객체를 자동으로 주입하여 수동으로 객체를 생성하고 조립하는 수고를 없애는 것을 의미합니다.
AOP는 일반적인 로직을 추출하고 이를 Aspect를 통해 특정 위치에 추가하며, Aspect 로직을 재사용하고 동적으로 추가 및 삭제할 수 있습니다.
Nest.js의 Middleware, Guard, Interceptor, Pipe 및 ExceptionFileter는 모두 AOP 아이디어의 구현일 뿐입니다. 이들은 모두 특정 경로 또는 모든 경로에 유연하게 적용될 수 있습니다.
미들웨어는 Express의 개념으로, 특정 경로에 도달한 후 Guard가 먼저 호출되어 경로에 대한 액세스 권한이 있는지 확인합니다. 인터셉터가 호출됩니다. 일부 로직을 앞뒤로 확장하고 파이프를 호출하여 대상 컨트롤러에 도달하기 전에 매개변수를 확인하고 변환합니다. 모든 HttpException 예외는 ExceptionFilter에 의해 처리되고 다른 응답을 반환합니다.
Nest.js는 이 AOP 아키텍처를 사용하여 느슨하게 결합되고 유지 관리 및 확장이 쉬운 아키텍처를 달성합니다.
AOP 아키텍처의 이점을 느껴 보셨나요?