Nest.js(1)
Nest js
- Node 기반을 둔 웹 API 프레임워크 Express, Fastify 프레임워크를 래핑하여 동작
- NestJS는 데이터베이스, ORM, 설정(Configuration), 유효성 검사 등 수많은 기능을 기본 제공하고 있습니다
- IoC(Inversion of Control, 제어역전), DI(Dependency Injection, 의존성 주입), AOP(Aspect Oriented Programming, 관점 지향 프로그래밍)와 같은 객체지향 개념을 도입하였습니다.
- 타입스크립트
Node.js 기반 웹 프레임워크가 갖춰야 할 필수 기능이라면 다음과 같은 것들이 있습니다.
- 최신 Ecma Script 지원
- Typescript (선택사항이나 사용 추세가 계속 늘어나고 있음)
- CORS
- HTTP 헤더 보안 (Express는 helmet을 사용)
- Configuration
- Interceptor
- Middleware
- Scheduling
- Logging
- Testing
- Swagger 문서화
- ORM
서비스 개발 외에 부가적으로 신경 써야 할 부분들
- 환경 변수 설정: 서버는 여러 환경에서 실행됩니다. 개발자의 로컬(local) 개발환경, 개발된 기능을 실제 사용자에게 배포하기 전에 테스트용 서버에 배포하는 스테이지(stage)환경, 그리고 실제 운용하는 프로덕션(production) 환경으로 보통 구성합니다. 각 환경에서 사용되는 변수가 달라지는 것들이 있다면 환경변수를 다르게 구성할 수 있도록 합니다.
- 요청 유효성 검증: 프론트엔드에서 들어오는 요청은 잘못된 값을 가지는 경우가 매우 빈번합니다. 사용자가 값을 잘못 입력하기도 하고 프론트 엔드에서 걸러지지 않은 잘못된 값이 유입되는 경우도 있습니다. 이 경우 서버에서는 핵심 로직을 수행하기 전에 값이 제대로 전달되었는지 판단하여 만약 잘못 전달된 경우라면 400 Bad Request 에러로 응답합니다. 예를 들어 로그인 요청에서 이메일을 넣어야 하는데 이메일 형식이 아닌 문자열이 전달되면 에러로 처리해야 합니다.
- 인증: 사용자의 리소스에 접근하기 위해서는 권한이 필요하고 로그인 과정을 거쳐야 합니다. 로그인을 거친 유저는 매 요청마다 로그인을 할 필요는 없고 인증과정을 통해 후속 동작을 수행합니다. 인증을 처리하는 방법은 여러가지가 있습니다. 이 책에서는 토큰방식, 그 중에서도 JWT(JSON Web Token)을 이용하는 방식을 적용합니다.
- 로깅: 서버를 운용하기 위해서는 로그를 잘 기록해야 합니다. 특히 이슈가 발생했을 때 원인을 빠르고 정확하게 파악하는 데에 로그가 매우 유용하게 사용됩니다. 또한 사내 사용자가 무슨 동작을 수행했는지 감사로그를 남기고 외부에 기록을 제출하는 경우도 있습니다.
- 헬스체크: 서버의 심장이 잘 뛰고 있는지, 즉 서버의 상태가 양호한지 주기적으로 검사합니다. 만약 서버 상태가 좋지 않다면 경고를 울려서 개발자가 빠르게 대응할 수 있는 방안을 마련해야 합니다.
- CQRS(Command and Query Responsibility Segregation, 명령과 조회의 책임 분리): 복잡한 소프트웨어를 만들다 보면 소스 코드가 스파게티처럼 얽히게 되는 경우가 생깁니다. 데이터베이스에 변형을 가하는 명령과 데이터 읽기 요청을 처리하는 조회 로직을 분리함으로써 성능, 확장성, 보안을 강화할 수 있습니다.
- 클린 아키텍처: 양파(Onion) 아키텍처, 육각형 아키텍처에서 발전한 클린 아키텍처는 SW의 계층을 분리하고 저수준의 계층이 고수준의 계층에 의존하도록 합니다. 의존의 방향이 바뀌는 경우가 있다면 DIP(Dependency Inversion Principle, 의존성 역전 법칙)를 활용하여 안정적인 소프트웨어를 작성할 수 있게 해 줍니다.
- 유닛 테스트: 소프트웨어에 변경이 생긴다면 반드시 테스트를 해야 합니다. 유닛 테스트는 유저의 입장에서 수행하는 테스트가 아닌 개발자가 테스트 코드를 이용하여 수행하는 최소 단위의 테스트 기법입니다. 내가 만든 코드 조각이 동작하는 조건을 기술하고, 주어진 입력에 대해 원하는 결과가 나오는 지 검사합니다.
Node 기반
Node 실행 원리를 알게 된다면 nest js 개발에 도움이 많이 된다.
- 멀티 쓰레드 방식은 여러 작업을 동시에 처리하므로 작업 처리속도가 빠른 장점이 있지만, 공유 자원을 관리하는 노력이 많이 들고 잘못 작성된 동기화로 인해 락에서 빠져나오지 못하는 경우가 발생하기 쉽습니다
- Node.js는 하나의 쓰레드에서 작업을 처리합니다. 단일 쓰레드이지만 백그라운에서는 쓰레드 풀을 구성해 작업을 처리합니다.
- Node.js는 이렇게 들어온 작업을 앞의 작업이 끝날때까지 기다리지 않고(non-blocking) 비동기로 처리합니다. 이 개념을 쉽게 설명하면 다음과 같습니다. 푸드코트의 경우 주문은 한 곳에서 받지만 음식은 입점된 각 식당에서 만듭니다. 음식이 완성된 순서대로 각 식당에서 호출벨을 통해 손님을 부르고 손님은 음식을 픽업합니다. 여기서 계산을 담당하는 작업은 단일 쓰레드이고 각 요리를 완성해 벨을 호출하는 식당들은 비동기로 요리를 준비합니다. 입력은 하나의 쓰레드에서 받지만 순서대로 처리 하지 않고 먼저 처리된 결과를 이벤트로 반환해주는 방식이 바로 Node.js가 사용하는 단일 쓰레드 non-blocking 이벤트 기반 비동기 방식입니다.
Node.js 동작원리 (Single thread, Event-driven, Non-Blocking I/O, Event loop)
Node.js는 어떻게 동작하는가
medium.com
이벤트 루프
- 나중에 정리
데코레이션
Nest는 데코레이터를 적극 활용합니다. 데코레이터를 잘 사용하면 횡단관심사를 분리하여 관점 지향 프로그래밍을 적용한 코드를 작성할 수 있습니다. 타입스크립트의 데코레이터는 파이썬의 데코레이터나 자바의 어노테이션과 유사한 기능을 합니다. 클래스, 메서드, 접근자, 프로퍼티, 매개변수에 적용 가능합니다. 각 요소의 선언부 앞에 @로 시작하는 데코레이터를 선언하면 데코레이터로 구현된 코드를 함께 실행합니다. 예를 들어 다음코드는 유저 생성 요청의 본문을 DTO로 표현한 클래스입니다.
tsconfig.json 파일은 타입스크립의 빌드환경을 정의한 파일입니다.
{
"compilerOptions": {
...
"experimentalDecorators": true,
...
}
}
experimentalDecorators 옵션이 true로 설정되어 있습니다. 이 옵션을 켜야 데코레이터를 사용할 수 있습니다. 비록 실험적인 기능이지만 매우 안정적이며 수많은 프로젝트에서 사용하고 있습니다.
function deco(value: string) {
console.log('데코레이터가 평가됨');
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
console.log(value);
}
}
class TestClass {
@deco('HELLO')
test() {
console.log('함수 호출됨')
}
}
결과는 다음과 같습니다.
데코레이터가 평가됨
HELLO
함수 호출됨
데코레이터 합성
- 각 데코레이터의 표현은 위에서 아래로 평가(evaluate)됩니다.
- 그런 다음 결과는 아래에서 위로 함수로 호출(call)됩니다.
다음 예의 출력 결과를 보면 합성순서에 대해 이해를 높일 수 있을 것입니다.
function first() {
console.log("first(): factory evaluated");
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
console.log("first(): called");
};
}
function second() {
console.log("second(): factory evaluated");
return function (target: any, propertyKey: string, descriptor: PropertyDescriptor) {
console.log("second(): called");
};
}
class ExampleClass {
@first()
@second()
method() {
console.log('method is called');
}
}
first(): factory evaluated
second(): factory evaluated
second(): called
first(): called
method is called
클래스 데코레이터 (Class Decorator)
메서드 데코레이터 (Method Decorator)
접근자 데코레이터 (Accessor Decorator)
속성 데코레이터 (Property Decorators)
매개변수 데코레이터 (Parameter 데코레이터)
- Nest에서 API 요청 파라미터에 대해 유효성 검사를 할 때 이와 유사한 데코레이터를 많이 사용합니다.
참고
2.6 데코레이터
Nest는 데코레이터를 적극 활용합니다. 데코레이터를 잘 사용하면 횡단관심사를 분리하여 관점 지향 프로그래밍을 적용한 코드를 작성할 수 있습니다. 타입스크립트의 데코레이터는 ...
wikidocs.net
1.4 이 책에서 만드는 애플리케이션 - 유저 서비스
이 책에서는 모든 웹 애플리케이션의 필수 기능이라고 할 수 있는 유저 서비스를 함께 만들어갑니다. ![](https://wikidocs.net/images/page/158 ...
wikidocs.net
https://blog.martinwork.co.kr/nestjs/2020/03/22/what-is-nestjs.html