Loading episodesโ€ฆ
0:00 0:00

๐Ÿง  ์ด ํ•œ ์ค„ ๋ณ€๊ฒฝ์œผ๋กœ Angular 20 ๋ผ์šฐํŠธ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ์ด ๋ช…ํ™•ํ•ด์ง„๋‹ค

00:00
BACK TO HOME

๐Ÿง  ์ด ํ•œ ์ค„ ๋ณ€๊ฒฝ์œผ๋กœ Angular 20 ๋ผ์šฐํŠธ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ์ด ๋ช…ํ™•ํ•ด์ง„๋‹ค

Ahmed Bouchefra June 18, 2025 5 min read

Angular๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด ๋ผ์šฐํŠธ ํŒŒ๋ผ๋ฏธํ„ฐ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์—์„œ ๋†€๋ผ์šด ๋ฐœ์ „์„ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Angular 16 ์ด์ „ ๋ฒ„์ „์œผ๋กœ ์ž‘์—…ํ•ด ๋ณธ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ๋‹จ์ˆœํ•œ id ํ•˜๋‚˜๋ฅผ ์ถ”์ถœํ•˜๊ธฐ ์œ„ํ•ด ActivatedRoute์™€ paramMap์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉํ•œ ๊ธฐ์–ต์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด์ œ Angular 20์˜ ์ตœ์‹  ๊ฐœ๋ฐœ ํŒจํ„ด๊ณผ ์ž˜ ์–ด์šธ๋ฆฌ๋Š” ๋” ๋‚˜์€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ withComponentInputBinding()์ž…๋‹ˆ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” ์ด ๊ธฐ๋Šฅ์ด ๋ฌด์—‡์ธ์ง€, ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ์•”๋ฌต์ ์œผ๋กœ ์ดˆ๋ž˜ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ์šฐ์•„ํ•˜๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค โ€” Angular 20 ๊ธฐ์ค€์œผ๋กœ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ’ก withComponentInputBinding()์ด๋ž€?

withComponentInputBinding()์€ ๋ผ์šฐํŠธ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ปดํฌ๋„ŒํŠธ์˜ @Input() ์†์„ฑ์— ์ž๋™์œผ๋กœ ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์„ค์ • ์œ ํ‹ธ๋ฆฌํ‹ฐ์ž…๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ผ์šฐํŠธ ์˜ต์ €๋ฒ„๋ธ”์„ ์ˆ˜๋™์œผ๋กœ ๊ตฌ๋…ํ•  ํ•„์š” ์—†์ด ์ปดํฌ๋„ŒํŠธ์—์„œ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, /user/:id๋ผ๋Š” ๊ฒฝ๋กœ๊ฐ€ ์žˆ๊ณ  ์ปดํฌ๋„ŒํŠธ์— id๋ผ๋Š” @Input()์ด ์žˆ๋‹ค๋ฉด, Angular๋Š” ์ž๋™์œผ๋กœ ์ด๋ฅผ ๋งคํ•‘ํ•ด์ค๋‹ˆ๋‹ค โ€” ๋‹จ, ๋ผ์šฐํ„ฐ ์„ค์ •์—์„œ ์ด ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ–ˆ์„ ๊ฒฝ์šฐ์—๋งŒ.

โœ… ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  1. ๊ฒฝ๋กœ๋ฅผ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค:
{ path: 'user/:id', component: UserComponent }
  1. ์ปดํฌ๋„ŒํŠธ์—์„œ @Input()์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค:
@Input() id!: string;
  1. ๋ผ์šฐํ„ฐ ์„ค์ •์—์„œ ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•ฉ๋‹ˆ๋‹ค:
provideRouter(routes, withComponentInputBinding())

์ด์ œ ๋” ์ด์ƒ ๊ตฌ๋… ์—†์ด๋„ ๋ผ์šฐํŠธ ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ์ปดํฌ๋„ŒํŠธ์— ์ž๋™ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ˜• ๋ฌธ์ œ์ : ์ฝ”๋“œ์—์„œ์˜ ์˜๋„ ๋ชจํ˜ธ์„ฑ

