2015년 10월 31일 토요일

객체지향 자바스클립트의 원리

1장 원시타입과 참조타입

: 자바스크립트는 일급함수이다.
원시타입 : Boolean,Null,String,Number,Undefiend
참조타입 : 객체를 말함. 객체는 참조를 한다음 반드시  null 해주는게 좋다.

-프로퍼티의 접근 아래와 같은 경우도 가능하다.
var array = [];
var method = "push";
array[method](12345); <- 즉 array.push(12345) 와 같다. !!!!

-객체의 확인은 instansof 와  typeof 로 가능하다.

-원시래퍼 타입  : 자바스크립트엔진은 사실 간단한문자열 대입시에도 string 을 생성후 널처리 하기 때문에 스트링에 함수로 각종 처리를 할수 있다.

2.함수

:자바스크립트에서 함수는 객체다.

함수는 함수 선언(function delcaration)  과  함수표현식(function expresion) 이 있다.
함수선언: 은 hoist 되기 때문에 자바스크립트 엔진에서 함수를 최상단으로 끌어 올려 지게 된다.
result = add (1,2); // 아래 add 함수가 자바스크립트엔진에 의해 상단으로 올려지기 때문에 실행가능
function add( num1, num2){
return num1+num2;
}

함수표현식:
result=add(1,2); //이건 안됨. 함수표현식은 선언과 동시에 정의되기때문에 호이스트되지않는다.
var add = function add(num1,num2){
return num1+num2;
}

오버로딩:
오버로딩은 기본적으로 지원하지 않는다.

this :
this는 호출한 함수의 스코프를 가진다. 따라서 객체내에서 불려진 함수내에서의 this 는 호출한 함수이지만, wrapping 되지 않고 호출되는 함수는 그냥 전역이 this 이다.

call 메쏘드:
this 는 임의로 조작해서 전혀 다른 객체를 this 로 전달할수있는다.
실행한함수또는객체.call(this 또는 다른 객체를 this 로 지정,args);
즉, helloWorld.call(this,"happy"); 라고 하면 helloworld 함수를 호출하되, 함수내에서 this 를 호출하면 전역 this 를 불려지게 하고, happy 라는 인자를 전달한다 라는 것고 같다.
helloWorld.call(anotherWorld,"avatar"); 라고 하면 helloworld 함수내에서 this 는 anotherworld 가 되고, 인자로 아바타를 전달하고 실행한다.

apply 메쏘드:
call 과 같지만, 두번째 인수로 배열,객체등을 전달할수 있다.

bind 메쏘드:
this 를 아예 고정시켜준다.

3.객체의 이해

: 자바스크립트는 객체가 동적이기 때문에 제약이 없지만 이런점 때문에, 다소 소스 정리가 쉽지않고 이해하기가 난해한 부분이있다.
객체는 거의 key : value 식으로 구성된다.

-프로퍼티
.(점) 속성은 자바스크립에서는 언제든지 선언하여 바로 사용할수 있다. 이때 자바스크립트는 객체에 put 이라는 내부 메쏘드를 호출한다. 그리고 값을 할당하면 바로  set 이 호출되어 새로운 값으로 교체한다.
객체에 특정 프로퍼티가 있는지 체크하려면 객체에 속성이 있는지 if( "name" in person);  검증한다. 이때는 프로퍼티의 값을 검증하지는 않고 속성만 판탄하기 때문에 성능향상에 좋다.
다만 객체가 생성될때 기본적으로 자바스크립에서 부가적인 속성을 추가하기 때문에 , 사용자가 만든 고유의 속성인지 확인해 볼필요가 있을때는 .hasOwnProperty("name") 라고 해야 한다.

프로퍼티는 delete 연산자르 삭제해야 한다. 중요하다.

객체의 프로퍼티가 어떤게 있는지 보고 싶을때는
열거가능한 프로퍼티.즉 tostring 따위도 포함할경우  for( property in object) 식
고유의 프로퍼티 (var props = Object.keys(object); for(var i=0;i < props.length;i++))  으로 한다.

