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

Publication

Category

Recent Post

2012. 10. 30. 15:25 Middleware, Cloud/OSGi

OSGi Layer에서 최상위에 있는 서비스 Layer는 번들이 서로 동적으로 협동하여 작업할 수 있도록 하는 방법을 제공한다. OSGi의 서비스는 SOA 처럼 구동된다 


  - Repository에 서비스를 Publish 한다

  - 클라이언트는 서비스를 Find 한다

  - 서비스가 찾아지면 클라이언트는 Repository와 Bind 된다


서비스의 사용 단계는 Publish -> Find -> Bind 되어 서비스 인터페이스를 통하여 수행된다 
 


▶ OSGi 서비스 등록 및 해지 

BundleContext를 통한 등록 API
public ServiceRegistration registerService(String clazz, Object Service, Dictionary properties);
public ServiceRegistration registerService(String[] clazz, Object Service, Dictionary properties);

인자값 의미

  - clazz : 해당 서비스 객체의 패키지명 + 인터페이스명, <Interface>.class.getName()  으로 얻어온다 

  - Service : 인터페이스 구현체, new 로 생성한다 

  - properties : 서비스 속성, SERVICE_VENDOR (같은 인터페이스 상속시 구분 명칭), SERVICE_RANKING (서비스 호출 우선순위)


서비스 해지
등록시 return 되는 ServiceRegistration 객체의 unregister()를 호출한다. 즉 BundleContext에는 등록된 서비스를 해지하는 API가 없고 return된 ServiceRegistration 객체를 통하여 해지한다



▶ OSGi 서비스 사용하기 

BundleContext를 통하여 서비스 찾는 API
public ServiceReference getServiceReference(String interfaceName); 
public Object getService(ServiceReference reference);

서비스 객체 얻는 순서 

  - BundleContext.getServiceReference(<interface>.class.getName())으로 호출하여 ServiceReference 객체를 얻는다

  - 다음 BundleContext.getService() 인자값으로 얻어도 ServiceReference 객체를 넘기면 실제 서비스 객체를 얻을 수 있다.


서비스 돌려주기
public void ungetService(ServiceReference reference);


* 동일한 인터페이스를 상속받은 서비스가 있고, 해당 인터페이스를 사용하는 클라이언트가 있다면 서비스 등록시 설정한 properties의 SERVICE_RANKING의 우선순위값에 따라 순서가 정해진다. 우선순위 RANKING이 동일 하다면 OSGi 에 등록된 번들 번호가 작은 것이 먼저 호출된다. 

* 클라이언트가 서비스 번들이 등록되었는지 찾기 위해서 Util 성격의 ServiceTracker를 사용하는 것이 좋다. 번들들은 동적으로 운영되므로 클라이언트가 호출하였어도 서비스가 등록되기 전일 수 있으므로 waiting하여 얻어오는 과정을 tracker에 위임한다 


* BundleContext API 참조 : http://kickjava.com/src/org/osgi/framework/BundleContext.java.htm


* 참조 샘플 : http://xguru.net/446

posted by 윤영식
2012. 10. 30. 14:20 Middleware, Cloud/OSGi

Bundle은 BundleContext에 의한 생명주기 관리가 이루어진다. 기본적으로 BundleContext 객체는 Bundle이 생성될 때 인자로 전달이 된다. 또한 OSGi 프레임워크와의 연결 통로이다. BundleContext는 OSGi Layer에서 LifeCycle Layer를 담당한다.



▶ BundleContext의 하는 일


  - OSGi에 새로운 번들 설치

  - OSGi에 설치된 다른 번들 리스트 및 정보 읽어오기

  - OSGi에 등록된 서비스 리스트 및 서비스 객체 가져오기

  - 서비스나 번들의 변경에 대한 이벤트 Listening  


결국 BundleContext가 번들에 대한 LifeCycle 관리 및 번들의 의존관계 설정에 따른 타 번들의 참조값을 BundleContext끼리 공유하여 가져온다


▶ Bundle의 LifeCycle

  1) OSGi 를 구동하여 shell 환경으로 들어가면 번들 jar 파일을 설치->시작->활성->정지->삭제등의 작업을 할 수 있다. 



  2) install file:c:/temp/testbundle.jar 파일 명령 : INSTALLED 상태가 된다
번들의 manifest 오류들을 점검 한다 

  3) resolve <bundle number> : RESOLVED 상태가 된다 
번들의 Export / Import를 연결해 주는 단계,  resolving 상태에서 문제가 발생하면 diag 명령을 내려서 원인을 찾는다

  4) start <bundle number> : STARTING->ACTIVE 상태가 된다
BundleActivator.start(BundleContext)가 호출된다. 문제 발생시 다시 RESOLVED 상태로 돌아 간다
start 안에는 많은 시간이 소요되는 작업을 해서는 안되고 있다면 별도의 스레드로 진행한다 

  5) stop <bundle number> : STOPPING->RESOLVED 상태가 된다
BundleActivator.stop(BundleContext)가 호출된다. stop()을 호출하면 만들어 놓은 스레드나 서비스를 종료 해지해야 한다. 따라서 stop 호출시 사용한 스레드, 서비스들을 종료하는 코드를 넣는다.   

  6) uninstall <bundle number> : RESOLVED-> UNINSTALLED 상태가 되고 ss(Equinox 기준) 또는 lb (felix 기준) 명령으로 보면 bundle 명칭이 나오지 않는다. 번들이 삭제된 것임 
번들이 완전 제거 되는 것임. OSGi 목록에서 나타나지 않는다 


