블로그 이미지
윤영식
Full Stacker, Application Architecter, KnowHow Dispenser and Bike Rider

Publication

Category

Recent Post

2012. 11. 21. 11:19 Lean Agile Culture

나는 전규현님의 블로그 포스팅을 관심있게 읽고 있는 독자이다. 패키지SW 개발을 7년 넘게 해보면서 느꼈던 모순과 방황에 대한 원인과 솔루션을 잘 설명해 주고있기 때문이다. 최근 지인들과 모여서 새로운 모바일 서비스를 기획하면서 어떤식으로 진행을 하고 어떤 시스템들이 필요할지 그리고 어떤 형태로 운영을 할지 고민을 하고 있다. 그 좋은 해답을 해당 블로그에서 이야기 해주고 있다. 


  • 소스저장소, 이슈, 위키, 프로젝트관리 :  http://softwaredev.tistory.com/297
    • 소스저장소 : Git onDemand : BitBucket
    • 이슈 : Jira onDemand
    • 위키 : Confluence onDemand
    • 스크럼 도구: GreenHopper onDemand (추가)
    • 프로젝트 관리 : Podio onDemand (추가)
  • SVN or Git 어느 것을 쓸것인가 :  http://softwaredev.tistory.com/238
    • 분산환경에서 일할 경우 : Git Repository

최근에 Podio로 프로젝트 관리를 하고 스크럼 방식 진행은 Trello를 사용하고 있다. 둘을 연결시켜서 보자가 Zapier를 사용하고 있지만 Zapier 오류로 인해 Trello -> Podio 연동이 잘 되지 않는다. 연동만 잘 된다면 Podio + Trello로도 사용할 만 하다. 물론 기본 전제는 분산환경에서 일할 경우 유용하고, 로컬에서 모여 일한다면 벽에 Post-It을 활용하는 것도 좋다. (GreenHopper 를 사용하면 Trello는 버려도 좋겠다)


posted by 윤영식
2012. 11. 21. 09:53 Middleware, Cloud/Linux

AWS의 Ubuntu 시스템에 ftpd를 설치하는 방법. 구글링하면 너무 많은 정보가 있으므로 좋은 사이트 몇개 링크함


1) 설치 기본 : sudo 설치 방법. https://help.ubuntu.com/10.04/serverguide/ftp-server.html

2) 설정 상세 : 설정에 대한 한글 상세 설명. http://community.365managed.com/10759


JBoss를 curl로 받으려고 하는데 마땅한 곳이 없다. 어디 없을까?

posted by 윤영식
2012. 11. 20. 10:29 Lean Agile Culture/Architecturing

모바일 컨버전스 서비스를 기획하면서 가장 헤메이는 부분이 대용량 데이터에 대한 신뢰성 있는 아키텍쳐를 구축하는 일이다. 이미 대형 포털과 모바일 서비스에서 많은 아키텍쳐 연구를 통하여 최적화를 했겠지만 이를 전수받거나 아니면 뼈대를 살표보는 일은 쉽지 않다. 그러나 AOSA(The Architecture of Open Source Applications) 라는 외국 사이트에서 이에 대한 단초를 제공하고 있고, 네이버 HelloWorld에서 일부 번역한 내용이 있어서 공부를 시작해 본다.


  - AOSA : http://www.aosabook.org/en/index.html

  - Naver 번역 :  http://helloworld.naver.com/helloworld/206816


스터디 모임에서 AOSA의 아키텍쳐 번역과 분석을 해보아야 겠다. TA(Technical Architecture) 설계능력 강화를 위하여 전체적인 조망아래 WAS 및 Open Source Solution 에 대한 접근을 Cloud에 구축/테스트해 보자. 



예전 Queue, NIO에 대한 간단한 개념 정립을 위해서 공부했던 Jenkov의 사이트를 다시 방문했다. Java API들에 대한 기본 개념정리가 잘 되어 있다.


  - http://tutorials.jenkov.com


posted by 윤영식
2012. 11. 19. 15:34 Lean Agile Culture/Lean Startup

스토리는 개인, 기업(조직), 소프트웨어, 서비스 모두에 필요한 초기단계의 전략과도 같다. 스토리가 없으면 재미가 없다. 앙꼬없는 찐빵을 무슨 맛으로 먹으랴. 소프트웨어쪽으로 눈을 돌리면 처음 이 제품을 만들게 된 동기가 있어야 한다. 동기를 유발한 사건이 있고 그 사건의 해결방안을 소프트웨어적으로 아니면 컨버전스적으로 해결 할 수 있는 생각의 흐름 또는 프레임을 가지고 있다면 좋은 아이디어가 나오지 않을까?


오늘 읽은 조성문님의 "스토리가 중요한 이유"를 읽고 많은 것을 생각하게 되었고, 생각을 스토리로 만들어 표현하는 훈련이 필요함을 느낀다.




posted by 윤영식
2012. 11. 16. 14:32 Lean Agile Culture/Architecturing

그동안 간간히 트윗되는 서비스 기업들의 아키텍쳐를 살펴보면서 향후 비슷한 서비스를 할 때 어떤 요소 기술들이 필요할까 생각해 보았다.


  - Netflix 온라인 VOD 서비스 Netflix의 AWS로 옮겨가기 까지의 아키텍쳐 변화 (Java 기반)

  - Evernote 자바 기반 아키텍쳐링 (Hibernate를 사용했다는 것이 흥미롭다, 참조)

  - Instagram SytleShare와 비슷한 구조인듯 하다 그리고 좀 더 세심한 아키텍쳐링  (Python 기반)

  - StyleShare AWS에서 어떤 서비스를 사용하는지 설명 (Python  기반)

  - Etc Search :  http://highscalability.com


향후 만들어갈 Mobile Service에 대해 Netflix 모델과 더불어 기업문화까지 본받을 필요가 있겠다. 자신의 성숙한 기술을 OSS로 공개하고 공유하는 정신을 높게 사고 싶다.




 모바일 컨버젼스 서비스를 만들기 위하여 어떤 단계를 거쳐가야 하는지 생각해 본다. 

  - Big Picture : 서버(미들웨어) 아키텍쳐를 서비스의 요구조건에 맞게 고려한다

  - Framework Picture : 어플리케이션 레벨의 구현에 필요한 Framework들을 고려한다 

  - Project Picture : 프로젝트를 어떻게 진행할 것인지 고려한다.