-프로퍼티의 종류
Data property 와 Accessor Property 로 나뉜다.
Data propery : put 메쏘드의 기본동작으로 생성된다. 값을 지정한다.
Accessor propety : get set 을 별도로 정의한다.

프로퍼티의 속성은 Object.defienProperty("객체","프로퍼티이름",프로퍼티 서술자)  로 바꿀수 있다.

Data property 는 value, writeable 속성을 추가로 바꿀수있다.

Object.defineProperty(person1,"name",{
value : "v1",
enumerable : true,
configurable:true,
writeable:true});

Data accessor property 는 get , set  을 변경할수 있다.

defienProperties 로 하면 여러개의 프로퍼티를 한번에 할수 있다.

프로퍼티 속성을 가져올때는 Object.getOwnPropertyDescriptor() 를 사용한다.

객체의 수정방지
객체 속성중 Extensible 을 false 로 하면 객체를 수정할수 없다.
Object.preventExtensions() 를 사용하면, 확장불가능한 객체로 만들수 있다.(엄격한 모드)

객체의 봉인
Object.seal()메쏘드를 하면 봉인할수 있다. 추가로 프로퍼티 추가나 제거는 불가능 하지만, 읽기나 쓰기는 가능하다.

객체의 동결
읽기 전용으로 만든다. Object.freeze(); 일종의 객체에 대한 스냅샷을 만든다고 생각하면 된다.

4.생성자와 프로트타입
생성자는 그냥 인자를 이용하면 됨.

프로토타입 
:어떤 함수를 이용하여 여러번 호출할때, 함수안에 정의된 내부함수객체를 별도의 빼내어 낸게 프로토타입이다.
Object.prototype 식으로 하며 ,보통  Object.prototype.myfunc = function(){};
더 나은 방법으로는
Object.prototype = {
whois : Person,
myfunc : function(){},
sayhello : function(){}
};

내장객체의 프로토타입
:내장객체의 프로토타입에 고유의 기능을 추가하면 꽤 유용한 경우가 있다.
Array.prototype.sum = fuction(){ return 1+1); array.sum();

5. 상속
6.객체 패턴
자바스크립트는 모두 public 이다.
따라서 Closure 를 이용해서 private 속성값을 만든다.

2015년 10월 30일 금요일

데이터베이스 설계와 구축

-PK 컬럼순서도 중요하다?

: where , join 절에서 인덱싱을 타기위한  pk 인덱스 순서도  중요하다.

복합인덱스의 경우에도 단순 스칼라 비교값이 먼저배치하고 between 등과 같은 연산이 필요한 컬럼등은 뒤로 배치하면 인덱스범위가 앞에서 부터 줄어든다.

-식별자와 비식별자

: 테이블을 식별자로만 설계하면 테이블간 강한 연결관계가 되어, 자식의 PK 에는 항상 부모의 PK 식별자가 있어야한다. 따라서 자식테이블에서는 식별자로만으로도 데이터를 얻어오는게 가능하다
:비식별자로만 되어 있으면 약한 연결관계가 되는데, 자식테이블은 부모테이블의 PK에 상관없이  선언하기 때문에, 자식은PK선언에 ㅂ비교적 독립적이며 자식테이블에서 자료를 얻어낼려면 부모와의 조인참조가 필요하다.

- Transaction

: ACID(Atomicity, Consistency, Isolation, Durability)
A: 업무를 처리하는 최소의 단위별로 작업해야 한다.
C:일관성
I:독립성(Lock 기능)
D:영구성

-정규화 와 반정규화...

: 중요하다..쩝..

작업중

2015년 10월 28일 수요일

PHP DesignPattern 예제는 여기..

http://www.php5dp.com/a-simple-php-design-pattern-the-factory-method/

http://designpatternsphp.readthedocs.org/en/latest/README.html 여긴좀...

실전사례로 보는 SQL튜닝방법-인사이트

SQL 튜닝 배우자.

정규화 반정규화도 튜닝 작업의 일환이다.

인덱스만 잘타도 기본적인 튜닝작업이 된다.