LifeCycel의 상태 변이 흐름에 따라 명령어도 동일함을 알 수 있다.  OSGi 미들웨어의 재구동없이 번들을 만들고 적용시키는 것이 가능함을 알 수 있다.


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

[Eclipse Virgo] 사용하기  (0) 2012.11.03
[OSGi] 서비스 Layer 만들기  (0) 2012.10.30
[OSGi] manifest.mf 파일 설정  (0) 2012.10.30
[OSGi] Felix 설치 사용하기  (0) 2012.10.29
[OSGi] 이론-1  (0) 2012.10.27
posted by 윤영식
2012. 10. 30. 13:51 Middleware, Cloud/OSGi

OSGi 번들은 jar 파일로 패키징이 되고 안에 META-INF/manifest.mf 파일이 존재해야 한다. 해당 파일에는 번들의 명칭, 버전, 의존관계, 정책등이 기술된다. manifest.mf 파일 만들기는 OSGi Layer에서 Module Layer의 모듈 즉, 번들을 만들기 위한 중요 부분이다.


Name: Value 방식으로 서술이 된다. 

일반적인 기술 방법은 http://blog.naver.com/PostView.nhn?blogId=kittenjun&logNo=10126086035 사이트를 참조한다. 


중요하게 생각되는 항목은


  - BundleActivator를 상속받아 구현한 클래스 지정하는 Bundle-Activator

  - OSGi에 노출되는 외부명칭 Bundle-Name, 내부 키명칭 Bundle-SymbolicName

  - 번들 버전 Bundle-Version 

  - 외부 Bundle을 사용한다면 Import-Package


정도는 기본적으로 알아두어야 겠다

주의 : manifest.mf 파일 맨뒤에는 CR(Carriage Return)과 같이 Line Break 종료되어야 한다. 따라서 파일 맨 마지막에 빈 공백의 라인을 의무적으로 넣는다. 작성하고 Enter키 두번 누른다. 맨 마지막 줄에 빈 공백 라인이 없으면 Activator 인식 오류가 발생할 수도 있다. 


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

[Eclipse Virgo] 사용하기  (0) 2012.11.03
[OSGi] 서비스 Layer 만들기  (0) 2012.10.30
[OSGi] BundleContext에 의한 LifeCycle 관리  (0) 2012.10.30
[OSGi] Felix 설치 사용하기  (0) 2012.10.29
[OSGi] 이론-1  (0) 2012.10.27
posted by 윤영식
2012. 10. 30. 11:46 Dev Environment/Sublime Text

Node.js 교육시간 처음에 설치한 것이 Sublime text 2이다. Eclipse 기반은 아무래도 무겁고, 그와 준하는 개발환경을 가지고 JavaScript 서버사이드 개발을 하고 싶을 경우 Sublime text 2를 설치한다. 설치후 패키지 설치 및 환경 설정을 보도록 하자 



1. Sublime Text 2 설치하기 


http://www.sublimetext.com/2  사이트에서 환경에 맞는 인스톨 패키지를 다운로드 받아서 설치한다. 유료 라이센스이지만 등록하지 않아도 왠만한 개발관련 (JavaScript, Node.js, Java...) 부분은 자유로이 사용할 수 있다. 



2. Sublime text package control 설치하기 


package control은 sublime text에 plugin 을 찾고, 설치를 쉽게 할 수 있도록 해준다. 

http://wbond.net/sublime_packages/package_control/installation  사이트로 가면 다음과 같은 설치 문구가 나온다


> sublime text 2 를 실행하고 ctrl + `  short key를 누른다



> 박스안에 있는 문구를 copy한다

import urllib2,os; pf='Package Control.sublime-package'; ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler())); open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read()); print('Please restart Sublime Text to finish installation')



> sublime text의 command line에 paste 하고 enter를 치면 install 된다 


> ctrl + shift + p short key를 누르면 plugin을 설치 할 수 있는 창이 뜬다


> install package 라고 치면 팝업창 하단이 바뀌고 선택되면 enter 또는 click을 한다 


> install package를 들어 갔다면 java라고 치면 관련 package가 나오고 선택하면 github에서 다운로드하여 자동 설치한다




3. Sublime text Tips


short key 

> ctrl + `  : 하단에 command 입력창 나옴 

> ctrl + shift + p : find 팝업창

> ctrl + p : 문서내 find 팝업창 (줄번호 찾아가기  :<line number>  ex) :13   13번줄로 이동)

> alt + shift + 1~9 : 컬럼창 분할  (View - Layout 메뉴)

> ctrl + a : 전체 선택,  ctrl + L : 라인 선택

> ctrl + shift + up/down key : line swap (Edit - Line 메뉴)

> ctrl + F2 : 문서내 bookmark 표기 이동은 F2 누르면 위에서 아래로 이동 (Goto - Bookmark 메뉴)

> 참조 사이트 : http://juhoi.tistory.com/51



어제 처음 써보지만 plugin 들을 github에서 바로 다운로드 받아서 설치해 주고, eclipse와 같은 기능들을 사용할 수 있어서 Text기반의 개발을 할때 그리고 로컬 컴퓨터 사양이 떨어질 때 쉽고 빠르게 사용할 수 있는 개발툴로 안성맞춤으로 보인다. Node.js 기반 개발 할 때는 이걸 사용해 보자

posted by 윤영식
2012. 10. 29. 16:15 Middleware, Cloud/OSGi

OSGi 프레임워크중 r4를 구현한 Felix를 설치하고 간단히 구현한 번들을 어떻게 올려서 사용할 수 있는지 보자. 


