← 홈

🅰️

⌘K
🤖
Claude Code AI 도구
🤗
Hugging Face AI 도구
🦜
LangChain AI 도구
🧠
Keras AI 도구
🦙
Ollama AI 도구
🐍
Python 프로그래밍 언어
🟨
JavaScript 프로그래밍 언어
🔷
TypeScript 프로그래밍 언어
⚛️
React 프로그래밍 언어
🐹
Go 프로그래밍 언어
🦀
Rust 프로그래밍 언어
📊
MATLAB 프로그래밍 언어
🗄️
SQL 프로그래밍 언어
⚙️
C/C++ 프로그래밍 언어
Java 프로그래밍 언어
🟣
C# 프로그래밍 언어
🍎
Swift 프로그래밍 언어
🟠
Kotlin 프로그래밍 언어
Next.js 프로그래밍 언어
💚
Vue.js 프로그래밍 언어
🔥
Svelte 프로그래밍 언어
🎨
Tailwind CSS 프로그래밍 언어
💚
Node.js 프로그래밍 언어
🌐
HTML 프로그래밍 언어
🎨
CSS/SCSS 프로그래밍 언어
🐘
PHP 프로그래밍 언어
💎
Ruby 프로그래밍 언어
🔴
Scala 프로그래밍 언어
📊
R 프로그래밍 언어
🎯
Dart 프로그래밍 언어
💧
Elixir 프로그래밍 언어
🌙
Lua 프로그래밍 언어
🐪
Perl 프로그래밍 언어
🅰️
Angular 프로그래밍 언어
🚂
Express.js 프로그래밍 언어
🐱
NestJS 프로그래밍 언어
🛤️
Ruby on Rails 프로그래밍 언어
◼️
GraphQL 프로그래밍 언어
🟪
Haskell 프로그래밍 언어
💚
Nuxt.js 프로그래밍 언어
🔷
SolidJS 프로그래밍 언어
htmx 프로그래밍 언어
💻
VS Code 개발 도구
🧠
PyCharm 개발 도구
📓
Jupyter 개발 도구
🧠
IntelliJ IDEA 개발 도구
💚
Neovim 개발 도구
🔮
Emacs 개발 도구
🔀
Git DevOps & CLI
🐳
Docker DevOps & CLI
☸️
Kubernetes DevOps & CLI
☁️
AWS CLI DevOps & CLI
🔄
GitHub Actions DevOps & CLI
🐧
Linux 명령어 DevOps & CLI
💻
Bash 스크립팅 DevOps & CLI
🌐
Nginx DevOps & CLI
📝
Vim DevOps & CLI
🔨
Makefile DevOps & CLI
🧪
Pytest DevOps & CLI
🪟
Windows DevOps & CLI
📦
패키지 매니저 DevOps & CLI
🍎
macOS DevOps & CLI
🏗️
Terraform DevOps & CLI
🔧
Ansible DevOps & CLI
Helm DevOps & CLI
🔨
Jenkins DevOps & CLI
🔥
Prometheus DevOps & CLI
📊
Grafana DevOps & CLI
💻
Zsh DevOps & CLI
🐟
Fish Shell DevOps & CLI
💙
PowerShell DevOps & CLI
🔄
Argo CD DevOps & CLI
🔀
Traefik DevOps & CLI
☁️
Azure CLI DevOps & CLI
☁️
Google Cloud CLI DevOps & CLI
📟
tmux DevOps & CLI
🔧
jq DevOps & CLI
✂️
sed DevOps & CLI
📊
awk DevOps & CLI
🌊
Apache Airflow DevOps & CLI
🔢
NumPy 데이터베이스 & 데이터
🐼
Pandas 데이터베이스 & 데이터
🔥
PyTorch 데이터베이스 & 데이터
🧠
TensorFlow 데이터베이스 & 데이터
📈
Matplotlib 데이터베이스 & 데이터
🐘
PostgreSQL 데이터베이스 & 데이터
🐬
MySQL 데이터베이스 & 데이터
🍃
MongoDB 데이터베이스 & 데이터
🔴
Redis 데이터베이스 & 데이터
🔍
Elasticsearch 데이터베이스 & 데이터
🤖
Scikit-learn 데이터베이스 & 데이터
👁️
OpenCV 데이터베이스 & 데이터
Apache Spark 데이터베이스 & 데이터
🪶
SQLite 데이터베이스 & 데이터
Supabase 데이터베이스 & 데이터
🔵
Neo4j 데이터베이스 & 데이터
📨
Apache Kafka 데이터베이스 & 데이터
🐰
RabbitMQ 데이터베이스 & 데이터
🔤
Regex 유틸리티
📝
Markdown 유틸리티
📄
LaTeX 유틸리티
🔐
SSH & GPG 유틸리티
🌐
curl & HTTP 유틸리티
📜
reStructuredText 유틸리티
🚀
Postman 유틸리티
🎬
FFmpeg 유틸리티
🖼️
ImageMagick 유틸리티
🔍
ripgrep 유틸리티
🔍
fzf 유틸리티
📗
Microsoft Excel 오피스 애플리케이션
📘
Microsoft Word 오피스 애플리케이션
📙
Microsoft PowerPoint 오피스 애플리케이션
📝
한컴 한글 한컴오피스
📽️
한컴 한쇼 한컴오피스
📊
한컴 한셀 한컴오피스
📄
Google 문서 Google Workspace
📊
Google 스프레드시트 Google Workspace
📽️
Google 프레젠테이션 Google Workspace
🔌
Cadence Virtuoso EDA & 하드웨어
⚙️
Synopsys EDA EDA & 하드웨어
💎
Verilog & VHDL EDA & 하드웨어
LTSpice EDA & 하드웨어
🔧
KiCad EDA & 하드웨어
📝
Notion 생산성 도구
💎
Obsidian 생산성 도구
💬
Slack 생산성 도구
🎮
Discord 생산성 도구
🎨
Figma 디자인 도구
📘
Confluence Atlassian
📋
Jira Atlassian
🃏
Jest 테스팅
Vitest 테스팅
🎭
Playwright 테스팅
🌲
Cypress 테스팅
🌐
Selenium 테스팅
💙
Flutter 모바일 개발
📱
React Native 모바일 개발
🍎
SwiftUI 모바일 개발
📱
Expo 모바일 개발
🐍
Django 웹 프레임워크
FastAPI 웹 프레임워크
🌶️
Flask 웹 프레임워크
🍃
Spring Boot 웹 프레임워크
🍸
Gin 웹 프레임워크
Vite 빌드 도구
📦
Webpack 빌드 도구
esbuild 빌드 도구
🐘
Gradle 빌드 도구
🪶
Maven 빌드 도구
🔧
CMake 빌드 도구
🎮
Unity 게임 개발
🤖
Godot 게임 개발
🔌
Arduino 임베디드 & IoT
🔍
Nmap 보안
🐕
Datadog 모니터링
📖
Swagger/OpenAPI 문서화
검색 결과가 없습니다
EN KO