이 책은 인덱스로 시작해서 인덱스로 끝난다.ㅋ
실전사례는 많아서 좋다.

-옵티마이져

Parsing 에 대한 적절한 실행계획을 세우는것.

:Soft Parsing : SQL을 실행한 적이 있는지 메모리에서 검사해서 기존방식대로 실행하여 처리는것.
Hard Parsing : SQL에서 사용하고 있는 객체들에 대한 접근권한체크후 어떤 방식으로 처리할것인지 실행계획을 세우는 것

-옵티마이져 종류

1.규칙기반 (Rule Base Optimizer , ROB): 특정 규칙을 기반으로 실행계획을 세우는 방법
:Rank(1~15) 에 정해진 우선순위대로 규칙을 적용한다.
-힌트를 사용할수 없다.
-HASH JOIN 을 사용할수 없다.
-Partitioned table, iot, reverse key index , function based index등은 사용할수없다.
이러한 제약때문에 Oracle10g 부터는 규칙기반 옵티마이져를 사용하지 않는다.

2.비용기반 (Cose Base Optimize , COB): SQL 의 비용을 계산해서 최소의 비용(cost) 로 처리할수 있는 계획을 세우는 방법

---

 

---

힌트의 사용
임시로 적용해 보는 몇가지 힌트를 통해 튜닝에 도움을 줄수있다.

/*+ ALL_ROWS */ : 최소한의 자원을 최대로 빨리 가져오는 실행계획을 세운다.
/*+ INDEX(table_name index_name)*/ : 특정 인덱스를 사용하거나,  NO_INDEX 를 통해 인덱스를 사용하지 않는 결과를 본다.
( /*+ INDEX_ASC(table_name index_name)*/ 와 /*+ INDEX_DESC(table_name index_name)*/) 도 있음.
/*+ FULL(table_name) */ : FULL SCAN  하고자 할때 쓰인다. Index scan 하고의 비교 검증용이다.
/*+ INDEX_FFS(table_name index_name) */ : index fast full scan 을 유도한다. 컬럼들이 모두 인덱스에 있을때, 인덱스만으로도 검색이 가능한경우.

/*+ ORDERRED */ : 무조건 from 절에서 나열한 테이블 순서대로 처리를 진행한다. join 쿼리의 경우 순서도 영향을 끼지기 때문이다.
/*+ LEADING(table1 table2...) */ : 명시된 테이블 순서대로 처리한다.

/*+ USE_NL(table1 table2...) */ : nesteed loop join 을 사용한다.(!= NO_USE_NL)
/*+ USE_HASH(table1 table2...) */ : hash join 을 사용한다.

/*+ USE_CONCATE */ :조건절의 OR 를  UNION ALL 형식으로 변형하여 실행한다.(!= NO_EXPAND)
/*+ MERGE */ : 뷰가 메인쿼리와 merge 되지 않을때 강제로 merge 한다. (!= NO_MERGE)
/*+ UNNEST */ : 서브쿼리와 메인쿼리를 하나의 조인형태로 한다.(!= NO_UNNEST)

2015년 10월 27일 화요일

Eclipse 단축키등

http://blueskywithyou.tistory.com/39

2015년 10월 25일 일요일

Abstract Factory

공통의 Todo 목표를 가진 제품의 생산방식을 대표클래스를 통해 추상화하고, 하위 클라이언트 클래스에서는 이를 구현하기만 하면 되는 패턴이다.

예제

인터페이스 render{
구체화된 하위 클래스들이 공통적으로 구현 해야할 기능 (예.  render , user, paint,  등..)
}

각각 구체화된 하위 클래스 implement   render{
인터페이스 render 의 메쏘드를 각자 제각각 구현
}

추상 팩토리 객체 AbstractRenderFactory{
추상화된 생성객체를 생성해서 이  객체를 상속받아 생성하는 객체를 통해 render 방식을 결정
}

추상팩토리 객체의 하위 클래스 extend AbstractRenderFactory{
추상팩토리 객체에 정의된 생성메쏘드를 오버라이드 하고, 구체화된 하위클래스의  render 를 실행.
}

 

 

