@NgModule appConfig

agnusdei·2023년 7월 19일
0

@NgModule 데코레이터는 Angular 애플리케이션을 구성하는 모듈을 정의할 때 사용되는 데코레이터입니다. 모듈은 컴포넌트, 디렉티브, 파이프 등을 묶어서 관리하는 컨테이너 역할을 합니다. @NgModule 데코레이터는 모듈 클래스에 적용되며, 해당 클래스의 속성들을 설정하여 모듈의 동작 방식을 지정합니다.

@NgModule 데코레이터는 다음과 같은 속성들을 가질 수 있습니다:

  1. declarations: 현재 모듈에서 사용할 컴포넌트, 디렉티브, 파이프를 등록합니다.

  2. imports: 현재 모듈에서 사용할 외부 모듈을 등록합니다. 다른 모듈에서 내보낸 컴포넌트, 디렉티브, 파이프를 사용할 수 있도록 합니다.

  3. exports: 현재 모듈에서 선언된 컴포넌트, 디렉티브, 파이프를 다른 모듈에서 사용할 수 있도록 내보냅니다.

  4. providers: 현재 모듈에 주입 가능한 서비스 프로바이더를 등록합니다. 모듈에 등록한 서비스는 해당 모듈에서 사용하는 모든 컴포넌트에서 주입할 수 있습니다.

  5. bootstrap: 최상위 컴포넌트를 지정합니다. Angular는 이 컴포넌트에서 시작하여 애플리케이션을 초기화합니다.

@NgModule 데코레이터는 Angular의 핵심 개념 중 하나로, 애플리케이션을 모듈로 구성하여 코드의 재사용성과 유지보수성을 높이는 데 중요한 역할을 합니다. 이제 몇 가지 다양한 예시를 통해 @NgModule 데코레이터의 사용법과 코드 분석을 해보겠습니다.

  1. 최소한의 @NgModule 예시:
import { NgModule } from '@angular/core';

@NgModule({
  declarations: [],
  imports: [],
  providers: [],
  bootstrap: []
})
export class AppModule { }

위의 코드는 최소한의 @NgModule 설정을 보여줍니다. 모든 속성이 빈 배열로 설정되어 있으므로 아직 컴포넌트, 디렉티브, 파이프, 모듈, 서비스 등을 등록하지 않았습니다.

  1. @NgModule에서 컴포넌트, 서비스 등의 등록:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import { UserService } from './user.service';

@NgModule({
  declarations: [AppComponent],
  imports: [BrowserModule],
  providers: [UserService],
  bootstrap: [AppComponent]
})
export class AppModule { }

위의 코드에서 declarations 속성에 AppComponent를 등록하고, imports 속성에 BrowserModule를 등록하여 브라우저에서 실행되는 애플리케이션을 구성하였습니다. 또한 providers 속성에 UserService를 등록하여 해당 서비스를 주입 가능하도록 설정했습니다. 마지막으로 bootstrap 속성에 AppComponent를 등록하여 애플리케이션의 시작 컴포넌트로 설정했습니다.

  1. @NgModule에서 외부 모듈 사용 예시:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { HttpClientModule } from '@angular/common/http';
import { AppComponent } from './app.component';