▶ 테스트 환경


  - Felix를 local PC에 설치하고 구동한다  (Felix가 OSGi 프레임워크라고 하지만 사실은 기능이 아무것도 없고 필요한 기능을 구현한 번들을 운영 관리해 주는 미들웨어-Middelware-라고 보면 된다)

  - Jetty 엔진 번들을 Felix 프레임워크에 올린다(start). 

  - Test용 Http Servlet 호출 프로그램을 짜고 번들로 만든다 (TestServlet 번들)

  - TestServlet 번들을 Felix에 올린다(start)

  - 브라우져에서 TestServlet을 호출해 본다. 


결국 아무 기능이 없는 Felix OSGi 미들웨어 위에 HTTP Servlet Engine인 Jetty를 올리고, Servlet을 개발하여 올리면 Client에게 서비스를 제공할 수 있게된다. 


▶ 환경 구축하고 테스트


  1) Felix (http://felix.apache.org/site/downloads.cgi) 에서 main framework 을 다운로드 한다

  2) 다운로드 zip 파일을 적당 위치에 푼다 (이전에 JDK 설치는 필수)
   

  3) 디렉토리 위치에 felix.bat 파일을 만든다  (bat 내용 :  java -classpath ./bin/felix.jar org.apache.felix.main.Main )    

    

  4) cmd 창을 띄워서 felix.bat 을 실행하고, lb 명령을 수행하면 현재 기본 Activate된 번들 정보가 나온다 (help 다른명령보기)

   

  5) felix에는 shell과 repository 번들이 bundle 디렉토리에 존재한다.

    

  6) 다른 번들을 auto deploy하기 위하여 conf/config.properties에서 #felix.auto.deploy.dir=bundle 로 되어있는 주석 #을 제거한다. 그리고 bundle디렉토리에 다운로드 받은 번들 jar 파일을 놓고 felix를 재시작하면 자동 activate된다.


  7) 수동 active 방법 : install xxx.jar   -->  start <번들No.> 

   

  8) felix를 일단 시작하면 기존 active된 상태 정보들은 felix-cache디렉토리에 영구저장된다. (번들 activate 상태정보를 완전 제거하고, felix를 초기화 하고 싶다면 해당 디렉토리를 삭제하면 된다)

  

  9) http://felix.apache.org/site/downloads.cgi 사이트에서 HTTP 관련 subproject 번들을 다운로드 받아서 로컬의 <felix 홈>/bundle 디렉토리에 copy한다


  

  10) felix를 재시작하면 jetty가 8080 port로 Listening을 한다 (포트 변경은 jetty bundle 압축을 풀고, metatype.xml 에 정의된 port 수정후 재 배포한다

 

  11) http://localhost:8080/ 을 호출해 보면 jetty 404 에러가 보이면 정상이다. (왜? 아무런 서비스도 올리지 않고 단지 jetty servlet engine만 기동 되었기 때문이다)
 

  12) 테스트 번들 만들기는 다음 블로그에서 소개하기로 하고 첨부된 httptest.jar 를 특정 디렉토리에 복사한다. 

  

  13) felix 위에 activate 시켜보자. 여기선 bundle 디렉토리에 파일을 놓고 felix를 restart함으로써 auto deploy 말고 수동으로 바로 activate 시켜본다 ( felix:install file:<directory> , 주의 : 윈도우 구분자는 \\ 두개 삽입하고 전체경로 지정 )

  

  14) http://localhost:8080/servlet1/MyMusicCollection  을 호출한다

  

  15) counting crows 입력값을 넣고 submit 하면 jetty가 해당 요청을 받아서 test servlet으로 요청처리를 보내고 결과를 반환한다

 


결국 OSGi 프레임워크는 필요한 기능이나 서비스를 번들로 만들어서 각 기능을 이용할 수 있게 해주는 미들웨어라고 볼 수 있다.


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

[Eclipse Virgo] 사용하기  (0) 2012.11.03
[OSGi] 서비스 Layer 만들기  (0) 2012.10.30
[OSGi] BundleContext에 의한 LifeCycle 관리  (0) 2012.10.30
[OSGi] manifest.mf 파일 설정  (0) 2012.10.30
[OSGi] 이론-1  (0) 2012.10.27
posted by 윤영식
2012. 10. 27. 14:10 Middleware, Cloud/OSGi

▶ OSGi (Open Services Gateway Initiative)


OSGi 기술은 java에서 동적 컴포넌트 시스템을 정의한 스펙이다. 

The OSGi technology is a set of specifications that define a dynamic component system for Java. 


컴포넌트 모듈을 만들고 이들을 추가하면 동적으로 반영되고 상호 모듈끼리 통신하여 대화할 수 있도록 만들어 주는 부분이 필요하다. 이를 위하여 OSGi는 어떤 Layer를 가지고 있나 보자 



참조 http://www.osgi.org/Technology/WhatIsOSGi


위의 관계를 간단히 보면 다음과 같다


  - 자바 인터페이스와 실제 구현 개체를 Service로 만든다 - Services Layer

  - 서비스를 제공하기 위한 기능적 배포단위로 Bundle을 만든다 (Jar 파일롤 묶음. MANIFEST 파일 포함) - Module Layer

  - 번들의 생명주기 관리는 Bundle Context가 해준다 (번들의 설치, 실행, 정지, 삭제 생명주기관리) - Life Cycle Layer

  - Installed -> Resolved -> Start -> Active -> Stop -> Resolved -> Uninstalled 

  - OSGi 프레임워크는 소량의 메모리로 효율적인 통합된 컴포넌트 개발환경을 제공하고, 애플리케이션 실행 중에도 동적 다운로드 
    및 업그레이드가 가능하게 해준다. 이는 OSGi가 애플리케이션간의 의존성을 관리하고 확장성(Scalable)를 제공한다. 