참고:

https://www.youtube.com/watch?v=soV1C6j9kkg
http://warmz.tistory.com/758 - 추천
http://alleysark.tistory.com/169  - 추천2
http://designpatternsphpko.readthedocs.org/ko/latest/Creational/AbstractFactory/README.html
http://dsheiko.com/weblog/design-patterns-by-php-and-js-es5-examples/#abstract-factory

Lifecycle of Fragment in Android

http://codemeaning.com/what-is-fragment/

2015년 10월 18일 일요일

초보자를 위한 분산 캐시 이야기

http://www.slideshare.net/OnGameServer/ss-10451675?related=3

[D2 campus seminar]개발자가 꼭 알아야 할 보안이야기

http://www.slideshare.net/deview/d2-campus-seminar-45210063?related=2

JAVA PERFORMANCE TURNING

http://www.slideshare.net/ienvyou/java-performance-tuning-46792397?related=1

2015년 10월 16일 금요일

PHP 의존성 주입 예제

이해가 되는 슬라이드

http://www.slideshare.net/rifat/dependency-injection-10624875?qid=5def2560-b50b-4e50-8592-cb7d4d077516&v=qf1&b=&from_search=6

 

http://modernpug.github.io/php-the-right-way/#dependency_injection 에서 발췌

의존성 주입


위키백과에서 인용:
의존성 주입(Dependency Injection, DI)은 프로그래밍에서 구성요소간의 종속성을 소스코드에서 설정하지 않고 외부의 설정파일 등을 통해 컴파일 시점이나 실행 시점에 주입하도록 하는 디자인 패턴 중의 하나이다.

위와 같은 설명은 실제보다 훨씬 어렵게 느껴지게 만드는 점이 있습니다. 의존성 주입이라는 것은 특정 컴포넌트의 의존 관계를, 생성자에서 주입하거나 메소드 호출 혹은 프로퍼티 설정을 하는 방식으로 지정할 수 있게 하는 것입니다. 간단한 얘기입니다.



기본 개념


간단한 예제를 통해서 기본적인 개념을 보여드리겠습니다.

아래 코드를 보면 데이터베이스와 통신하기 위한 어댑터를 필요로 하는 Database라는 클래스가 있습니다. 생성자에서 어댑터 인스턴스를 생성하는 방식으로 되어 있어서 두 클래스는 서로 강한 의존 관계를 가지고 있습니다. 그래서 Database 클래스를 테스트하기도 어렵습니다.

<?php
namespace Database;

class Database
{
protected $adapter;

public function __construct()
{
$this->adapter = new MySqlAdapter;
}
}

class MysqlAdapter {}


아래와 같이 리팩터링하여 의존성 주입을 사용하도록 하면 의존 관계를 약화시킬 수 있습니다.

<?php
namespace Database;

class Database
{
protected $adapter;

public function __construct(MySqlAdapter $adapter)
{
$this->adapter = $adapter;
}
}

class MysqlAdapter {}


이제 Database는 내부에서 직접 의존 관계에 있는 클래스 인스턴스를 생성하지 않고, 외부에서 전달받게 되었습니다. 어댑터 인스턴스를 인자로 전달받는 메소드를 만들어서 해당 어댑터를 사용하도록 설정하는 방식을 적용하거나, $adapter 프로퍼티를public 으로 만들어서 프로퍼티를 직접 설정하게 할 수도 있을 것입니다.

PHP DesignPattern 2

http://www.fluffycat.com/PHP-Design-Patterns/

2015년 10월 15일 목요일

php design patterns

http://wafe.github.io/php-the-right-way/pages/Design-Patterns.html

http://www.phptherightway.com/pages/Design-Patterns.html

http://mytory.net/archives/1948/

 

https://sourcemaking.com/design_patterns/observer/php

 

http://designpatternsphpko.readthedocs.org/ko/latest/

 

http://dsheiko.com/weblog/design-patterns-by-php-and-js-es5-examples/

6. Factory pattern