Angular CLI

CLI 명령어

ng new my-app 새 프로젝트 생성
ng serve 개발 서버 시작
ng build 프로젝트 빌드
ng build --configuration=production 프로덕션 빌드
ng test 유닛 테스트 실행
ng e2e E2E 테스트 실행
ng generate component name 컴포넌트 생성
ng g c name 축약형
ng g s name 서비스 생성
ng g m name 모듈 생성
ng g pipe name 파이프 생성
ng g directive name 디렉티브 생성
ng add @angular/material 라이브러리 추가
ng update 의존성 업데이트

컴포넌트

컴포넌트 기초

컴포넌트 데코레이터
@Component({
  selector: 'app-hello',
  templateUrl: './hello.component.html',
  styleUrls: ['./hello.component.css']
})
export class HelloComponent {
  name = 'World';
}
인라인 템플릿
@Component({
  selector: 'app-hello',
  template: `<h1>Hello, {{name}}!</h1>`,
  styles: [`h1 { color: blue; }`]
})
독립 컴포넌트
@Component({
  selector: 'app-hello',
  standalone: true,
  imports: [CommonModule],
  template: `...`
})

입력과 출력

입력 속성
@Input() name: string = '';

// In parent template:
<app-child [name]="parentValue"></app-child>
출력 이벤트
@Output() clicked = new EventEmitter<string>();

onClick() {
  this.clicked.emit('data');
}

// In parent:
<app-child (clicked)="handleClick($event)"></app-child>
양방향 바인딩
@Input() value: string = '';
@Output() valueChange = new EventEmitter<string>();

// Usage:
<app-input [(value)]="data"></app-input>

생명주기 훅

ngOnInit
ngOnInit(): void {
  // Called once after first ngOnChanges
}
ngOnChanges
ngOnChanges(changes: SimpleChanges): void {
  // Called when input properties change
}
ngOnDestroy
ngOnDestroy(): void {
  // Cleanup before component is destroyed
}
ngAfterViewInit
ngAfterViewInit(): void {
  // After view is initialized
}

템플릿

템플릿 문법

보간
{{ expression }}
{{ user.name }}
{{ getValue() }}
속성 바인딩
[property]="expression"
[disabled]="isDisabled"
[src]="imageUrl"
이벤트 바인딩
(event)="handler()"
(click)="onClick()"
(input)="onInput($event)"
양방향 바인딩
[(ngModel)]="value"
속성 바인딩
[attr.aria-label]="label"
클래스 바인딩
[class.active]="isActive"
[ngClass]="{'active': isActive}"
스타일 바인딩
[style.color]="textColor"
[ngStyle]="{'color': textColor}"

구조적 디렉티브

*ngIf
<div *ngIf="condition">Shown</div>

<div *ngIf="condition; else elseBlock">True</div>
<ng-template #elseBlock>False</ng-template>
*ngFor
<li *ngFor="let item of items; index as i; trackBy: trackById">
  {{i}}: {{item.name}}