OSGi 프레임워크는 Bundle을 관리하는 Bundle Context를 가지고 있고 Bundle이 가지고 있는 Service를 등록하여 Bundle끼리 상호 대화할 수 있도록 해준다. 결국 Service를 등록하는 Registry가 OSGi Framework안에 존재하고 해당 Registry가 Service들을 상호 연결시켜주는 방식이다. 해당 방식은 Spring Framework의 DI (Denpendency Injecttion)가 같고, 결국 SOLID의 DIP 원리를 구현하여 서비스끼리의 Loosed Coupling을 지원한다는 말씀되시 겠다. 




* OSGi 사용 장점

  - 개발자입장에서 큰규모의 분산환경 구현 및 배포를 컴포넌트 기반으로 하기 때문에 이에대한 복잡성을 제거하여 단순화 해준다. (Eclipse, JBoss, Spring등에 쓰이고 있다)

  - 사업면에서는 운영비용을 줄여주고 네트워크환경의 멀티디바이스 통합을 손쉽게 해준다 

  - 또다른 이점은  http://www.osgi.org/Technology/WhyOSGi 여길 참조하자. 좋은 점은 다가졌다는 이야기


* OSGi 이론 다시 정리 참조http://blog.secmem.org/107


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

[Eclipse Virgo] 사용하기  (0) 2012.11.03
[OSGi] 서비스 Layer 만들기  (0) 2012.10.30
[OSGi] BundleContext에 의한 LifeCycle 관리  (0) 2012.10.30
[OSGi] manifest.mf 파일 설정  (0) 2012.10.30
[OSGi] Felix 설치 사용하기  (0) 2012.10.29
posted by 윤영식
2012. 10. 26. 21:46 Testing, TDD/Tools, FitNesse

JMeter를 통하여 검색인자에 대하여 동적인 값을 넣어주고 싶을 경우 부하를 어떻게 주는지 보도록 하자. 동적인 인자 값을 txt로 설정하고 불러와서 자동으로 인자값을 바꾸어 준다.



▶ search.txt에서 인자값을 읽어서 동적으로 search 파라미터를 바꾸어서 부하주기 

  1. CSV Data Set Config를 추가 한다

  2. 동작으로 넣어줄 search.txt 파일을 만든다 (각 인자값은 \r\n)


  3. 만든 search.txt 파일 경로를 CSV Data Set Config 에 절대경로 위치를 설정한다

  4. "Google Search"에서 레코딩한 "/search" 의 HTTP Request의 Parameters 값으로 static하게 설정된 "beethoven"을 ${search_name}이라 설정한다
     
  5. Response Assertion에도 beethoven으로 설정된 값을 동일하게 ${search_name} 이라 고쳐준다

  6. 결과 값을 보기위하여 Debug Sampler를 추가한다. 그리고 하위로 View Results Tree 를 추가하여 결과 내역을 상세히 본다


  7. View Results Tree의 상세 내역을 보면 HTTP Response data로 search_name=Morzart 등등 변경되어 인자값이 전달된 것을 볼 수 있다

  8. Run/start를 수행하면 7번과 같은 결과를 볼 수 있다

JMeter의 왼쪽 Tree Menu는 위에서 부터 아래로 순차적으로 수행이 된다. 따라서 각 Tree Node를 마우스 Drag&Drop으로 원하는 위치로 이동을 할 수 있다. Add를 잘 못 하였더라도 위치조정을 하면 된다

BeanShell을 이용하게 되면 프로그래밍적인 Controller를 추가할 수 있고, 트리메뉴의 순서를 변경하면 순차적으로 수행을 한다. BeanShell 사용은 다음에 살펴보자.


posted by 윤영식
2012. 10. 26. 19:46 Testing, TDD/Tools, FitNesse

JMeter에 Thread Group을 "Google Search"로 설정하고, WorkBeanch에서 레코딩 작업을 "Goolge Search"에 해준후 부하를 어떻게 쏘고 결과를 보는지 알아보자 



▶ 부하 주기 

  1. Assertion을 설치하여 결과값이 제대로 레코딩된 것인지 확인 할 수 있다 ([Add] 버튼 클릭후 입력값 beethoven 넣음)



  2. 결과를 Graph Result로 보기위하여 추가한다

  3. Thread Group의 user 수를 100으로 한다


  4. 상단의 메뉴 Run/Start를 수행한다


  5. Graph Results 를 통하여 결과 성능을 볼 수 있다. (X축 : 동시 접속자수, Y축 : 응답시간)
    성능그래프는 어차피 x축 동접수 대비 y축의 최대 응답시간의 직교점을 찾으면 된다.

  6. Summary Report를 통하여 에러와 결과값을 수치로 확인한다



가장 간단하게 성능 테스트 하는 것을 보았는데, 예전에 사용한 MS Stress Test Tool과 유사하다. 하지만 Thread Group의 Add 항목에 있는 기능들을 보면 스크립트를(BeanShell) 이용하여 동적인 아규먼트를 주거나 다양한 프로토콜 (FTP, TCP, LDAP 등등) 을 지원한다. 따라서 사용수준의 사용법을 익히 알고 있는 엔지니어라면 -예로 LoadRunner- JMeter를 사용하는데 큰 어려움을 없을 것으로 생각된다. 