http://arnakiel.blogspot.kr/2010/01/%EB%94%94%EC%9E%90%EC%9D%B8-%ED%8C%A8%ED%84%B4%EC%9D%98-%EB%84%A4%EB%B2%88%EC%A7%B8-%ED%8C%A9%ED%86%A0%EB%A6%AC-%ED%8C%A8%ED%84%B4factory-pattern-1.html

http://outliers.tistory.com/14

2015년 10월 12일 월요일

5.Decorator pattern

참고. http://warmz.tistory.com/757 (*발췌 ava.io 패키지에는 어마어마하게 많은 클래스들이 있지만, 많은 부분이 데코레이터 패턴을 바탕으로 만들어져 있다.)

http://stevenjsmin.tistory.com/73

http://donxu.tistory.com/96

http://code.tutsplus.com/tutorials/design-patterns-the-decorator-pattern--cms-22641

 

http://tiboy.tistory.com/entry/Decorator-Pattern%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0-%ED%8C%A8%ED%84%B4

http://warmz.tistory.com/entry/Decorator-Pattern-%EB%8D%B0%EC%BD%94%EB%A0%88%EC%9D%B4%ED%84%B0-%ED%8C%A8%ED%84%B4

2015년 10월 11일 일요일

시작하세요 AngularJS 프로그래밍

시작하세요! AngularJs  프로그래밍
AngularJS 는 오픈소스 자바 프레임워크 이다. 프레임워크이기 때문에 기본 뼈대만 있고, 사이트구축에 대한 응용은 알아서 해야한다.
하지만 AngularJS 에서 추가로 제공하는 라이브러리를 통해서 애니메이션,쿠기,로드,단위테스트,리소스관리,라우트,터치이벤트 등이 쉽게 구현가능하다.
angular-js , animate, cookies, loader, mocks, resource, toure, ssanitize, scenario, touch...

Tip: Bower.io 에서 클라이언트종속성을 편하게 가져올수 있도록 할수있다. 관련된 라이브러리를 편하게 선택해서 불러올수있다.
http://bower/angulra/angular.js

Tip: angular-batarang 프로젝트는 크롬브라우져의 웹인스펙터 확장팩형태로 제공되는 전용 디버깅 기능이다.

- Karma 와 Jasmine

karma 는 테스트러너이다. 실제 테스트를 위해선 jasmine (테스트 프레임워크)을 이용해서 작성해야 카르마가 테스트 할수 있다.
node 로 구현되는 것이기때문에 관련모듈을 설치할필요가 있다.
npm install karma  ,  karma-jasmine, karma-chrome-launcher
sudo npm install -g karma-cli : g 옵션으로 아무데서나 카르가 실행되도록 한다.

설치되었으면,

karma.conf.js 를 열어서 설정을 한다. 이때 autoWatch 를 true 로 하면 파일이 변경되면 바로 카르마가 실행되도록 한다.
자세한것은 PACKT 사의 MVC 패턴과 트위터부트스트랩을 이용한 AngulraJS 반응형 웹앱 개발과 성능 최적화 참고.
Angulra-seed 의 git 을 클론하면 기본 스캐폴더(폴더구성 및 관련파일구성)을 쉽게 할수있다.
이를 통해 가져온 스캐폴더에는  css,img,js,lib,partials 폴더가 있다.
AngularJS 주요기능
-양방향 데이터 바인딩
-MVC 구조
-지시자(Directive)를 이용한 확장
-의존관계 주입
-Singlepage WebApplication 을 위한 Router 구현
-$q 를 이용한 비동기 프로그래밍 지원
-테스팅 환경 지원

AngularJS 를 이용하기 위해서는 http://angular.js 만 지정하면 된다.
물론 이건 angularjs 프레임워크만 로드할것 뿐이다. html 페이지에서 적용하려면
<html ng-app> 이라고 태그 속성을 지정하면 그때부터 angularjs 가 html 소스를 먼저 해석하게된다.
이렇게 ng- 로 시작되는 많은 angularJS 만의 지시자들과 속성이 있는데 이를 디렉티브라고 한다.

