저세상 개발
우리가 nest factory를 실행시킨 사이에...
C0L4
2022. 5. 14. 01:38
개인적으로 네스트 팩토리를 실행시킨 다음에 뭔일이 일어나는지 궁금해서 몇가지를 좀 찾아보았다.
const app = await NestFactory.create(AppModule);
저걸로 보통 네스트팩토리라는걸 생성하는데, 이게 우리가 돌려야할 커다란 웹사이트의 알파이자 오메가다..
구현체를 보면..
public async create<T extends INestApplication = INestApplication>(
module: any,
serverOrOptions?: AbstractHttpAdapter | NestApplicationOptions,
options?: NestApplicationOptions,
): Promise<T> {
const [httpServer, appOptions] = this.isHttpServer(serverOrOptions)
? [serverOrOptions, options]
: [this.createHttpAdapter(), serverOrOptions];
const applicationConfig = new ApplicationConfig();
const container = new NestContainer(applicationConfig);
this.setAbortOnError(serverOrOptions, options);
this.registerLoggerConfiguration(appOptions);
await this.initialize(module, container, applicationConfig, httpServer);
const instance = new NestApplication(
container,
httpServer,
applicationConfig,
appOptions,
);
const target = this.createNestInstance(instance);
return this.createAdapterProxy<T>(target, httpServer);
}
위 내용이 NestFactory의 create의 구현체이다.
함 보면, 일단은 module만 받으면 만사 ok라는 마인드로 구현되어 있고...
일단, 우리가 작성한 코드에는 serverOrOptions 는 전달하지 않으므로, createHttpAdapter() 와 ServerOrOptions 를 각각 httpServer 와 options 에 전달하도록 한다. isHttpServer 라는 함수는 전달받은 인자에 httpServer 가 존재하는지 확인하는 함수임.
고 다음 ApplicationConfig 와 NestContainer 를 하나씩 만들어 준다.
ApplicationConfig 는 어플리케이션의 IoC컨테이너에 대한 전역 설정에 관련된 객체이고 NestContainer 는 전달받은 Config를 기반으로 Nest의 IoC컨테이너를 반환한다.
그 뒤로 에러 정보나 로거 정보를 주입하는 과정을 거친다.
Initialize 는 전술한 객체를 바탕으로 실제 Nest인스턴스를 실행시킬 준비를 하게 되고, 내용은 아래와 같다.
private async initialize(
module: any,
container: NestContainer,
config = new ApplicationConfig(),
httpServer: HttpServer = null,
) {
const instanceLoader = new InstanceLoader(container);
const metadataScanner = new MetadataScanner();
const dependenciesScanner = new DependenciesScanner(
container,
metadataScanner,
config,
);
container.setHttpAdapter(httpServer);
const teardown = this.abortOnError === false ? rethrow : undefined;
await httpServer?.init();
try {
this.logger.log(MESSAGES.APPLICATION_START);
await ExceptionsZone.asyncRun(
async () => {
await dependenciesScanner.scan(module);
await instanceLoader.createInstancesOfDependencies();
dependenciesScanner.applyApplicationProviders();
},
teardown,
this.autoFlushLogs,
);
} catch (e) {
this.handleInitializationError(e);
}
}
해당 모듈에 대한 의존성을 스캔하고 해당하는 인스턴스를 생성한다. 상세내용은 사실 하꼬라 모르겟슴... 대충 주입가능한 클래스의 인스턴스를 돌아가면서 하나씩 만들어준다고 생각하면 될거같다..