posted by 윤영식
2012. 10. 26. 14:53 Languages/Java

BeanShell은 java syntax로 짠 script의 랭귀지 인터프리터이다. 

사이트 : http://www.beanshell.org 


▶ BeanShell 설치


  - 먼저 bsh-xxx.jar 파일을 다운로드 받는다

  - 윈도우라면 classpath 경로에 추가한다  

       


  - BeanShell은 GUI 또는 Command Line에서 수행할 수 있다

   + java bsh.Console : GUI

      


    + java bsh.Interpreter : text only command line

     


    + java bsh.Interpreter filename [args] : run script file


  - BeanShell은 일반 java appliction에서 호출 할 수도 있다 (application에서 bsh.Interpreter를 new 해서 호출)

  - BeanShell GUI 에서 loose type 으로 자바 코딩하듯이 짜면 된다. ( print()는 System.out.println()의 bsh 내장 함수)

    


  - 좀 더 자세한 사용자 메뉴얼 : http://www.beanshell.org/manual/bshmanual.htm 참조

  - default import 구문

    + javax.swing.event

    + javax.swing

    + java.awt.event

    + java.awt

    + java.net

    + java.util

    + java.io

    + java.lang


  - BeanShell 동작 방식

    + standalone 모드 : java bsh.Interpreter [filename] [arg..]

     

    + remote 모드 : java bsh.Remote [HTTP 또는 bsh URL] 

   



▶ BeanShell 을 Remote Server에서 접속하여 사용하기 

  - Remote Server Mode 흐름도 : 웹브라우져에서 접속하거나, Telnet 접속이 가능하다. 또는 Servlet 코드에서 접속도 가능하다

   


  - 웹브라우져 접속방법

    + 내 BeanShell이 있는 곳에서 내장함수 server(portNum); 수행

      

    

    + 불여우(FireFox)에서 http://<주소>:<portNum>/remote/jconsole.html 로 접속한다 (주의 : 브라우져에서 여러개 bsh console을 열어서 작업을 할 수 있으나 global session이어서 서로 share된다)

     


  - telnet 접속 : telnet <myhost> <port+1>  여기서는 "telnet localhost 8082"
    


  - 그외 BshServlet을 통한 호출도 가능 하다. 

  

▶ BeanShell 사용하는 곳


  - JMeter에서 BeanShell 적용하기 : http://nezah.egloos.com/4336838

  - Eclispe에 BeanShell적용하기 : http://blog.sangpire.pe.kr/69

  - 기타 기초적인 것은 구글링~~~ (구글 이자식들 독도명 지도에서 삭제해가지고 열받는 중. SW 주권을 찾을 때다)


posted by 윤영식
2012. 10. 26. 11:37 Testing, TDD/Tools, FitNesse

JMeter를 순수 Java 기반의 성능 테스트 툴이다. 아파치의 설명을 보자 


The Apache JMeter™ desktop application is open source software, a 100% pure Java application designed to load test functional behavior and measure performance. It was originally designed for testing Web Applications but has since expanded to other test functions.



▶ JMeter를 사용해 보자 


  1. JMeter 사이트에서 최신 버전을 다운로드 받는다 ( http://jmeter.apache.org/download_jmeter.cgi )
  2. 로컬에 압축 파일을 풀고, D:\apache-jmeter-2.8\bin\jmeter.bat 를 실행한다

  3. 사용자(=Thread) Group를 생성한다 : 이것은 요청하는 사용자의 요청 방법을 설정한다 (명칭을 Google Search 로 수정)
    1. Number of Thread : 동시 사용자 수
    2. Ramp-Up Period : 사용자가 하나씩 들어갈 때 시간 간격
    3. Loop Count : 테스트 시나리오를 몇 번 실행할 것인지



  4. WorkBench에서 Http Proxy Server를 선택한다

  5. 브라우져에서 웹사이트를 Recording할 때 사용하는 로컬 프락시 임의 포트를 9090으로 설정하고 Thread Group으로 설정한 Google Search를 선택한다

  6. 이제 Recording을 위하여 FireFox 브라우져를 설치하고, FireFox에 Proxy 사용 및 Port를 9090으로 설정한다 



  7. 불여우창에서(ㅋㅋ) 구글 사이트로 들어가서 임의 검색어를 넣고 검색을 하기전에 위 5번 화면의 하단 [Start] 버튼을 클릭한다. [Start] 버튼을 클릭후 불여우창에서 보는 모든 웹요청은 JMeter로 Recording이 된다

  8. 원하는 웹요청을 다 하였다면 JMeter창에서 [Stop] 버튼을 클릭하여 Recording을 멈춘다 

  9. Recording이 끝나면 다음과 같이 레코딩된 내역을 볼 수 있다
  10. 다음에 부하를 준다. (다음 블로그에서...)


posted by 윤영식
2012. 10. 25. 20:34 Testing, TDD/Test First

1) JUnit을 통하여 단위테스트 하는 방법에 대한 참조 사이트들

  - JUnit 기본 사용하기 : http://blog.daum.net/aqua0405/5558279

  - JUnit 단축키 : alt + shift + x 그런후 t 클린하면 JUnit Test가 진행

  - Spring에서 JUnit :  http://blog.sangpire.pe.kr/125

  - Mock 객체 사용하기 :  http://javacan.tistory.com/148

  - DBUnit 사용하기 :  http://www.java2go.net/blog/tag/Testing