<Big Picture>
조대협님의 블로그에 소개된 대용량 시스템의 레퍼런스 아키텍쳐와 Netflix의 사례를 고려하여 각 단계의 필요 미들웨어와 배치등을 어떻게 할 것인지 생각해 보자

  - 클라우드 서비스 이용하기 : AWS Pacific zone 이용하기 (각 서비스에 대한 이해와 사용경험을 가져야 한다)

  - 미들웨어 선정 : 현재는 Virgo 위에 Tomcat + SpringDM 사용 예상 (OSGi Bundle 이용)

  - 메모리 캐싱 : Redis를 고려해 보고 있다. 역시 설치와 테스트가 필요하고 어느 부분에 쓰일지도 검토해야 한다)

  - 프레임워크 : 

    + 통신용 프레임워크는 Vert.x 를 Bundle로 올려서 NIO 처리 (apache 대체로 생각하지만 각 필요한 요구조건에 대한 테스트가 필요하다)

    + 도메인 업무처리용 프레임워크는 Spring Roo를 통해 빠르게 개발을 진행하고 싶다 


  - 데이터베이스 : RDBMS를 고려한다면 MySQL, NoSQL을 본다면 Cassandra와 MongoDB를 사용하려 한다. 

  - 상호 연결 : Apache Trift를 통하여 서로 틀린 부분에 대한 Communication을 해소하려 한다 (ESB와 비슷하게 이용 가능할까?)

  - 클라이언트 Push : Vert.x의 Socket.io를 이용한다

  - 모니터링 : Netflix의 오픈소스를 이용하거나 필요시 별도로 만든다

  - 개발, 테스트, 배포 : 운영서버와 유사한 AWS 클라우드 기반으로 가져가며 AMI(Amazone Machine Image)를 이용하여 만들고, 개발, 테스트, 배포 각각 별개의 인스턴스를 가져간다

    + 개발 : 운영과 동일 환경구성

    + 테스트 : JUnit 단위 테스트는 개발단계에서 수행하고, FitNeese 통하여 인수테스트 수행등 종합적인 테스트 방안을 마련한다


<Framework Picture>
모바일 컨버전스 서비스 성격에 맞는 프레임워크를 선택하는 것이 관건으로 보인다

  - UI Layer : 하이브리드 웹앱으로 가고, 성능향상이 필요한 부분이 있다면 고객 확보시점에 따라 네이티브로 간다. Rapid Development를 위하여 선택

  - UI Framework : Sencha Touch, JQuery Mobile, PhoneGap등을 사용, PC 버전은 Sencha의 ExtJS를 사용한다. Unit Test와 개발환경때문에 GWT를 고려해 보았으나, 기초장벽을 어느 정도 해소하면 ExtJS로 하는 것이 좋겠다는 판단임 (요즘 열심히 JavaScript 파고 있다)

  - Server Framework : Vert.x, Spring, Spring roo 등을 사용할 예정

  - Test Framework : JUnit, FitNeese

  - Deploy : Maven 또는 Gradle 고려중, Jenkins + HuBot (GTalk 통하여 deploy 명령) 사용

  - Open API 지향 설계 : Restful 서비스 



<Project Picture>
프로젝트는 Agile의 Scrum 방식으로 진행을 하면 이를 위하여 다음과 같은 협업도구를 사용한다

  

- Issue, Wiki 는 Atlassian의 Jira와 Confluence를 SaaS로 이용

  - Scrum 방식 개발위해 Atlassian GreenHopper 이용

  - 소스서버는 DVC로 GitHub private 신청하여 이용

  - 오프라인 정기 모임

  - 온라인 협업 도구 최대하 활용 : Atlassian 제품, Podio, CaCao Agit, GMail 등


그 동안 살펴본 기능들을 잘 엮어서 프로토타입 모바일 컨버전스 서비스를 내년 초까지 만들어 볼 계획이다.



posted by 윤영식
2012. 11. 15. 18:10 Middleware, Cloud/Cloud

그동안 브라우져에서 코딩하기 위하여 사용해본 툴들중에 Cloud9IDE가 가장 최적이지 않을까 생각된다. 그 동안 웹에서 코딩할려고 시도해본 IDE를 열거해 본다. 



GitHub 이나 Bitbucket에 올린 소스를 clone하여 개발할 수 있고, Node.js에서 돌릴 수 있는 개발 IDE와 PaaS를 제공하는 Cloud9IDE를 앞으로 사용해 보자.


posted by 윤영식
2012. 11. 15. 16:35 Middleware, Cloud/Cloud

 

AWS의 우분투위에 Vert.x를 사용해 보려고 한다. Vert.x는 기본 JDK 1.7 를 사용한다

 

  - Oracle JDK1.7 설치하기 : root 계정 또는 sudo를 수행하여 설치한다

  

1. apt-get 보완 하기

prompt> sudo add-apt-repository ppa:webupd8team/java 

prompt> sudo apt-get update


2. jdk 1.7 설치

prompt> apt-get install oracle-jdk7-installer 

prompt> java –version 

java version "1.7.0_09" 
Java(TM) SE Runtime Environment (build 1.7.0_09-b05)
Java HotSpot(TM) 64-Bit Server VM (build 23.5-b02, mixed mode)

'Middleware, Cloud > Cloud' 카테고리의 다른 글

Cloud9IDE 사용하기  (0) 2012.11.15
[CloudFoundry] 개발한 Node.js 프로그램 배포하기  (0) 2012.11.03
posted by 윤영식
2012. 11. 15. 15:05 Middleware, Cloud/OSGi

5주간의 주말 강좌를 통하여 OSGi의 개념을 정리해 보고, 어떤 것이 나의 목적에 가장 잘 부합되는지 고민해 보았다.

  - Felix : OSGi의 커널은 잘 동작하지만 HTTP Server 등의 사용하고자 하는 기능에 대해서는 sub project에서 bundle을 설치해 주어야 했다.

  - Virgo : SpringSource의 dm Server를 Eclipse 재단에 기부하고 OSGi kernel과 HTTP Server(Tomcat or Jetty 선택가능), war 파일 배포, Spring framework 등이 내장된 POJO를 위한  Enterprise Application Server

 

