웹 개발을 하다 보면 프론트엔드 프레임워크 선택에 고민이 생기죠. React, Vue, 그리고 Angular… 이 중에서 Angular(앵귤러)는 구글이 만들어 엔터프라이즈급 프로젝트에서 특히 사랑받는 프레임워크입니다. 오늘은 Angular가 무엇인지, 왜 사용하는지, 그리고 어떻게 시작하면 되는지 실전 경험을 바탕으로 차근차근 알아보겠습니다.
1. Angular(앵귤러), 정확히 뭘까요?
Angular는 구글(Google)이 개발하고 유지보수하는 TypeScript 기반의 오픈소스 웹 애플리케이션 프레임워크입니다. 2016년 9월에 공식 출시된 이후, 현재는 2025년 5월에 출시된 Angular v20이 최신 버전이에요.
많은 분들이 헷갈려하시는 부분이 있는데요, “AngularJS”와 “Angular”는 완전히 다른 프레임워크입니다. AngularJS는 2010년에 출시된 구버전(Angular 1)이고, 2016년부터 등장한 Angular 2 이상의 버전을 그냥 “Angular”라고 부릅니다. 완전히 새로 작성된 프레임워크라고 보시면 됩니다.
Angular의 가장 큰 특징은 “완전한 프레임워크(Full-Featured Framework)”라는 점입니다. React가 UI 라이브러리로 추가 도구가 필요한 것과 달리, Angular는 라우팅(Routing), 상태 관리(State Management), 폼 처리(Form Handling), HTTP 클라이언트 등 웹 애플리케이션 개발에 필요한 모든 기능을 기본 제공합니다.
2. 왜 Angular를 선택할까? 핵심 장점들
완벽한 올인원 솔루션
Angular를 처음 접하면 “배울 게 많네”라고 느낄 수 있어요. 하지만 이게 바로 Angular의 강점입니다. 라우팅은 어떤 라이브러리를 쓸지, 상태 관리는 뭘로 할지 고민할 필요가 없습니다. Angular가 제공하는 Angular Router, RxJS, Dependency Injection 등을 사용하면 됩니다.
대규모 팀 프로젝트를 진행할 때 이런 일관성은 정말 중요합니다. 모든 개발자가 같은 패턴과 도구를 사용하니 코드 리뷰도 수월하고, 유지보수성도 훨씬 좋아지죠.
TypeScript가 기본
Angular는 TypeScript를 기본 언어로 사용합니다. 현재 Angular v20은 TypeScript 5.8 이상을 요구하고 있어요. 처음에는 타입 지정이 번거롭게 느껴질 수 있지만, 프로젝트가 커질수록 TypeScript의 진가를 느끼게 됩니다.
예를 들어, 컴포넌트 간 데이터를 주고받을 때 타입 오류를 미리 잡아주니 런타임 에러가 확 줄어듭니다. IDE의 자동완성 기능도 훨씬 정확해지고요.
엔터프라이즈 친화적
Google, Microsoft, IBM 같은 글로벌 기업들이 Angular를 사용하는 데는 이유가 있습니다. Angular는 대규모 애플리케이션을 구축하는 데 필요한 체계적인 구조(Opinionated Structure)를 제공합니다.
최근 통계에 따르면 2025년 현재 미국에서만 약 23,000개 이상의 Angular 관련 채용 공고가 있다고 합니다. 금융, 헬스케어, 정부 프로젝트 등 안정성이 중요한 분야에서 특히 선호되고 있습니다.
강력한 CLI 도구
Angular CLI(Command Line Interface)는 정말 훌륭한 도구입니다. 프로젝트 생성부터 컴포넌트 생성, 빌드, 테스트까지 모든 과정을 명령어 한 줄로 처리할 수 있어요. 예를 들어 새 컴포넌트를 만들 때:
ng generate component my-component
# 또는 축약형
ng g c my-component
이렇게 하면 컴포넌트 파일(.ts), 템플릿 파일(.html), 스타일 파일(.css), 테스트 파일(.spec.ts)이 자동으로 생성됩니다. 보일러플레이트 코드 작성 시간을 대폭 줄여주죠.
3. Angular의 핵심 개념 이해하기
Angular를 제대로 사용하려면 몇 가지 핵심 개념을 이해해야 합니다. 하나씩 살펴볼까요?
컴포넌트 (Components)
컴포넌트는 Angular 애플리케이션의 기본 구성 요소입니다. 화면의 각 부분을 독립적인 컴포넌트로 만들어 재사용할 수 있습니다.
import { Component } from '@angular/core';
@Component({
standalone: true,
selector: 'app-hello',
template: `<h1>안녕하세요, {{name}}님!</h1>`,
styles: [`h1 { color: #1976d2; }`]
})
export class HelloComponent {
name = 'Angular 개발자';
}
Angular v20부터는 Standalone Components가 기본 권장 방식입니다. 이전에는 NgModule이 필수였지만, 이제는 더 간단하게 컴포넌트를 만들 수 있게 되었어요.
템플릿 문법 (Template Syntax)
Angular는 강력한 템플릿 문법을 제공합니다. HTML을 확장한 형태로, 데이터 바인딩과 디렉티브를 사용할 수 있습니다.
데이터 바인딩 종류:
- 보간(Interpolation):
{{ }}
– 데이터를 화면에 표시 - 프로퍼티 바인딩(Property Binding):
[property]="value"
– DOM 속성 바인딩 - 이벤트 바인딩(Event Binding):
(event)="handler()"
– 이벤트 처리 - 양방향 바인딩(Two-way Binding):
[(ngModel)]="property"
– 양방향 데이터 동기화
<!-- 프로퍼티 바인딩 예시 -->
<img [src]="imageUrl" [alt]="imageDescription">
<!-- 이벤트 바인딩 예시 -->
<button (click)="handleClick()">클릭하세요</button>
<!-- 양방향 바인딩 예시 -->
<input [(ngModel)]="username" placeholder="이름을 입력하세요">
새로운 Control Flow 문법
Angular v20에서는 기존의 구조 디렉티브(*ngIf
, *ngFor
, *ngSwitch
)가 공식적으로 deprecated되었습니다. 대신 더 직관적인 Control Flow 문법을 사용합니다:
<!-- 조건부 렌더링 -->
@if (isLoggedIn) {
<p>환영합니다!</p>
} @else {
<p>로그인이 필요합니다.</p>
}
<!-- 반복문 -->
@for (item of items; track item.id) {
<div>{{ item.name }}</div>
}
<!-- Switch문 -->
@switch (status) {
@case ('pending') {
<p>대기 중...</p>
}
@case ('success') {
<p>완료되었습니다!</p>
}
@default {
<p>알 수 없는 상태</p>
}
}
Signals – 반응형 프로그래밍의 미래
Angular v20에서 Signals API가 안정화되었습니다. Signals는 Angular의 새로운 반응형 프로그래밍 방식으로, 상태 관리를 더 간단하고 효율적으로 만들어줍니다.
import { Component, signal, computed } from '@angular/core';
@Component({
standalone: true,
selector: 'app-counter',
template: `
<p>카운트: {{ count() }}</p>
<p>두 배: {{ doubled() }}</p>
<button (click)="increment()">증가</button>
`
})
export class CounterComponent {
count = signal(0);
doubled = computed(() => this.count() * 2);
increment() {
this.count.update(value => value + 1);
}
}
의존성 주입 (Dependency Injection)
Angular의 의존성 주입 시스템은 정말 강력합니다. 서비스를 쉽게 공유하고 테스트할 수 있게 해주죠.
// 서비스 정의
import { Injectable } from '@angular/core';
@Injectable({
providedIn: 'root'
})
export class DataService {
getData() {
return ['항목1', '항목2', '항목3'];
}
}
// 컴포넌트에서 사용
import { Component, inject } from '@angular/core';
import { DataService } from './data.service';
@Component({
standalone: true,
selector: 'app-list',
template: `
@for (item of items; track item) {
<li>{{ item }}</li>
}
`
})
export class ListComponent {
private dataService = inject(DataService);
items = this.dataService.getData();
}
4. Angular 시작하기 – 실전 단계별 가이드
자, 이제 실제로 Angular 프로젝트를 시작해볼까요? 차근차근 따라해보세요.
사전 준비 (Prerequisites)
Angular를 사용하려면 먼저 Node.js를 설치해야 합니다. Angular v20은 Node.js v20 이상을 요구합니다.
1단계: Node.js 설치 확인
터미널(Terminal)이나 명령 프롬프트(Command Prompt)를 열고 다음 명령어를 입력하세요:
node -v
npm -v
Node.js 버전이 20.0.0 이상이면 준비 완료입니다. 설치가 안 되어 있다면 Node.js 공식 사이트에서 LTS 버전을 다운로드하세요.
2단계: Angular CLI 설치
Angular CLI를 전역으로 설치합니다:
npm install -g @angular/cli
설치가 완료되면 버전을 확인해보세요:
ng version
Angular CLI 20.1.3 버전이 표시되면 성공입니다.
첫 프로젝트 만들기
3단계: 새 프로젝트 생성
원하는 폴더로 이동한 후, 다음 명령어를 실행하세요:
ng new my-first-angular-app
CLI가 몇 가지 질문을 할 거예요:
- Would you like to add Angular routing? (라우팅을 추가하시겠습니까?) → Yes 선택
- Which stylesheet format would you like to use? (어떤 스타일시트를 사용하시겠습니까?) → CSS 선택 (초보자에게 추천)
- Do you want to enable Server-Side Rendering (SSR) and Static Site Generation (SSG/Prerendering)? (SSR을 활성화하시겠습니까?) → No 선택 (일단은)
이제 Angular가 프로젝트를 생성합니다. 몇 분 정도 걸릴 수 있어요.
4단계: 개발 서버 실행
프로젝트 폴더로 이동하고 개발 서버를 실행합니다:
cd my-first-angular-app
ng serve
또는 자동으로 브라우저를 열고 싶다면:
ng serve --open
# 축약형: ng serve -o
브라우저에서 http://localhost:4200
을 열면 Angular 시작 페이지가 보입니다!
프로젝트 구조 살펴보기
생성된 프로젝트의 주요 폴더 구조를 이해해봅시다:
my-first-angular-app/
├── src/
│ ├── app/
│ │ ├── app.component.ts (메인 컴포넌트 로직)
│ │ ├── app.component.html (메인 컴포넌트 템플릿)
│ │ ├── app.component.css (메인 컴포넌트 스타일)
│ │ ├── app.component.spec.ts (메인 컴포넌트 테스트)
│ │ └── app.config.ts (앱 설정)
│ ├── index.html (HTML 진입점)
│ ├── main.ts (TypeScript 진입점)
│ └── styles.css (전역 스타일)
├── angular.json (Angular 설정 파일)
├── package.json (프로젝트 의존성)
└── tsconfig.json (TypeScript 설정)
첫 컴포넌트 만들기
실제로 컴포넌트를 하나 만들어볼까요?
5단계: 새 컴포넌트 생성
ng generate component hello-world
# 또는: ng g c hello-world
이 명령어는 src/app/hello-world/
폴더를 만들고 필요한 파일들을 자동 생성합니다.
6단계: 컴포넌트 수정하기
hello-world.component.ts
파일을 열어서 다음처럼 수정해봅시다:
import { Component } from '@angular/core';
@Component({
selector: 'app-hello-world',
standalone: true,
template: `
<div class="greeting-card">
<h2>{{ title }}</h2>
<p>{{ message }}</p>
<button (click)="changeMessage()">메시지 변경</button>
</div>
`,
styles: [`
.greeting-card {
padding: 20px;
border: 2px solid #1976d2;
border-radius: 8px;
text-align: center;
max-width: 400px;
margin: 20px auto;
}
button {
background-color: #1976d2;
color: white;
padding: 10px 20px;
border: none;
border-radius: 4px;
cursor: pointer;
}
button:hover {
background-color: #1565c0;
}
`]
})
export class HelloWorldComponent {
title = 'Angular에 오신 것을 환영합니다!';
message = '이것은 당신의 첫 Angular 컴포넌트입니다.';
changeMessage() {
this.message = 'Angular로 개발하는 것은 즐겁습니다! 🎉';
}
}
7단계: 메인 앱에 컴포넌트 추가
app.component.ts
파일을 열어서 새 컴포넌트를 import하고 사용합니다:
import { Component } from '@angular/core';
import { HelloWorldComponent } from './hello-world/hello-world.component';
@Component({
selector: 'app-root',
standalone: true,
imports: [HelloWorldComponent],
template: `
<main>
<h1>My Angular App</h1>
<app-hello-world></app-hello-world>
</main>
`,
styles: [`
main {
font-family: Arial, sans-serif;
padding: 20px;
}
`]
})
export class AppComponent {
title = 'my-first-angular-app';
}
브라우저에서 변경사항이 자동으로 반영되는 것을 확인할 수 있습니다. 버튼을 클릭하면 메시지가 변경되는 것도 확인해보세요!
5. Angular와 다른 프레임워크 비교
많은 분들이 “React와 Vue 중에 뭐가 더 좋나요?”라고 물어보십니다. 사실 이 질문에는 정답이 없습니다. 각각의 장단점이 있고, 프로젝트 성격에 따라 적합한 선택이 달라지니까요.
Angular vs React vs Vue – 2025년 현황
최근 통계를 보면 재미있는 트렌드를 발견할 수 있습니다:
인기도 (NPM 다운로드 수, 2025년 2월 기준)
- React: 가장 높은 다운로드 수 유지
- Angular: 두 번째로 많은 다운로드 수
- Vue: 세 번째
채용 시장 (미국 기준, 2025년)
- React: 약 52,103개 채용 공고
- Angular: 약 23,070개 채용 공고
- Vue: 약 2,031개 채용 공고
언제 Angular를 선택해야 할까?
Angular가 적합한 경우:
- 대규모 엔터프라이즈 프로젝트: 은행, 보험, 정부 시스템처럼 수백 명의 개발자가 참여하는 프로젝트
- 명확한 구조가 필요한 경우: “어떻게 코드를 짤까?” 고민하지 않고 Angular의 가이드를 따르고 싶을 때
- TypeScript를 선호하는 팀: TypeScript의 강력한 타입 시스템을 최대한 활용하고 싶을 때
- 풀스택 기능이 필요한 경우: 라우팅, 폼 검증, HTTP 클라이언트 등을 별도 라이브러리 없이 사용하고 싶을 때
React가 더 나은 경우:
- 유연성이 중요한 프로젝트: 원하는 라이브러리를 자유롭게 조합하고 싶을 때
- 빠른 프로토타이핑: 단순한 UI 라이브러리로 빠르게 시작하고 싶을 때
- React Native 사용: 웹과 모바일 앱을 동시에 개발할 계획이 있을 때
Vue가 더 나은 경우:
- 배우기 쉬운 프레임워크 선호: 프론트엔드 초보자이거나 빠르게 배우고 싶을 때
- 작은 규모 프로젝트: 스타트업이나 소규모 팀 프로젝트
- 점진적 도입: 기존 프로젝트에 부분적으로 프레임워크를 도입하고 싶을 때
성능 비교
2025년 성능 비교 연구에 따르면:
특성 | React | Angular | Vue |
---|---|---|---|
렌더링 방식 | Virtual DOM | Real DOM + AOT | Virtual DOM |
초기 로딩 속도 | 빠름 | 느림 (프레임워크 크기) | 가장 빠름 |
런타임 성능 | 매우 좋음 | 좋음 | 매우 좋음 |
번들 크기 | 중간 | 큼 (143KB) | 작음 (23KB) |
메모리 사용량 | 중간 | 높음 | 낮음 |
Angular의 초기 로딩이 느린 것은 사실이지만, AOT(Ahead-of-Time) 컴파일과 Tree Shaking 최적화를 통해 실제 프로덕션에서는 성능 차이가 크지 않습니다.
6. Angular 시작할 때 로드맵과 추천 리소스
Angular를 처음 시작하는 분들을 위한 학습 로드맵을 정리해봤습니다.
1단계: 기초 다지기 (1-2주)
필수 선수 지식:
- HTML & CSS 기본
- JavaScript ES6+ 문법 (화살표 함수, Promise, async/await 등)
- TypeScript 기초 (타입 시스템, 인터페이스)
학습 리소스:
- MDN의 Angular 튜토리얼 – 공식적이고 체계적인 입문 가이드
- W3Schools Angular 튜토리얼 – 기초부터 단계별 설명
2단계: 핵심 개념 익히기 (2-3주)
이 단계에서는 Angular의 핵심 기능들을 하나씩 실습해봅니다:
- 컴포넌트와 템플릿: 데이터 바인딩, 디렉티브, 파이프
- 서비스와 의존성 주입: 서비스 생성, 싱글톤 패턴
- 라우팅: 페이지 네비게이션, 라우트 가드(Route Guards)
- 폼: Template-driven Forms, Reactive Forms
- HTTP 통신: HttpClient를 이용한 API 호출
실습 프로젝트 아이디어:
- To-Do List 앱 만들기
- 간단한 블로그 목록 앱
- 날씨 정보 표시 앱 (OpenWeather API 활용)
3단계: 고급 기능 다루기 (2-3주)
- 상태 관리: Signals, RxJS Observables
- 성능 최적화: OnPush 변경 감지, Lazy Loading
- 테스트: Jasmine, Karma를 이용한 단위 테스트
- 빌드 최적화: 프로덕션 빌드, 번들 크기 최적화
4단계: 실전 프로젝트 (4주 이상)
실제 서비스 수준의 프로젝트를 만들어보세요:
- 대시보드 애플리케이션
- E-commerce 사이트
- 소셜 미디어 클론
- 관리자 패널 (Admin Panel)
추천 학습 리소스
공식 문서 및 가이드:
- Angular 공식 문서 – 가장 정확하고 최신 정보
- Angular 한국어 문서 – 한글로 된 공식 문서
온라인 강의:
- Udemy – Complete Angular Course 2025 – Angular 20+ 최신 내용 포함
- Udemy – Angular: The Complete Guide – Maximilian Schwarzmüller의 인기 강의
컴포넌트 라이브러리:
- Angular Material – Google의 Material Design 구현체
- PrimeNG – 풍부한 UI 컴포넌트
- NG Bootstrap – Bootstrap을 Angular에 통합
커뮤니티:
- Angular Discord – 실시간 질문 답변
- Stack Overflow Angular 태그 – 기술적 문제 해결
7. Angular 개발을 위한 실전 팁, 환경 셋팅
실제 프로젝트를 진행하면서 알게 된 유용한 팁들을 공유합니다.
개발 환경 세팅
1. VSCode 필수 확장 프로그램
Visual Studio Code를 사용한다면 다음 확장 프로그램들이 정말 유용합니다:
- Angular Language Service – 템플릿 자동완성과 오류 검사
- Angular Snippets – 코드 스니펫으로 빠른 코딩
- Prettier – 코드 포맷팅 자동화
- ESLint – 코드 품질 관리
- Angular DevTools – 크롬 확장 프로그램으로 디버깅
2. 프로젝트 생성 시 유용한 플래그
# 라우팅과 스타일을 미리 지정하여 질문 건너뛰기
ng new my-app --routing --style=scss
# Git 저장소 생성 건너뛰기
ng new my-app --skip-git
# 패키지 설치 건너뛰기 (나중에 직접 설치)
ng new my-app --skip-install
# Zoneless 변경 감지 활성화 (최신 기능)
ng new my-app --zoneless
성능 최적화 팁
1. Lazy Loading 활용
모든 모듈을 한 번에 로드하지 말고, 필요할 때만 로드하도록 설정하세요:
// app.routes.ts
import { Routes } from '@angular/router';
export const routes: Routes = [
{
path: 'dashboard',
loadComponent: () => import('./dashboard/dashboard.component')
.then(m => m.DashboardComponent)
},
{
path: 'admin',
loadChildren: () => import('./admin/admin.routes')
.then(m => m.ADMIN_ROUTES)
}
];
2. OnPush 변경 감지 전략
컴포넌트가 자주 변경되지 않는다면 OnPush 전략을 사용하세요:
import { Component, ChangeDetectionStrategy } from '@angular/core';
@Component({
selector: 'app-my-component',
changeDetection: ChangeDetectionStrategy.OnPush,
// ...
})
export class MyComponent {
// ...
}
3. TrackBy 함수 사용
리스트를 렌더링할 때는 TrackBy를 사용해 불필요한 DOM 조작을 줄이세요:
@for (item of items; track item.id) {
<div>{{ item.name }}</div>
}
흔한 실수와 해결법
실수 1: Subscription 메모리 누수
RxJS Observable을 구독(subscribe)한 후 구독 해제(unsubscribe)를 잊어버리면 메모리 누수가 발생합니다.
// ❌ 나쁜 예
export class BadComponent {
ngOnInit() {
this.dataService.getData().subscribe(data => {
this.data = data;
});
}
}
// ✅ 좋은 예 1: takeUntilDestroyed 사용
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
export class GoodComponent {
private destroyRef = inject(DestroyRef);
ngOnInit() {
this.dataService.getData()
.pipe(takeUntilDestroyed(this.destroyRef))
.subscribe(data => {
this.data = data;
});
}
}
// ✅ 좋은 예 2: async 파이프 사용
@Component({
template: `
<div>{{ data$ | async }}</div>
`
})
export class BetterComponent {
data$ = this.dataService.getData();
}
실수 2: ExpressionChangedAfterItHasBeenCheckedError
이 오류는 Angular의 변경 감지 과정에서 데이터가 예상치 못하게 변경될 때 발생합니다.
// ❌ 잘못된 방법
ngAfterViewInit() {
this.isLoading = false; // 오류 발생!
}
// ✅ 올바른 방법
ngAfterViewInit() {
setTimeout(() => {
this.isLoading = false;
});
// 또는 ChangeDetectorRef 사용
// this.cdr.detectChanges();
}
디버깅 도구 활용
Angular DevTools
Chrome에서 Angular DevTools 확장 프로그램을 설치하면:
- 컴포넌트 트리 시각화
- 컴포넌트 상태 실시간 확인
- 성능 프로파일링
- 라우트 시각화 (Angular v20+)
- Signal 그래프 확인 (Angular v20+)
개발자 도구(F12)를 열고 “Angular” 탭을 선택하면 됩니다.
8. 2025년 이후 Angular의 미래와 최신 트렌드
Angular는 계속 발전하고 있습니다. 최근 Google I/O 2025에서 발표된 내용을 보면 Angular의 미래가 정말 기대됩니다.
AI 통합 확대
Google은 Angular에 AI를 적극적으로 통합하고 있습니다:
- Gemini Canvas와 Google AI Studio에서 Angular 앱 생성 가능
- AI를 활용한 코드 생성 품질 향상
- 2025년 9월 16일에는 Angular AI 이벤트 개최 예정
실제로 AI에게 “사용자 대시보드 만들어줘”라고 하면 Angular 코드를 자동으로 생성해주는 시대가 왔습니다.
Zoneless 변경 감지
Angular의 가장 큰 변화 중 하나는 Zoneless 변경 감지입니다. Angular v20에서 개발자 프리뷰 단계로, 기존의 Zone.js 없이도 변경 감지가 가능해졌습니다.
이게 왜 중요할까요? Zone.js는 강력하지만 성능 오버헤드가 있었습니다. Zoneless 모드를 사용하면:
- 더 작은 번들 크기
- 더 빠른 성능
- 더 예측 가능한 동작
// 새 프로젝트 생성 시 Zoneless 활성화
ng new my-app --zoneless
// 또는 기존 프로젝트에 적용
import { provideZonelessChangeDetection } from '@angular/core';
export const appConfig: ApplicationConfig = {
providers: [
provideZonelessChangeDetection(),
// ...
]
};
Web Standards 통합
Angular는 최신 웹 표준을 적극 수용하고 있습니다:
- Web Components 통합 강화
- WebAssembly 지원 확대
- Custom Elements 개선
이를 통해 Angular 컴포넌트를 React나 Vue 프로젝트에서도 사용할 수 있게 됩니다.
개발자 경험 개선
Angular 팀은 개발자 경험(DX) 개선에 많은 노력을 기울이고 있습니다:
- 더 간단한 문법 (Control Flow, Signals)
- 향상된 에러 메시지
- 더 빠른 빌드 시간
- 개선된 디버깅 도구
Angular는 처음에는 배울 게 많아 보이지만, 한번 익히고 나면 정말 강력한 도구가 됩니다. 특히 대규모 프로젝트나 엔터프라이즈 환경에서는 Angular의 체계적인 구조가 빛을 발합니다. 2025년 현재 Angular v20은 Signals, Zoneless 변경 감지, AI 통합 등 최신 기술을 적극 도입하며 계속 진화하고 있습니다. React나 Vue도 훌륭한 선택이지만, Angular만의 독특한 장점들이 분명히 있습니다.
궁금한 점이 있다면 Angular 공식 Discord나 Stack Overflow에서 커뮤니티의 도움을 받을 수 있습니다. 🙂