2) JUnit 테스트 순서

  - @Test 안에 계약에 의한  설계에 따른 테스트를 만든다

  - ctrl + 1 로 실제 업무 클래스를 생성하여 로직 실패를 만든다

  - 실패한 코드를 확인후 기능이 돌아가는 코드를 짠다

  - 다시 테스트를 돌려본다

  - 추상화가 필요할 경우 추상클래스를 테스트 코드에 넣고, 하위 클래스의 메소드를 pull up하는 리팩토링을 수행한다

  - 테스트 코드안에서 계약에 의한 설계와 OOP와 Refactoring을 계속 하면서 결과값을 검증한다.

  - 이를 계속 반복한다 


3) JUnit에 대한 개념 잡기 슬라이드 


posted by 윤영식
2012. 10. 25. 17:48 Git, GitHub/GitHub

GitHub의 Wiki는 단순 페이지만을 생성하는데, 일반 위키들 처럼 오른쪽에 목차가(Sidebar) 나오고 하단에는 footer등을 넣고 싶을 경우 다음을 참조하자 



내 프로젝트에서도 한번 써봐야 겠다. 그동안 wiki 페이지 기능이 단순해서 사용하지 않았는데, 확장을 할 수 있게 되어 있었다. 

  • OSS인 골룸(gollum)을 통해서 GitHub의 wiki를 확장할 수 있다
  • Sidebar 넣기 
    • _Sidebar.ext 파일을 만든다. 물론 내용은 wiki 형식을 따르면 된다 : .md파일이 없는 모든 sub directory에 영향을 미친다 (요건 체크해 볼일이다)
    • wiki git을 checkout 한다 (wiki의 Git Access 탭에서 git url을 얻으면 됨)
    • wiki repository를 local로 다 가져온후 _Sidebar.md 파일을 만든다
    • .md 파일안에 markdown syntax로 link를 [[link]] 형식으로 넣는다 
    • _Sidebar.md 파일을 commint한후 origin master에 push 한다 
  • Header 넣기
    • _Header.ext 파일 만든다 (wiki 포멧)
    • _Header.md 파일 만든다 (markdown syntax)
  • Footer 넣기
    • _Footer.ext 파일 만든다 (wiki 포멧)
    • _Footer.md 파일 만든다 (markdown syntax)  


요점만 정리했는데, 실제로 해볼일~~에구구

posted by 윤영식
2012. 10. 25. 16:31 Middleware, Cloud/WAS

하이퍼소닉은 애플리케이션 테스트용으로 사용하는 것으로 실 운영시에는 적은 메모리라도 아끼기 위하여 삭제하는 것이 좋다. 하이퍼소닉은 외부 접근이 안되므로 보안에 대한  설정은 없지만 운영들어 가기전에 삭제한다


  • deploy> 밑에서 ls *ds.xml 검색하면 hsqldb-ds.xml 파일이 나온다 
  • hsqldb-ds.xml 파일을 삭제한다 

하이퍼소닉을 제거한후 oracle을 사용한다면 다음과 같은 서비스에 설정을 변경하여 준다. 

  • deploy 밑에 oracle-ds.xml 파일을 만든다 
  • DefaultDS를 사용하고 있는 ejb2-timer-service.xml의 설정을 oracle로 변경한다
  • JMS를 사용하면 deploy/messaging/hsqldb-persistence-service.xml 파일을 지우고 동일한 oracle-persistence-service.xml 파일을 만든다
  • uuid-key-generator.sar에서 UUID 키 생성을 한다면 META-INF/jboss-service.xml 에서 DefaultDS를 변경한다 
만일 새로운 데이터베이스로 서비스를 전환했다면 

show tables in jbossdb; 로 사용하는 테이블들을 점검 한다 


posted by 윤영식
2012. 10. 25. 16:12 Middleware, Cloud/WAS

Java Messaging Service를 사용하지 않는 다면 다음의 파일 또는 내용을 제거 하여 자원(메모리, CPU) 소모를 예방한다


  • deploy/messaging 디렉토리 삭제
  • deploy/jms-ra.rar 파일 삭제
  • deployers/messaging-definitions-jboss-beans.xml 파일 삭제
  • conf/standardjboss.xml 파일에서 jms 관련 내용 제거 

메시징을 이용한다면 

  • deploy/messaging/destinations-service.xml 안에 <security>를 설정한다
  • conf/login-config.xml 파일에 <application-policy name="JMSRealm"> 이라는 새로운 application 정책을 만든다 
  • 마지막으로 deploy/messaging/messaging-jboss-beans.xml 안에 <bean name="SecurityStore">를 설정한다 


posted by 윤영식
2012. 10. 25. 16:02 Middleware, Cloud/WAS

▶ shutdown이나 twiddle이 JBoss의 내부 마이크로 커널과 통신하려면 JMX invoker를 사용한다.


  • deploy/jmx-invoker-service.xml 구성에서 org.jboss.invocation.Invocation 에 대한 인증 인터셉터를 추가한다
         <operation>
            <description>The detached invoker entry point</description>
            <name>invoke</name>
            <parameter>
               <description>The method invocation context</description>
               <name>invocation</name>
               <type>org.jboss.invocation.Invocation</type>
            </parameter>
            <return-type>java.lang.Object</return-type>
            <descriptors>
               <interceptors>
                  <!-- Interceptor to require authenticated users -->
                  <interceptor code="org.jboss.jmx.connector.invoker.AuthenticationInterceptor"
                     securityDomain="java:/jaas/jmx-console"/>
                  <!-- Interceptor that deals with non-serializable results -->
                  <interceptor code="org.jboss.jmx.connector.invoker.SerializableInterceptor"
                     policyClass="StripModelMBeanInfoPolicy"/>
               </interceptors>
            </descriptors>
         </operation>