Virgo를 찾았을 때의 흥분이란.. 이제 서버에서 만들 기능들을 서비스 개념의 번들로 나누어서 Virgo OSGi Server의 Bundle로 등록할 수가 있게 된다.

  - 서비스별로 버전관리가 가능하고

  - 모듈 프로그래밍이 되고

  - POJO 기반의 Spring DM을 적용할 수 있고

  - 서비스의 Life Cycle을 관리한다

Ecliipse의 Plugin이 Equinox  OSGi bundle인 것을 생각하다면 이제 패키지 솔루션의 서버 Layer의 서비스 단들을 번들로 관리하면서 외부적으로는 Plugins 형태로 유지보수할 수 있게되는 것이다.

  

<오늘 읽은 기사>

  - Vert.x를 OSGi에 올리기 : Vert.x 번들 만들기와 Spring DM 기증으로 나온 blueprint 적용법까지 자세히 설명하고 있다


'Middleware, Cloud > OSGi' 카테고리의 다른 글

[OSGi] Bundle 정의내리기  (0) 2012.11.22
[SpringDM] Dynamic Module 만들기  (0) 2012.11.10
[Eclipse Virgo] 사용하기  (0) 2012.11.03
[OSGi] 서비스 Layer 만들기  (0) 2012.10.30
[OSGi] BundleContext에 의한 LifeCycle 관리  (0) 2012.10.30
posted by 윤영식
2012. 11. 14. 21:44 MongoDB

AWS의 ubuntu 시스템에 MongoDB를 설치하여 사용해 보자. 



<설치하기>
  • root권한 얻기 : sudo su
  • /etc/apt 디렉토리에 대한 권한이 있어야 하기 명령이 제대로 수행된다 
prompt> sudo apt-key adv --keyserver keyserver.ubuntu.com --recv 7F0CEB10
prompt> echo "deb http://downloads-distro.mongodb.org/repo/ubuntu-upstart dist 10gen" | tee -a /etc/apt/sources.list.d/10gen.list
prompt> sudo apt-get -y update


  • mongoDB를 설치해 보자 
sudo apt-get -y install mongodb-10gen


  • MongoDB config File 위치
/etc/mongodb.conf 


  • MongoDB script File 위치 : log, data file 디렉토리 생성
/etc/init/mongodb.conf


  • Data Files과 Log 디렉토리 위치
data files : /var/lib/mongodb 
log files   :  /var/log/mongodb


  • MongoDB 시작하기
시작 : sudo service mongodb start
종료 : sudo service mongodb stop
재시작 : sudo service mongodb restart

CLI 접속 : mongo



* 만일 CLI 접속에서 에러가 발생하면 AWS의 Security Groups에서 mongodb 속한 Instance 의 security에서 27017 tcp port를 적용해 주면 된다.


* 사용하기 초간단 예 : 명령어 - mongo


'MongoDB' 카테고리의 다른 글

[MongoDB] Node.js에서 mongoose 통하여 MongoDB 접속하기  (0) 2013.01.05
posted by 윤영식
2012. 11. 14. 16:55 Git, GitHub

AWS에 Ubuntu 12버전 이미지를 설치하고 개발환경 구성을 하고 있다. 개발소스의 버전관리는 Git을 사용할 것이고, Git 설치하는 과정을 정리한다

 

<Ubuntu 설치하기>

  • ci 계정을 하나 만든다 : prompt> useradd ci
  • sudo 권한이 없다면 : root 권한에서 prompt> sudo useradd –m ci –G admin
  • 기본 라이브러리들 설치 : prompt> sudo apt-get install expat curl zlib1g-dev libssl-dev openssl make
  • git을 설치 한다 (현재 1.7.9.5-1 버전) : prompt> sudo apt-get install git-core 
  • git 버전 확인 : prompt> git –version
  • binary 위치 : /usr/bin/git

 

<Git 환경설정>

ci@ip-10-146-81-140:~$ which git
/usr/bin/git
ci@ip-10-146-81-140:~/git_repositories$ git config --global user.name "dowon"
ci@ip-10-146-81-140:~/git_repositories$ git config --global user.email nulpulum@gmail.com
ci@ip-10-146-81-140:~/git_repositories$ git config --global --list
user.name=dowon
user.email=nulpulum@gmail.com

* gDoc Link

* 전체 설정 정보 : http://www.kernel.org/pub/software/scm/git/docs/git-config.html#_variables

'Git, GitHub' 카테고리의 다른 글

[Git] commit 사용하기  (0) 2012.11.26
[Git] diff 사용하기  (0) 2012.11.22
[Git] Branch 전략  (1) 2012.11.14
SVN에 대하여 이해하기  (0) 2012.09.20
[Git] 레퍼런스 모음  (0) 2012.09.10
posted by 윤영식
2012. 11. 14. 08:50 Git, GitHub

Git을 가장 효율적으로 사용할 수 있는 방법에 대하여 번역해 놓은 글을 읽었다. 가장 합리적이면서 다양한 경우의 수에 대비한 적용 방식이  아닐까 하는 생각이 든다

원문 : Git Branch 전략

  • origin/master <-> origin/develop 영원히 가져가는 핵심 브랜치
    • master –>(create) develop –>(merge) master
    • 이름 : develop-*, master-*
    • master : production ready 코드
    • develop : integration 코드 (통합) – daily CI build
    • master 로 merge 할 때 배포 버전 태그 달음 : master commit 시 자동 빌드 수행
    • develop –> master로 가기 전 release 브랜치를 반드시 거친다
  • feature / release / hotfix 보조 브랜치
    • feature 브랜치
      • 조만간 배포할 기능을 개발 (배포할 수도 안 할 수도 있는 기능)
      • 이름 : feature-*
      • develop –>(create) feature –>(merge) develop
      • 맘에 안드는 기능이면 delete 한다.
      • feature는 개발자 저장소에 commit 하고,  origin에 push하지 않는다
    • release 브랜치
      • 제품 배포를 준비하는 브랜치
      • 이름 : release-*
      • 버전 번호를 부여함
      • develop->(create) release –>(merge) develop, master
      • 발견된 버그가 있다면  release에서 해결하고 develop에 merge
      • 진짜 배포할 상태가 되었을 때 master로 merge 하고 tag를 단다 (명령어들은 원문 참조)
    • hotfix 브랜치
      • 이미 배포한 운영버전에 문제를 해결하기 위해 만듦
      • 이름 : hotfix-*
      • master –> (create) hotfix –> (merge) develop, master
      • 치명적 버그의 발견 즉시 해결하기 위해 master 브랜치의 tag에서 create 한다

 