์ด ๊ธฐ๋Šฅ์€ ๋ถ„๋ช… ์œ ์šฉํ•˜์ง€๋งŒ, ์ฝ”๋“œ์˜ ์˜๋„๋ฅผ ํ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@Input()์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค๋Š” ์˜๋ฏธ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์— ๋ผ์šฐํŠธ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์—ฐ๊ฒฐํ•˜๋ฉด, ์ฝ”๋“œ์˜ ์˜๋ฏธ๊ฐ€ ์• ๋งคํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž(ํ˜น์€ ๋ฏธ๋ž˜์˜ ์ž์‹ )๋Š” ์ด ๊ฐ’์ด URL์—์„œ ์™”๋‹ค๋Š” ์‚ฌ์‹ค์„ ํŒŒ์•…ํ•˜์ง€ ๋ชปํ•˜๊ณ , ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ „๋‹ฌ๋˜์—ˆ๋‹ค๊ณ  ์ฐฉ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿงช ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•: ๋ช…ํ™•ํ•œ ์˜๋„๋ฅผ ์œ„ํ•œ ๋ณ„์นญ ์‚ฌ์šฉ

ํ•ด๊ฒฐ์ฑ…์€ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. Angular์˜ ๋‚ด์žฅ input() ์‹œ๊ทธ๋„์— ๋ณ„์นญ์„ ๋ถ™์—ฌ, ์˜ˆ๋ฅผ ๋“ค์–ด routeBinding()์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

import { input, input as routeBinding } from '@angular/core';

์ด์ œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž…๋ ฅ์˜ ์ถœ์ฒ˜๋ฅผ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • input() โ†’ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ „๋‹ฌ๋œ ๊ฐ’
  • routeBinding() โ†’ ๋ผ์šฐํ„ฐ์—์„œ ์ „๋‹ฌ๋œ ๊ฐ’

์˜ˆ์‹œ:

id = routeBinding<string>();     // ๋ผ์šฐํ„ฐ์—์„œ ์ „๋‹ฌ๋œ ํŒŒ๋ผ๋ฏธํ„ฐ
title = input<string>();         // ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ „๋‹ฌ๋œ ์ž…๋ ฅ๊ฐ’

์ด ์ž‘์€ ๋ณ€๊ฒฝ์€ Angular์˜ ์ž‘๋™ ๋ฐฉ์‹์— ์•„๋ฌด๋Ÿฐ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์ง€๋งŒ, ์ฝ”๋“œ์˜ ์˜๋„๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๊ณ , ๊ฐ€๋…์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.


๐Ÿงฑ ์˜ˆ์‹œ: Angular 20์—์„œ ๋ช…ํ™•ํ•œ ๋ผ์šฐํŠธ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ”์ธ๋”ฉ

๐Ÿ”น 1๋‹จ๊ณ„: UserComponent ์ƒ์„ฑ

import { Component, input, input as routeBinding } from '@angular/core';

@Component({
  selector: 'app-user',
  standalone: true,
  template: `
    <h2>์œ ์ € ์ปดํฌ๋„ŒํŠธ</h2>
    <p>๋ผ์šฐํŠธ ํŒŒ๋ผ๋ฏธํ„ฐ ID: <strong></strong></p>
  `,
})
export class UserComponent {
  id = routeBinding<string>(); // ๋ผ์šฐํ„ฐ์—์„œ ์ „๋‹ฌ
  regularInput = input<string>(); // ๋ถ€๋ชจ์—์„œ ์ „๋‹ฌ
}

๐Ÿ”น 2๋‹จ๊ณ„: ๋ฃจํŠธ ์ปดํฌ๋„ŒํŠธ ์„ค์ •

import { Component } from '@angular/core';
import { RouterLink, RouterOutlet } from '@angular/router';

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [RouterOutlet, RouterLink],
  template: `
    <h1>Angular 20 ๋ผ์šฐํŠธ ํŒŒ๋ผ๋ฏธํ„ฐ ๋ฐ๋ชจ</h1>
    <nav>
      <a [routerLink]="['/user', 42]">/user/42 ์ด๋™</a>
    </nav>
    <router-outlet/>
  `,
})
export class AppComponent {}

