Angular의 개요

Angular에 대한 세부적인 포스팅을 하기 전에 먼저 간단하게 개요를 정리 합니다.

Angular란?

  • 구글에서 만든 open-souce web application
  • SPA(Single Page Application) 개발이 가능
  • 다양한 플랫폼에 맞게 개발 가능
  • 유지보수, 개발 속도 향상 (데이터 바인딩, 템플릿 등의 문법 제공 )

아키텍쳐

tistory-image

Angular의 구성요소

Angular2를 구성하는 요소는 크게 4가지 입니다.

  • 컴포넌트 (Component)
  • 모듈 (Module)
  • 서비스 (Service)
  • 지시자 (Directive)

컴포넌트 (Component)

tistory-image

  • Angular는 컴포넌트를 중심으로 개발함
  • 컴포넌트는 화면을 구성하기 위한 하나의 단위로 봄
  • 기본적으로 템플릿 + 지시자 + 클래스 조합으로 구성
  • 템플릿은 컴포넌트의 UI를 담당하며 가상DOM에 저장되므로 컴포넌트간 스타일에 영향을 받지 않음
  • 템플릿은 Angular에서 제공하는 HTML 템플릿 문법을 사용하여 클래스와 데이터나 이벤트를 바인딩함
  • 클래스는 컴포넌의 로직을 관리함
  • 컴포넌트마다 라이프사이클이 있으며 hook이 제공됨

기본구성

import { component } from '@angular/core';

@Compoent({
    // component element 이름
    selector: 'ex-compoent',
    // view html (or templateUrl)
    template: '<div>{{msg}}</div>',
    // css code (or styleUrls)
    styles: [`div {color: red}`]
})

export class MyComponent {
    msg: string = "hello";
}

Data binding

tistory-image

바인딩 방향 입력방식 문법
단방향 표현식 {{표현식}}, [target] = “표현식”, bind-target=”표현식”
단방향 명령식 (target) = “명령식”, on-target = “명령식”
양방향 표현식 [(target)] = “표현식”, bindon-target = “표현식”

tistory-image

컴포넌트에서는 템플릿으로 Property값으로 바인딩을 하고 템플릿에서는 컴포넌트로 이벤트로 바인딩을 함.

tistory-image

component에서 template으로 data 바인딩(단방향)

component –> template

import { component } from '@angular/core';

// component
@Compoent({
    template: `<div>{{name}}</div>`
})
class ExComponent {
    name: string = '아이언맨';
}
// 화면
[propery]=”value”: 해당 propery에 data 바인딩(단방향)

component –> template

// parentsComponent
@Compoent({
    template: `<exComponent [name]="name"/>`
})
class ParentsComponent {
    name: string = '아이언맨';
}
// exComponent
@Compoent({
    selector: 'exComponent'
    template: `<div>{{name}}</div>`
})
class ExComponent {
    @Input() name: string;
}
// exComponent 화면
(event)=”handler”: event를 전달한다.(단방향)

component <– template

// compoent
@Compoent({
    template: `<div (click)="testClick('로보트')">click</div>`
})
class ExComponent {
    testClick(name) {
        console.log(`나는 ${name}입니다.`);
    }
}
// 클릭시 console창에
/* 나는 로보트입니다. 표시 */
[(ng-model)]=”propery”: template과 Compoent의 양방향 바인딩

component <–> template

@Compoent({
    template: `<input [(ngModel)]="name"> {{name}}`
})
class ExComponent {
    name: string = '로보트'
}

모듈 (Module)

tistory-image

  • 모듈은 Angular에서 제공하는 라이브러리 모듈과 사용자 정의 모듈이 있음
  • export 키워드를 사용하여 모듈을 정의하고 외부에 노출할 수 있음
  • 최소 1개 이상의 모듈이 있어야 함
  • component, directive(지시자), 파이프 등이 있음
export class MyComponent { }
  • 정의된 모듈은 임포트해서 사용할 수 있음
import { MyComponent } from './MyComponent';