각 브랜치 정책에 따라 개발을 해보자 

'Git, GitHub' 카테고리의 다른 글

[Git] commit 사용하기  (0) 2012.11.26
[Git] diff 사용하기  (0) 2012.11.22
[Git] Ubuntu 에 설치하기  (0) 2012.11.14
SVN에 대하여 이해하기  (0) 2012.09.20
[Git] 레퍼런스 모음  (0) 2012.09.10
posted by 윤영식
2012. 11. 12. 16:26 Languages/JavaScript

JavaScript를 하면서 어려웠던 새로운 개념이 Closure이다. 이참에 조금 정리해 보도록 하자 


▶ Closure 개념

  - 로컬 변수를 참조하고 있는 함수 내의 함수 (JavaScript 마스터북, Jpub출판, p180)

  - 즉, 클로저는 자신의 범위(Scope) 밖에 있는 변수들에 접근할 수 있는 함수를 의미한다 

  - inner function을 return 할때 closure가 된다 (원문)

function outerFn() {

var count=1;

return function (cnt) {

      count += cnt;

console.log(count);

}

}


var func = outerFn();

func(10); // 결과 값 11

func(10); // 결과 값 21

  1) func가 closure가 됨 : 내부 변수들 closure, private 변수 생성됨

  2) func(parameter) 호출해 줘도 내부 변수들은 다시 생성되는 것이 아니라 상태를 유지시켜서 참조 됨 

  3) 즉, 클로저가 만들어 지면서 내부 변수들은 별도로 유지되면서 상태값을 유지함

  4) 클로저의 참조를 제거하고 GC할려면 명시적으로 func=null; 함



다른 예제를 보자 
예) closure가 아님 
function foo(x) {
  var tmp = 3;
  function bar(y) {
    console.log(x + y + (++tmp));
  }
  bar(10);
}
foo(2); // 결과 값 16
foo(2); // 결과 값 16
foo(2); // 결과 값 16

예) closure 임
function foo(x) {
  var tmp = 3;
  return function (y) {
    console.log(x + y + (++tmp));
  }
}
var bar = foo(2); // bar is now a closure.
bar(10); // 결과 값 16
bar(10); // 결과 값 17
bar(10); // 결과 값 18

var bar2 = foo(2);
bar2(10); // 결과 값 16
bar2(10); // 결과 값 17

  - 로컬 변수를 계속 생성하지 않고 상태를 유지하면 사용할 수 있다 (마치 객체처럼 var bar2 = foo(2); 하면 또 다른 closure가 생성되면서 bar와 별도의 상태공유 변수 x와 tmp가 생성된다. 마치 클래스에서 객체생성하는 것 처럼 된다. closure 생성시에 arguement와 var로 선언된 variable 에 대한 참조가 가능해 진다. 결국 참조자들-x, tmp-가 일정 메모리에 저장되어 상태를 유지한다)


  - 위의 예에서 var bar = foo(2);를 하는 순간 foo function 객체의 x, tmp 변수의 레퍼런스를 closure 가 가진다 (즉, x, tmp 에 대한 변수 상태값이 유지되고, y 값은 bar(10)을 호출할 때 넘겨주는 값이 된다)


  - 클로저는 간단한 객체이다 (엄밀히 따져서 객체는 아니지만 객체식으로 치환해서 살펴보면 다음과 같다)

    + 클로저 : 객체 = 클로저를 감싸고 있는 부모 함수 foo : 생성자

    + 클로저 : 객체 = 클로저로 부터 참조되는 로컬 변수 tmp :  프로퍼티

    + 클로저 : 객체 = 클로저 자신 bar, bar2 : 메소드

    + 클로저 : 객체 = var bar = foo(2) 함수 호출 : 인스턴스화

    + 클로저 : 객체 = 클로저를 대입하는 변수 bar(10), bar2(10) : 인스턴스 <-- 요거 애매함


  - function 내부에 for문을 돌면서 function을 호출하여 callback 을 셋팅하는 오류 제거 (원문1, 원문2)


실제 사용해 보면서 좀 더 이해를 해나가야 겠다. JavaScript Master북의 글이 좀 더 쉽게 이해가 가니, 햇갈릴 때 책을 다시 정독해 보자. 


<참조>

  - 소스니 코브 : Closure 이해하기

  - Closure 정리 : 한글이라 이해하기 쉬울것임

  - Inside.JS : 한글 정리 예제 포함

posted by 윤영식
2012. 11. 12. 11:34 Languages/JavaScript

자바스크립트의 Function에는 Expression (FE) 과 Declaration (FD) 가 있다고 한다. 이에 대한 차이를 연구해 보자. 우선 존경해 맞이하는 소스니코브의 정리 내역과 구글링한 사이트를 읽고 정리한다 



▶ Function Declaration


  - 변수 할당 없는 이름있는 함수를 정의

  - "var"로 시작하지 않고 "function"으로 시작해야 한다(must)

- 명확한 이름을 가져야 한다
- 소스코드중에 오고 function body를 가지면 다른 function 안에도 위치한다
- entering the context stage에서 생성된다 (즉, function 안에 FD 존재않음)
- variable object(VO)에 영향을 준다 
function bar() {
return 3;

}


or


// 1) directly int the global context

function globalFD() {

// inside the body of another function

function innerFD() {}

}




▶ Function Expression


  - 변수 할당이 있는 표현식으로서 함수를 정의

  - 이름있는 또는 익명(anonymous) 함수 가능

  - FE는 "function"으로 시작하지 않아야 한다(must)