디렉티브는 기본적으로 제공하는 이외에도 사용자가 직접 만들어서 추가하여 나만의 디렉티브를 구현할수 있다.

특정 태그블록에 기능을 추가하거나 변수값을 대입(대응)대도록 할수 있는데, 이를 위해서는 ng-controller 지시어를 사용한다.
먼저 코드블록에서 콘트롤러로 사용할 함수를 지정한다.

//$scope 는 AngularJS 의 전역변수이며 매직변수이다.
var myval = [{mval:"1",mcheck:false},{mval:"2",mcheck:true}];
function myTest($scope){
$scope.name = "My Angular Test";
$scope.myGval = myval; // angularJS 의 $scope 에 myval 변수를 추가한다.
}

이제 특정태그블록에서 콘트롤러를 지정하면된다.


{{appName}}

//appName 은 angularJS 의 변수

  • {{my.mval}}



div 태그블록을 ng-controller 로 하겠다고 지시자를 지정하고, myTest 함수를 콘트롤러 구현부로 하겠다고 선언한다.
ng-repeat 을 통해서 li 태그를 $scope.myGval 객체의 개수만큼 반복하면서 li 를 생성한다.
ng-model 은 "값"에 해당하는 것으로 input 박스의 값에 angularjs 의 사용자 지정 model 변수들을 연동할때 쓰인다.
-angularjs 부트스트랩
ng-app 을 통해서 angularjs 를 기동시키고 html 태그블록에서 angularjs 가 렌더링되도록 했다.
하지만 html 전체가 아닌 작게 나뉜 태그블록에서 ng-app 을 지정하고자 싶지만  ng-app 은 한번밖에 해석되지 않는데,
이때는 javascript 에서 angular.bootstrap(document.getElementById('id태그')) 를 통해서 여러번 실행가능한다.
-ng-init : 태크블록 내에서 초기화할 필요가 있는 변수나 기능 지정
-ng-repeat : 태그블록을 반복
-ng-switch="모델이름" :  하위테그에서 ng-switch-when="모델값의 밸류" 가 트루일때 화면에 보임
-ng-if : 참일때보임
-ng-show,hide
-input 태그블록에서는 ng-model, ng-required,ng-minlength,ng-maxlength,ng-pattern,ng-change 등이 있다.
-FormController 의 속성 메쏘드 알아보기
-NgModelController 속성과 메써드 알아보기

이벤트 지시자
ng-click, ng-dblclick, ng-ketdown, ng-ketpress, ng-keytup,ng-mousedown,ng-mouseenter,ngmouseleave, ng-mousemove,over,up,change,blur

스타일시트 클래스 지시가
ng-class, ng-style="$scope.스타일값"
Controller 로 정의한 중첩된 태그블록에서 하위 콘트롤러에서 상위 콘트롤러의 $scope 는 접근이 가능한다.