모듈 시스템

  • 모듈시스템은 컴포넌트, 지시자, 파이프와 같은 구성 모듈을 통합적으로 관리할 수 있게 해줌
  • 모듈구성은 기본적으로 `애플리케이션 루트 모듈을 이용함
  • 규모가 커지면 특징모듈과 같은 하위 모듈 구성을 추가하여 사용함
  • 모듈 구성은 기본적을 @NgModule 장식자를 사용함

기본구성

import { NgModule }      from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
// ngModule decorator
@NgModule({
  // import할 모듈 리스트(Angular 모듈, routing 모듈..)
  imports:      [ BrowserModule ],
  // 모듈에 속하는 컴포넌트, 디렉티브(지시자), 파이프 클래스들의 리스트
  declarations: [ AppComponent ],
  // DI providers 리스트 (서비스 모듈...)
  providers:    [ Logger ],
  // import하는 모듈이 쓸 수 있는 declarations 리스트
  exports:      [ AppComponent ],
  // bootstrap 가능한 컴포넌트 리스트
  bootstrap:    [ AppComponent ],
  // 어느 템플릿에서도 참조되지 않은 컴포넌트의 리스트
  entryComponents: [ AppComponent ]
})
export class AppModule { }

서비스 (Service)

tistory-image

  • 재사용 가능한 로직을 정의 하기 위해 사용함 (중복로직을 최소화)
  • 컴포넌트에서 직접적으로 관심없는 로직을 정의하고 사용함
  • 의존성 주입으로 서비스를 활용함
  • @Injectable 장식자를 사용해서 서비스라는 것을 선언함
  • 로깅 서비스, 테스트를 위한 목 객체서비스, 애플리케이션 환경설정과 변수관리 서비스등에 주로 사용함

로깅서비스 예제

export class Logger {
  log(msg: any)   { console.log(msg); }
  error(msg: any) { console.error(msg); }
  warn(msg: any)  { console.warn(msg); }
}
export class HeroService {
  private heroes: Hero[] = [];
  constructor(
    private _backend: BackendService,
    private _logger: Logger) { }
  getHeroes() {
    this.backend.getAll(Hero).then( (heroes: Hero[]) => {
      this.logger.log(`Fetched ${heroes.length} heroes.`);
      this.heroes.push(...heroes); // fill cache
    });
    return this.heroes;
  }
}

DI (Dependency injection) : 의존성 주입

tistory-image

  • 클래스의 새로운 인스턴스에 필요한 종속성을 제공하는 방법.
  • @Injectable을 사용하여, Injector에 service들을 등록 시킴.
@Injectable()
class ExService {
    plusNumber(a: number, b:number) {
        return a + b;
    }
}
@Compoent({
    ...
})
class ExComponent {
    // 아래와 같이 의존성 주입을 한다.
    constructor(private _exService: ExService) {}
    plusNumber(a: number, b: number) {
        console.log(this._exService.plusNumber(a, b));
    }
}

지시자(Directive)

  • Angular에서 제공하는 내장 지시자와 직접 제작해서 사용할 수 있는 커스텀 지시자가 있음
  • Component에서 template(view)만 빠진 것이라고 생각하면 된다.
  • angular에서 기본으로 제공하는 directive들이 있음
  • DOM을 다루는 방식임
import { Directive, ElementRef, Renderer } from '@angular/core';

@Directive ({
    selector: '[helloStyle]',
})

export class HelloStyleDirective {
    constructor (private el: ElementRef, private renderer: Renderer) { }
    ...
}

▲ 위의 형태로 지시자를 정의함

@Compoent({
    selector: 'my-Component',
    template: '<div helloStyle ></div>'

})

▲ 정의된 지시자를 위의 예제처럼 helloStyle로 사용함.

Similar Posts

  • [파워포인트] 글꼴 사용에 관한 모든것

    PPT 디자인에 있어 글꼴(폰트)은 상당히 중요한 요소에 속합니다. PPT작업을 멋지게 하고 작업한 결과물을 다른 사람에게 전송을 하면 다른 사람이 디자인을 보고 욕을 할 경우가 있습니다. 그중에 가장 큰 이유는 글꼴(폰트)일 이유가 큽니다. 그래서 PPT의 글꼴(폰트) 사용에 관해서 포스팅을 해보려고 합니다. PPT파일에 글꼴(폰트) 포함하기 PPT도 다양한 폰트를 사용할 수 있습니다. 하지만 나만의 특별한 폰트를 사용했을 경우 […]

  • 가상머신에 Node.js설치하고 환경설정하기

    이전 포스팅에서 VirtualBox와 Vagrant를 소개하고 설치하는 포스팅을 했었습니다. 이번에는 가상머신 위에 간단하게 Node.js를 설치하고 환경설정을 하는 방법을 포스팅하겠습니다. NVM (Node Version Manager) 설치하기 NVM은 Node.js를 버전별로 설치하고 관리할 수 있게 도와주는 툴입니다. 그래서 한 시스템 안에 기존버전의 Node.js를 삭제할 필요없이 여러 버전의 Node.js를 쉽게 설치하고 사용할 수 있게 해 줍니다. 주의 할 점은 NPM을 사용하지 […]

  • BMW의 새로운 도전!! 무선충전시스템의 양산

    전기차가 지속적으로 발전을 하고 있고 현재는 한번 충전으로 거의 300km ~ 390km까지 달릴수 있는 차가 대세를 이루고 있는 상황입니다. 그정도 거리면 서울에서 부산까지 편도로 한번 찍을 수 있는 거리인데요. 그것 까지는 대단히 좋은 성과라 할 수 있습니다. 하지만 항상 그 다음이 문제가 되는 것은 그럼 어떻게 다시 서울로 올라오느냐 입니다. 그렇습니다. 바로 충전의 문제 입니다. […]

  • git사용법과 명령어

    git은 개발자에게는 없어서는 안될 버전관리시스템입니다. SVN이 중앙집중식 버전관리 시스템이라면 git은 분산 버전관리 시스템이라 할 수 있습니다. 경우에 따라 다르겠지만 예전에는 SVN을 많이 사용하던것을 현재는 분산 버전관리 시스템이 git으로 많이 넘어온 상태입니다. 로컬컴퓨터에서만 사용할 경우에는 git만 설치하여 사용하면 되지만 원격저장소를 통해서 여러사람과 사용하기 위해서는 git서버가 있어야 합니다. git서버로 대표적인 사이트는 우리가 흔히 알고 있는 github가 있고 […]

  • 물 위에서의 또다른 삶~ 피라미드형 수상주택

    이탈리아의 디자이너 피에르파올로 라자리니(Pierpaolo Lazzarini)가 마야와 일본 건축에서 영감을 얻은 피라미드 모양의 떠 다니는 수상가옥을 선보였습니다. Waya라고 명명한 수상가옥은 유리 섬유, 탄소 섬유 및 강철로 만들어 지며 모듈형태로 구성되어 있어서 온실 모듈, 호텔 및 영화관 모듈 등 다양한 모듈로 군을 이루는것이 목표라고 합니다. Waya 모듈은 태양열 패널과 수력 터빈에서 모든 전력을 자체적으로 얻습니다 아직까지는 컨셉단계로 […]

  • 웹디자이너라면 꼭 알아야 할 Flexbox Layout

    웹디자인을 하면서 레이아웃을 잡는 방법에 대해서 시대별로 많은 변화가 있었습니다. Web이 나오기 시작한 초창기에는 Table을 이용하여 화면의 레이아웃을 잡았고 웹표준, 웹접근성이 이슈화 되면서 시멘틱한 마크업이 대세가 되면서 CSS의 DIV를 이용한 방법으로 레이아웃을 잡았습니다. CSS3로 버전업이 되면서 레이아웃 구현애 대한 방법으로 Flexbox가 탄생하게 되었고 2017년 현재 레이아웃을 편리하게 구현하기 위해서는 Flexbox를 사용하여 구현하는 것이 최선이라 할 […]

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다