- 소스중에 expression position에 정의된다 
- 함수명은 optional 이다 
- variable object(VO)에 저장되지 않는다 
- code execution stage에서 생성된다 
// anonymous function expression
var a = function() {
return 3;
}

// named function expression
var a = function bar() {
return 3;
}

//self invoking function expression or immediately invoked function expression (IIFE, 즉시실행함수)
(function sayHello() {
alert("dowon hi");
})();

// in parentheses (grouping operator) can be only an expression
(function foo() {});

// in the array initialiser - also only expressions
[function bar() {}];

// comma also operators with expressions
1, function baz() {};


// FE is not available neither before the defintion

// because it is created at code execution phase.

alert(foo); // foo is not defined

(function foo() {});

// nor after, because it is not in the VO

alert(foo); // foo is not defined


// parentheses로 grouping 하기 

(function {}) ();

(function {}());


* Name Fuction Expression (NFE)

  - 재귀 호출을 위해 이름으로 자기자신을 호출할 수 있다 (이때 함수를 Variable Object에 저장할 필요가 있을까? 없다!)

  - 부모 context에서 생성할까? 노우!

  - FE로 하면 VO에 영향을 미치지 않는다 

(function foo(bar) {
if(bar) {
return;
}
foo(true); //foo name is available
})();

// but from the outside, correctly, is not  
// 즉, foo는 부모 scope에 없고 function의 [[Scope]]안에 specialObject에 저장한다 (하기 설명 참조)
foo(); // foo is not defined


위 소스 해석 (원문)

  - Interpreter가 code execution stage에서 FE를 만나면 FE를 생성하기 전에 special object를 만들고 현재 scope chain 앞에 놓는다 

  - FE 자신을 생성하고, 자신의 scope 프로퍼티에 scope chain 을 한다 (referencing)

  - special object에 unique 프로퍼티로 FE를 추가한다

  - 마지막에 parent scope chain으로 부터 special object를 제거 한다 

specialObject = {};

Scope = specialObject + Scope;

foo = new FunctionExpression;
foo.__scope__ = Scope;  // or foo.[[Scope]] = Scope;
specialObject.foo = foo; // [DontDelete], {ReadOnly}

delete Scope[0]; // remove specialObject from the front of scope chain



* FE의 특징

  - Variable Object (VO)에 속하지 않다 (스크립트 수행시 Execution Context-EC- 에 한 부분 = VO)

  - 따라서 FE는 Hoist안되고 FD만 Hoist 된다 (원문)

  - 그리고 FE는 자신의 내부 Scope에만 의미가 있지 외부(Outside)에는 의미가 전혀 없다 

  - VO = Function Declaration + Variable Declaration(var) + Arguments 들이 속한다 (FD가 최우선 순위 -> VD 순서로 Hoist됨)

  - FE로 하면 VO를 오염시키지 않기에 사용이 늘어나고 있다

예1)

bar(); // hoist 되어 정상 처리됨 

foo(); // error 발생 


function bar() { .... } // FD 

var foo = function() { .... }; // FE


예2)

var myFunction = function sameFunction() {

return myFunction === sameFunction; // true

};

console.log(myFunction()); // true 

console.log(sameFunction());  // [ReferenceError: contents is not defined] 에러 발생 



* FE에 사용하는 Grouping Operator 와 Immediately Invoked Fuction Expression (IIFE) 특징 

  - Grouping Operator인 () 은 variable과 function을 global scope와 격리된 private scope로 만드는 방법을 제공한다

  - IIFE는 jQuery, Underscore, Prototype, Dojo 등에서 global  scope을 깔끔하게 유지키 위해 private scope로 캡슐화, 모듈화에 중요하게 사용된다

  - 하기 예제는 외부세계로 부터 숨겨진 코드를 정의할 수 있고, private scope에서 동작하는 library variable을 만드는 것이다.

var Box = (function () {
    var contents = [];
    return {
        insert: function (thing) {
            contents.push(thing);
            return this;
        },
        count: function () {
            return contents.length;
        }
    };
})();

console.log(Box.insert('abc').insert(123).insert({
    width: 640, height: 360
}).insert(function () {
    return 'Hello!';
}).count()); // 4 를 출력