@NgModule({
  declarations: [AppComponent],
  imports: [BrowserModule, HttpClientModule],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }

위의 코드에서 imports 속성에 BrowserModuleHttpClientModule을 등록하여 브라우저 환경과 HTTP 클라이언트를 사용할 수 있도록 설정하였습니다. HttpClientModule은 외부 모듈 중 하나로, HTTP 요청을 위해 사용됩니다.

@NgModule 데코레이터를 사용하여 모듈을 구성하면 애플리케이션을 모듈 단위로 분리하여 코드를 조직화하고 유지보수를 용이하게 만들 수 있습니다. 또한 다른 모듈과의 결합도를 낮추면서 재사용 가능한 모듈을 쉽게 생성할 수 있습니다. 이를 통해 Angular 애플리케이션의 구조를 체계적으로 관리할 수 있습니다.

import { ApplicationConfig, importProvidersFrom } from '@angular/core';
import {
  RouteReuseStrategy,
  provideRouter,
  withEnabledBlockingInitialNavigation,
} from '@angular/router';
import { appRoutes } from './app.routes';
import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http';
import { IonicModule, IonicRouteStrategy } from '@ionic/angular';
import { HttpInterceptorService } from './services/http-interceptor.service';
import { BrowserModule } from '@angular/platform-browser';
import { SharedModule } from './shared/shared.module';
import { NgxsModule } from '@ngxs/store'
import { AuthState } from '../store/auth.store';

export const appConfig: ApplicationConfig = {
  providers: [
    provideRouter(appRoutes, withEnabledBlockingInitialNavigation()),
    { provide: RouteReuseStrategy, useClass: IonicRouteStrategy },
    { provide: HTTP_INTERCEPTORS, useClass: HttpInterceptorService, multi: true },
    importProvidersFrom(
      BrowserModule,
      IonicModule.forRoot(),
      SharedModule,
      HttpClientModule,
      NgxsModule.forRoot([AuthState], {
        developmentMode: process.env['NODE_ENV'] !== 'production'
      })
    )
  ],
};

위의 코드는 @NgModule 데코레이터가 있는 파일이 아니라, 일반적인 JavaScript 파일입니다. 이 파일은 Angular의 ApplicationConfig 객체를 정의하는데 사용되며, 이 객체는 Angular 애플리케이션의 구성 정보를 담고 있습니다. @NgModule 데코레이터는 Angular의 모듈 클래스에 적용되어야 하며, 해당 파일에서는 @NgModule 데코레이터를 사용하는 대신 ApplicationConfig 객체에 설정 정보를 정의하여 사용하는 것으로 보입니다.

일반적인 @NgModule 파일과의 차이점은 다음과 같습니다:

  1. @NgModule 데코레이터 사용 여부:
    일반적인 @NgModule 파일은 클래스에 @NgModule 데코레이터를 적용하여 Angular 모듈을 정의합니다. 하지만 위의 코드에서는 클래스가 없이 ApplicationConfig 객체를 정의하기 때문에, @NgModule 데코레이터를 사용하는 것이 아닙니다.

  2. providers 배열 설정:
    @NgModule 데코레이터를 사용하는 파일에서는 providers 배열 안에 서비스 프로바이더를 등록하는 것이 일반적입니다. 하지만 위의 코드에서는 appConfig 객체의 providers 배열에 등록됩니다. 이 때 importProvidersFrom 함수를 사용하여 여러 모듈에서 서비스 프로바이더를 가져와 등록하고 있습니다.

  3. forRoot() 메서드 호출:
    forRoot() 메서드는 Angular에서 외부 모듈을 등록할 때 사용되는 관습적인 패턴입니다. 이 메서드는 외부 모듈을 애플리케이션의 루트 모듈에 등록할 때 호출합니다. 위의 코드에서 IonicModule.forRoot() 메서드는 Ionic 모듈을 애플리케이션의 루트 모듈에 등록하는 것을 의미합니다. 일반적으로 이렇게 등록된 모듈은 애플리케이션 전체에서 사용됩니다.

  4. importProvidersFrom 사용 이유:
    importProvidersFrom 함수는 여러 모듈에서 서비스 프로바이더를 한 번에 등록하기 위해 사용됩니다. 이 함수는 여러 모듈의 providers 배열을 하나로 합쳐서 한 곳에 등록할 수 있게 도와줍니다. 이렇게 함으로써 코드를 간결하게 유지하고, 중복 등록을 피할 수 있습니다.

위의 코드에서는 appConfig 객체를 정의하여 providers 배열에 라우터, HTTP 인터셉터, Ionic 모듈, 서비스, Ngxs 상태 관리 모듈 등을 등록하고 있습니다. 이를 통해 Angular 애플리케이션의 구성을 유연하게 조정하고, 코드를 모듈화하여 재사용성을 높일 수 있습니다. 단, 위의 코드가 어디에서 사용되는지에 따라서도 의미가 달라질 수 있으며, 사용되는 컨텍스트를 더욱 고려하여 분석해야 합니다.

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

너무 좋은 글이네요. 공유해주셔서 감사합니다.

답글 달기