해당 조건을 적용하면 단순 shutdown 명령이 내리지 않고 하기와 같이 한다

 bin> shutdown -S -s jnp://<IP> -u admin -p <admin 패스워드>

  • jnp 프로토콜 접속하는 JBoss 설치 IP (옵션)
  • -u 인증 admin 아이디 
  • -p admin 계정의 패스워드 



▶ HTTP Invoker 는 80 포트를 통해서 외부세계에서 JBoss의 JNDI, JMX invocation, EJB invocation등의 원격 접속을 허용한다. 


  • 80 포트는 애플리케이션을 요청하는 포트 이므로 HTTP Invoker는 아예 삭제를 한다
  • deploy/http-invoker.sar라는 단일 서비스를 디렉토리 몽땅 제거하면 서비스가 삭제된다





posted by 윤영식
2012. 10. 25. 15:40 Middleware, Cloud/WAS

JBoss 5.x에 대한 관리화면 폴더는 각 도메인안의 

  • deploy/jmx-console.war : JMX 콘솔
  • deploy/management : 웹 콘솔
두 디렉토리를 삭제하면 JMX 관리가 안됨. 보고 싶다면 보안을 설정한다

  • jmx-console.war/WEB-INF/web.xml에서 하기 security 테그의 주석을 제거한다 
