Nest.js
Node.js에 기반을 둔 API 프레임워크로, Express.js 또는 Fastify 프레임워크를 래핑하며 동작한다. 데이터베이스, ORM, 설정, 유효성 검사 등 제공하는 기능도 많으면서도 기능을 쉽게 확장할 수 있는 Node.js 장점을 그대로 가지고 있다. 아, 그리고 기본으로 타입 스크립트도 지원한다고 함.
TypeError: this.libOptions.parse is not a function
Jetbrains 제품을 사용하고 있으면서 이러한 에러를 직면했으면 다음과 같이 해결해보세요.
1. Alt + Shift + S (설정탭)
2. Eslint 검색
3. Automatic ESLint configuration 선택
4. 기존에 있던 패턴을 지우고 "**/*.(js|ts|jsx|tsx|html|vue)" 추가
1. Node.js 런타임 위에서 동작하는 TypeScript용
오픈 소스 백엔드 웹 프레임워크.
2. 노드 생태계에서 거의 기본처럼 쓰였던 Express.js에
비해 제어 역전성을 가지는 프레임워크적 성향이 더욱 강하며,
NestJS가 상당한 아이디어를 차용한 자바 생태계의 Spring과도
자주 비교된다.
* 다만 NestJS 자체는 독립적인 프레임워크가 아니며, 내부적으로
기존의 웹 프레임워크들의 기능을 일관된 API로 노출해
주는 거대한 어댑터(Adapter)에 가깝다.
현재까지는 공식적으로 Express.js 및 Fastify를 지원한다.
@Controller
- 개발의 시작을 Spring Framework로 시작해서 크게 어려움은 없었다. 애플리케이션에 대한 요청을 수신하는 부분. / Express.js에서는 Routes 부분
사전에 MVC 패턴에 대한 지식이 있고 Spring 지식이 있으면 코드를
파악하는데 큰 어려움은 없을 것 같다. 아직은 특이한 부분은 찾지 못했다.
기개발된 코드에서는 Service에 대한 주입이 생성자로 이루어지고 있다.
@Module
모듈은 Nest가 애플리케이션 구조를 만들때 사용할 수 있는 메타데이터를 제공해주는 역할을 한다.
자바의 모듈을 예상했지만 참조 문서를 읽어보니 다른 것 같다.
Nest.js @Module
루트 모듈은 Nest가 애플리케이션 그래프를 구성하기 위해 사용하는 시작점
Nest가 모듈과 프로바이더 간의 관계 및 종속성을 연결하기 위해 사용하는 내부 데이터 구조
Java Module과 패키지
여러 패키지와 이미지 등의 자원을 모아 놓은 컨테이너
// Nest.js Module Example
import { Module } from '@nestjs/common';
import { ExampleService } from './example.service';
import { ExampleController } from './example.controller';
@Module({
controllers: [ExampleController],
providers: [ExampleService],
exports: [ExampleService],
})
export class ExampleModule {}
@Decorator
데코레이터 어노테이션이 있는 것은 아니다. 소스 분석 중
- example.controller.ts
- example.service.ts
- example.decorator.ts
라는 소스 코드가 있어서 한번 무엇인지 확인해보았다.
//usr.decorator.ts
import { createParamDecorator, HttpException } from '@nestjs/common';
export const RqUsr = createParamDecorator((data, ctx) => {
const req = ctx.switchToHttp().getRequest();
//핵심 동작 생략 ..
throw new HttpException('Unauthorized', 403);
});
//usr.controller.ts
//중략
import { Usr } from '@server/usr/entities/usr.entity';
import { RqUsr } from '@server/usr/usr.decorator';
@Controller('usr')
export class UserController {
constructor(private readonly usrService: UsrService) {}
@Get(':pathvariable')
findOne(@RequiredUser() user: User, @Param('test') testText: string) {
return this.usrService.getExampleInfo(user, example);
}
}
2번째 코드 블럭의 -> findOne(@RequiredUser() user: User,