본문 바로가기

개발 공부/Angular

ng-template / ng-container 차이

1. ng-template이란?

ng-template은 Angular에서 제공하는 템플릿 컨테이너로, 동적으로 렌더링할 HTML 콘텐츠를 정의하는 데 사용됩니다.
ng-template은 단독으로 렌더링되지 않으며, Angular가 명시적으로 렌더링하도록 설정해야 화면에 나타납니다.

주요 특징

  • 템플릿 정의: ng-template 내부의 코드는 DOM에 렌더링되지 않고, Angular가 필요할 때만 렌더링됩니다.
  • 유연한 사용: *ngIf의 else, ngTemplateOutlet 등의 Angular 지시문과 결합하여 활용됩니다.
  • 매개변수 전달 가능: ng-template에 데이터를 바인딩하거나 전달할 수 있습니다.

 

예시

 

조건부 렌더링

<ng-template #loadingTemplate>
  <p>로딩 중입니다...</p>
</ng-template>

<div *ngIf="isLoading; else loadingTemplate">
  <p>콘텐츠가 로드되었습니다!</p>
</div>

 

  • <ng-template> 내부에 로딩 메시지를 정의합니다.
  • *ngIf의 else 키워드를 사용해 isLoading이 false일 경우 loadingTemplate을 렌더링합니다.

 

 

동적 템플릿 렌더링

<ng-template #greeting let-name="name">
  <p>안녕하세요, {{ name }}님!</p>
</ng-template>

<div *ngFor="let user of users">
  <ng-container *ngTemplateOutlet="greeting; context: { name: user.name }"></ng-container>
</div>

 

 

  • ng-template에서 let-name 구문으로 데이터를 받을 준비를 합니다.
  • ngTemplateOutlet 지시문을 사용해 템플릿을 반복적으로 렌더링하며, context로 데이터를 전달합니다.

 

 

2.ng-container란?

ng-container는 Angular에서 제공하는 그룹핑 컨테이너로, HTML 구조를 최적화하기 위해 사용됩니다. DOM에 렌더링되지 않으며, 단지 Angular가 구조적 지시문을 적용하는 데 활용됩니다.

주요 특징

  • 불필요한 DOM 제거: div와 같은 추가 태그를 생성하지 않고 여러 요소를 그룹화.
  • 구조적 지시문 지원: *ngIf, *ngFor 등의 구조적 지시문과 결합하여 DOM 구조를 간소화.
  • 스타일 및 속성 적용 불가: ng-container는 DOM에 표시되지 않으므로 CSS 스타일이나 속성을 직접 적용할 수 없습니다.

 

예시

 

 

구조적 지시문으로 DOM 최적화

<ng-container *ngIf="showContent">
  <h1>안녕하세요!</h1>
  <p>이 콘텐츠는 조건에 따라 렌더링됩니다.</p>
</ng-container>

 

 

  • showContent가 true일 때만 <h1>과 <p>를 렌더링합니다.
  • ng-container는 DOM에 렌더링되지 않으므로 <div>와 같은 추가 노드가 생성되지 않습니다.

 

중첩된 조건문 처리

<ng-container *ngIf="isLoggedIn; else loggedOut">
  <p>환영합니다, {{ userName }}님!</p>
</ng-container>

<ng-template #loggedOut>
  <p>로그인이 필요합니다.</p>
</ng-template>

 

 

  • ng-container는 조건문 로직을 깔끔하게 처리하면서 추가 DOM 요소를 생성하지 않습니다.
  • else 키워드를 사용하여 ng-template과 결합합니다.

ng-template과 ng-container의 차이점

특징 ng-template ng-container
렌더링 여부 DOM에 렌더링되지 않음, Angular가 명시적으로 렌더링해야 사용됨 DOM에 렌더링되지 않음, Angular가 렌더링 시점에 무시
주요 목적 동적 콘텐츠를 렌더링하거나 템플릿을 정의 그룹화된 콘텐츠를 표시하거나 구조 지시문을 적용
사용 예시 ngIf의 else, ngTemplateOutlet 등 *ngIf, *ngFor와 함께 불필요한 DOM 제거
주요 차이점 템플릿 정의용으로 사용, 직접적으로 콘텐츠를 렌더링하지 않음 그룹핑 요소로 사용, 내부 요소를 조건부로 렌더링하거나 반복 가능

 

 

 

두 요소를 조합한 실전 예제

사용자 프로필 렌더링

<ng-template #userTemplate let-user="user">
  <div class="user-profile">
    <h2>{{ user.name }}</h2>
    <p>나이: {{ user.age }}</p>
  </div>
</ng-template>

<ng-container *ngFor="let user of users">
  <ng-container *ngTemplateOutlet="userTemplate; context: { user: user }"></ng-container>
</ng-container>

 

 

  • ng-template으로 사용자 프로필을 정의하고, 데이터를 받아 렌더링합니다.
  • ng-container를 사용해 반복문 내에서 ngTemplateOutlet을 적용합니다.

 

'개발 공부 > Angular' 카테고리의 다른 글

RxJS의 ReplaySubject / Angular  (0) 2024.12.14
Angular Routing Resolver  (1) 2024.12.11
ng-template / Angular (2)  (0) 2024.12.08
ng-template / Angular (1)  (0) 2024.12.05
ng-container / Angular (2)  (0) 2024.12.02