<security-constraint>
     <web-resource-collection>
       <web-resource-name>HtmlAdaptor</web-resource-name>
       <description>An example security config that only allows users with the
         role JBossAdmin to access the HTML JMX console web application
       </description>
       <url-pattern>/*</url-pattern>
     </web-resource-collection>
     <auth-constraint>
       <role-name>JBossAdmin</role-name>
     </auth-constraint>
   </security-constraint>


  • JBossAdmin 권한을 가진 사용자만이 JMX 콘솔 사용이 가능하다 
  • 사전에 WEB-INF/jboss-web.xml 의 보안 도메인 링크가 하기와 같이 설정되어 있어야 한다
<jboss-web>
      <security-domain>java:/jaas/jmx-console</security-domain>
</jboss-web>

  • security domain에 대한 부분은 conf/login-config.xml에 하기와 같이 설정되어 있다
 <application-policy name="jmx-console">
    <authentication>
      <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule"
        flag="required">
        <module-option name="usersProperties">props/jmx-console-users.properties</module-option>
        <module-option name="rolesProperties">props/jmx-console-roles.properties</module-option>
      </login-module>
    </authentication>
  </application-policy>

  • conf/props 디렉토리 밑에 jmx-console-users.properties에 key=value로 admin을 정의 한다
  • conf/props 디렉토리 밑에 jmx-console-roles.propertiess에 하기와 같이 역할을 정의 한다
admin=JBossAdmin,HttpInvoker

  • management/console-mgr.sar/web-console.war/WEB-INF 디렉토리에서 web.xml 의 security 태그 주석을 제거하고 jboss-web.xml에서 java:/jaas/web-console를 java:/jaas/jmx-console 로 변경하면 똑같은 보안설정을 따르게 된다. 



posted by 윤영식
2012. 10. 24. 21:14 Testing, TDD/Tools, FitNesse

▶ Fit으로 테스트 했던 CalculateDiscount를 FitNesse Wiki에 넣어 보자 


  1. CalculateDiscount wiki 페이지를 만들어준다

  2. Excel을 이용하여  CalculateDiscount  표를 작성한다 (상단의 명칭은 java 클래스 명칭과 동일하게 작성한다)
 

  3. CalculateDiscount wiki 페이지에 excel 표를 Copy&Paste하고 [SpreadSheet to FitNesse] 포멧으로 바꾸고 [Save] 한다

  4. 기존에 만들어 두었던  CalculateDiscount java 컴파일 내역을 fitnesse.jar 파일 있는 곳에 복사한다

  5. [Test] 버튼을 클릭하여 테스트를 수행한다

  6. 결과를 확인한다



▶ Fit 과 FitNesse 응용하기 


  - Fit 방식을 이용하여 Maven에서 자동화 테스트 구현을 한다. 결과 result.html을 웹서버로 서비스하게 만들어 준다

  - FitNesse는 고객이 FrontPage로 들어와서 위키페이지 마다 [Test]를 클릭하여 결과를 직접 확인 하는 방법도 있다. 

posted by 윤영식
2012. 10. 24. 20:52 Testing, TDD/Tools, FitNesse

▶ FitNesse 를 설치하고 웹상에서 테스트하기 


  1. http://www.fitnesse.org/  로 들어가서 fitnesse.jar 파일을 다운로드 받는다

  2. 특정 디렉토리에 복사를하고 classpath 환경변수에 잡아준다. (안 잡을 경우 java -classpath에서 잡아줌)

  3. listen port를 지정하고 fitnesse 서버를 기동시킨다

  4. 브라우져에서 확인한다. FitNesse는 Wiki Web Server 이다. 여기에 Fit 테스트를 결합 시켰다.


  5. Main 페이지에서 왼쪽 메뉴에서 [Edit] 를 클릭한다
 

  6. Editing 페이지 하단에 >TestSample 이라고 입력하고 Save한다

  7. 화면의 하단의 TestSample[?] 에서 링크된 ? 를 클릭한
.
  8. TestSample Wiki 페이지가 나온다. 

  9. Excel을 이용하여 StressTest Column Fixture를 만든다.  (상단의 명칭은 java 클래스 명칭과 동일하게 작성한다) 

  10. TestSample Wiki 페이지 왼쪽 메뉴 [Edit] 클릭하여 들어간다. 
  11. 편집모드에서 상단에 fitnesse.jar 파일이 있는 위치정보를 넣어주고, Excel표는 Copy하여 Paste 한후에 [SpreadSheet to FitNesse] 버튼을 클릭한다. 그러면 Excel 포멧이 FitNesse 포멧으로 변경된다. 그리고 [Save] 한다. 


  12. 저장한 화면이 다음과 같이 나온다
 

  13. 왼쪽 메뉴 [Properties]에서 Test 속성을 체크하고 [Save] 한다


  14. StressTest.java 파일을 작성한다

  15. StressTest.java파일은 fitnesses.jar 파일이 있는 곳에서 컴파일 한다 

  16. 이제 모든 준비가 끝났다. 

    - 샘플 wiki 페이지를 만듦

    - 샘플 wiki 내용에 인수 테이블 포멧 Copy&Paste from Excel

    - Java Fixture를 만들어서 Fitnesse.jar 파일위치에서 컴파일

  17. 다음에 TestSample 페이지의 [Test] 버튼을 클릭한다

  18. 결과값이 자동으로 출력된다


한번의 스텝이 돌았다. 이제 FrontPage 메인에 또 다른 테스트 케이스를 > 를 이용하여 넣고서 첨부 할 수 있다. 

'Testing, TDD > Tools, FitNesse' 카테고리의 다른 글

[JMeter] 성능 테스트툴 간단 사용기-1  (0) 2012.10.26
[테스트 실습-3] FitNesse-2  (0) 2012.10.24
[테스트 실습-2] Fit-3  (0) 2012.10.23
[테스트 실습-2] Fit-2  (0) 2012.10.23
[테스트 실습-2] Fit-1  (1) 2012.10.23
posted by 윤영식
2012. 10. 23. 22:20 Testing, TDD/Tools, FitNesse

▶ Batch나 업무 프로세스를 타고 Fit Testing  (Action Fixture)

  - start   : 실행 fixture를 자동화할 클래스 명칭을 얻고 테스트를 시작한다

  - check : 메소드를 수행하여 값을 검증한다

  - enter  : 어떤 테스트도 하지 않고 void 메소드를 수행한다

  - press : 메소드를 수행하고 인수(argument)를 전달한다


  1. word로 위에서 부터 아래로 쭉 실행할 내역을 적는다 (start : BuyActions 란 명칭으로 주고 java파일도 동일하게 작성)

  2. java 파일을 하기와 같이 작성한다  

  3. java 파일 컴파일 하고, java fit.FileRunner TestBuyItems.htm result.html 수행한다

  4. 결과 result.html 을 열어본

▶ Action Fixture를 이용한 Chat Server 테스트 

  

  1. word에서 html 파일 만들기



  2. java로 Fixture 개발 (Fixture-ChatServerActions, 업무 모듈-ChatRoom, User, Room) 

  3. java 파일 컴파일하고, java fix.FileRunner TestChatServer.htm result.html 명령 수행하기 

  4. 결과  result.html 열어보기
 

▶ 예제 파일


TestCase-4.zip


TestCase-5.zip



▶ 참고 

  - Fit 의 Fixture 를 wiki에서 사용하는 방법 및 코드 

  - eclipse에서 Fit을 자동화 테스트 하고 싶을 경우 (luxoft)

  - eclipse FitRunner plug-ins 테스트 하기 


'Testing, TDD > Tools, FitNesse' 카테고리의 다른 글

[JMeter] 성능 테스트툴 간단 사용기-1  (0) 2012.10.26
[테스트 실습-3] FitNesse-2  (0) 2012.10.24
[테스트 실습-3] FitNesse-1  (0) 2012.10.24
[테스트 실습-2] Fit-2  (0) 2012.10.23
[테스트 실습-2] Fit-1  (1) 2012.10.23
posted by 윤영식
2012. 10. 23. 21:58 Testing, TDD/Tools, FitNesse

▶ 다수 인수에 대한 Fit Testing (Column Fixture)


  1. word에서 다음과 같이 fixture를 만들어 본다


  2. java 파일을 코딩한다 



  3. javac *.java 명령으로 컴파일 한다 

  4. java fit.FileRunner CalculateCredit.htm result.html 명령을 수행한다 

  5. result.html 파일을 열어본다 


▶ 인수값 열거형 Fit Testing (Column Fixture)


  1. word에서 열거를 위하여 콤마(,)를 사용한다. TestFirstPhone.htm으로 저장한다 

  2. java 코딩을 하기와 같이 한다


  3. java파일을 컴파일 한다

  4. java fit.FileRunner TestFirstPhone.htm result.html 수행한다 

  5. 결과를 열어본다


열거형등 다양한 타입에 대한 테스트를 수행해 볼 수 있겠다. 


▶ 예제 파일


'Testing, TDD > Tools, FitNesse' 카테고리의 다른 글

[JMeter] 성능 테스트툴 간단 사용기-1  (0) 2012.10.26
[테스트 실습-3] FitNesse-2  (0) 2012.10.24
[테스트 실습-3] FitNesse-1  (0) 2012.10.24
[테스트 실습-2] Fit-3  (0) 2012.10.23
[테스트 실습-2] Fit-1  (1) 2012.10.23
posted by 윤영식