๐Ÿ”น 3๋‹จ๊ณ„: ๋ผ์šฐํ„ฐ ์„ค์ • ๋ฐ ์•ฑ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ

import { bootstrapApplication } from '@angular/platform-browser';
import { provideRouter, Routes, withComponentInputBinding } from '@angular/router';
import { AppComponent } from './app.component';
import { UserComponent } from './user.component';

const routes: Routes = [
  {
    path: 'user/:id',
    component: UserComponent,
  },
];

bootstrapApplication(AppComponent, {
  providers: [provideRouter(routes, withComponentInputBinding())],
});

โœ… ์š”์•ฝ

๊ธฐ๋Šฅ ์„ค๋ช…
withComponentInputBinding() ๋ผ์šฐํŠธ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ปดํฌ๋„ŒํŠธ ์ž…๋ ฅ์— ์ž๋™ ์—ฐ๊ฒฐ
๋ณ„์นญ ์‚ฌ์šฉ routeBinding() ๋ณ„์นญ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ ์˜๋„ ๋ช…ํ™•ํ™”
Angular 20 ์™„๋ฒฝ ํ˜ธํ™˜ ์Šคํƒ ๋“œ์–ผ๋ก  ์ปดํฌ๋„ŒํŠธ ๋ฐ ์‹œ๊ทธ๋„ ์•„ํ‚คํ…์ฒ˜์— ์ตœ์ 
DX ํ–ฅ์ƒ ๋” ์‰ฌ์šด ๋””๋ฒ„๊น…๊ณผ ํ˜‘์—… ๊ฐ€๋Šฅ

๐Ÿš€ ๋งˆ๋ฌด๋ฆฌ ์ƒ๊ฐ

๋น„๋ก withComponentInputBinding()์€ ์ด์ „ ๋ฒ„์ „์— ๋„์ž…๋œ ๊ธฐ๋Šฅ์ด์ง€๋งŒ, Angular 20์€ ์ด ๊ธฐ๋Šฅ์„ ๋„์ž…ํ•˜๊ธฐ์— ์™„๋ฒฝํ•œ ์‹œ์ ์ž…๋‹ˆ๋‹ค. ์Šคํƒ ๋“œ์–ผ๋ก  ์ปดํฌ๋„ŒํŠธ์™€ ์‹œ๊ทธ๋„ ์ค‘์‹ฌ ์•„ํ‚คํ…์ฒ˜๊ฐ€ ์ค‘์‹ฌ์ด ๋œ ์ง€๊ธˆ, ๋ผ์šฐํŒ… ๋ฐฉ์‹๋„ ํ•œ ๋‹จ๊ณ„ ์ง„ํ™”ํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

input()์„ ๋ผ์šฐํŠธ ํŒŒ๋ผ๋ฏธํ„ฐ์šฉ์œผ๋กœ aliasํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ์ด ์ž‘์€ ํŠธ๋ฆญ์€ ์ฝ”๋“œ ์˜๋„๋ฅผ ๋ช…ํ™•ํžˆ ํ•˜๊ณ , ํ˜‘์—…๊ณผ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ์‰ฝ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๐Ÿ’ฌ ์—ฌ๋Ÿฌ๋ถ„์˜ ์ƒ๊ฐ์€?

์ด ๋ณ„์นญ ํŒจํ„ด์„ Angular 20 ํ”„๋กœ์ ํŠธ์— ๋„์ž…ํ•ด๋ณด์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? Angular์—์„œ ๊ณต์‹์ ์œผ๋กœ @RouteParam() ๊ฐ™์€ ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ๋ฅผ ๋„์ž…ํ•˜๋ฉด ์ข‹์„๊นŒ์š”?


Join the 10xdev Community

Subscribe and get 8+ free PDFs that contain detailed roadmaps with recommended learning periods for each programming language or field, along with links to free resources such as books, YouTube tutorials, and courses with certificates.

Audio Interrupted

We lost the audio stream. Retry with shorter sentences?