// This throws a ReferenceError since the JavaScript engine can't
// resolve the `contents` identifier.
// [ReferenceError: contents is not defined] 를 출력 
try {
    console.log(contents);  
} catch(err) { 
    console.log(err); 


  - IIFE는 function 호출처럼 arguements를 받고, 실행시간에 in-scope에 있는 모든 데이터에 대한 access가 가능한 Closure를 반환할 수 있다 (variable 상태 저장 가능)

var d, Saved, testSubject, i, l, x;

// Capture a start time.
d = new Date().getTime();

// `Saved` exposes a single API method `get` which returns that
// start time: the variable `d` is supplied as the argument
// identified within the function definition as `start`.
// 최기의  시작시간값을 저장하고 있다 
Saved = (function (start) {
    return {
        get: function () {
            return start;
        }
    };
})(d);

testSubject = {
    level1: {
        level2: {
            level3: {
                level4: {
                    val: 'value'
                }
            }
        }
    }
};

for (i = 0, l = 1000000; i < l; i++) {
    x = testSubject.level1.level2.level3.level4.val;
}

// Capture the time after diving five levels into the `testSubject`
// object literal one million times.
// 현재 시간을 구한다 
d = new Date().getTime();

// Output the current value of `d`.
// 현재 시간이 찍힘 
console.log(d); 

// Output the original value of `d`.
// 초기 IIFE의 시간이 찍힘
console.log(Saved.get());

// Output the difference which indicates how many seconds it took
// to do that object crawl.
console.log(d - Saved.get());

//------ 결과 
1352699019341 // d 현재 시간 
1352699019322 // Saved.get() IIFE 시간 
19  // 차이 값 



<참조>

  - javascript 블로그 : 간단하고 명확하게 정의내림 (표현형식만 설명)

  - 소스니 코브 : 너무 심도 있게 설명해서 집중하지 않으면 놓치기 쉬움 (왜 구별해서 사용하는지 설명)

  - 예제로 보는 javascript : Function Expression을 사용하는 이유를 가장 잘 설명함

'Languages > JavaScript' 카테고리의 다른 글

[JavaScript 성능향상] 웹사이트 최적화 방법  (0) 2012.12.12
[JavaScript] Template Engine  (0) 2012.11.26
[JavaScript] Closure 알아가기  (0) 2012.11.12
[JavaScript] Core 요약  (0) 2012.10.12
[JavaScript] Design Pattern  (0) 2012.09.10
posted by 윤영식
2012. 11. 10. 20:19 Middleware, Cloud/OSGi

위키북스의 OSGi & Spring DM을 읽으면서 Spring DM쪽의 내용을 요약해 본다 



▶ 동영상 자료

  - IBM DeveloperWorks : 안영회/이일민 개념 및 개발하기 (맨 하단의 Next 클릭해서 봄)



▶ 간단 요약 (Ch. 11)

  - 서비스 레지스트리를 사용하는 OSGi의 서비스 룩업 메커니즘을 스프링에서 제공하는 의존성 주입 형태로 사용할 수 있게 해준다. (그림 참조)

  - SpringDM은 OSGi상에서 Extender 개념을 이용하여 POJO(Plain Old Java Object) 형태의 일반 스프링 빈을 OSGi번들로 동적으로 바꾸는 작업을 지원한다 (Extender : 동적으로 설치되는 번들/서비스의 설치/삭제 시 이벤트를 받아서 특정 동작을 수행함)

    + SpringDM OSGi Extender : META-INF/spring/*.xml 파일을 읽어서 스피링 빈으로 초기화 한다

    + SpringDM Web Extender : war 확장자 배포하거나 WEB-INF 폴더를 가지고 있으면 웹컨테이너에 등록시킴 


  - POJO A가 BundleActivator -> BundleContext로 Service Registry에 Service A등록이 되고 ServiceTracker -> BundleActivator를 통해 Service A를 찾아 POJO B가 사용한다 (참조)

  - OSGi 번들은 BundleActivator, ServiceTracker Interface에 의존하나 SpringDM은 spring.xml 과 POJO 만을 필요로 한다 

    + POJO기반으로 번들을 만들어 테스트가 용이하다

    + 번들, 라이프사이클, 버젼닝, 동적 추가/수정/삭제 등의 기능을 엔터프라이즈급 애플리케이션을 개발할 때 사용할 수 있게 됨


  - SpringDM 개발 = Eclipse STS(Spring Tool Suite) + Maven Plugin(v 3.0.4) 설치

  - Eclipse에 Target Platform을 설정한다 (T.P = 번들을 개발하고 실행하는 환경을 의미함. 사용자 Target Platform 만들기 참조)

  - OSGi로 관련 Bundle을 별도의 Plug-In Project로 만들다 보면 Working set으로 묶어서 관리하고 싶어진다. 이를 위한 설정은    WhiteShip 브로깅을 참조한다

  - SpringDM은 Spring Application Context : Bundle = 1:1 관계이다 



▶ Eclipse에서 SpringDM 간단히 만들고 등록하기 

1. Plug-in Project를 생성한다 (이클립스 플러그인 프로젝트는 기본적으로 이클립스 Equinox OSGi를 이용한다)


2. 적절한 이름을 입력하고 하단 Options에서 Activator를 상속받지 않은 POJO로 개발을 할 것이다 


3. 생성하면 자동으로 MANIFEST.MF 파일이 생성된다


4. META-INF/spring.xml 파일을 생성한다 


5. spring.xml 스프링 프레임워크 빈등록 환경설정 이전에 프로젝트를 선택하고 Spring Tools에서 "Add Spring Project Nature"를 선택한다 


6. 프로젝트 폴더 우측 상단에 S 자가 표현된다


7. spring 폴더에 "Spring Bean Configuration File"을 생성한다 


8. 명칭은 spring.xml 로 생성한다


9. spring.xml에 osgi 관련 xsd 내역이 없으니 코딩하고, 인식하고자 하는 bean을 등록한다 


10. Run Configuration... 에서 해당 프로젝트의 실행 환경을 새로 생성한다 


11. Bundle로 HelloSpringDM을 선택한다 (Target Platform을 적절히 선택해 주어야 한다. 여기선 오류가 있다. Spring이 선택되어야 한다)



12. Active한 bundle을 확인하고 HelloSpringDM의 RESOLVED 상태를 start 시켜주어 Active 상태로 만든다 

posted by 윤영식
2012. 11. 9. 16:23 Testing, TDD/Tools, FitNesse

간단하게 특정 URL에 대한 성능 측정을 Command Line에서 수행하고 결과를 얻을 수 있는 툴로 Apache Benchmark가 있다. 손쉽게 사용해 보자


  • 테스트 url의 결과값을 확인해 보자 : curl <URL> 
  • 성능을 측정해 보자 : ab <Options> <URL>


* 참조 : ab 사용법




posted by 윤영식
2012. 11. 3. 18:19 Middleware, Cloud/Cloud

Node.js로 개발한 간단한 애플리케이션을 CloudFoundry로 배포해 보자. 현재 클파(CloudFoundry)는 무료이지만 조만간 유료로 가지 않을까 생각된다. 특징을 보자 


▶ 클파 설치하기

  - 우선  http://www.cloudfoundry.com/  으로 가서 Sign Up 한다 (신청한 메일계정으로 비밀번호가 온다)

  - http://www.rubyinstaller.org/ 사이트로 가서 ruby를 설치한다. (설치시 path 설정여부에 check를 한다. ruby의 gem을 사용하기 위함으로 node.js의 npm와 같은 package 설치 관리자로 보면 된다)


  - d:>gem install vmc  (클파 관리 유틸 vmc를 설치 한다. 한참을 설치하니 그냥 기다리자)

  - vmc의 target을 클파로 지정을 한다 (api.cloudfoundry.com) 그런후 신청한 계정으로 로그인을 한다


  - 하단에 첨부된 파일 적절한 위치에 푼다음 해당 디렉토리로 이동한다

  - 클파에 애플리케이션을 Push 한다 (vmc push <URL해드> 예) vmc push nulpulum 으로 하면 웹 호출 주소가 http://nulpulum.cloudfoundry.com 이 된다. 자세한 사항은 vmc help 로 살펴보자. 최초에는 사용하려는 service에 대하여 물어본다 이때 mongoDB 1개만을 만든다.)



  - 배포된 애플리케이션의 정보를 보자

  - 브라우저에서 호출하여 보자 


  - 간단하게 자신의 애플리케이션을 배포하여 바로 확인해 볼 수가 있다. 등록가능한 애플리케이션에 대해 보려면 vmc services 명령으로 확인해 보면 된다. 


* 첨부파일 : Node.js + Express + MongoDB를 사용한 간단한 CRUD 애플리케이션 

cloudFoundry mongodb.zip



<참조>

  - Open Source Cloud PaaS

  - Spring쪽에서 만든거라 Spring Framework을 지원하고, Node.js등 최신 기술을 지원한다 

  - 클파 이해하기

  - 클파 VMC 사용

'Middleware, Cloud > Cloud' 카테고리의 다른 글

Cloud9IDE 사용하기  (0) 2012.11.15
Ubuntu 에 JDK 1.7 설치하기  (0) 2012.11.15
posted by 윤영식
2012. 11. 3. 12:11 Middleware, Cloud/OSGi

예전 프로젝트할 때 WAS를 재기동하지 않고 애플리케이션과 SQL을 관리툴을 통하여 reloading 하는 프레임워크를 만든적이 있다. 또는 솔루션에서 액션을 수행하는 어뎁터 Java 코드를 관리툴을 통하여 입력하면 WAS의 재기동없이 신규 및 업데이트가 가능하게 한적이 있다. 그때 마다 사용했던 것이 ClassLoader 이다. 


좀 더 발전적이게 Plugin처럼 만들고 싶다는 생각을 했지만 게으름으로 미루다 OSGi에 관심을 갖게 되었다. 솔루션을 만들때 통신, 데이터 관리, 어드민 관리, 서비스등을 별도의 버전으로 관리하고 싶었다. OSGi 이면서 J2EE와 같은 Enterprise급 또는 솔루션 개발을 진행할 수 없을까 고민하던 중 찾은 Eclipse Virgo!  


  - 이일민씨의 기고글 : Virg 들어가기

  - Ted Won씨의 블로그 : Virgo 이해

  - 공식 Virgo Wiki


딱 내가 찾던 미들웨어 기능을 고스란히 가지고 있는 Eclipse Virgo를 사용해 보자 

Virgo는 두가지 종류의 버전을 제공한다 


  - Virgo Kernel : Runtime Platform for OSGi based java applications

  - Virgo Web Server : Virgo Kernel + Tomcat Server, OSGi based Web Application 배포 가능 



▶ Virgo 설치 


  1) 다운로드 :  http://www.eclipse.org/virgo/download/ (현재 v3.5.0)

  2) Virgo Server for Apache Tomcat 으로 시작해 보자

  3) bin/startup.bat 를 수행하면 OSGi bundle를 로딩하고 tomcat이 시작된다

  4) 웹 admin console을 들어가 보자 (http://localhost:8080,  id: admin pwd: springsource)

  5) 상단의 메뉴를 클릭하면 반영된 bundle내용 및 기타 상태정보와 deploy등을 수행할 수 있다

  6) Virgo에서 제공하는 모니터링 툴을 실행해 보자 (<Virgo_Home>/bin/jconsole.bat 실행)

  7) jconsole 로그인 (admin / springsource)

  8) JVM에 대한 기본적인 모니터링 항목(memory, thread info, loaded classes, tomcat JMX info) 등을 다양하게 모니터링 할 수 있다 

[Overview] 탭에서 Memory, CPU, Thread수, 로딩된 Class수 등을 볼 수 있다. 



[Threads] 탭에서 각 스레드의 정보를 볼 수 있다. 하단 왼쪽의 스레드를 클릭하면 하단 오른쪽에 정보가 나온다. 


[MBeans]탭에서 Tomcat의 JMX 뿐만 아니라 Virgo 관련 JMX 정보도 볼 수 있다 


  9) Virgo가 사용하는 기본 Library Path(repository/ext)와 유저 Library Path (repository/usr). 기본 OSGi Bundling만 인식한다 

  10) Log는 configuration/serviceability.xml 안에 설정을 하면 serviceability 디렉토리에 로그가 쌓인다 (logback 사용)

  11) OSGi telnet console을 사용하고 싶다면 configuration/osgi.console.properties 중 telnet.enabled=true 로 수정 그리고 Virgo를 재기동한다


  12) OSGi CLI 기반 연결 기본 port 는 2401 변경하고 싶다면 위의 properties파일에서 포트 번호를 변경하고 접속한다

  13) osgi> lb 명령을 수행하면 현재 번들의 상태를 알 수 있다

  14) 번들을 보면 OSGi Kernel, Apache Felix, Apache MINA등이 Active이고 Spring, SLF4J 등이 Resolved 상태이다


Virgo는 OSGi개념위에 J2EE 플랫폼기반 애플리케이션을 만들 수 있게 해준다. 


posted by 윤영식
2012. 10. 30. 21:52 NodeJS/Concept


Node.js를 위한 Web Framework으로 Express 를 사용한다. GitHub에도 상당한 순위에 올라와 있고, rail 방식과 유사하다. Connect 모듈을 기반으로 템플릿은 EJS와 Jade를 기반으로 하고 있다. 



▶ Express 설치하기  (http://expressjs.com/guide.html)

  • npm (Node Package Manager)을 이용하여 설치해 보자 (-g 옵션은 nodejs 설치 전체에 적용된다. -g 옵션을 안 주면 설치 디렉토리내애서만 영향을 미친다)

    설치가 완료되면 nodejs가 global 참조영역인 Application Data/npm/node_modules/express 라고 설치가 된다


  • express 명령으로 HelloExpress라고 만들어 보자. 그러면 기본적인 Web Application 골격이 생긴다. (WAS의 Context war 파일 생성되는 것으로 비유하면 되겠다. 예로
    > routes/*.js 파일은 web.xml의 url-mapping 설정과 유사하다
    > views/*.js 는 템플릿 엔진의 파일들이 위치한다 (ejs 또는 jade를 사용한다. ejs는 JSP 코딩과 유사하여 친숙하고, jade는 간결함이 좋다)
    > public/* 퍼블리싱 하는 static 파일들
    > app.js Express의 main 파일이다


  • HelloExpress 디렉토리로 이동하여 express가 의존관계에 있는 외부 modules를 설치한다


  • 설치가 완료된 후 node app 로 Express 프레임워크를 수행한다 (http server listening 이 포함되어 있음)



  • app.js 코드를 보자 

    > 외부모듈 express를 얻어와서 app변수에 정적 서버환경을 셋팅하고 있다.(default jade 템플릿 셋팅)
    > URL의 호출에 대한 맵핑을 담당하는 rounting 설정을 한다 
    > 맨 마지막줄에 http server 를 시작한다 

  • http://localhost:3000/dowon 이라는 url 셋팅을 해본다. 우선 app.js 에 routing 정보를 넣는다

  • HelloExpress/routes/user.js 안에 exports.dowon 을 추가한다 



  • HelloExpress/app.js 서버를 재시작 하고, 브라우져에서 호출한다.  



▶ Node를 위한 Jade Template 사용하여 표현하기

  • routing하기 위하여 user.js에 하드 코딩된 html 코드를 jade 템플릿으로 서비스하는 방법을 알아보자. 우선 views 디렉토리에 dowon.jade 파일을 만든다 (jade는 템플릿 엔진이다)



  • dowon.jade 템플릿 코딩을 한다 (자세한 사항은 http://jade-lang.com 사이트를 참조하자)

  • routes/index.js 안에 정보를 넣으면 app.js 안에서 routes.dowon으로 호출을 할 수 있다


  • routes/index.js 파일안에 설정한 index, dowon은 app.js 에서 routes.index 와 routes.dowon 으로 호출한다 


  • 재시작하고 브라우져에서 http://localhost:3000/dowon2 로 호출하면 jade 내역이 html로 변환되어 서비스 된다




    간단하게 Express Framework을 Node.js에 얻져서 사용하는 방법을 보았다. 사용하며 느낀것은 서비스를 위한 앞단의 url-mapping과 유사한 route 개념은 새롭게 개발할 필요없이 적용할 수 있어서 좋다. 그러나 domain 모델쪽의 개발과 persistence 영역의 개발에 대한 부분이 Express에 있는지 없다면 어떤 외부 module을 통하여 Express와 통합을 해야하는지  찾아 보아야 겠다. 

    * jade 설치 및 사용법 : http://blog.doortts.com/223


'NodeJS > Concept' 카테고리의 다른 글

[EJS] 사용하기  (0) 2012.12.15
[Node.js] Global Objects  (0) 2012.12.10
[Node.js] File I/O 사용하기  (0) 2012.12.10
[Node.js] EventEmitter 에 대하여  (0) 2012.12.10
[Node.js] debugger 사용하기  (0) 2012.12.10
posted by 윤영식
2012. 10. 30. 19:24 NodeJS/Modules



CoffeeScript는 Javascript 코드를 단축시키고 가독성을 높이며 {}와 ; 가 있는 코드로 부터 해방시켜준다. 실제 CoffeeScript 코드를 보았을 때 마치 영어 산문을 보는듯 했다. 만일 마틴파울러 아저씨가 이야기하는 Clean Code Style을 지향한다면 정말 영어 산문을 쓰는듯 코딩을 하면 된다. 


1) CoffeeScript 코드 짜고 JavaScript와 비교하기 

  - http://coffeescript.org/#top 로 들어가서 "TRY COFFESCRIPT" 상단 메뉴를 선택한다. 브라우저에서 coffeescript 코드를 치면 바로 javascript코드로 확인할 수 있다.


  - 그렇다면 이런 coffeescript 코드를 어떻게 배울 수 있을까? 구글에서 "smooth coffeescript"를 검색하고 interactive... 을 선택한다

  
HTML5 화면으로 웹상에서 CoffeeScript를 익히면서 학습을 할 수 있는 사이트이다. Edit 박스의 코드를 수정하면 하단의 결과값이 자동 변경되어 출력된다. 
CoffeeScript 디버깅툴이 내장된 상용툴을 사용해 보자 (http://www.jetbrains.com/webstorm/)


<국내 레퍼런스> 

  - coffeescript 개념부터 잘 정리된 사이트 : http://aroundck.tistory.com/958

posted by 윤영식
2012. 10. 30. 16:29 NodeJS

Node.js 를 배우기 위해서 Sublime Text 를 설치하고 Node를 설치하는 과정을 보자 



▶ Sublime Text에 Node 연동하기 

  • sublimet text를 설치하고 install package control을 설치했다면 ctrl+shift+p를 누르고 "install package" 입력후 Enter
  • 다음에 node라고 입력을 하면 node관련 패키지 3개가 나온다 각각 설치한다

  •  Node.js 엔진 설치를 위하여 http://nodejs.org/ 사이트 중앙에 있는 [Install]을 클릭하면 설치본이 다운로드 된다. 안내에 따라 설치를 하게되면 System Path에 자동으로 <NODE_HOME>/bin 디렉토리가 잡힌다
    기타 공식 설치 사이트 : https://github.com/joyent/node/wiki/Installation

  • node 문법으로 간단하게 java의 System.out.println과 같은 console.log를 타입핑후 hi.js 명칭으로 저장하고, ctrl + B 키를 누르면 Automatic Build가 된다. Tools -> Build System -> Automatic 이 체크되어 있다면 Syntax를 자동인지하여 Nodejs로 빌드하여 결과를 출력한다

TextMate만큼 막강한 Sublime Text를 통한 Node.js 개발 환경 구축이 완료되었다. 


* 참조 : Sumlime Text 2 설치 및 환경설정



▶ Nodejs 기본 파악하기 


> Nodejs 의 기본 명령 앞에 dot 를 붙인다. 



> 읽어 볼 만한 블로깅 글을 Link만 열거 한다. 

     Beginner Book : ManuelKiessling-NodeBeginnerBook.zip


posted by 윤영식