์ค์: Angular ํ์ ์๋ก ์์ฑํ๋ ๋ชจ๋ ์ฝ๋์์ NgModule ๋์ ๋
๋ฆฝํ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
์ด ๊ฐ์ด๋๋ @NgModule์ ์ฌ์ฉํ๋ ๊ธฐ์กด ์ฝ๋๋ฅผ ์ดํดํ ๋ ์ฐธ๊ณ ํ์ธ์.
NgModule์ @NgModule ๋ฐ์ฝ๋ ์ดํฐ๋ฅผ ๋ถ์ธ ํด๋์ค์
๋๋ค.
์ด ๋ฐ์ฝ๋ ์ดํฐ๋ Angular๊ฐ ์ปดํฌ๋ํธ ํ
ํ๋ฆฟ์ ์ปดํ์ผํ๊ณ ์์กด์ฑ ์ฃผ์
์ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ์ง์ ํ๋ ๋ฉํ๋ฐ์ดํฐ ๋ฅผ ์ธ์๋ก ๋ฐ์ต๋๋ค.
import {NgModule} from '@angular/core';
@NgModule({
// ์ด๊ณณ์ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์์ฑํฉ๋๋ค.
})
export class CustomMenuModule {}
NgModule์ ํฌ๊ฒ ๋ ๊ฐ์ง ์ญํ ์ ํฉ๋๋ค:
- NgModule์ ์ํ๋ ์ปดํฌ๋ํธ, ๋๋ ํฐ๋ธ, ํ์ดํ๋ฅผ ์ ์ธํฉ๋๋ค.
- ์ด NgModule์ ๋ก๋ํ๋ ์ปดํฌ๋ํธ, ๋๋ ํฐ๋ธ, ํ์ดํ์ ์ธ์ ํฐ์ ํ๋ก๋ฐ์ด๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
declarations
@NgModule ๋ฉํ๋ฐ์ดํฐ์ declarations ํ๋กํผํฐ์๋ NgModule์ ์ํ๋ ์ปดํฌ๋ํธ, ๋๋ ํฐ๋ธ, ํ์ดํ๋ฅผ ์ ์ธํฉ๋๋ค.
@NgModule({
/* ... */
// CustomMenu์ CustomMenuItem์ ์ปดํฌ๋ํธ์
๋๋ค.
declarations: [CustomMenu, CustomMenuItem],
})
export class CustomMenuModule {}
์ ์์ ์์ CustomMenu์ CustomMenuItem ์ปดํฌ๋ํธ๋ CustomMenuModule์ ์ํฉ๋๋ค.
declarations ํ๋กํผํฐ์๋ ์ปดํฌ๋ํธ, ๋๋ ํฐ๋ธ, ํ์ดํ์ ๋ฐฐ์ด ์ ์ง์ ํ ์๋ ์์ต๋๋ค.
์ด ๋ฐฐ์ด ์์ ๋ค๋ฅธ ๋ฐฐ์ด์ ํฌํจํด๋ ๋ฉ๋๋ค.
const MENU_COMPONENTS = [CustomMenu, CustomMenuItem];
const WIDGETS = [MENU_COMPONENTS, CustomSlider];
@NgModule({
/* ... */
// ์ด NgModule์๋ CustomMenu, CustomMenuItem,
// CustomSlider, CustomCheckbox๋ฅผ ๋ชจ๋ ์ ์ธํฉ๋๋ค.
declarations: [WIDGETS, CustomCheckbox],
})
export class CustomMenuModule {}
์ปดํฌ๋ํธ, ๋๋ ํฐ๋ธ, ํ์ดํ๊ฐ ์ฌ๋ฌ NgModule์ ์ค๋ณต์ผ๋ก ์ ์ธ๋์ด ์์ผ๋ฉด Angular๋ ์ค๋ฅ๋ฅผ ๋ฐ์์ํต๋๋ค.
NgModule์ ์ ์ธํ ์ปดํฌ๋ํธ, ๋๋ ํฐ๋ธ, ํ์ดํ์๋ ๋ฐ๋์ standalone: false๋ฅผ ๋ช
์ํด์ผ ํฉ๋๋ค.
@Component({
// NgModule์ ์ ์ธํ ์ ์๋๋ก ์ปดํฌ๋ํธ์ `standalone: false`๋ฅผ ์ง์ ํฉ๋๋ค.
standalone: false,
/* ... */
})
export class CustomMenu {
/* ... */
}
imports
NgModule์ ์ ์ธํ ์ปดํฌ๋ํธ๋ ๋ค๋ฅธ ์ปดํฌ๋ํธ, ๋๋ ํฐ๋ธ, ํ์ดํ์ ์์กดํ ์ ์์ต๋๋ค.
์ด๋ฐ ์์กด์ฑ์ @NgModule ๋ฉํ๋ฐ์ดํฐ์ imports ํ๋กํผํฐ์ ์ถ๊ฐํฉ๋๋ค.
@NgModule({
/* ... */
// CustomMenu์ CustomMenuItem์ PopupTrigger์ SelectorIndicator ์ปดํฌ๋ํธ์ ์์กดํฉ๋๋ค.
imports: [PopupTrigger, SelectionIndicator],
declarations: [CustomMenu, CustomMenuItem],
})
export class CustomMenuModule {}
imports ๋ฐฐ์ด์๋ ๋ค๋ฅธ NgModule๋ฟ ์๋๋ผ ๋
๋ฆฝํ ์ปดํฌ๋ํธ, ๋๋ ํฐ๋ธ, ํ์ดํ๋ ์ง์ ํ ์ ์์ต๋๋ค.
exports
NgModule์ ์ ์ธํ ์ปดํฌ๋ํธ, ๋๋ ํฐ๋ธ, ํ์ดํ๋ฅผ ์ธ๋ถ๋ก ๊ณต๊ฐ(export) ํ๋ฉด ๋ค๋ฅธ ์ปดํฌ๋ํธ์ NgModule์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@NgModule({
imports: [PopupTrigger, SelectionIndicator],
declarations: [CustomMenu, CustomMenuItem],
// CustomMenuModule์ ๋ก๋ํ๋ ์ปดํฌ๋ํธ์ NgModule์์
// CustomMenu์ CustomMenuItem์ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
exports: [CustomMenu, CustomMenuItem],
})
export class CustomMenuModule {}
exports ํ๋กํผํฐ์๋ ์ง์ ์ ์ธํ ํญ๋ชฉ๋ง ์ง์ ํ ์ ์๋ ๊ฒ์ ์๋๋๋ค.
NgModule์์ ๋ก๋ํ ๋ค๋ฅธ ์ปดํฌ๋ํธ, ๋๋ ํฐ๋ธ, ํ์ดํ, NgModule๋ ์ธ๋ถ๋ก ๊ณต๊ฐํ ์ ์์ต๋๋ค.
@NgModule({
imports: [PopupTrigger, SelectionIndicator],
declarations: [CustomMenu, CustomMenuItem],
// CustomMenuModule์ ๋ก๋ํ๋ ์ปดํฌ๋ํธ์ NgModule์์ PopupTrigger๋ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
exports: [CustomMenu, CustomMenuItem, PopupTrigger],
})
export class CustomMenuModule {}
NgModule ํ๋ก๋ฐ์ด๋
ํ: ์์กด์ฑ ์ฃผ์ ๊ณผ ํ๋ก๋ฐ์ด๋์ ๋ํด ์์๋ณด๋ ค๋ฉด ์์กด์ฑ ์ฃผ์ ๊ฐ์ด๋๋ฅผ ์ฐธ๊ณ ํ์ธ์.
NgModule์๋ ์์กด์ฑ ์ฃผ์
์ ์ฌ์ฉํ providers๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
์ด ํ๋ก๋ฐ์ด๋๋ ๋ค์ ์์น์์ ์ฌ์ฉํ ์ ์์ต๋๋ค:
- ํด๋น NgModule์ ๋ก๋ํ๋ ๋ชจ๋ ๋ ๋ฆฝํ ์ปดํฌ๋ํธ, ๋๋ ํฐ๋ธ, ํ์ดํ
- ํด๋น NgModule์ ๋ก๋ํ๋ ๋ค๋ฅธ NgModule์
declarations์providers
@NgModule({
imports: [PopupTrigger, SelectionIndicator],
declarations: [CustomMenu, CustomMenuItem],
// OverlayManager ์๋น์ค๋ฅผ ์ ๊ณตํฉ๋๋ค.
providers: [OverlayManager],
/* ... */
})
export class CustomMenuModule {}
@NgModule({
imports: [CustomMenuModule],
declarations: [UserProfile],
providers: [UserDataClient],
})
export class UserProfileModule {}
์ ์์ ๋ ๋ค์๊ณผ ๊ฐ์ด ๋์ํฉ๋๋ค:
CustomMenuModule์OverlayManager๋ฅผ ์ ๊ณตํฉ๋๋ค.CustomMenu์CustomMenuItem์ปดํฌ๋ํธ๋CustomMenuModule์ ์ ์ธ๋์ด ์์ผ๋ฏ๋กOverlayManager๋ฅผ ์ฃผ์ ํ ์ ์์ต๋๋ค.UserProfile์ด ์ํ NgModule์์CustomMenuModule์ ๋ก๋ํ๋ฏ๋กUserProfile์OverlayManager๋ฅผ ์ฃผ์ ํ ์ ์์ต๋๋ค.UserDataClient๊ฐ ์ํ NgModule์์CustomMenuModule์ ๋ก๋ํ๋ฏ๋กUserDataClient์OverlayManager๋ฅผ ์ฃผ์ ํ ์ ์์ต๋๋ค.
forRoot์ forChild ํจํด
์ผ๋ถ NgModule์ ์ค์ ์ ์ธ์๋ก ๋ฐ๊ณ ํ๋ก๋ฐ์ด๋ ๋ฐฐ์ด์ ๋ฐํํ๋ ์ ์ forRoot ๋ฉ์๋๋ฅผ ์ ์ํฉ๋๋ค.
forRoot๋ผ๋ ์ด๋ฆ์ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ถํธ์คํธ๋ฉํ ๋ ์ด ํ๋ก๋ฐ์ด๋๋ฅผ ์ ํ๋ฆฌ์ผ์ด์
์ ์ต์์ ์๋ง ์ถ๊ฐํ๋ค๋ ์๋ฏธ๋ก ์ฌ์ฉํ๋ ๊ด๋ก์
๋๋ค.
์ด ๋ฐฉ์์ผ๋ก ํฌํจํ ํ๋ก๋ฐ์ด๋๋ ๋ชจ๋ ์ฆ์ ๋ก๋๋๋ฏ๋ก, ํ์ด์ง๋ฅผ ์ฒ์ ๋ก๋ํ ๋ ํ์ํ JavaScript ๋ฒ๋ค ํฌ๊ธฐ๊ฐ ์ปค์ง๋๋ค.
bootstrapApplication(MyApplicationRoot, {
providers: [CustomMenuModule.forRoot(/* some config */)],
});
๋น์ทํ๊ฒ ์ผ๋ถ NgModule์ ์ ํ๋ฆฌ์ผ์ด์
๊ณ์ธต ์์ ์ปดํฌ๋ํธ์ ํ๋ก๋ฐ์ด๋๋ฅผ ์ถ๊ฐํ๋ค๋ ์๋ฏธ๋ก ์ ์ forChild ๋ฉ์๋๋ฅผ ์ ์ํฉ๋๋ค.
@Component({
/* ... */
providers: [CustomMenuModule.forChild(/* some config */)],
})
export class UserProfile {
/* ... */
}
์ ํ๋ฆฌ์ผ์ด์ ๋ถํธ์คํธ๋ฉํ๊ธฐ
์ค์: Angular ํ์ ์๋ก ์์ฑํ๋ ๋ชจ๋ ์ฝ๋์์ bootstrapModule ๋์ bootstrapApplication์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
์ด ๊ฐ์ด๋๋ @NgModule๋ก ๋ถํธ์คํธ๋ฉํ๋ ๊ธฐ์กด ์ ํ๋ฆฌ์ผ์ด์
์ ์ดํดํ ๋ ์ฐธ๊ณ ํ์ธ์.
@NgModule ๋ฐ์ฝ๋ ์ดํฐ์๋ ํ๋ ์ด์์ ์ปดํฌ๋ํธ๋ฅผ ๋ด๋ bootstrap ๋ฐฐ์ด์ ์ ํ์ ์ผ๋ก ์ง์ ํ ์ ์์ต๋๋ค.
platformBrowser๋ platformServer์ bootstrapModule ๋ฉ์๋๋ก Angular ์ ํ๋ฆฌ์ผ์ด์
์ ์์ํ ์ ์์ต๋๋ค.
์ด ํจ์๋ฅผ ์คํํ๋ฉด ๋ฑ๋กํ ์ปดํฌ๋ํธ์ CSS ์
๋ ํฐ์ ์ผ์นํ๋ ์๋ฆฌ๋จผํธ๋ฅผ ํ์ด์ง์์ ์ฐพ์ ํด๋น ์์น์ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํฉ๋๋ค.
import {platformBrowser} from '@angular/platform-browser';
import {NgModule} from '@angular/core';
@NgModule({
bootstrap: [MyApplication],
})
export class MyApplicationModule {}
platformBrowser().bootstrapModule(MyApplicationModule);
bootstrap์ ๋ฑ๋กํ ์ปดํฌ๋ํธ๋ NgModule์ ์ ์ธ์ ์๋์ผ๋ก ํฌํจ๋ฉ๋๋ค.
NgModule๋ก ์ ํ๋ฆฌ์ผ์ด์
์ ๋ถํธ์คํธ๋ฉํ๋ฉด ํด๋น ๋ชจ๋์ providers์ imports๋ก ๋ก๋ํ ๋ชจ๋ ํ๋ก๋ฐ์ด๋๋ฅผ ์ฆ์ ๋ก๋ํ๋ฉฐ, ์ ํ๋ฆฌ์ผ์ด์
์ ์ฒด์์ ์ด ํ๋ก๋ฐ์ด๋๋ฅผ ์ฃผ์
ํ ์ ์์ต๋๋ค.