-모듈
ngmodules.org 에서 참고.
모듈을 나만의 directive (지시자)생성
angular.module('mytestApp',[]).directive('helloworld',funciton(){ return function(scope, iElement,iAttrs,controller){ iElement.html(" hello "+iAttrs.myname+"");
라고 선언되었을때

라고 가능.

-지시자 설정객체
지시자 설정함수에서 반환되는 객체를 말함.
지시자를 생성할때에 객체형으로 여러가지 속성을 지정하여 리턴할수 있다.
name,priority,terminal,scope,template,replace,transclude,restrict,controller:function(), compile 등..
이중 template_Url 을 통해서 외부파일에 해당 코드블록만 따로 템플릿화 시켜서 이용이 가능하다.
<h1>hello <span>{{worldname}}</span></h1>
단 해당 디렉티브를 여러번 호출할경우 지시자 속성중 scope 를 true 로 해서 각각의 scope 를 생성해야한다.

-scope 속성
scope 속성에 { myname : "@who" } 라고 되어 있으면,
 
해도 scope 가 엉키지 않는다.
---------------------------------------




</div>
</div>

angular.module('sampleApp',[]).controller('demoCtrl',['$scope',function($scope){

}]).directive('hello',function(){
return {
template:'<span>{{myname}}</span>',
restrict:"AE",
scope:{ myname:"@to"}
}
});
---------------------------------------

scope 속성에 { myname : "=who" } 라고 되어 있으면,
  하면 who 속성이 양방향 바인딩 된다.

-지시자 Directive
크게 네가지 형태로 지정가능한다.
1.요소의 속성
<span my-directive="exp"></span>
2.요소의 클래스
<span class="my-directive:exp"></span>
3.요소이름
<my-directive></my-directive>
4.코멘트호출
<!-- directiv: mydirective expression -->
Tip : 웹표준을 위해서 x-ng-click 등으로 한다.
Tip : IE 8 등에서는 Dom 이 먼저 생성되야 하므로 <!-- [if lte IE8]> document.createElement('my-directive');<![endif]--> 해준다.
-외존관계 주입
$provide  를 이용한 주입방법
-value
: angular.module('myapp',[]).value('AppName','myValue').controller('myctrl',function($scope,AppName){ $scope.printAppName = AppName);

-factory
: 188page 샘플 예제 2.38

-service
: 190page 샘플 예제 2.39

-provider
: value,factory,service 는 모두  provider 의 래퍼다.
,contrant

메서드별 차이점은 다른 서비스를 주입가능한지 등 화깅ㄴ필요.

$injector 에 의한 주입. 특정 서비스가 해당 모듈에 저의 되었는지 확인 가능.
예제 2.44

-$route 서비스
angular-route.js 라는 별도의 라우트 라이브러리를 연동해야 한다. 244 페이지
예제 3.1
angular.modle('myapp',['ngRoute']).config(functiuon($routeProvider){$routeProvider.
when('/home','tempalteUrl:'template/home.tmpl.html'})
when('/about','tempalteUrl:'template/about.tmpl.html'},controller:'aboutCtl')..
선언하고
<ng-view></ng-view> 에서 보여줌.
controller,controllerAs,template,templateUrl,resole,redirectTo,reloadOnSearch,caseInsentitiveMath 등의 속성이 있다.
-$http 서비스
-RESTful 웹서비스를 위한 $resource

2015년 10월 10일 토요일

4.adaptter pattern

유지보수 또는 향후 확장성 차원에서 어답터 라는 인터페이스를 통해서 추가로 발생되는 기능이나 기존의 기능에 유연하게 대처할수 있도록 해준다.

추상클래스를 상속받은 기존의 클래스에는  새로운 기능(220볼트 플러그인과같은)이 없기 때문에 , 애덥터 클래스를 새로 추가하여 그 안에 220 둥그런 돼지코 를 110 의 | | 돼지코로 호환되는 구현부를 만들어서 기존 클래스에서 하던방식대로 연결하는 패턴임.

http://tiboy.tistory.com/entry/Adapter-Pattern%EC%96%B4%EB%8E%81%ED%84%B0-%ED%8C%A8%ED%84%B4

http://warmz.tistory.com/763

http://blog.jdm.kr/11 <--쉽게 설명

http://outliers.tistory.com/18

php  예제 : http://redgolems.tistory.com/2

3.Template Method 패턴

상위클래스는 처리의 흐름이 정의 되어 있는 추상클래스이고 ,하위 클래스는 사우이클래스를 상속받아 구체적인 처리를 구현한 클래스가 된다.

따라서 상위 클래스는 하위 클래스가 실제적으로 어떤 구체적인 작업을 하는지 모르며, 서로 다른 하위 클래스들은 나름대로의 방식대로 구현하되 처리의 흐름은 상위 클래스에 정의된대로 따르게 된다.

즉, 탬플릿의 주체가 되는 콘트롤러 의 성격을 띄는 상위클래스에서 흐름을 관장하고, 상속받은 실제 하위 클래스에서는 상위클래스에서 정의된 순서와 규정에 맞게 오버라이딩 하고, 추가 기능등을 구현하게 된다.

따라서 일련의 상속받은 하위 클래스들은 모두 상위 클래스의 템플릿구성대로 구현과 실행하게 되는 패턴이다.

구조가 일관적인 형식의 제품이나 기능들을만들때 주로 사용하는 패턴이다.

Abstract  UpperClass {

abstract public function init();
abstract public function run();
abstract public function end();
final function showMain(){
this->init();
this->run();
this->end();

}
protected int sharedVal = 0; //하위 클래스에서 공통으로 공유하는 변수등.

}

추상클래스인 UpperClass 에는 오버라이디이 불가능한 final 인 showMain 에 정의된 초기와->실행->종료 라는 템플릿으로 하위 클래스에서 실행되도록 구현된것이다.

하위 클래스는 추상메쏘드 들을 각 상황에 맞에 오버라이딩 한다음 showMain() 을 실행하여 동일한 실행 프로세스를 가질수 있도록 했다.

 

http://copynull.tistory.com/124

http://egloos.zum.com/iilii/v/3806897

http://secretroute.tistory.com/entry/Head-First-Design-Patterns-%EC%A0%9C8%EC%9E%A5-Template-Method-%ED%8C%A8%ED%84%B4

http://blog.jdm.kr/116

http://skmagic.tistory.com/entry/Template-Method-Pattern-Class-%EC%A0%95%EB%A6%AC%EB%B3%B8

http://darkneo.tistory.com/7

Git 분산관리 버젼 시스템 - 인사이트

1.저장소( repository) : 사용자가 변경한 모든 내용을 추적하는 공간.

2.저장소 만들기 :

  • mkdir mywebsite

  • cd mywebsite

  • git init

  • 후에

  • git add index.html

  • git commit -m "hehe first website"


3.branch  만들기

git branch RB_1.0 master

master 브랜치에서 RB_1.0  라는 브랜치를 생성한다. (서브비젼에서는 트렁크라고 했음)

4.원격저장소 복제해오기

git clone http://mysite myclonesite

5.파일무시하기

.gitignore : 저장소및 자신의 컴퓨터에서 파일무시

.git/info/exclude : 자신의 저장소에서만 파일무시

6.브랜치 활용

-깃에서는 모든게 브랜치 로 간주된다.

브랜치는 새로운 기능을 잠깐 만들어보려고 할떄나, 검증전의 새로운 기능추가, 리팩토링,버그수정 등의 별도의 과정을 하고자 할때 주로 생성한다. 새로운 기능은 베타버젼일수있으며 검증이 끝나면 다시 마스터와 통합하여 릴리즈 버젼으로 만들어 배포하는 수순이다.

git checkout -b newAlgo master

마스터로 부터 새로운 알고브랜치를 만든다.

6.1 병합

newAlgo 체크아웃상태에서

git add test.html -> git commit -m "for test" 하면 master 브랜치에서는 존재하지않는다.

따라서 합치고자 하는 브랜치로 전환해야 한다.

git checkout master

git merge --squash newAlgo

로 아까 추가한 것을  master 에 합친다.( squash 는 모든 커밋을 하나의 커밋으로 밀어넣는다.)

6.2 브랜치의 충돌

"브랜치1" 과 "브랜치2"를 먼저 추가후 "브랜치1"에서 내용을 추가한후

"브랜치2"에서 따로 내용 추가한다음

1의 파일을 다시 수정하고

git commit -> git checkout "브랜치1" -> git merge "브랜치2" 하면 충돌이 일어난다.

<<< : 현재 브랜치
>> : 다른브랜치

=== : 구분자

이때는 그냥 머지툴로 충돌 확인하고 적절한 수정을...쿨럭....같은 내용중에 어떤거를 남길수 판단은 인간이.

7.커밋 돌려놓기

git revert -n 5401434 -> git commit -m "revert"

8.원격 저장소를 이용

8.1 push

git origin mybranch:master 해서 로컬의 특정 브랜치를 원격에 저장할수 있다.

원격저장소에 대한 별칭은

git remote add 이름 저장소URL 이다.

git pull thkim HEAD 하면 별칭된 주소에서 가져온다.