@NgModule
데코레이터는 Angular 애플리케이션을 구성하는 모듈을 정의할 때 사용되는 데코레이터입니다. 모듈은 컴포넌트, 디렉티브, 파이프 등을 묶어서 관리하는 컨테이너 역할을 합니다. @NgModule
데코레이터는 모듈 클래스에 적용되며, 해당 클래스의 속성들을 설정하여 모듈의 동작 방식을 지정합니다.
@NgModule
데코레이터는 다음과 같은 속성들을 가질 수 있습니다:
declarations
: 현재 모듈에서 사용할 컴포넌트, 디렉티브, 파이프를 등록합니다.
imports
: 현재 모듈에서 사용할 외부 모듈을 등록합니다. 다른 모듈에서 내보낸 컴포넌트, 디렉티브, 파이프를 사용할 수 있도록 합니다.
exports
: 현재 모듈에서 선언된 컴포넌트, 디렉티브, 파이프를 다른 모듈에서 사용할 수 있도록 내보냅니다.
providers
: 현재 모듈에 주입 가능한 서비스 프로바이더를 등록합니다. 모듈에 등록한 서비스는 해당 모듈에서 사용하는 모든 컴포넌트에서 주입할 수 있습니다.
bootstrap
: 최상위 컴포넌트를 지정합니다. Angular는 이 컴포넌트에서 시작하여 애플리케이션을 초기화합니다.
@NgModule
데코레이터는 Angular의 핵심 개념 중 하나로, 애플리케이션을 모듈로 구성하여 코드의 재사용성과 유지보수성을 높이는 데 중요한 역할을 합니다. 이제 몇 가지 다양한 예시를 통해 @NgModule
데코레이터의 사용법과 코드 분석을 해보겠습니다.
@NgModule
예시:import { NgModule } from '@angular/core';
@NgModule({
declarations: [],
imports: [],
providers: [],
bootstrap: []
})
export class AppModule { }
위의 코드는 최소한의 @NgModule
설정을 보여줍니다. 모든 속성이 빈 배열로 설정되어 있으므로 아직 컴포넌트, 디렉티브, 파이프, 모듈, 서비스 등을 등록하지 않았습니다.
@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
를 등록하여 애플리케이션의 시작 컴포넌트로 설정했습니다.
@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
속성에 BrowserModule
와 HttpClientModule
을 등록하여 브라우저 환경과 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
파일과의 차이점은 다음과 같습니다:
@NgModule
데코레이터 사용 여부:
일반적인 @NgModule
파일은 클래스에 @NgModule
데코레이터를 적용하여 Angular 모듈을 정의합니다. 하지만 위의 코드에서는 클래스가 없이 ApplicationConfig
객체를 정의하기 때문에, @NgModule
데코레이터를 사용하는 것이 아닙니다.
providers
배열 설정:
@NgModule
데코레이터를 사용하는 파일에서는 providers
배열 안에 서비스 프로바이더를 등록하는 것이 일반적입니다. 하지만 위의 코드에서는 appConfig
객체의 providers
배열에 등록됩니다. 이 때 importProvidersFrom
함수를 사용하여 여러 모듈에서 서비스 프로바이더를 가져와 등록하고 있습니다.
forRoot()
메서드 호출:
forRoot()
메서드는 Angular에서 외부 모듈을 등록할 때 사용되는 관습적인 패턴입니다. 이 메서드는 외부 모듈을 애플리케이션의 루트 모듈에 등록할 때 호출합니다. 위의 코드에서 IonicModule.forRoot()
메서드는 Ionic 모듈을 애플리케이션의 루트 모듈에 등록하는 것을 의미합니다. 일반적으로 이렇게 등록된 모듈은 애플리케이션 전체에서 사용됩니다.
importProvidersFrom 사용 이유:
importProvidersFrom
함수는 여러 모듈에서 서비스 프로바이더를 한 번에 등록하기 위해 사용됩니다. 이 함수는 여러 모듈의 providers
배열을 하나로 합쳐서 한 곳에 등록할 수 있게 도와줍니다. 이렇게 함으로써 코드를 간결하게 유지하고, 중복 등록을 피할 수 있습니다.
위의 코드에서는 appConfig
객체를 정의하여 providers
배열에 라우터, HTTP 인터셉터, Ionic 모듈, 서비스, Ngxs 상태 관리 모듈 등을 등록하고 있습니다. 이를 통해 Angular 애플리케이션의 구성을 유연하게 조정하고, 코드를 모듈화하여 재사용성을 높일 수 있습니다. 단, 위의 코드가 어디에서 사용되는지에 따라서도 의미가 달라질 수 있으며, 사용되는 컨텍스트를 더욱 고려하여 분석해야 합니다.
너무 좋은 글이네요. 공유해주셔서 감사합니다.