# Angular 19 면접 질문: Signals, SSR과 반드시 알아야 할 개념
> 가장 자주 나오는 Angular 19 면접 질문: Signals, 점진적 하이드레이션, zoneless 변경 감지, 새로운 리액티브 API. 코드 예제와 기대되는 답변까지 함께 정리합니다.
- Published: 2026-03-28
- Updated: 2026-05-04
- Author: Anthony Fillion-Maillet
- Tags: angular, interview, signals, ssr, angular-19
- Reading time: 9 min
---
2026년 Angular 면접은 단순한 컴포넌트와 서비스 차원을 훨씬 넘어섭니다. 2024년 11월에 출시된 Angular 19는 안정화된 Signals, 점진적 하이드레이션을 갖춘 SSR, zoneless 변경 감지라는 근본적인 아키텍처 전환을 가져왔습니다. 이 개념들을 숙지했는지 여부가 미들 레벨과 시니어 레벨 후보를 가르는 기준이 됩니다.
> **2026년 면접관이 평가하는 포인트**
>
> Angular 19 질문은 세 가지 영역을 겨냥합니다. Signals를 통한 세밀한 리액티비티, 점진적 하이드레이션을 통한 SSR 성능, 그리고 Zone.js 없이 애플리케이션을 설계하는 능력입니다. 기대되는 답변은 단순한 문법 지식이 아니라 아키텍처적 이해를 보여줍니다.
## Angular 19 Signals: 새로운 리액티비티 모델
Signals는 변경 감지가 도입된 이래 Angular에서 가장 본질적인 변화입니다. Signal은 값이 변경될 때 자동으로 컨슈머에게 알림을 보내는 동기 리액티브 값입니다.
**전형적인 질문: "Signal과 RxJS Observable의 차이는 무엇입니까?"**
기대되는 답변은 두 모델을 명확히 구분합니다.
```typescript
// signals-vs-observables.ts
import { signal, computed, effect } from '@angular/core';
// Signal: synchronous, value always available
const count = signal(0);
const doubled = computed(() => count() * 2); // Recomputed only when count changes
// Effect: reacts to signal changes
effect(() => {
console.log(`Count: ${count()}, Doubled: ${doubled()}`);
});
count.set(5); // Immediate, synchronous notification
```
Signals는 세밀한 의존성 그래프를 사용합니다. retry, debounce, merge 등 복잡한 비동기 워크플로우를 다루는 RxJS와 달리, Signals는 동기적인 UI 리액티비티를 최적화합니다. Angular 19는 컴포넌트 상태에는 Signals를, 비동기 스트림 (HTTP 요청, WebSocket)에는 RxJS를 권장합니다.
## Signal Inputs와 Queries: @Input()에서 마이그레이션
Angular 19는 input, output, query를 위한 signal 기반 API를 안정화했습니다. 이 질문은 면접에서 꾸준히 등장합니다.
**전형적인 질문: "기존 @Input()을 Signal Input으로 어떻게 마이그레이션합니까?"**
```typescript
// user-card.component.ts
import { Component, input, computed } from '@angular/core';
@Component({
selector: 'app-user-card',
template: `
{{ fullName() }}
{{ role() }}
`
})
export class UserCardComponent {
// Signal inputs: strict typing, optional default value
firstName = input.required();
lastName = input.required();
role = input('developer'); // Default value
// Computed derived from inputs: automatically recomputed
fullName = computed(() => `${this.firstName()} ${this.lastName()}`);
}
```
핵심 이점은 Signal Inputs가 라이프사이클 훅 없이도 `computed()` 값을 직접 만들 수 있다는 점입니다. 입력 변화에 반응하기 위해 더 이상 `ngOnChanges`가 필요하지 않습니다. Angular는 마이그레이션을 자동화하기 위해 `signal-input-migration` schematic을 제공합니다.
## linkedSignal: 의존 상태 동기화
`linkedSignal`은 소스에 연결된 쓰기 가능한 signal을 만드는 Angular 19의 실험적 API입니다. 이 개념은 시니어 레벨 면접에서 자주 등장합니다.
**전형적인 질문: "linkedSignal로 변경 가능한 파생 상태를 어떻게 다룹니까?"**
```typescript
// product-filter.component.ts
import { signal, linkedSignal } from '@angular/core';
// Category list that can change
const categories = signal(['frontend', 'backend', 'devops']);
// Linked selection: resets when categories change
const selectedCategory = linkedSignal({
source: categories,
computation: (cats) => cats[0] // Reset to first element
});
// Manual modification still possible
selectedCategory.set('backend');
// When categories changes, selectedCategory resets automatically
categories.set(['mobile', 'data', 'cloud']);
// selectedCategory() === 'mobile'
```
구체적인 사용 사례: 소스 리스트가 바뀌면 선택이 리셋되는 필터 드롭다운입니다. `linkedSignal`이 없을 때 이 패턴은 `effect()` 안에서 `set()`을 호출해야 했고, 이는 업데이트 루프를 만드는 안티 패턴이었습니다.
> **면접 함정: effect() 안에서 set()**
>
> `effect()` 내부에서 `signal.set()`을 호출하는 것은 Angular가 감지하는 안티 패턴입니다. 프레임워크는 개발 모드에서 경고를 출력합니다. 올바른 해법은 파생 값이 쓰기 가능해야 하는지에 따라 `linkedSignal` 또는 `computed()`를 사용하는 것입니다.
## Resource API: Signals로 비동기 데이터 로드
Angular 19는 비동기 데이터 로딩을 위한 실험적 API `resource`를 도입했습니다. 이 API는 컴포넌트의 전통적인 service + subscribe 패턴을 대체합니다.
```typescript
// user-profile.component.ts
import { resource, signal } from '@angular/core';
import { inject } from '@angular/core';
import { HttpClient } from '@angular/common/http';
const userId = signal(42);
const http = inject(HttpClient);
// Resource: links a source signal to an async loader
const userResource = resource({
request: () => ({ id: userId() }), // Recomputed when userId changes
loader: async ({ request }) => {
const response = await fetch(`/api/users/${request.id}`);
return response.json();
}
});
// Access in template
// userResource.value() -> data (or undefined)
// userResource.isLoading() -> boolean
// userResource.error() -> error if any
```
면접에서 `resource`와 `rxResource` (RxJS 버전)에 대한 지식을 보여주는 것은 능동적인 기술 트래킹의 증거입니다. `rxResource`는 Observable을 로더로 사용하므로 기존 RxJS 코드베이스를 가진 팀에 유용합니다.
## Angular 19의 SSR과 점진적 하이드레이션
Angular 19는 developer preview 단계의 점진적 하이드레이션으로 SSR을 한 단계 끌어올립니다. [Google Search 규모](https://blog.angular.dev/meet-angular-v19-7b29dfd05b84)에서 검증된 이 기능은 면접에서 점점 자주 등장하는 주제입니다.
**전형적인 질문: "Angular 19의 점진적 하이드레이션은 어떻게 동작합니까?"**
전통적인 하이드레이션은 서버 렌더링 이후 클라이언트에서 컴포넌트 트리 전체를 다시 만듭니다. 점진적 하이드레이션은 화면에 보이거나 상호작용이 발생한 시점에 필요한 컴포넌트만 하이드레이트합니다.
```typescript
// product-page.component.ts
import { Component } from '@angular/core';
@Component({
template: `
@defer (on viewport) {
}
@defer (on interaction) {
}
`
})
export class ProductPageComponent {
productId = 'angular-19-guide';
}
```
`@defer` 디렉티브는 하이드레이션 시점을 정밀하게 제어합니다. 사용 가능한 트리거: `on viewport` (가시), `on interaction` (클릭, 포커스), `on idle` (브라우저 유휴), `on timer(5s)` (지연). 콘텐츠는 하이드레이션 전에도 정적인 HTML로 계속 표시되므로 콘텐츠가 깜박이지 않습니다.
## 라우트 단위 render mode: 라우트별 세밀한 SSR
Angular 19는 라우트 단위의 render mode를 도입해 동일한 애플리케이션 안에서 SSR, SSG, CSR이 공존할 수 있게 했습니다.
```typescript
// app.routes.server.ts
import { RenderMode, ServerRoute } from '@angular/ssr';
export const serverRoutes: ServerRoute[] = [
// Marketing pages: pre-rendered at build time (SSG)
{ path: '', renderMode: RenderMode.Prerender },
{ path: 'pricing', renderMode: RenderMode.Prerender },
// Dashboard: server-rendered on each request (SSR)
{ path: 'dashboard/**', renderMode: RenderMode.Server },
// Interactive editor: client-side only (CSR)
{ path: 'editor/**', renderMode: RenderMode.Client },
];
```
면접에서 라우트별 render mode 선택을 정당화할 수 있다는 것은 성능, SEO, 인터랙티비티 사이의 트레이드오프를 이해하고 있음을 보여줍니다. 정적 페이지 (랜딩, 블로그)는 prerender의 이점을 누립니다. 사용자 데이터를 가진 동적 페이지는 SSR을 사용합니다. 인터랙티브한 애플리케이션은 CSR을 유지합니다.
## Zoneless 변경 감지: Zone.js 없는 아키텍처
Zoneless 변경 감지는 Angular 19에서 가장 중요한 아키텍처적 진화입니다. 시니어 면접에서 이 질문은 필수가 되었습니다.
**전형적인 질문: "Zone.js 없이 변경 감지는 어떻게 작동합니까?"**
```typescript
// main.ts
import { bootstrapApplication } from '@angular/platform-browser';
import {
provideExperimentalZonelessChangeDetection
} from '@angular/core';
import { AppComponent } from './app.component';
bootstrapApplication(AppComponent, {
providers: [
provideExperimentalZonelessChangeDetection()
]
});
```
Zone.js가 없으면 Angular는 더 이상 브라우저의 비동기 API (setTimeout, Promise, addEventListener)에 패치를 적용하지 않습니다. 변경 감지는 오직 Signals를 통해서만 트리거됩니다. 측정 가능한 이점:
- 번들 크기 10-15 KB 감소 (zone.js 제거)
- Zone.js 프레임이 없는 깔끔한 스택 트레이스
- 타깃팅된 변경 감지: 변경된 Signal의 영향을 받는 컴포넌트만 다시 렌더링
> **Angular 20.2: zoneless가 안정화**
>
> Angular 20.2부터 zoneless 모드는 `provideZonelessChangeDetection()` (Experimental 접두사 없이)으로 안정화되었습니다. 이 진화 과정을 면접에서 언급하면 생태계에 대한 능동적인 추적을 보여줍니다.
## 기본값으로 standalone: NgModules의 종말
Angular 19는 standalone 컴포넌트를 기본 동작으로 만들었습니다. `standalone: true` 플래그가 더 이상 필요하지 않습니다. 이 결정은 아키텍처를 단순화하고 보일러플레이트를 줄입니다.
**전형적인 질문: "standalone-by-default는 Angular 애플리케이션 아키텍처에 어떤 영향을 줍니까?"**
```typescript
// dashboard.component.ts
@Component({
selector: 'app-dashboard',
imports: [CommonModule, RouterModule, UserCardComponent],
template: `
@for (user of users(); track user.id) {
}
`
})
export class DashboardComponent {
users = signal([]);
}
```
각 컴포넌트는 `imports`를 통해 의존성을 명시적으로 선언합니다. NgModules는 하위 호환성을 위해 계속 사용할 수 있지만, 새로운 Angular 19+ 애플리케이션에서는 더 이상 필요하지 않습니다. 면접에서는 빅뱅 방식 대신 컴포넌트 단위의 점진적 마이그레이션을 설명할 수 있는 능력이 높이 평가됩니다.
## Angular 19 면접을 위한 답변 전략
기술 면접관은 Angular 19에 대해 세 가지 차원을 평가합니다.
- **아키텍처적 이해**: Signals가 단순한 사용법이 아니라 왜 점진적으로 Zone.js를 대체하는지를 설명할 수 있어야 합니다
- **트레이드오프**: `computed()`, `linkedSignal`, `effect()`를 언제 사용할지, 그리고 RxJS를 언제 유지할지 알아야 합니다
- **마이그레이션**: 전통적인 Angular 애플리케이션에서 Signals와 zoneless 모드로의 점진적 마이그레이션 전략을 설명해야 합니다
핵심은 [공식 Angular 문서](https://angular.dev)를 그대로 외워서 말하지 않는 것입니다. 모든 답변은 복잡한 폼, SSR이 적용된 e-커머스 페이지, 실시간 대시보드 등 실제 프로젝트에서 가져온 구체적인 사용 사례로 뒷받침해야 합니다.
면접 전 Angular의 기초 개념을 점검하려면 [Angular 면접 질문 25선 가이드](/blog/angular/top-25-angular-interview-questions)를 참고하십시오.
## 결론
- Angular 19의 Signals는 `@Input()` + `ngOnChanges` 패턴을 세밀한 동기 리액티브 모델로 대체합니다. `signal()`, `computed()`, `input()`이 사용 사례의 90%를 커버합니다
- `linkedSignal`은 `effect()` + `set()` 안티 패턴에 의존하지 않고 변경 가능한 파생 상태를 해결합니다
- `@defer`를 활용한 점진적 하이드레이션은 SEO를 희생하지 않으면서 Time to Interactive를 줄입니다. 각 컴포넌트는 자신의 트리거에 따라 하이드레이트됩니다
- zoneless 모드는 번들에서 Zone.js를 제거하고 변경 감지를 Signal의 영향을 받는 컴포넌트로만 한정합니다
- 라우트 단위 render mode는 페이지별 요구 사항에 따라 같은 애플리케이션에서 SSG, SSR, CSR을 혼합할 수 있게 합니다
- standalone-by-default 컴포넌트는 새로운 애플리케이션에서 NgModules의 필요를 없앱니다
- 면접에서는 트레이드오프를 보여주는 것 (Signals vs RxJS, SSR vs CSR, zoneless vs Zone.js)이 문법보다 중요합니다
---
Source: SharpSkill (https://sharpskill.dev), tech interview preparation for your real stack.
HTML version of this page: https://sharpskill.dev/ko/blog/angular/angular-19-interview-questions-signals-ssr-must-know