</li>
*ngSwitch
<div [ngSwitch]="value">
  <p *ngSwitchCase="1">One</p>
  <p *ngSwitchCase="2">Two</p>
  <p *ngSwitchDefault>Other</p>
</div>
@if (v17+)
@if (condition) {
  <p>True</p>
} @else {
  <p>False</p>
}
@for (v17+)
@for (item of items; track item.id) {
  <li>{{ item.name }}</li>
} @empty {
  <li>No items</li>
}

템플릿 참조

템플릿 변수
<input #myInput>
<button (click)="doSomething(myInput.value)">Click</button>
ViewChild
@ViewChild('myInput') inputRef!: ElementRef;

ngAfterViewInit() {
  this.inputRef.nativeElement.focus();
}
ContentChild
@ContentChild(ChildComponent) child!: ChildComponent;

서비스와 DI

서비스

주입 가능 서비스
@Injectable({
  providedIn: 'root'
})
export class DataService {
  getData() {
    return ['a', 'b', 'c'];
  }
}
컴포넌트에 주입
constructor(private dataService: DataService) {}

// Or using inject function:
private dataService = inject(DataService);

HTTP 클라이언트

HttpClient 임포트
// In app.config.ts or module:
provideHttpClient()
GET 요청
this.http.get<User[]>('/api/users')
  .subscribe(users => this.users = users);
POST 요청
this.http.post<User>('/api/users', userData)
  .subscribe(user => console.log(user));
헤더 포함
const headers = new HttpHeaders()
  .set('Authorization', 'Bearer token');

this.http.get('/api/data', { headers });
에러 처리
this.http.get('/api/data').pipe(
  catchError(error => {
    console.error(error);
    return of([]);
  })
);

라우팅

라우트 설정

라우트 정의
const routes: Routes = [
  { path: '', component: HomeComponent },
  { path: 'users', component: UsersComponent },
  { path: 'users/:id', component: UserDetailComponent },
  { path: '**', component: NotFoundComponent }
];
지연 로딩
{
  path: 'admin',
  loadChildren: () => import('./admin/admin.module')
    .then(m => m.AdminModule)
}
라우터 아웃렛
<router-outlet></router-outlet>
라우터 링크
<a routerLink="/users">Users</a>
<a [routerLink]="['/users', user.id]">User</a>
활성 클래스
<a routerLink="/users" routerLinkActive="active">Users</a>

라우터 서비스

네비게이트
this.router.navigate(['/users', id]);
쿼리 파라미터
this.router.navigate(['/search'], {
  queryParams: { q: 'angular' }
});
라우트 파라미터 가져오기
constructor(private route: ActivatedRoute) {
  this.route.params.subscribe(params => {
    this.id = params['id'];
  });
}
쿼리 파라미터 가져오기
this.route.queryParams.subscribe(params => {
  this.query = params['q'];
});

템플릿 기반 폼

기본 폼
<form #myForm="ngForm" (ngSubmit)="onSubmit(myForm)">
  <input name="email" [(ngModel)]="email" required email>
  <button type="submit" [disabled]="myForm.invalid">Submit</button>
</form>
유효성 검사
<input name="email" [(ngModel)]="email" #emailInput="ngModel" required>
<div *ngIf="emailInput.invalid && emailInput.touched">
  Email is required
</div>

반응형 폼

폼 그룹
form = new FormGroup({
  email: new FormControl('', [Validators.required, Validators.email]),
  password: new FormControl('', Validators.minLength(6))
});
폼 빌더
form = this.fb.group({
  email: ['', [Validators.required, Validators.email]],
  password: ['', Validators.minLength(6)]
});
템플릿
<form [formGroup]="form" (ngSubmit)="onSubmit()">
  <input formControlName="email">
  <input formControlName="password" type="password">
  <button type="submit" [disabled]="form.invalid">Submit</button>
</form>
값 가져오기
this.form.value  // all values
this.form.get('email')?.value  // single value

파이프

내장 파이프

날짜
{{ date | date:'yyyy-MM-dd' }}
{{ date | date:'short' }}
통화
{{ price | currency:'USD' }}
{{ price | currency:'KRW':'symbol' }}
대소문자
{{ text | uppercase }}
{{ text | lowercase }}
{{ text | titlecase }}
비동기
{{ observable$ | async }}
JSON
{{ object | json }}
슬라이스
{{ items | slice:0:5 }}

커스텀 파이프

파이프 생성
@Pipe({
  name: 'truncate',
  standalone: true
})
export class TruncatePipe implements PipeTransform {
  transform(value: string, limit: number = 20): string {
    return value.length > limit
      ? value.substring(0, limit) + '...'
      : value;
  }
}
사용법
{{ longText | truncate:50 }}

시그널 (v16+)

시그널 기초

시그널 생성
count = signal(0);
값 읽기
this.count()  // 0
값 설정
this.count.set(5);
업데이트
this.count.update(v => v + 1);
계산된
doubleCount = computed(() => this.count() * 2);
이펙트
effect(() => {
  console.log('Count:', this.count());
});
템플릿에서
<p>Count: {{ count() }}</p>
<p>Double: {{ doubleCount() }}</p>