1. nest의 요청 처리 기본 로직과 AOP 패턴
0. 요청
1. middleware (미들웨어)
2. guards (가드)
- 주로 permission (인증) 처리를 할 때 사용합니다.
3. pre-interceptors (인터셉터)
- 주로 post-interceptor를 위한 변수 선언, 함수 실행을 합니다. (선택)
4. Pipes (파이프)
- 변환(요청 바디를 원하는 형식으로 변환), 유효성 검사를 합니다.
5. Controller (컨트롤러)
- 라우터 역할을 수행합니다. (서비스 로직의 결과를 응답합니다.)
6. Service (서비스 ; 컨트롤러 안에 정의되어 있다면)
- 해당 요청에 대한 핵심 로직이 수행됩니다.
7. post-interceptor (인터셉터)
- 주로 pre-interceptor 로직을 가지고 응답한 데이터를 가공하거나 전체 로직의 속도를 측정합니다. 최종적으로 성공적인 응답 데이터를 보냅니다.
8. exception filters (필터)
- 예외 처리를 담당합니다. 에러 메세지를 원하는 형태로 가공해서 응답합니다.
9. 응답
2. AOP 패턴(관점지향 프로그래밍)
- 관점지향 프로그래밍으로 횡단 관심사의 분리를 통해 코드의 모듈성을 증가시킴으로써, 코드의 역할/책임의 분리, 가독성과 그에 따른 생산성 향상을 지향하는 프로그래밍 패러다임이다.
- nest의 요청 처리 로직 상에서 Interceptor 는 이런 AOP 패턴의 가치에 따른 개념이다.
3. Interceptor
- 미들웨어와 기능적으로 매우 유사하다고 느낄 수 있다. 다만, nest에서 Interceptor와 middleware의 큰 차이는 로직 처리 순서의 차이라고 볼 수 있다.
- Interceptor는 예컨대, 컨트롤러가 시작하기 전/후로 상황을 구분하여 다수의 컨트롤러에서 공통적으로 발생하는 로직, 처리를 전담할 수 있다.(컨트롤러 외에 전역/라우터 단에서도 Interceptor는 사용 가능하다)
ex. 컨트롤러 시작 후, 데이터 가공의 일관성을 위해, interceptor를 활용할 수도 있다.
ex. 로깅 기능의 경우 Interceptor로 많이 구현한다.
- interceptor는 관점 지향 패러다임의 관점에 착안하여, 다수의 기능에서 재사용성이 가능한 기능을 하나의 모듈로 묶는 데 사용되는 개념이라고 할 수 있다.
참고자료