<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>niee의 잡다한 공간입니다.</title>
    <description>웹/앱 개발, 디자인 패턴, 리팩토링, Spring, Python, Docker, Angular 등 실무에서 정리한 개발 노트를 공유하는 블로그입니다.</description>
    <link>https://parkminkyu.github.io/</link>
    <atom:link href="https://parkminkyu.github.io/feed.xml" rel="self" type="application/rss+xml"/>
    <pubDate>Tue, 28 Apr 2026 02:31:31 +0000</pubDate>
    <lastBuildDate>Tue, 28 Apr 2026 02:31:31 +0000</lastBuildDate>
    <generator>Jekyll v3.10.0</generator>
    
      <item>
        <title>08.Python Flask 외부에서 접속하기</title>
        <description>&lt;pre&gt;&lt;code&gt;Flask서버를 운영서버에 올린후 외부에서 접속하는 방법을 알아보자
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;외부-접속-하는방법&quot;&gt;외부 접속 하는방법&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;외부 접속 방법은 별거 없다. application.py의 app.run()안에 바인딩될 호스트 정보를 넣어주면 된다.&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code&gt;1. 기본 app.run()의경우 127.0.0.1로 실행되어 로컬에서의 접속만 가능하다.
2. 기본 app.run(host=&apos;0.0.0.0&apos;)의 경우 모든 호스트로 접속이 가능하다.
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;포트를 변경하고 싶을경우는 port 정보를 넣어준다&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code&gt;1. 기본 app.run()의경우 포트 5000으로 실행된다
2. 기본 app.run(host=&apos;0.0.0.0&apos;, port=9900)의 경우 9900번 포트로 실행된다.
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;python으로 해당파일 실행 하고 브라우저로 접속한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code&gt;$ python application.py
  * Serving Flask app &quot;application&quot; (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:9900/ (Press CTRL+C to quit)
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;외부에서 변경된 정보로 접속해본다&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://niee.kr:5000&quot;&gt;http://niee.kr:5000&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Mon, 03 Aug 2020 01:45:00 +0000</pubDate>
        <link>https://parkminkyu.github.io/08-python-flask/</link>
        <guid isPermaLink="true">https://parkminkyu.github.io/08-python-flask/</guid>
        
        <category>python</category>
        
        <category>flask</category>
        
        <category>flask 외부접속</category>
        
        
        <category>python</category>
        
        <category>Flask</category>
        
      </item>
    
      <item>
        <title>01.Mac 터미널 scp 이용한 ftp파일 업로드/다운로드</title>
        <description>&lt;pre&gt;&lt;code&gt;맥북 사용중 ftp클라이언트 프로그램 설치없이 scp를 사용하여
파일 업로드 다운로드를 하는 방법을 알아본다.
클라이언트 사용하면 편하지만 터미널로 충분히 가능하고 뭔가 있어 보인다고 할까나...
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;맥-터미널로-ftp-파일-업다운-로드-하기&quot;&gt;맥 터미널로 ftp 파일 업/다운 로드 하기&lt;/h3&gt;
&lt;ol&gt;
  &lt;li&gt;맥 터미널 명령어중 &lt;code&gt;scp&lt;/code&gt;를 이용하여 터미널로 ftp파일 업로드 다운로드가 가능하다&lt;/li&gt;
  &lt;li&gt;사용법은&lt;/li&gt;
&lt;/ol&gt;

&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;//기본적인 파일 업로드
$ spc 업로드할파일명 ftp계정@호스트:올라갈경로

//ex)
$ spc test.txt niee@host.kr:/home/niee/folder

//기본 ftp포트가 아닌 다른 포트를 사용할 경우
$ spc -P 포트번호 test.txt niee@host.kr:/home/niee/folder

//기본적인 파일 다운로드
$ spc ftp계정@호스트:다운받을경로/파일명 다운받을폴더경로

//ex)
$ spc niee@host.kr:/home/niee/folder/test.txt /local

//기본 ftp포트가 아닌 다른 포트를 사용할 경우
$ spc -P 포트번호 niee@host.kr:/home/niee/folder/test.txt /local

//폴더를 업/다운로드 할경우는 -r옵션

//ex)폴더 다운로드
$ spc -r niee@host.kr:/home/niee/folder/ /local

//ex)폴더 
$ spc -r /local niee@host.kr:/home/niee/folder/
&lt;/code&gt;&lt;/pre&gt;
</description>
        <pubDate>Sun, 01 Mar 2020 02:20:00 +0000</pubDate>
        <link>https://parkminkyu.github.io/01-mac_terminal_ftp_file/</link>
        <guid isPermaLink="true">https://parkminkyu.github.io/01-mac_terminal_ftp_file/</guid>
        
        <category>ftp</category>
        
        <category>mac terminal</category>
        
        <category>scp</category>
        
        
        <category>mac</category>
        
      </item>
    
      <item>
        <title>지시자 (Directive)</title>
        <description>&lt;pre&gt;&lt;code&gt;Angular2 스터디 발표 자료
지시자는 템플릿내에서 사용되는 구성요소의 모양이나 구조를 결정, 컴포넌트 지시자, 구조 지시자, 속성 지시자, 커스텀 지시자가 있음.
- 선언형 프로그래밍과 지시자
- 커스텀 지시자
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;1-선언형-프로그래밍과-지시자&quot;&gt;1. 선언형 프로그래밍과 지시자&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;선언형 프로그래밍은 순서나 문제해결 과정을 다루기보다, 무엇을 나타내야 할지에 관심.&lt;/li&gt;
  &lt;li&gt;선언형 프로그래밍의 예로 HTML이 있음&lt;/li&gt;
  &lt;li&gt;HTML에서 중요한 것은 애플리케이션이 추구하는 목적에 부합하도록 엘리먼트를 배치했느냐&lt;/li&gt;
  &lt;li&gt;angular도 선언형 프로그래밍 방식으로 개발&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;1-1-지시자의-장점&quot;&gt;1-1. 지시자의 장점&lt;/h5&gt;

&lt;ul&gt;
  &lt;li&gt;템플릿에 가독성을 부여 : 지시자에 의미있는 이름을 부여하여 컴포넌트가 어떻게 동작할지를 예측가능.&lt;/li&gt;
  &lt;li&gt;코드 복잡도를 낮춤 : P.280 참조&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;1-2-지시자directives의-종류&quot;&gt;1-2. 지시자(Directives)의 종류&lt;/h5&gt;

&lt;ul&gt;
  &lt;li&gt;컴포넌트 지시자 : 컴포넌트 템플릿을 표시하기 위한 지시자.&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;@Component({
  selector : &apos;component-name&apos;
})
export class ComponentClass{

}
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;구조 지시자 : Angular2에서 제공하는 내장 지시자이며 ng접두어가 붙어있음. &lt;a href=&quot;https://v2.angular.io/docs/ts/latest/api/&quot;&gt;공식 사이트 참조&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;span [ngSwitch]=&quot;조건&quot;&amp;gt; &amp;lt;template [ngSwitchCase]=&quot;값&quot;&amp;gt;&amp;lt;/template &amp;lt;/span&amp;gt;

&amp;lt;ul *ngIf=&quot;show&quot;&amp;gt;

&amp;lt;li *ngFor=&quot;let i of list&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;속성 지시자 : 네이티브 엘리먼트의 class, style 속성과 구분하기 위한 접두어로 ngClass, ngStyle 사용&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;ul [ngClass]=&quot;className&quot;&amp;gt;

&amp;lt;li [ngStyle]=&quot;{&apos;font-style&apos;:bold;}&quot;&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;커스텀 지시자 : 사용자가 새롭게 추가할 수 있는 지시자.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;2-커스텀-지시자&quot;&gt;2. 커스텀 지시자&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;컴포넌트와 별개의 파일에 정의.&lt;/li&gt;
  &lt;li&gt;네이밍 규칙은 파일명.directive.ts&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;2-1-커스텀-지시자-샘플&quot;&gt;2-1. 커스텀 지시자 샘플&lt;/h5&gt;

&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;//1. 커스텀 지시자 생성
import { Directive } from &apos;@angular/core&apos;;

@Directive({
  selector : &apos;[my-click]&apos;,
  host : { &apos;(click)&apos; : &apos;onClick()&apos;}
})
export class MyClickDirective{
  onClick(){
    alert(&apos;Hello&apos;);
  }
}

//2. 커스텀 지시자 사용 컴포넌트 생성
import { Component } from &apos;@angular/core&apos;;

@Component({
  selector: &apos;app-custom-directive&apos;,
  template: &apos;&amp;lt;button my-click&amp;gt; onClick() &amp;lt;/button&amp;gt;&apos;
})
export class CustomDirectiveCmp {
  constructor() { }
}

//3. 모듈에 등록
import { CustomDirectiveCmp } from &apos;./custom-directive/custom-directive.component&apos;;
import { MyClickDirective } from &apos;./custom-directive/my-click.directive&apos;;

declarations: [
    CustomDirectiveCmp, MyClickDirective,
  ]
&lt;/code&gt;&lt;/pre&gt;

&lt;h5 id=&quot;2-2-selector와-input-attribute-장식자&quot;&gt;2-2. selector와 @Input, @Attribute 장식자&lt;/h5&gt;

&lt;ul&gt;
  &lt;li&gt;selector사용시 대괄호를 이용하면, 속성 바인딩을 이용한다.&lt;/li&gt;
  &lt;li&gt;대괄호를 이용하여 속성 바인딩이 적용되어 있으면 &lt;code&gt;@Input&lt;/code&gt; 장식자로 값을 받아 들일수 있다. P.287참조&lt;/li&gt;
  &lt;li&gt;대괄호가 없는 일반 속성값을 받기위해선 &lt;code&gt;@Attribute&lt;/code&gt; 장식자를 사용한다. P.288참조&lt;/li&gt;
&lt;/ul&gt;

&lt;h5 id=&quot;2-3-커스텀-지시자에-이벤트-추가&quot;&gt;2-3. 커스텀 지시자에 이벤트 추가&lt;/h5&gt;

&lt;ul&gt;
  &lt;li&gt;이벤트 추가는 &lt;code&gt;host&lt;/code&gt;속성과 &lt;code&gt;@HostListener&lt;/code&gt; 장식자를 이용한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;//1. host속성
@Directive({
  host : {
    &apos;(click)&apos;:&apos;clickEvent()&apos;,
    &apos;(mousemove)&apos;:&apos;mousemoveEvent()&apos;
  }
})

//2. @HostListener
import { HostListener } from &apos;@angular/core&apos;

@HostListener(&apos;click&apos;) clickEvent(){}
@HostListener(&apos;mousemove&apos;) mousemoveEvent(){}
&lt;/code&gt;&lt;/pre&gt;

&lt;h5 id=&quot;2-4-elementref와-renderer&quot;&gt;2-4. ElementRef와 Renderer&lt;/h5&gt;

&lt;ul&gt;
  &lt;li&gt;Angular는 DOM에 바로 접근하는 것을 허용하지 않는다.&lt;/li&gt;
  &lt;li&gt;만약 DOM을 직접 제어하고 싶다면 &lt;code&gt;ElementRef&lt;/code&gt; 모듈을 이용한다.&lt;/li&gt;
  &lt;li&gt;엘리먼트의 모양을 결정해야 하는것 같은 작업을 목적으로 한다면 &lt;code&gt;Renderer&lt;/code&gt;를 이용한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/wikibook/ng2-book/blob/master/directives/src/app/element-rendering/element-rendering.component.ts&quot;&gt;예제소스&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Tue, 09 May 2017 10:00:00 +0000</pubDate>
        <link>https://parkminkyu.github.io/07-angular2/</link>
        <guid isPermaLink="true">https://parkminkyu.github.io/07-angular2/</guid>
        
        <category>angular2</category>
        
        <category>지시자</category>
        
        <category>Directive</category>
        
        
        <category>Study</category>
        
        <category>angular2</category>
        
      </item>
    
      <item>
        <title>Spring Camp 2017 후기</title>
        <description>&lt;pre&gt;&lt;code&gt;2017 스프링 캠프 참여 및 요약
- keynote 정상혁
- Reactive Spring ( Spring 5 &amp;amp; Reactor ) 정윤진
- 이벤트 소싱 이론부 이규원
- Implementing EventSourcing &amp;amp; CQRS (구현부) 심천보
- Reactive Programming with RxJava 김인태
- 엔티티 히스토리를 편리하게 관리해주는 스프링 데이터 Envers 김영한
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;1-keynote&quot;&gt;1. keynote&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;오픈소스 코드 기여 방법&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;http://benelog.github.io/docs/spring-camp-2017/&quot;&gt;발표 자료&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;2-reactive-spring--spring-5--reactor-&quot;&gt;2. Reactive Spring ( Spring 5 &amp;amp; Reactor )&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;스프링 5 : java9, http/2, Reactive&lt;/li&gt;
  &lt;li&gt;코드 베이스에 람다등이 추가되어 업그레이드시 주의(jdk 버전등)&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;jigsaw&lt;/code&gt; (새로운 모듈 시스템)?&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;undertow&lt;/code&gt;??&lt;/li&gt;
  &lt;li&gt;요청 당 하나의 쓰레드 생성, 쓰레드풀 문제 -&amp;gt; 로드 밸런스 적용(구식…) -&amp;gt; 클라우드 도입(어플리케이션 요청량에 따른 자동 스케일, 로드 밸런스와 별차이가 없다?) -&amp;gt; Reactive(느슨한 결합, 비동기로 전달되는 메세지)&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;Reactive Streams&lt;/code&gt; : 논-블럭킹 백프래셔, 비동기 스트림 프로세싱 표준&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;java9의 java.util.concurrent.Flow&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;RxJava&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/joshlong/flux-flix-service&quot;&gt;예제소스&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;3-이벤트-소싱-이론부&quot;&gt;3. 이벤트 소싱 이론부&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;spring camp에 마소직원이??&lt;/li&gt;
  &lt;li&gt;닷넷에서 먼저 시작&lt;/li&gt;
  &lt;li&gt;데이터 저장기법, 메세지가 중심이 아님&lt;/li&gt;
  &lt;li&gt;이벤트 소싱 프로세스 발표자료 6페이지&lt;/li&gt;
  &lt;li&gt;도메인에서 발생하는 사실(이벤트)들을 모두 기록&lt;/li&gt;
  &lt;li&gt;이벤트는 추가만 된다?(삭제,수정 x)&lt;/li&gt;
  &lt;li&gt;버전관리 시스템(git,svn등)&lt;/li&gt;
  &lt;li&gt;이벤트명은 과거형 동사, 이벤트는 검증의 대상이 아니다.&lt;/li&gt;
  &lt;li&gt;이벤트 소싱은 반드시 &lt;code&gt;CQRS?&lt;/code&gt;와 조합해서 사용하자&lt;/li&gt;
  &lt;li&gt;가파른 학습, 유일성 상실&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://docs.com/gyuwon/5525/event-sourcing-spring-camp-2017&quot;&gt;발표 자료&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/Reacture/Khala.EventSourcing&quot;&gt;예제 소스 닷넷임&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;4-implementing-eventsourcing--cqrs-구현부&quot;&gt;4. Implementing EventSourcing &amp;amp; CQRS (구현부)&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;어플리케이션의 모든 상태변화를 순서에 따라 이벤트로 저장한다.&lt;/li&gt;
  &lt;li&gt;전통적인 데이터 저장 방법은, 최신 정보만 저장되어 이력을 알수 없다(별도의 이력 테이블을 구성 하지만, 점점 복잡해진다).&lt;/li&gt;
  &lt;li&gt;최종 상태를 알기위해 매번 이벤트를 다시 리플레이 해야 함 -&amp;gt; 스냅샷으로 해결.&lt;/li&gt;
  &lt;li&gt;스냅샷 : 이벤트 저장 시점의 도메인 상태를 저장&lt;/li&gt;
  &lt;li&gt;스냅샷만으로 해결이 불가능함 -&amp;gt; CQRS 적용&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;CQRS&lt;/code&gt; : 명령과 조회의 책임분리&lt;/li&gt;
  &lt;li&gt;Command 모델은 상태변경이 안 되도록 한다.&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;Aggregate?&lt;/code&gt; 도 상태변경이 안되게 한다.&lt;/li&gt;
  &lt;li&gt;디버그가 용이하다?&lt;/li&gt;
  &lt;li&gt;쓰기 성능이 좋다?&lt;/li&gt;
  &lt;li&gt;익숙하지 않다.&lt;/li&gt;
  &lt;li&gt;단순 모델에 적합하지 않다.&lt;/li&gt;
  &lt;li&gt;도구 부족 &amp;amp; 성숙하지 않은 기술&lt;/li&gt;
  &lt;li&gt;MSA(Micro service archic)에 최적화&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/jaceshim/springcamp2017&quot;&gt;예제소스&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;5-reactive-programming-with-rxjava&quot;&gt;5. Reactive Programming with RxJava&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;http://reactivex.io&quot;&gt;사이트&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;비동기, 람다, higher-order function&lt;/li&gt;
  &lt;li&gt;어렵다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;6-엔티티-히스토리를-편리하게-관리해주는-스프링-데이터-envers&quot;&gt;6. 엔티티 히스토리를 편리하게 관리해주는 스프링 데이터 Envers&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;스프링 데이터 Auditing : 누가 데이터를 언제 입력 변경했나 감시.&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;@Audited&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;@RevisionRepository&lt;/code&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/spring-projects/spring-data-envers&quot;&gt;Spring envers Github&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Sun, 23 Apr 2017 03:20:00 +0000</pubDate>
        <link>https://parkminkyu.github.io/spring-camp/</link>
        <guid isPermaLink="true">https://parkminkyu.github.io/spring-camp/</guid>
        
        <category>spring camp 2017</category>
        
        
        <category>spring-camp</category>
        
      </item>
    
      <item>
        <title>컴포넌트 스타일</title>
        <description>&lt;pre&gt;&lt;code&gt;Angular2 스터디 발표 자료
컴포넌트 스타일 지정 방법
- 쉐도우DOM선택자
- host
- host-context
- /deep/
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;1-컴포넌트-스타일&quot;&gt;1. 컴포넌트 스타일&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;@Component&lt;/code&gt;장식자 속성의 style에 스타일을 지정하면 컴포넌트 마다, 쉐도우 DOM에 독립적으로 스타일을 지정.&lt;/li&gt;
  &lt;li&gt;다른 컴포넌트에는 스타일에 영향을 주지 않음&lt;/li&gt;
  &lt;li&gt;쉐도우 DOM선택자의 종류&lt;/li&gt;
&lt;/ul&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;사용법&lt;/th&gt;
      &lt;th&gt;내용&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;:host&lt;/td&gt;
      &lt;td&gt;현재 컴포넌트의 쉐도우 DOM선택&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;:host-context&lt;/td&gt;
      &lt;td&gt;템플릿 외부 조건에 따라 현재 컴포넌트 선택&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;/deep/&lt;/td&gt;
      &lt;td&gt;자식컴포넌트에 속한 엘리먼트 선택&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;h3 id=&quot;2-host-선택자&quot;&gt;2. :host 선택자&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;현재 자신의 컴포넌트를 의미&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;:host{
  ....
}
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;부모 컴포넌트의 조건에 따라 자식 컴포넌트의 상태를 결정할 경우 클래스 부여 가능&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;:host(.active){
  ....
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;3-host-context-선택자&quot;&gt;3. :host-context 선택자&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;부모 엘리먼트에 설정한 클래스 값에 따라 컴포넌트 내부에 특정 엘리먼트를 선택.&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;//부모
@Component({selector:&apos;parent&apos;,template:&apos;&amp;lt;child class=&quot;active&quot;&amp;gt;&amp;lt;/child&amp;gt;&apos;})

//자식
@Component({selector:&apos;child&apos;,styles:[&apos;:host-context(.active)button{...}&apos;])

&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;4-deep-선택자&quot;&gt;4. /deep/ 선택자&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;부모 컴포넌트에서 정의한 스타일 정보를 하위 컴포넌트 내의 엘리먼트에 적용.&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code class=&quot;language-css&quot;&gt;:host /deep/ div{
  ....
}
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;//부모
@Component({selector:&apos;parent&apos;,styles:[&apos;:host /deep/ div.first{...}&apos;])

//자식
@Component({selector:&apos;child&apos;,template:&apos;&amp;lt;div class=&quot;first&quot;&amp;gt;&amp;lt;/div&amp;gt;&apos;)

&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;P.121 참조&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/wikibook/ng2-book/tree/master/component/src/app/component-style&quot;&gt;예제소스&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Thu, 20 Apr 2017 13:00:00 +0000</pubDate>
        <link>https://parkminkyu.github.io/05-angular2/</link>
        <guid isPermaLink="true">https://parkminkyu.github.io/05-angular2/</guid>
        
        <category>angular2</category>
        
        <category>컴포넌트</category>
        
        <category>컴포넌트 스타일</category>
        
        
        <category>Study</category>
        
        <category>angular2</category>
        
      </item>
    
      <item>
        <title>자식 엘리먼트의 호출과 탐색</title>
        <description>&lt;pre&gt;&lt;code&gt;Angular2 스터디 발표 자료
자식 엘리먼트의 호출과 탐색 방법
- @ViewChild 장식자를 이용
- @ViewChildren 장식자를 이용
- @ContentChild 장식자를 이용
- @ContentChildren 장식자를 이용
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;1-viewchild-장식자를-이용한-엘리먼트-상태-얻기&quot;&gt;1. &lt;code&gt;@ViewChild&lt;/code&gt; 장식자를 이용한 엘리먼트 상태 얻기&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;템플릿에는 사용자가 정의한 지시자를 선언해 기능 구현이 가능.&lt;/li&gt;
  &lt;li&gt;지시자는 템플릿 내에 선언돼 있기 때문에, 화면이 초기화 후 DOM에 지시자 정보가 저장됨&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;@ViewChild&lt;/code&gt; 선언 방법&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;import {ViewChild} from &apos;@angular/core&apos;;
@ViewChild(클래스명)변수명: 클래스명;
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;지시자의 DOM은 화면이 초기화되고 접근할 수 있기 때문에 아래와 같이 사용.&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;import {ViewChild} from &apos;@angular/core&apos;;
@ViewChild(클래스명)
set selector(v:클래스명){
  setTimeout(()=&amp;gt;{.....},0);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;P.107 참조&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/wikibook/ng2-book/blob/master/component/src/app/viewchild/viewchild.component.ts&quot;&gt;예제소스&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;2-viewchildren-장식자-이용&quot;&gt;2. &lt;code&gt;@ViewChildren&lt;/code&gt; 장식자 이용&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;@ViewChild&lt;/code&gt;는 하나의 엘리먼트 상태를 취하지만, &lt;code&gt;@ViewChildren&lt;/code&gt;는 여러 지시자를 한번에 탐색.&lt;/li&gt;
  &lt;li&gt;선언 방법&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;@ViewChildren(&apos;설명 레이블&apos;) 변수명:QueryList&amp;lt;참조변수 자료형&amp;gt;;
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;QueryList는 변경되지 않는 리스트형, ngFor를 이용해 반복문 사용 가능&lt;/li&gt;
  &lt;li&gt;P.110 참조&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/wikibook/ng2-book/blob/master/component/src/app/viewchildren/viewchildren.component.ts&quot;&gt;예제소스&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;3-contentchild-장식자-이용&quot;&gt;3. &lt;code&gt;@ContentChild&lt;/code&gt; 장식자 이용&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;다른 곳에서 자신의 태그 사이에 넣어준 요소는 &lt;code&gt;@ContentChild&lt;/code&gt; 이다.&lt;/li&gt;
  &lt;li&gt;선언 방법&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;@ContentChild(클래스명)변수명:클래스명;
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;P.113 참조&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/wikibook/ng2-book/blob/master/component/src/app/contentchild/contentchild.component.ts&quot;&gt;예제소스&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;4-contentchildren-장식자-이용&quot;&gt;4. &lt;code&gt;@ContentChildren&lt;/code&gt; 장식자 이용&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;여러개의 지시자 정보를 관리&lt;/li&gt;
  &lt;li&gt;선언 방법&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;@ContentChildren(클래스명)변수명:클래스명;
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;P.115 참조&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/wikibook/ng2-book/blob/master/component/src/app/contentchildren/contentchildren.component.ts&quot;&gt;예제소스&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Thu, 20 Apr 2017 11:00:00 +0000</pubDate>
        <link>https://parkminkyu.github.io/06-angular2/</link>
        <guid isPermaLink="true">https://parkminkyu.github.io/06-angular2/</guid>
        
        <category>angular2</category>
        
        <category>컴포넌트</category>
        
        <category>자식 엘리먼트 호출</category>
        
        <category>ViewChild</category>
        
        <category>ViewChildren</category>
        
        <category>ContentChild</category>
        
        <category>ContentChildren</category>
        
        
        <category>Study</category>
        
        <category>angular2</category>
        
      </item>
    
      <item>
        <title>컴포넌트 상호 작용</title>
        <description>&lt;pre&gt;&lt;code&gt;Angular2 스터디 발표 자료
컴포넌트간 상호 작용방법을 학습
- 중첩 컴포넌트
- Input 장식자를 이용한 데이터 전달
- Inputs 속성을 이용한 데이터 전달
- EventEmitter를 이용한 데이터 전달
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;1-중첩-컴포넌트&quot;&gt;1. 중첩 컴포넌트&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;한개의 컴포넌트가 여러개의 컴포넌트를 포함하고 있으면 중첩 컴포넌트라 함&lt;/li&gt;
  &lt;li&gt;깊이에 따라 부모, 자식, 손자 … 이라 칭함&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;2-중첩-컴포넌트-생성&quot;&gt;2. 중첩 컴포넌트 생성&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;손자컴포넌트 &lt;a href=&quot;https://github.com/ParkMinKyu/angular2study/blob/master/src/app/grandson.component.ts&quot;&gt;grandson.component.ts&lt;/a&gt; 생성&lt;/li&gt;
  &lt;li&gt;자식컴포넌트 &lt;a href=&quot;https://github.com/ParkMinKyu/angular2study/blob/master/src/app/child.component.ts&quot;&gt;child.component.ts&lt;/a&gt; 생성&lt;/li&gt;
  &lt;li&gt;부모컴포넌트 &lt;a href=&quot;https://github.com/ParkMinKyu/angular2study/blob/master/src/app/parent.component.ts&quot;&gt;parent.component.ts&lt;/a&gt; 생성&lt;/li&gt;
  &lt;li&gt;모듈 등록&lt;/li&gt;
  &lt;li&gt;적용 및 확인&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;1. 손자 컴포넌트 생성
&amp;gt; /hello-ng2/src/app/grandson.component.ts

import { Component } from &apos;@angular/core&apos;;

@Component({
  selector : &apos;nested-grandson&apos;,
  template : &apos;&amp;lt;div&amp;gt;손자&amp;lt;/div&amp;gt;&apos;,
  styles : [&apos;div{border: 1px solid; width : 65%; height : 65%;}&apos;]
})
export class NestedGrandsonComponent{

}

2. 자식 컴포넌트 생성
&amp;gt; /hello-ng2/src/app/child.component.ts

import { Component } from &apos;@angular/core&apos;;

@Component({
  selector : &apos;nested-child&apos;,
  template : &apos;&amp;lt;div&amp;gt;자식&amp;lt;nested-grandson&amp;gt;&amp;lt;/nested-grandson&amp;gt;&amp;lt;/div&amp;gt;&apos;,
  styles : [&apos;div{border :1px solid; width : 75%; height : 75%;}&apos;]
})
export class NestedChildComponent{

}

3. 부모 컴포넌트 생성
&amp;gt; /hello-ng2/src/app/parent.component.ts

import { Component } from &apos;@angular/core&apos;;

@Component({
  selector : &apos;nested-parent&apos;,
  template : &apos;&amp;lt;div&amp;gt;부모&amp;lt;nested-child&amp;gt;&amp;lt;/nested-child&amp;gt;&amp;lt;/div&amp;gt;&apos;,
  styles : [&apos;div{border: 1px solid; width : 85%; height : 85%;}&apos;]
})
export class NestedParentComponent{

}

4. 모듈 등록
&amp;gt; /hello-ng2/src/app/app.module.ts
...
import { NestedParentComponent } from &apos;./parent.component&apos;;
import { NestedChildComponent } from &apos;./Child.component&apos;;
import { NestedGrandsonComponent } from &apos;./grandson.component&apos;;

@NgModule({
  declarations: [
    AppComponent,
    HelloComponent,
    NestedParentComponent,
    NestedChildComponent,
    NestedGrandsonComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule
  ],
  providers: [],
  bootstrap: [AppComponent,HelloComponent,NestedParentComponent]
  ...

5. 적용 및 확인
&amp;gt; ng serve
http://localhost:4200
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;3-input-장식자를-이용한-값-받기&quot;&gt;3. Input 장식자를 이용한 값 받기&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;@Input()&lt;/code&gt; 장식자를 사용하기 위해선 core에 있는 Input을 임포트 해야함.&lt;/li&gt;
  &lt;li&gt;부모 컴포넌트에서 자식 컴포넌트에게 값을 보내면 자식 컴포넌트는 &lt;code&gt;@Input()&lt;/code&gt; 장식자를 이용하여 값을 받음.&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;@Input()&lt;/code&gt; 장식자는 외부에서 값을 받아올때 사용.&lt;/li&gt;
  &lt;li&gt;부모 컴포넌트에서 자식 컴포넌트에 값을 전달 할 때는 [자식 컴포넌트에 정의된 변수명]=’전달할 값이 저장된 변수 명’ 의 형식으로 사용&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;4-input-장식자-실습&quot;&gt;4. Input 장식자 실습&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;자식 컴포넌트 &lt;a href=&quot;https://github.com/ParkMinKyu/angular2study/blob/master/src/app/data-child.component.ts&quot;&gt;data-child.component.ts&lt;/a&gt; 생성 및 @Input 장식자를 이용하여 값을 받도록 class확장&lt;/li&gt;
  &lt;li&gt;부모 컴포넌트&lt;a href=&quot;https://github.com/ParkMinKyu/angular2study/blob/master/src/app/data-parent.component.ts&quot;&gt;data-parent.component.ts&lt;/a&gt; 생성 및 자식 장식자에 값 전달&lt;/li&gt;
  &lt;li&gt;모듈 등록&lt;/li&gt;
  &lt;li&gt;적용 및 확인&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;1. 자식 컴포넌트 생성

import { Component,Input } from &apos;@angular/core&apos;;

@Component({
  selector : &apos;data-child&apos;,
  template : &apos;&amp;lt;div&amp;gt;parentName : {{name}} &amp;lt;/div&amp;gt;&apos;
})
export class DataChild{
  @Input() name:string;
}

2. 부모 컴포넌트 생성

import { Component } from &apos;@angular/core&apos;;

@Component({
  selector : &apos;data-parent&apos;,
  template : &apos;&amp;lt;div&amp;gt;data @input : &amp;lt;data-child [name]=&quot;parentName&quot;&amp;gt;&amp;lt;/data-child&amp;gt; &amp;lt;/div&amp;gt;&apos;
})
export class DataParent{
  parentName = &quot;부모님이시다.&quot;;
}

3. 모듈 등록
...
import { DataParent } from &apos;./data-parent.component&apos;;
import { DataChild } from &apos;./data-child.component&apos;;

@NgModule({
  declarations: [
  ...
    DataParent,
    DataChild
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule
  ],
  providers: [],
  bootstrap: [..., DataParent]

4. 적용 및 확인
&amp;gt; ng serve
http://localhost:4200
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;더 자세한 사항은 P.99 참조&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;5-inputs-속성을-이용하여-값-받기&quot;&gt;5. inputs 속성을 이용하여 값 받기&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;다른 모든것은 &lt;code&gt;@Input()&lt;/code&gt; 장식자를 이용할 때와 같다.&lt;/li&gt;
  &lt;li&gt;다른점은 값을 받는 자식 컴포넌트의 &lt;code&gt;@Component&lt;/code&gt; 설정에 inputs : [‘값을 받을 변수명1’,’변수명2’…] 의 형식으로 받으면 된다.&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;import { Component,Input } from &apos;@angular/core&apos;;

@Component({
  selector : &apos;data-child&apos;,
  template : &apos;&amp;lt;div&amp;gt;parentName : {{name}} &amp;lt;/div&amp;gt;&amp;lt;div&amp;gt; inputs1 : {{inputs1}}, inputs2 : {{inputs2}} &amp;lt;/div&amp;gt;&apos;,
  inputs : [&apos;inputs1&apos;,&apos;inputs2&apos;]
})
export class DataChild{
  @Input() name:string;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;6-eventemitter-를-이용한-값-전달&quot;&gt;6. EventEmitter 를 이용한 값 전달&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;자식 컴포넌트에서 부모 컴포넌트로 값을 보낼때는 &lt;code&gt;@Output()&lt;/code&gt; 장식자로 선언한 변수를 &lt;code&gt;EventEmitter&lt;/code&gt; 로 초기화한다.&lt;/li&gt;
  &lt;li&gt;부모에게 보낼 시점에 &lt;code&gt;EventEmitter&lt;/code&gt;로 초기화한 변수의 &lt;code&gt;emit()&lt;/code&gt; 메서드를 사용해 부모 컴포넌트로 이벤트를 전달한다.&lt;/li&gt;
  &lt;li&gt;core에 있는 Output, EventEmitter를 임포트 해야한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;7-eventemitter-실습&quot;&gt;7. EventEmitter 실습&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;버튼 클릭시 랜덤 숫자를 부모에게 전달하는 자식 컴포넌트 &lt;a href=&quot;https://github.com/ParkMinKyu/angular2study/blob/master/src/app/event-emitter-child.component.ts&quot;&gt;event-emitter-child.component.ts&lt;/a&gt; 생성.&lt;/li&gt;
  &lt;li&gt;자식 컴포넌트에서 발생한 숫자를 받아 표시할 부모 컴포넌트&lt;a href=&quot;https://github.com/ParkMinKyu/angular2study/blob/master/src/app/event-emitter-parent.component.ts&quot;&gt;event-emitter-parent.component.ts&lt;/a&gt; 생성.&lt;/li&gt;
  &lt;li&gt;모듈 등록&lt;/li&gt;
  &lt;li&gt;적용 및 확인&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;1. 자식 컴포넌트 생성

import { Component, EventEmitter, Output } from &apos;@angular/core&apos;;

@Component({
  selector : &apos;event-child&apos;,
  template : &apos;&amp;lt;button (click)=&quot;sendNumber()&quot;&amp;gt;전달&amp;lt;/button&amp;gt;&apos;
})
export class EventEmitterChild{
  @Output() outEventEmitter: EventEmitter&amp;lt;number&amp;gt; = new EventEmitter&amp;lt;number&amp;gt;();

  sendNumber(){
    let randNum = Math.floor(Math.random() * 6) + 1;
    this.outEventEmitter.emit(randNum);
  }
}


2. 부모 컴포넌트 생성

import { Component } from &apos;@angular/core&apos;;

@Component({
  selector : &apos;event-parent&apos;,
  template : &apos;&amp;lt;div&amp;gt;{{randNum}}&amp;lt;event-child (outEventEmitter)=&quot;outEvent($event)&quot;&amp;gt;&amp;lt;/event-child&amp;gt;&amp;lt;/div&amp;gt;&apos;
})
export class EventEmitterParent{
  randNum = 0;
  outEvent(randNum:number){
    this.randNum = randNum;
  }
}


3. 모듈 등록
...
import { EventEmitterParent} from &apos;./event-emitter-parent.component&apos;;
import { EventEmitterChild} from &apos;./event-emitter-child.component&apos;;

@NgModule({
  declarations: [
  ...
    EventEmitterParent,
    EventEmitterChild
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule
  ],
  providers: [],
  bootstrap: [...,EventEmitterParent]

4. 적용 및 확인
&amp;gt; ng serve
http://localhost:4200
&lt;/code&gt;&lt;/pre&gt;

&lt;hr /&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ParkMinKyu/angular2study/tree/master/src/app&quot;&gt;소스확인&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Wed, 19 Apr 2017 12:00:00 +0000</pubDate>
        <link>https://parkminkyu.github.io/04-angular2/</link>
        <guid isPermaLink="true">https://parkminkyu.github.io/04-angular2/</guid>
        
        <category>angular2</category>
        
        <category>컴포넌트</category>
        
        <category>컴포넌트 상호작용</category>
        
        <category>중첩 컴포넌트</category>
        
        <category>값 전달</category>
        
        <category>inputs</category>
        
        <category>input</category>
        
        <category>EventEmitter</category>
        
        
        <category>Study</category>
        
        <category>angular2</category>
        
      </item>
    
      <item>
        <title>컴포넌트 기초 실습</title>
        <description>&lt;pre&gt;&lt;code&gt;Angular2 스터디 발표 자료
컴포넌트 사용은 크게 다음 두가지 과정을 거침
- 컴포넌트 추가
- 컴포넌트를 모듈에 등록
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;1-컴포넌트-추가&quot;&gt;1. 컴포넌트 추가&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;컴포넌트 네이밍 규칙&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code&gt;name.component.ts
name-other.component.ts
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;컴포넌트 구조&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;import { component } from &apos;@angular/core&apos;

@Component({
  selector : &apos;ComponentName&apos;,
  template : &apos;HTML 템플릿&apos;,
  styles : [&apos;div{background:blue;}&apos;]
})
export class ComponentClass{
  component 로직
}
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;2-컴포넌트를-모듈에-등록&quot;&gt;2. 컴포넌트를 모듈에 등록&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;어플리케이션 모듈 파일(app.module.ts)을 열어 어플리케이션 시작시 사용할 컴포넌트 등록&lt;/li&gt;
  &lt;li&gt;declarations 속성에 임포트한 컴포넌트를 선언&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;...
import { HelloComponent } from &apos;./hello.component&apos;;

@NgModule({
  declarations: [
    HelloComponent
  ],
  ...
})
export class AppModule { }

&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;3-실습&quot;&gt;3. 실습&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;a href=&quot;https://github.com/angular/angular-cli&quot;&gt;angular-cli 설치&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;프로젝트 생성&lt;/li&gt;
  &lt;li&gt;컴포넌트 생성&lt;/li&gt;
  &lt;li&gt;컴포넌트 등록&lt;/li&gt;
  &lt;li&gt;적용 확인&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;1. angular-cli 설치
&amp;gt; npm install -g @angular-cli

2. 프로젝트 생성
&amp;gt; ng new hello-ng2
&amp;gt; cd hello-ng2

3. package.json 수정
&amp;gt; 현재 angular4버전이 나와서 기본 모듈이 4버전으로 되어있으니 책에나온 버전으로 변경 2.0.2 router만 3.0.2

4. 컴포넌트 생성
&amp;gt; /hello-ng2/src/app/hello.component.ts

import { Component } from &apos;@angular/core&apos;;

@Component({
  selector : &apos;hello-component&apos;,
  template : &apos;&amp;lt;div&amp;gt;{{title}}&amp;lt;/div&amp;gt;&apos;,
  styles : [&apos;div{border:1px solid;}&apos;]
})

export class HelloComponent{
  title = &apos;Hello Angular2&apos;;
}

5. 컴포넌트 등록
&amp;gt; /hello-ng2/src/app/app.module.ts
.....
import { HelloComponent } from &apos;./hello.component&apos;;

@NgModule({
  declarations: [
    AppComponent,
    HelloComponent
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})

6. 실행 및 확인
&amp;gt; hello-ng2/ng serve
http://localhost:4200
&lt;/code&gt;&lt;/pre&gt;

&lt;hr /&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ParkMinKyu/angular2study/tree/master/src/app&quot;&gt;소스확인&lt;/a&gt;&lt;/p&gt;
</description>
        <pubDate>Tue, 18 Apr 2017 12:00:00 +0000</pubDate>
        <link>https://parkminkyu.github.io/03-angular2/</link>
        <guid isPermaLink="true">https://parkminkyu.github.io/03-angular2/</guid>
        
        <category>angular2</category>
        
        <category>컴포넌트</category>
        
        <category>컴포넌트 기초</category>
        
        
        <category>Study</category>
        
        <category>angular2</category>
        
      </item>
    
      <item>
        <title>컴포넌트 구조</title>
        <description>&lt;pre&gt;&lt;code&gt;Angular2 스터디 발표 자료
컴포넌트 내부는 크게 세영역으로 나누어짐
- import 영역
- @Component 장식자
- 컴포넌트 클래스 영역
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;1-import-영역&quot;&gt;1. import 영역&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;Angular 라이브러리 모듈은 @를 붙여 호출.&lt;/li&gt;
  &lt;li&gt;사용자 정의 모듈 호출은 상대경로를 통해 호출.&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;//angular 모듈 호출
import { Component } from &apos;@angular/core&apos;;

//사용자 정의 모듈 호출
import { ModuleName } from &apos;./module.name&apos;;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;2-component-영역&quot;&gt;2. @Component 영역&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;@Component는 컴포넌트 장식자라함.&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;@Component({
  selector : &apos;ComponentName&apos;,
  template : &apos;&amp;lt;div&amp;gt;Component template&amp;lt;/div&amp;gt;&apos;,
  styles : [&apos;div{background:blue;}&apos;]
})
export class HelloApp{}
&lt;/code&gt;&lt;/pre&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;selector&lt;/code&gt; :  컴포넌트의 이름을 정의 &lt;code&gt;&amp;lt;ComponentName&amp;gt;&amp;lt;/ComponentName&amp;gt;&lt;/code&gt;의 형식으로 사용.&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;template&lt;/code&gt; : 내부파일에 html과 템플릿 문법을 이용해 템플릿 정의&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;templateUrl&lt;/code&gt; : 외부 파일에 html과 템플릿 문법을 정의&lt;/li&gt;
  &lt;li&gt;P.89-90참조&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;3-컴포넌트-클래스-영역&quot;&gt;3. 컴포넌트 클래스 영역&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;템플릿 데이터 출력과 관련된 로직을 처리.&lt;/li&gt;
  &lt;li&gt;http 서비스를 이용해 요청 결과를 템플릿에 반영.&lt;/li&gt;
  &lt;li&gt;템플릿의 클릭이벤트를 받아 이벤트 처리.&lt;/li&gt;
  &lt;li&gt;템플릿에 사용할 데이터를 다른 컴포넌트에서 받아 처리.&lt;/li&gt;
  &lt;li&gt;바인딩 변수를 이용해 권한에 따라 템플릿에서 화면 제어.&lt;/li&gt;
&lt;/ul&gt;
</description>
        <pubDate>Mon, 17 Apr 2017 12:00:00 +0000</pubDate>
        <link>https://parkminkyu.github.io/02-angular2/</link>
        <guid isPermaLink="true">https://parkminkyu.github.io/02-angular2/</guid>
        
        <category>angular2</category>
        
        <category>컴포넌트</category>
        
        <category>컴포넌트 구조</category>
        
        
        <category>Study</category>
        
        <category>angular2</category>
        
      </item>
    
      <item>
        <title>컴포넌트</title>
        <description>&lt;pre&gt;&lt;code&gt;Angular2 스터디 발표 자료
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;1-웹-컴포넌트&quot;&gt;1. 웹 컴포넌트&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;웹 컴포넌트는 HTML과 CSS, 자바스크립트를 하나의 단위로 묶어주는 기술.&lt;/li&gt;
  &lt;li&gt;HTML, 템플릿 호출, 쉐도우 DOM, 커스텀 엘리먼트의 구성으로 이루어짐.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;2-html-템플릿&quot;&gt;2. HTML 템플릿&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;컴포넌트의 UI를 표현하는 영역.&lt;/li&gt;
  &lt;li&gt;웹페이지의 일부분으로 동작하며, 재사용 가능함.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;3-템플릿-호출&quot;&gt;3. 템플릿 호출&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;템플릿은 문서 상단에 링크 엘리먼트를 이용해 호출.&lt;/li&gt;
  &lt;li&gt;템플릿 사용은, 스크립트 엘리먼트 안에서 템플릿 내용을 불러오고 쿼리 선택자를 이용하여 선택한 템플릿 노드를 현재 문서의 DOM 노드 밑으로 붙인다.&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code class=&quot;language-html&quot;&gt;&amp;lt;head&amp;gt;
  &amp;lt;link rel=&quot;import&quot; href=&quot;template.html&quot;&amp;gt;
  &amp;lt;link rel=&quot;import&quot; href=&quot;template2.html&quot;&amp;gt;
  .........
&amp;lt;/head&amp;gt;

&amp;lt;script&amp;gt;
 var link = document.querySelector(&apos;link[rel=&quot;import&quot;]&apos;);
 var content = link.import;
 var el = content.querySelector(&apos;#template&apos;);
 document.body.appendChild(el.cloneNode(true));
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;h3 id=&quot;4-쉐도우-dom&quot;&gt;4. 쉐도우 DOM&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;P.81 참조&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;5-커스텀-엘리먼트&quot;&gt;5. 커스텀 엘리먼트&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;엘리먼트 이름을 임의로 정의해서 만든 엘리먼트 이다.&lt;/li&gt;
  &lt;li&gt;기능과 모양이 합쳐진 화면 구성요소 이다.&lt;/li&gt;
  &lt;li&gt;P.82 참조&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;6-중첩-컴포넌트&quot;&gt;6. 중첩 컴포넌트&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;컴포넌트는 그 자체로 하나의 독립적인 프로그램.&lt;/li&gt;
  &lt;li&gt;부모 컴포넌트가 여러 자식 컴포넌트를 포함할 때 부모 컴포넌트를 중첩 컴포넌트라 함.&lt;/li&gt;
  &lt;li&gt;P.86 참조&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;7-컴포넌트-트리&quot;&gt;7. 컴포넌트 트리&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;컴포넌트 내부에 자식 컴포넌트를 포함하다 보면 컴포넌트 트리의 계층 구조가 만들어짐&lt;/li&gt;
  &lt;li&gt;P.86 참조&lt;/li&gt;
&lt;/ul&gt;

&lt;h3 id=&quot;8-컴포넌트-기반-개발&quot;&gt;8. 컴포넌트 기반 개발&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;컴포넌트는 명세에 따른 배포, 조립 가능한 독립 구성 단위여야 한다.&lt;/li&gt;
&lt;/ul&gt;

&lt;pre&gt;&lt;code class=&quot;language-javascript&quot;&gt;@Component({
  //컴포넌트 메타데이터 설정
})

export class HelloComponent{
  //컴포넌트 로직 작성
}
&lt;/code&gt;&lt;/pre&gt;
</description>
        <pubDate>Mon, 17 Apr 2017 12:00:00 +0000</pubDate>
        <link>https://parkminkyu.github.io/01-angular2/</link>
        <guid isPermaLink="true">https://parkminkyu.github.io/01-angular2/</guid>
        
        <category>angular2</category>
        
        <category>컴포넌트</category>
        
        
        <category>Study</category>
        
        <category>angular2</category>
        
      </item>
    
  </channel>
</rss>
