자바에서는 개발자가 프로그램에서 별도로 메모리 관리를 하지 않는다. 이것은 C/C++에서는없던 획기적인 것이었다. 자바의 메모리 관리 개념은  개발자를 열광케 하고, 나아가 자바가 세상을 지배하는 언어가 되는데 핵심 역할을 담당하였다

그러나 애석하게도 자바에서는 여전히 메모리 문제가 발생하고있다. C/C++처럼 빈번하지는 않지만 종종 OutOfMemoryError 발생하고 있으며, 이러한 메모리 부족 에러는 운영자나 개발자가 가장 껄끄러워하는 문제 중에 하나로 인식되어있다.

1.1 자바의 메모리 부족 유형

Out Of Memory Error 발생하는 원인을 보면 크게 (1)단지 메모리가 부족할  (2)Heavy 서비스가 수행되면서 혹은 (3) 메모리 LEAK 의한 메모리 부족 때문으로 구분할  있다.

절대적인 메모리 부족

단지 메모리가 부족하다는 것은  설정된 메모리량이 요구되는 메모리량에 비해 부족하다는 것이다. 프로그램이나 기타 오류가 아닌 단지 값이 적게 설정되었다는 것을 의미하기 때문에 통상적으로는 -Xmx값을 늘려줌으로써 해결되는 것이 보통이다. 실제로는 의외로 JVM 시작시 메모리 옵션을 빠뜨리는 경우가 많다. 혹은 -Xmx256 같이 메모리 단위(원하는 설정-Xmx256m) 빠트리는 경우도 있다.  물론 옵션을 잘못 기술하는 것은 단순한 실수이지만, 자바  메모리에 대한 경험이 전혀 없어서  단위 시간당 서비스 호출건수(Service Arrival Rate) 비해  없이 적은량의 메모리를 지정하는 경우도 종종 있다.

SUN/HP JVM에서는 perm 영역이 작아서 발생하는 경우가 있다. 메모리의 perm영역에는 클래스코드 등이 저장되는 공간으로  사용되는 클래스가 많은 경우에는 사이즈를 늘려 주어야 한다.

Heavy Application Service 의한 부족

OutOfMemoryError  응용서비스(ex Web Request 처리 로직) 순간적으로 메모리를 과도하게사용함으로써 발생할  있다.

데이터 베이스에서 너무 많은 데이터를 로딩하거나 검색 조건이 잘못되어 검색서버에서 너무많은 텍스트를 조회하는 경우가 해당된다.  다른 경우로 과거에 upload/download프로그램에서 자주 발견되던 것으로 byte[] buffer에서 buffer 크기를 너무 크게 설정함으로써 연속공간부족 현상(IBM JVM) 발생하는 경우나,  동시에 여러 개의 요청이 발생하여 단위 시간당 절대사용량이 많아 OuOfMemory발생하는 경우를 생각할  있다. 물론 후자의 경우는 application정상적으로 메모리를 많이 사용하는지 단지 프로그램 오류인지는 판별하기 어려울 수도 있다.

LEAK 의한 메모리 부족

마지막으로 Memory Leak 발생하여 메모리가 부족해지는 경우이다.  보다 정확하게 자바에서메모리 LEAK 로직적으로 사용되지 않는 객체가 GC  없는 strong reference 의해 참조되어 메모리 사용량이 증가하는 상태를 말한다. 대부분 적절한 반환을 거치지 않아 발생한다.

대표적으로 JDBC관련 클래스를 사용하고 close() 호출하지 않게 되어 발생하는 경우를 생각할  있다(물론 JDBC 따라서 혹은 Web Application Server 따라서 메모리 Leak 발생하지 않을   있다.)

메모리 LEAK 다른 사례로 Cache 구현 로직에 문제가 있는 경우이다. CACHE에서 불필요한데이터의 제거 로직이 정상적으로 동작하지 않는 경우 OutOfmemoryError 발생할 수있다.

Http Session에서 데이터가 증가하는 현상 또한  범주에 포함 시킬  있을 것이다.

 

1.2  OutOfMemoryError 발생시 원인 분석

화면이나 프로그램 로그에서 OutOfMemoryError 보게 된다면 어떤 경우에 발생하는지를 정확히 판별해야 한다.

단지 설정이 잘못된 경우라면 통상적으로 JVM startup 혹은 startup이후 짧은 시간내에OutOfMemory 발생하게된다. 따라서 서버를 리스타트   OutOfMemoryError 보게 된다면 옵션 설정을 먼저 의심해 보아야 한다. 그러지만 PERM영역이 부족한 경우에는 약간 시간을두고 발생하게 되지만 특징은 HEAP메모리가 부족하지 않는데 OutOfMemoryError 발생하면서 SUN/HP JVM이라면  PERM영역이 부족하지 않은지를 먼저 확인해야  것이다.

만약 (2)경우라면 어떤 현상이 관찰될까? HEAP MEM 그래프를 보면 갑자기 메모리 사용량이급격히 증가하고 GC 빈번해지는 현상이 관찰되는 것이 일반적이다. 시간에 따라 메모리 사용량이 증가하지 않고 어느 순간에 메모리 사용량이 급격히 증가하고 GC 빈번해 지는 현상이발생한다면 특정 Application 메모리를 과도하게 사용함을 추정할  있다. 다만 Active Service 증가한 이후에 Memory사용량이 증가하고 GC 빈번해지면 인과관계가 약간 불분명할 수는 있다  다른 원인에 의한 Active Service 증가하고  service들이 사용하는 메모리량이 많아서 OutOfmemoryError 발생할 수는 있는데 사실 이런 경우는 빈번하지 않다.

IBM JVM 경우에 HEAP 여유가 충분하고 GC 빈번해지지도 않으면서 갑자기OutOfMemoryError 발생한 경우에는 fragmentation 의한 연속공간부족을 의심할  있다.

마지막으로 메모리 LEAK HEAP그래프가 시간에 따라 증가되는 현상으로 나타난다. 시간이 몇시간인 경우도 있으나  달이 넘는 경우도 있다. 메모리 사용량은 명시적으로System.gc() 호출한  비교해야 한다.

단지 설정이 잘못되거나 너무 적은 메모리를 설정한 경우에는 설정을 수정함으로써 해결하면OK이지만 특정 Application 의한 OutOfmemoryError Memory leak 발생하는 경우에는 해결을 위해 보다 논리적 접근이 필요하다.

특정 application 의한 불특정 시점에 OutOfMemoryError 발생하는 것이 확인된다며 어떤application Memory Error 발생하는지를 찾아야 한다. 만약 해당 Application uploaddownload 관련있는 프로그램이라면 데이터를 제어하기 위한 버퍼 사이즈를 먼저확인하고단순히 DB 사용하는 프로그램이라면 DB Access 데이터 량을 확인하는 것이 먼저이다.

 제니퍼는 OutOfMemoryError 의한 서비스 종료가 발생하면 WARNING 발생하고 에러 정보를 저장함으로 이것을 확인하는것도 방법이다. 통상적으로 메모리를 과도하게 사용한Application 수행되면 순간적으로 해당 인스턴스의 응답시간/CPU사용량등이 증가하게되며XVIEW상에서 모든 프로그램의 응답시간이 급격하게 증가하는 현상을 관찰할 수있는데 이때가장 높은 (응답시간이 길거나/CPU사용량이 높음) 위치하는 것이 문제의 Application 경우가 많다. 따라서 일자별 XView 데이터 조회를 통해서 해당 시간대를 면밀히 관찰하면 쉽게 찾을  있다.

Memory Leak 이것은 원만큼 자바 튜닝이 공력이 붙지 않으면 해결하기 힘들다  시간이 필요한데다가 개발 서버에서는 좀처럼 재연되지 않기 때문에 특히 어렵다. 메모리 릭은 원칙적으로HEAP DUMP 분석하는 것이 가장 빠른 길이다.

과거 JAVA 1.4 에서는 IBM JVM에서만 HEAP DUMP 가능했지만  JAVA1.5이상에서는 모든플렛폼에서 HEAP DUMP 가능하다.

 제니퍼에서는 HEAP 사용량을 모니터링 하고 트랜잭션별 응답시간과 CPU사용량을 모니터링함으로써 메모리 문제 해결에 크게 도움이  수있다.

제니퍼를 통해서 OutOfMemoeyError 어떠한 유형인지를 판별하고 만약 LEAK 의심이 된다면 언제쯤 OutOfMemoryError 발생할지 그리고 그메모리 부족이 서비스 응답시간에 영향은없는지를 모니터링 하여 안정적으로 시스템을 운영하면서 메모리 문제를 해결할  있다.

 



Posted by sjokim
,

서비스의 성능과 그 상세 내역(프로파일)을 추적하는 것은 서비스 중심 프로파일링이라 하고 Java EE컴포넌트(즉 서블릿, EJB JDBC)단위로 성능과 그 상세내역(프로파일)을 추적하는것을 컴포넌트 중심 프로파일링이라 한다.



Service Base Profiling

서비스의 처리 로직을 상세하게 추적한다.  모든 프로파일 정보를 서비스 단위로 맵핑한다.서비스 단위로 프로파일 정보를 확인할 수 있다.


Component Base Profiling

프로파일 정보를 컴포넌트 단위로 수집한다. 따라서 프로파일 정보를 컴포넌트 단위로 확인할 수있다. 만약 서비스에 대한 프로파일 검토가 필요하면 서비스가 호출한 컴포넌트를 확인하고 이 컴포넌트의 프로파일을 확인한다.


※컴포넌트 기반 프로파일링의 문제

컴포넌트 기반의 프로파일링은 얼핏 보면 논리적이고 서비스 기반 프로파일링 보다 자세한정보를 보여줄 것 같다. 하지만 컴포넌트 기반 프로파일링은 컴포넌트의 특성 때문에 비효율적인 서비스 모니터링 방법이다.


컴포넌트의 수행시간의 대부분은 여전히 JDBC혹은 TP와 같은 외부 호출이다.

컴포넌트 기반의 프로파일링의 이유의 핵심은 성능 저하 원인을 SQL이나 TP호출 보다는 어떤 Java EE컴포넌트에서 기인할 것이라는 가정하기 때문이다.

하지만 실제 프로덕션 환경에서 성능저하의 원인인 대부분 외부 시스템 즉 SQL/TP/LDAP호출에서 기인하는 경우가 더 많다.. 

그래서 컴포넌트 중심 프로파일링을 하게되면 컴포넌트 단위의 프로파일을 보고 그것이 서비스에 어떻게 영향을 미쳤는지를 알기 위해서는 다시 서비스 프로파일을 보아야 한다. 즉 서비스->컴포넌트, 다시 컴포넌트->SQL/TP의 2중의 프로파일을 분석해야 한다.


서비스와 컴포넌트간의 맵핑을 해야하고 서비스와 SQL/TP 간의 맵핑은 어렵다.

컴포넌트는 서비스와 N:M관계이다  또한 컴포넌트와 SQL/TP관계도 N:M관계이다. 그리고  컴포넌트간의 호출관계도 발생한다 그만큼 그들간의 맵핑 정보는 복잡해지고 추적과 분석이 어려워 진다.


운영 담당자는 컴포넌트를 잘 모른다

어쩌면 이것이 가장 큰 문제 일수있다. 일반적으로 운영담당자는 Java EE의 전문가가 아니다. 개략적인 이해만 있을 뿐이다. 설령 JavaEE에 지식이 풍부하더라도 운영담당자가 개발에 참여하는 경우는 거의 없다. 당연히 운영 담당자는 애플리케이션 내의 컴포넌트 구성이나 상관관계에 대한 깊은 이해가 어렵다. 또한 이들에게는 Application Server Tier의 진입점인 서비스 로부터 끝지점인 DB/TP 연계 중심으로 성능을 이해하는 것이, EJB나 Servlet/JSP, JMS 등과 같은 컴포넌트 구성을 이해하는 것이 보다는 쉽다.

당연히 이들은 느린 서비스를 추출하고 그것의 수행내역을 개발자에게 검토 요청하는 것이가장 효과적일 것이다.


오버헤드를 피할 수 없다.

애플리케이션 서비스를 프로파일링해 보면 프로파일링 자체의 오버헤드도 있지만, 프로파일링정보의 목록을 관리하는 오버헤드도 크다. 그런데 컴포넌트 단위의 프로파일링에서는 각 컴포넌트 별로 프로파일링 목록을 관리해야 하기 때문에 프로파일링 목록이 엄청나게 많아진다.

그렇다고 프로파일링 컴포넌트를 필터링하게되면 분석정보의 유실이나 왜곡을 피할 수 없다. 

'성능과 장애' 카테고리의 다른 글

Application Monitorability을 위한 설계 고려사항  (0) 2009.10.27
문제 해결을 위한 TOOLS  (0) 2009.10.26
OutOfMemoryError 해결  (0) 2009.10.26
XVIEW를 만들게된 동기  (0) 2009.10.26
성능 테스트 관련 용어  (0) 2009.10.26
Posted by sjokim
,


서비스 트랜잭션을 직관적으로 모니터링하자 그래서 XView를 만들었다

애플리케이션 모니터링을 처음 고민하기 시작할때가 
아마도 처음 장애해결에 나갔을 때 인것 같다.
DB,H/W,N/W,그리고 나(APP) 그렇게 4명이 시스템의 장애를
해결하기 위해 사이트에 나간적이 있었다.

첫날 사이트에 도착해서 이런저런 회의를 통해서 
문제가 심각하다는 이야기를 듣고 각자 하루 동안 현상을 수집하기로 했다
DB는 SQL툴을 열어 놓고 SQL문을수행하면서 결과를 수집하기 시작했다.
H/W는 수십개의 쉘을 돌리면서 결과를 수집하기 시작했다.
N/W담당자도 쉘과 몇개의 프로그램을 설치하고는 정보를 수집하였다.
그런데 나는(?) 다른 사람들은 운영서버에서 정보를 수집하는데
나는 개발자에게 소스를 받았다. 그리고는 소스를 읽어나갔다.

다음날... 4명은 탁자에 모였다.. 나를 제외한 모두는 
그래프를 들고서 다른 사람에게 현황을 설명하기 시작했다.
DB도 H/W도 N/W도 그런데 나는 그자리에서 나만 이해하는
소스 코드들을 들고 어쩔줄 몰라했다.. 그 많은 소스 중에서
문제가 쉽게 발견되지 않는 것이 당연하기는 했다..

어쨌거나.. 그때 나에게도 뭔가 툴이 필요하다고 느꼈다..
뭔가 빨리 깔아서 잠깐 모니터링 하고 다음날 이야기 할 수 있는
그런툴.. 문제를 빨리 잡을 수 있는 툴 그런것이 필요했다.

결과적으로 그 사이트의 문제는 EJB 프로그램을 잘못해서
메모리가 급격히 증가하고 그래서 발생한 문제 였다.
정말 운이 좋아서.. 우연히 전혀 비과학적으로 3일째 소스를 넘기다가 우연히 발견하여
문제를 해결하였다..
이런경우 우리는 "소 뒷발로 쥐잡았다"고 한다.

그런데 이러한 나의 고민은 이후에도 계속되었다.
몇개의 사이트에 문제 해결을 나가는 동안
나는 로그와 소스에만 의존해야 했다.
하드웨어의 로그는 구글에서 검색하면 대부분 나온다.
그러나 애플리케이션이 남기는 로그 인터넷 어디에도 없다 그사이트에만 있는 로그이다.
그렇게 힘들게 몇개의 시스템 문제해결에 참가한 후에

상용 툴을 설치해야 겠다고 생각하게되었다.
지금도 있는 몇개의 툴을 설치했다. 아니 정확하게는 
설치를 시도했다.. 하지만 일반적으로 나에게 주어진 시간은
2~3일 정도 그시간이 지나면 모든 사람은 내얼굴을 보면서
빨리 문제를 해결할 것을 종용한다.
나는 툴 설치를 포기하고 다시 로그와 소스에 의존하여
문제를 해결하였다.

그리고 나서는 안되겠다. 내가 필요한 것을 내가 만들어야 겠다고 생각했다
막상 툴을 만들려고 하니..
애플리케이션을 모니터링하려면 어떻게 해야할까..
아니 정확히는 무엇을 모니터링 할까 하는 원론적인
질문이 고민스러웠다.
CPU,MEM 이런것은 시스템 모니터링 툴들이 알려준다
SQL성능 이것은 DB가 잘 알려준다.
그러면 나는? 애플리케이션을 모니터링 해야 한다.
그런데 Application Server에 동작하는 프로그램은
모양이 비슷하다 사용자(브라우저) 요청을 받아서 결과를 리턴한다.
그 결과를 만들기 위해 DB도 가고 턱시도도 호출하고...
우리는 이런것을 트랜잭션이라고 한다. 
아마 서비스 트랜잭션이 더 맞을 것이다.

그래 나는 이 트랜잭션을 모니터링 해야 겠다. 그때만 해도
프로파일 툴이 일반화 되지 않았지만 
트랜잭션 프로파일링이 필요하다는 결론에 이르렀다.
그래서 일단 트랜잭션 별로 프로파일 정보를 로그파일에 
남겼다. 로그파일 명에 서비스 명과 응답시간을 넣어서
디렉토리에서 쉽게 찾을 수있도록 하였다 물론 프로파일링 툴을 적용하면
이것을 툴에서 할 것이다.하지만 원리는 같다.

그런데 문제가 있었다. 트랜잭션성능과 구간별 시간은 보이는데 애플리케이션 전체를
알 수 없었다 그트랜잭션 하나의 문제가 전체의 문제라는 확신을 할 수가 없었다.

만약 트랜잭션 전체의 성능을 보면 애플리케이션을 알 수 있을텐데
볼 수 없었다. 나는 트랜잭션 프로파일 하나하나를 리뷰했지만
동일 서비스가 트랜잭션에 따라 다른 응답시간을 보이고
이것들의 원인을 정확히 알 수 없었고 그것이 문제의 원인이라고
주장할 수 없었다.

문제는 트랜잭션의 성능을 한눈에 볼필요가 있었다.
즉 문제 핵심은 그많은 트랜잭션(초당 몇백개)의 성능을
어떻게 볼 수 잇게 하느냐가 문제였다 나는 그중에서 프로파일을
분석해야할 트랜잭션을 선별하거나 트랜잭션 간의 연관도를 알고 싶었다

서비스명이 같은 트랜잭션 끼리 묶어서 평균 응답시간을
라인 그래프로 보기도 하고 리스트박스에 표현도 해보았지만
한눈에 모든 트랜잭션을 관찰한다는 것은 어려웠다.

그러다가 유래카..^^ 트랜잭션의 성능을 점으로 표현하면될 것 같았다.
프로그램을 만들어서 모든 트랜잭션을 점으로 화면에 표현하였다..
세로축은 응답시간 가로축은 종료시간으로한 점 그래프를 만들고
그 중에서 점을 선택하면 그 점에 대한 프로파일 정보를 
확인할 수있도록 하였다.

이렇게해서 제니퍼의 XVIEW가 만들어졌다.
XVIEW는 모든 트랜잭션을 한눈에 개별적으로 확인할 수 있다.
현재 어떠한 툴도 트랜잭션 모니터링을 이렇게 하지는 않는다.

XVIEW에서는 느린 서비스 혹은 같은 시간대에 수행된 트랜잭션들을 
직관적으로 확인하고 그들간의 상관관계를 확인할 수 있다

동일 서비스에 대해 느릴때와 빠를 때의 차이를 상대비교할 수있으며
트랜잭션간의 락이 발생하거나 자원의 부적이 응답시간에 어떻게
영향을 미치는지도 직관적으로 확인할 수 있다.

그뒤로 나는 애플리케이션 성능 바라보는데 한단계 수준 업이 되었다는 것을 느끼게 되었다.


Posted by sjokim
,
2000년대 초기부터 2005년 무렵까지 엔터프라이즈 시스템 구축을 주도하던 키워드는 한마디로 COMPONENT였다. 
CBD에 관한 책들은 우후죽순처럼 쏟아져 나왔고 CBD를 이야기 하지 않으면 프로젝트는 시작될 수 없었다. 모든 개발관련툴은 CBD를 지원한다는 광고를 실어야 했고 CBD를 모르면 개발자로 참여할 수도 없었다. 

그런데 지금 CBD는 어디에 있는가?
엔터프라이즈 시스템에서 CBD는 더이상 키워드가 되지 못하고 있다. 4GL이나 3Tier와는 너무도 다른 양상이다. 컴포넌트 개념은 Technical 문제를 다루는 곳에서 존재하지만 이것은 여전히 예전의 라이브러리 개념과 별 차이를 보이지 못하며 정작 CBD가 주장하던 비즈니스 컴포넌트 개념은 온데간데 없다. 혹시 내가 모르는 곳에서 숨어서 꽃을 피우고 있나? 아닐 것이다.

사람들은 더이상 비즈니스 컴포넌트에 집착하지 않는다. 적당히 유야무야되었다는 것이 정확할 것이다. 이런 글을 쓰고 있는 나 또한 그 시절에 CBD가 미래를 열어 줄 것이라 확신했었다. 뭔가 내가 부족하기 때문에 컴포넌트 개념을 잘 이해 못하고 그래서 내가 참여했던 프로젝트에서 비즈니스 컴포넌트 개념이 정착되지 못하는 것이라 생각했었다.

그런데 내가 이 시점에 CBD를 이야기하는 것은 정말 과거의 우리 신념에 대한 반성이 없이 새로운 키워드를 찾으려고 노력한다는 것을 지적하고 싶다. 컴포넌트 개념이 정말로 나 스스로를 포함한 모든 사람을 위선으로 빠트리기 위한 거짓부렁에 불과했는가? 아니면 일정정도 의미가 있고 가치있는 개념이었는가?

우리는 공개적으로 반성하고 정리해야 할 것이다. 그래야 미래의 새로운 키워드에 대해서 비판적으로 수용할 수 있을 것이다. 

내가 현시점에 CBD를 보는 관점은 기술적으로는 의미잇는 성과를 이루었지만 비즈니스 컴포넌트 관점에서는 실패했다고 생각한다. 나는 CBD의 가장 성공 사례로 이클립스를 꼽는다. 수많은 솔류션이 이클립스로 통합되고 있다. 이클립스는 단순한 개발툴이 아니고 솔류션을 위한 프레임웍 혹은 컨테이너 역할을 하고 있다. 간단한 기능의 유틸리티는 이클립스 플러그인으로 개발하면 너무 훌륭하게 다른 유틸리티들과 함께 사용할 있다.
이런한 모습은 구글폰 같은 핸드폰에서도 나타나고 있다. 

과거의 CBD개념은 분명 100%실패한 개념이 아니라 다른 개념으로 진화해갈 것이고 언제가는 다시한번 세상을 풍미하지 않을까 하는 생각을 해본다. 
그런데 우리는 너무도 쉽게 쫓아가다가 너무도 쉽게 버리고 있는것은 아닌가? 
다시한번 CBD에 대한 개념정리가 공론화 되기를 바라는 마음에서 이글을 써본다.

Posted by sjokim
,

1 개요

이클립스 RCP(Rich Client Platform) 자바로 독립 응용 프로그램을 만들기 위한 강력한 도구를 제공한다. 응용 프로그램을 만들다 보면 본래 기능보다 메뉴라든지, 도구 모음(toolbar) 처리나 프로그램 설정 관리 같은 기능들을 구현하는  오히려  많은 노력과 시간이 투자되경우가 많다. 이클립스 RCP 이러한 문제로부터 프로그래머를 해방시킨다.

지금부터 이클립스 RCP 활용해 예제 프로그램을 만드는 과정을 소개하고자 한다. 직접 따라 해보면, RCP 이용해 그럴 듯한 프로그램 하나를 개발해볼  있을 것이다. 

 

2 예제 프로그램 생성하기

이클립스 RCP 프로그램을 시작하려면 예제 프로그램에서 출발하는 것이 좋다(물론 수정하다보면 나중에는 원본 예제가 모두 사라지게 되겠지만…).

 

프로젝트 생성

다음과 같이 플러그인 프로젝트 만든다.

 

1.  Select a wizard: Plug-in Project 선택하고 Next 클릭

2.  Plug-in Project: Project Name MyRCP 입력하고 Next 클릭

3.  Plug-in Content: Rich Client Application 부분을 Yes 수정  Next 클릭

4.  Templates: RCPMail Template 선택하고 Next 클릭

5.  RCP Mail Template: 그냥 Finish 클릭

 

이렇게 하면 아래와 같이 간단한 전자메일 클라이언트가 만들어진다.

 


그림 1. 예제 프로젝트 생성 모습

 

 화면 중앙의 Launch an Eclipseapplication 부분을 클릭하면 MyRCP 실행된다.

 

3 전자메일 클라이언트를 파일 탐색기로 개조하기

이클립스 RCP 상당 부분을 설정만으로 가능하며, 프로그래밍을 하더라도 응용 프로그램의메뉴, 도구 모음 등은 최소한의 코드로   있게 되어 있다. 여기서는 프로그램적 요소를 중심으로 수정해 MyRCP 프로그램을 간단한 파일 탐색기 형태로 만들어  것이다.  이렇게 함으로써 간단한 RCP프로그램의 구조를 파악할  있을 것이다



그림 2. MyRCP 최초 실행 모습

 

3.1 전자메일 리스트 창을 파일 탐색기 수정하기

예제 프로그램에서 왼쪽 네비게이션  부분을 파일 탐색기 수정해 보자. 예제 프로그램의NavigationView.java 열어보면 jface 프로그래밍이  것을 확인할  있다. 물론 jface사용하면 편리한 점이 많으나 여기서는 swt 사용해 간단한 파일 탐색기 만들어 보겠다(jface 사용하면 좀더 풍부하게 그리고 효과적으로 응용 프로그램을 작성할  있으므로RCP프로그램을 잘하려면 jface 익혀두는 것이 좋다).

NavigationView ViewPart 자식 클래스이므로 createPartControl(Composite) setFocus() 파일 탐색기 기능을 하는 코드를 작성하면 된다(참조 NavigationView.java)

 


그림 3 NavigationView 수정하여 실행

 

레이지 로딩(lazy loading) 구현하기

NavigationView에서 보면 트리 컴포넌트를 구현할  간단한 팁이 들어 있다. 파일 리스트를트리 형태로 보여   목록을 모두 읽을 필요는 없다. 성능 저하를 막기 위해 참조가 발생했을  자식 정보를 읽어 들이도록 코딩된 모습을 확인할  있다.

 

private void buildChildItem(TreeItem item,File file, boolean isroot) {

       if(isroot)

               item.setText(file.getAbsolutePath());// 아이템 루트이면 절대 경로 라벨로 사용

       else

               item.setText(file.getName());// 아이템 루트 아니면 이름만 라벨로 사용

        if(file.isFile()) {

                           item.setText(1,formatSize(file.length()));

                           item.setText(2,formatTime(file.lastModified()));

         }

             item.setImage(getImage(file));

             item.setData("path",file);

             if (hasChild(file)) {

                           item.setExpanded(false);

                           newTreeItem(item, 0); // 더미 아이템

             }

}

 

트리에서 특정 노드의 자식을 보여   해당 아이템에 자식이 존재하는지만을 확인한  만약 자식이 존재한다면 더미 아이템을 추가해 놓고 펼침(expand) 상태를 false  놓는다. 그렇게 하면 해당 트리 아이템 자식이 존재한다는 [+] 표시 보이게 된다. Expand 이벤트가발생할   아이템이 더미 아이템을 삭제하고 실제 자식 아이템들을 보여준다.

다음으로 해당 아이템 펼쳐질  이전에 방문했는지를 검사하여 방문한 적이 없는 아이템 대해서만 방문 기록을 세팅을 하고 buildChild 통해 자식 트리 초기화한다.

 

fileTree.addListener(SWT.Expand, newListener() {

             publicvoid handleEvent(final Event event) {

                           finalTreeItem item = (TreeItem) event.item;

                           if (item.getData("visited") ==null) { // 이전에 방문했는지 확인

                                        item.setData("visited","true"); // 해당 아이템에 방문했음을 설정

                                        buildChild(item);

                           }

             }

};

 

3.2 메시지 창을 파일 뷰어 수정하기

예제에서 오른쪽 메시지 창은 View.java 구현되어 있다. 이것을 매개변수 파일 이름을 받아 화면에 파일 내용을 보여주는 파일 뷰어 수정한다(참조 View.java)
. 
단지 선택된 파일을 읽어 들이는 것이기 때문에 기술적으로 복잡할 것은 없지만 다만 열리는 창에 파일 이름 전달하는 방법이 간단한 이라   있다.

 

MyRCP 프로그램의 텝윈도우 Open Logic

기본적으로   독립적인 컴포넌트다. 따라서 다른 창에서 명시적으로 정보를 전달하기보다는 이벤트 모델을 통해 창들간에 데이터를 전송하는 것이 좋은 방법이나 여기서는 Secondary ID 파일 이름을 전달하는 약간의 트릭을 이용해 전달하고 있다.

 

public static HashMap selection = new HashMap();

public static void openView(String viewId,String path) {

             if(path == null)

                           return;

             IWorkbenchWindowwindow = MyRCPPlugin.getDefault().getWorkbench()

                                        .getActiveWorkbenchWindow();

             selection.put("" +path.hashCode(), path);

             try{

                           window.getActivePage().showView(viewId,"" + path.hashCode(),

                                                     IWorkbenchPage.VIEW_ACTIVATE);

             }catch (PartInitException e) {

                           MessageDialog.openError(window.getShell(),"Error",

                                                     "Erroropening :" + e.getMessage());

             }

}

 

Secondary ID에는 특수 문자를 사용할  없기 때문에, HashMap 파일 이름의 해시 저장하고 에서 해시 코드 사용해 넘겨진 파일 이름 알아내는 방식을 취하고 있다.  방식을 이용할 경우selection(HashMap) element 수가 계속 늘어날 여지가 있다.

다음 코드는  createPartControl()에서 전달되는 Secondary ID 이용해 파일 이름을 알아내고 화면에 출력하는 것이다.

 

public void createPartControl(Compositeparent) {

             Stringhash = this.getViewSite().getSecondaryId();

             Stringpath = (String)Perspective.selection.get(hash);

             if(path == null)

                           return;

 

3.3 시작 메뉴 수정  초기화

이제 메뉴를 수정한다. 최초의 전자메일 프로그램에서 사용하던 불필요한 메뉴를 제거하고시작할  필요 없는  열리지 않도록 로직을 수정한다.

 

메뉴 구조 수정

메뉴와 도구 모음 관한 프로그램 코드(ApplicationActionAdvisor.java) 보면, 매우 직관적으로 구현되어 있기 때문에 고치는  어려움이 없을 것이다. 만약 메뉴나 도구 모음 아이템을 추가하고자 한다면 원본 코드에 존재하는 로직을 참고해 동일한 형태로 프로그램을 짜면된다. fillMenuBar(MenuBar 초기화)에서 exitAction aboutAction만을 남기고 나머지는 모두 주석 처리한다. 그리고 fillCoolBar(CoolBar 초기화) 수정해 exitAction aboutAction실행할  있도록 변경한다.

 

화면 크기 수정

예제 프로그램을 보면 화면 영역이   있는데 왼쪽은 25%, 오른쪽은 75% 차지하고 있다. 프로그램이 시작할  이렇게 열리는 화면 영역의 크기를 조정하기 위해서는Perspective.java에서 createInitialLayout(IPageLayout layout) 수정한다.

layout.addStandaloneView(NavigationView.ID,false, IPageLayout.LEFT, 0.25f,editorArea);layout.addStandaloneView(NavigationView.ID, false, IPageLayout.LEFT, 0.5f, editorArea);수정하면 프로그램이 시작될   개의 화면 영역이 각각 50% 점유하게 된다. 그리고folder.addView(View.ID); 주석 처리하면 시작할  불필요한 메시지 화면이 열리지 않는다.

 


그림 4 화면 영역 비율을 수정하여 시작한 모습

 

4 MyRCP 익스포트하기

이제 MyRCP 독립 프로그램으로 실행하기 위해 익스포트한다.

4.1 제품 만들기

만들어진 프로그램을 설정을 통해 익스포트하면 그것이 독립 응용 프로그램이 된다.

 

제품 설정 파일 생성

프로젝트에서 마우스 오른쪽 버튼을 클릭해 New->Product Configuration 선택한다.

 


그림 5 제품 Configuration 생성

 

‘New Product Configuration’ 화면에서 MyRCP 선택하고, ‘File name’ MyRCP.product 입력하고 Finish 클릭한다. 그러면 독립 프로그램으로 실행하기 위한 각종 설정 값들을 지정할  있는 화면이 열린다.

생성된 MyRCP.product 설정은  개의 으로 구성되어 있는데, 간편하게 OverviewConfiguration  개의  설정하면 익스포트  있다.

 

오버뷰 설정

Overview  화면에서 프로그램 이름 같은 기본 정보를 설정한다.

 


그림 6 오버뷰 설정

 

‘Product ID’ 오른편 New 버튼을 클릭하면 ‘New Product Definition’ 화면이 나타난다.


그림 7 제품 정의

 

먼저 ‘Defining Plug-in’ 오른편의 Browse 클릭하여 ‘Plug-in Selection’에서 MyRCP 선택하고 OK 누른다. 둘째로 ‘Product ID’ 임의의 값을 입력한다. 예제에서는 MyRCP 입력했다. 그리고 Finish 선택하면 아래와 같이  필드에 입력 값들이 등록되는 것을   있다.

 


그림 8 오버뷰 입력된 모습

 

설정

MyRCP.product에서 Configuration  선택하면 아래와 같이 비어있는 화면을   있다. MyRCP 독립 응용 프로그램으로 실행하기 위해서는 필요한 플러그인들이 전부 같이 익스포트되어야 한다.

 


그림 9 설정

 

Add 버튼을 누르면 플러그인 선택하는 화면이 보인다.   MyRCP(제품 포함되어야 하는 기본 플러그인) 선택한다.

 



그림 10 MyRCP 플러그인 추가

 

MyRCP 플러그인 동작하려면 의존 관계에 있는 다른 플러그인 모두 추가돼야 하지만 이클립스에는  작업 자동으로 수행해 주는 기능이 있다. 화면에서 ‘Add RequiredPlug-ins’클릭하면 이미 추가된 MyRCP 동작하기 위해 필요한 모든 플러그인들이 자동으로 추가된다.

 



그림 11 필요한 플러그인 자동 추가

 

제품 익스포트  실행

MyRCP 독립 응용 프로그램으로 수행하기 위해 익스포트 해야 한다.

 



그림 12 익스포트

 

MyRCP.product Overview 화면에서 Exporting 영역의 ‘Eclipse Product export wizard’ 클릭해 익스포트 수행한다.

 



그림 13 익스포트 위치 지정

 

Export 창에서 ‘Archive file’ 적절한 경로 입력하고 Finish 클릭하면 익스포트 수행된다. 익스포트 파일을 적당한 디렉터리에 풀어서 실행하면 된다.

 

4.2  기타 유용한   가지

사소하지만 처음 RCP 만들  공유하고자 하는 내용을 정리해 보았다.

 

설정 사용하기

이클립스에서는 환경 설정을 위한 기능을 제공하고 대부분의 설정 정보는 이곳에 넣는 것이일반적이다. 그러나 java –Dxxx=100 같이 사용하고자 한다면 configure/config.ini 값을 넣고 System.getProperty(“xxx”)형태로 프로그램에서 읽어 사용할  있다.

 

메모리 지정하기

MyRCP 자바 프로그램이기 때문에 메모리 지정이 필요하다 익스포트 전에MyRCP.product Configuration 에서 지정할 수도 있지만, 메모리 옵션을 바꾸려고 매번 익스포트 수는 없다.

메모리를 포함한 JVM 옵션은 eclipse.ini 저장되어 있다. 그런데 만약 Configuration 에서JVM 옵션을 지정하지 않으면 eclipse.ini 파일 자체가 만들어지지 않는다.

 

 모양 바꾸기

실행한 화면을 보면  이클립스와 모양이 다른 것을   있다. 이것을 수정하려면plugin_customization.ini 파일에 속성 설정이 필요하다. configuration/config.ini 파일에 필요한설정을 넣고 그것을 프로그램에서 사용하면 효과적이다. config.iniorg.eclipse.ui/SHOW_TRADITIONAL_STYLE_TABS=false 설정되면  모양이 이클립스처럼 부드럽게 변경된다. 속성을 적용하려면 plugin_customization.ini MyRCP 플러그인같이 패키징되어야 한다.

 



그림 14 MyRCP 프로젝트 구조

 



그림 15 빌드 목록에 plugin_customization.ini 추가

 

Build.properties 파일을 열어 위와 같이 바이너리 빌드에서 체크 주면 같이 패키징된다.



그림 16  모양이 바뀐 MyRCP

 

다시 MyRCP 실행하면 바뀐 모양을 확인할  있다.

 

결론

RCP초보자라면 지금까지 간단한 샘플을 통해서 RCP 대한 몇가지 의미있는 가치들을 발견할  있었을 것이다. 응용프로그램을 자바로 하면서도 4GL보다 나은 프로덕을 쉽게 만들수있다는 것은 정말 강력한 매력이다.

아직은 RCP 시장에서 붐은 아니지만 이클립스 RCP 접한 사람중에서 그가치를 높게 평가하지 않는 사람은 없다. 자바 개발자라면 RCP 접해두는 것은  필요하고도 가치있는 일이다.


'코딩과 개발' 카테고리의 다른 글

Java Launcher만들기  (0) 2012.09.19
The GNU C Library Reference Manual  (0) 2009.10.30
멀티 쓰레드 패턴  (0) 2009.10.26
Java ClassLoader 이해하기  (0) 2009.10.26
Posted by sjokim
,

우리들 중 다수는 부하테스트(Load Test) 스트레스 테스트(Stress Test)의 용어의 차이를 잘 모른 채 그냥 동의어로 사용하는 경향이 있다. 이러한 용어의 명확한 구분 없이 사용하는 사이트의 경우는, 도대체 적절한 부하테스트를 하자는 것인지, 의미있는 스트레스 테스트를 하자는 것인지 목표가 명확하지 않는 경우가 대부분이다.

스트레스테스트(Stress Test)는 어플리케이션이 실행 시에 필요로 하는 각종 리소스(CPU, RAM, Disk )의 허용하는 한도를 넘어서서 비정상적인 높은 부하를 발생시켜보는 테스트를 일컫는다. 일정한 한도를 넘어서는 부하 상황이 되면 경우에 따라 JVM이 다운되거나, 데이터를 잃어버리게 되는 것 등과 같이 시스템의 비정상적인 작동을 유발시킬 수도 있다. 이 같은 결점(Bug)이나 결함(failure)을 찾기 위해 스트레스를 가해 보는 것이다. 스트레스 테스트 시의 부하(일련의 들어오는 요청)는 이처럼 시스템 리소스의 한계점을 시험하려는 의도이기 때문에, 다분히 의도적으로 왜곡되는 경향이 있으며, 향후 실제 접속자에 의해 발생하는 부하량 패턴과는 거리가 멀 수도 있다.

반면, 부하테스트(Load Test)는 적절한 부하를 발생시켜 통계적으로 의미있는 수치를 측정하는 테스트를 일컫는다. 부하테스트의 두 가지 중요한 목적 중 하나는 장시간 서비스 가능 여부를 확인하는 신뢰성(reliability) 테스트와 두 번째는 성능 테스트(Performance Test)이다. 부하테스트(Load Test)라는 용어 자체는 대단히 모호하며 그 용어를 의미있게 사용하기엔 너무나 일반적이고 미흡한 면이 없잖아 있다. 예를 들어 부하(Load)라는 것이 과부하(Overload) 높은부하(High Load)를 암묵적으로 항상 의미한다고 생각하는가? 성능테스트(Performance Test) 관점에서의 부하(Load)는 최소레벨(0 tps)에서부터, 리소스 고갈 상황이나 기형적인 응답시간의 극심한 저하 혹은 트렌젝션 실패 등과 같은 상황이 발생하기 직전까지의 최대 레벨(Maximum tps)까지 다양할 수 있다.

성능테스트(Performance Test)는 부하테스트 중 하나의 관점, 즉 성능적 관점만 측정하겠다는 뜻이 담겨 있다. 해당 시스템 혹은 어플리케이션의 성능을 측정한다함은 점진적인 부하량 증가 과정에서 더 이상 단위시간당 최대 처리량(TPS)이 증가하지 않을 때, 그 때의 수치를 측정하고 그 수치를 해석하는 과정을 의미한다. 성능테스트의 일반적인 목적은 현재의 시스템 혹은 어플리케이션이 최대로 수용가능한 동시단말사용자수가 몇 명인지, 혹은 목표로 정한 성능이 도출되지 않을 때 병목지점이 어딘지를 밝히고 목표성능을 획득하기 위해 무엇을 시정해야하는지를 찾아내기 위함이다. 성능테스트 과정에서 매우 중요한 부분은 목표성능을 설정하고 그러한 목표성능을 확인/측정하기 위해 향후 시스템 운영 중에 실제로 발생할 접속사용자의 호출패턴이 어떠하냐를 분석/추정하는 과정이 반드시 필요하고, 이를 근간으로 점진적 부하를 발생시켜야 의미있는 성능테스트 결과를 도출할 수 있다. 그렇지 않을 경우 성능테스트가 자칫 스트레스테스트로 끝나고 만다. 

각 용어를 도식으로 표현하면 다음과 같다.



Posted by sjokim
,

1 java에서 class path

자바는 클래스를 기반으로 동작하도록 만들어진 프로그램 언어이다. 그리고 자바 클래스를 실행하는 엔진을 자바 가상 머신(JVM)이라 한다. JVM은 물리적으로 java.exe라는 실행 파일과 부속 라이브러리로 되어있다.

JVM(java.exe)이 수행할  클래스의 위치가 classpath이다.

클래스패스 설정

Java.exe가 인식할 수 있는 클래스패스에는 여러 가지가 있다. 그중에서 크게 java.exe가 실행하면서 로딩하는 bootclass java.lang.ClassLoader에 의해 로딩되는 일반 클래스가 있다.

Bootclass java.exe에 의해 로딩되면 JVM이 초기화되면서 필요한 클래스들로 이루어져 있다.System.getProperty("sun.boot.class.path")에서 확인할 수 있다.

JVM초기화 과정이 끝나면 java java.lang.ClassLoader를 통해서 어플리케이션 클래스들을 로딩한다. System.getProperty("java.class.path")에서 값을 확인할 수 있다.

Hello 클래스를 만들어 실행하는 방식을 알아보자.

>Hello.java를 컴파일하여 hello.jar파일 생성

1.       Jar파일을 CLASSPATH환경변수에 설정

>set CLASSPATH=hello.jar

>java test.Hello

2. jar파일을 -cp 혹은 -classpath를 이용하여 직접 설정

>java  -cp hello.jar  test.Hello

>java  -classpath hello.jar test.Hello

3. Xbootclasspath hello.jar를 설정하여 실행하는 방법

>java  -Xbootclasspath/p:hello.jar  test.Hello

>java  -Xbootclasspath/a:hello.jar  test.Hello

4. JAVA_HOME/jre/lib/ext hello.jar를 복사하고 실행

>copy hello.jar %JAVA_HOME%/jre/lib/ext/.

>java  -Xbootclasspath/a:hello.jar  test.Hello

JAVA_HOME/jre/lib/ext의 파일들은 System.getProperty("java.class.path")에 표현되지 않는다.

5. -jar를 이용하여 바로 실행

Jar파일내에 /META-INF/MANIFEST.MF 파일을 만들어 넣는다. 만약 존재하면 다음과 같이Main-Class: 속성을 추가한다.

Manifest-Version: 1.0

Main-Class: test.Hello

그리고 다음과 같이 실행하면 test.Hello가 실행된다.

>java  -jar hello.jar

 -jar로 수행할 때 클래스 패스를 추가하려면

Manifest-Version: 1.0

Main-Class: test.Hello

Class-Path: a.jar b.jar

클래스 로딩 순서

만약 동일한 클래스가 여러곳에 설정되어있을 때 로딩되는 우선순위는 다음과 같다.

>Xbootclasspath에 설정된 파일  ç BOOT LOADER

> JAVA_HOME/jre/lib/ext에 있는 파일  ç EXT LOADER

>MENIFEST.MF Class-Path:에 설정된 클래스  ç APP LOADER

>-cp or -classpath에 설정된 파일                   ç APP LOADER

>환경변수 CLASSPATH에 설정된 파일               ç APP LOADER

ü        Java  -jar로 클래스를 실행한 경우 클래스패스를 추가하고자 하면JAVA_HOME/jre/lib/ext에 복사하거나 MENIFEST.MF Class-Path를 편집하는 방법이 있다.

ü        App Loader를 위한 클래스 패스 설정은 같이 사용할 수 없고 그 중에서 하나를 선택해야 한다.

클래스 로더 구조

자바에서 모든 클래스로더는 java.lang.ClassLoader child클래스 이다. 클래스 로더에서 말하는Parent/Child관계는 상속관계를 의미하는 것이 아니고 ClassLoader Chain에서 선행 Node를 의미한다.


여기서 ExtClassLoader AppClassLoader Parent ClassLoader이다. 마찮가지로AppClassLoader SubAppClassLoader parent이다.

ClassLoader의 주요 메소드의 소스를 파악하면 쉽게 이해 할 수 있다.

protected Class findClass(String name) throws ClassNotFoundException {

             throw new ClassNotFoundException(name);  ç 각 로더 마다 재정의된다.

 }

 

protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException

    {

             // First, check if the class has already been loaded

             Class c = findLoadedClass(name);

             if (c == null) {

                 try {

                           if (parent != null) {

                               c = parent.loadClass(name, false); ç ParentLoader 에게 먼저 요청

                           } else {

                               c = findBootstrapClass0(name);

                           }

                 } catch (ClassNotFoundException e) {

                     // If still not found, then call findClass in order to find the class.

                     c = findClass(name);

                 }

             }

             return c;

    }

각 클래스로더는 findClass를 재정의해야 한다.각 로더의 findClass  클래스 패스에서  요청된 클래스가 존재하는지 확인하고 로딩한다.

개별 로더는 자신의 클래스 패스를 검색하기 전에 parent클래스 로더에게 해당 클래스 로딩을 먼저 요청한다. 따라서 자바에서 동일한 파일을 여러 곳에 복사하더라도 항상 최상위 클래스패스의 클래스가 로딩된다.

2 Application Server ClassLoader

단순한 자바 Application의 클래스로더는 SystemClassLoader(BootClassLoader), ExtClassLoader, AppClassLoader 3계층으로 구성된다. 그러나 WAS Servlet컨테이너와 그 아래에 각 Servlet Context를 위한 클래스 로더를 별도로 두고 있다.

 



AppClassLoader ServletContainerClassLoader는 같이 사용되기도 하지만 보통 분리된다. Tomcat의 경우 ServletContainerClassLoader TOMCAT_HOME/common/lib의 클래스들을 로딩한다.

ServletContainerClassLoader ServletContextClassLoader WAS벤더에 의해 구현되기 때문에 세부적인 상황이 버전에 따라 다를 수 있다. 따라서 구체적으로 클래스를 어떻게 배치할 것인가는 해당 WAS의 구현을 확인하고 결정해야 한다.

3 Servlet 2.3 spec for ClassLoader

서블릿 스팩을 보면 WAR를 위한 클래스 로딩 방식이 일반 자바 클래스 로더와 규칙이 다름을 알 수있다.

Servlet Spec

SRV.9.5 Directory Structure

The web application classloader must load classes from the WEB-INF/ classes directory first, and then from library JARs in the WEB-INF/lib directory.

..

SRV.9.7.2 Web Application Classloader

The classloader that a container uses to load a servlet in a WAR must allow the developer to load any resources contained in library JARs within the WAR following normal J2SE semantics using getResource().

It must not allow the WAR to override J2SE or Java servlet API classes.

It is further recommended that the loader not allow servlets in the WAR access to the web container’s implementation classes.

It is recommended also that the application class loader be implemented so that classes and resources packaged within the WAR are loaded in preference to classes and resources residing in container-wide library JARs.

스팩과 클래스 로더

-         WEB-INF/classes WEB-INF/lib는 동일 로더에 의해 로딩되지만 로더는 WEB-INF/clasess를 먼저 검색/로딩한다(must)

-         Servlet-API를 구현한 서블릿 컨테이너 클래스를 웹 어플리케이션이 Access할 수 없도록 하라(recommend)

-         WAR내부의 클래스를 컨테이너 클래스 패스의 클래스보다 먼저 로딩하라(recommend)

서블릿 스팩의 일부 모호한 점으로 인해 (recommend)형태의 항목은 서브릿 엔진에 따라서 다르게 구현하고 있거나 옵션 처리되어 있을 것이다.

4 ServletContextClassLoader구현

서블릿 스팩을 근거로 하여 ServletContextClassLoader(이하 SCCL)의 구현하기 위해서는 다음과 같은 형태로 로직이 구현되어야 한다. 클래스 load 요청이 들어 오면 먼저 자기 자신의 클래스 패스를 검색하고 이후에 parent 로더에게 요청한다.

 protected synchronized Class loadClass(String name, boolean resolve) {

             // First, check if the class has already been loaded

             Class c = findLoadedClass(name);

           If(c == null){

try{

c = findClass(name); ç Own Classpath 먼저 검색

} catch (ClassNotFoundException e) {

if (parent != null) {

                     c = parent.loadClass(name, false);

                  } else {

                     c = findBootstrapClass0(name);

                  }

}

}

             return c;

    }

 

위 로직은 서블릿 스팩을 완전하게 구현한 것이 아니다. 실제 서블릿 스팩을 보면 servlet API 관련한 클래스는 WAR가 아닌 Servlet Container에서 로딩하도록 되어있다. 따라서c=findClass(name)을 수행하기 전에 로딩해야 할 클래스가 서블릿 API관련한 클래스인지를 검사하는 로직이 필요하다. 만약 로딩해야할 클래스가 서블릿API관련 클래스이면 parent.loadClass()를 먼저 호출하도록 구현되어야 한다.

5 WAR 개념과 클래스 로딩의 우선순위

근원적으로 컴포넌트 컴포넌트 내부의 정보를 감추고 인터페이스 만으로 외부와 통신한다. WAR는 이러한 컴포넌트 개념을 지원하고 있으며 따라서 동일한 클래스가 WAR 외부와 내부에 존재할 때WAR는 내부의 클래스를 우선적으로 사용해야 한다


 

ContainerClassLoader WARClassLoader Parent 클래스이다. 따라서 Java클래스 로더 정책에 의해서는 Container ClassA가 로딩되어야 한다. 하지만 Servlet Spec2.3에 의해서 WAR Class A 가 로딩된다. 컴포넌트 개념에서는 외부 클래스가 아닌 내부 클래스 (Class A)가 사용되어야만 내부 로직이 바뀌어도 외부에 영향을 미치지 않으며, 컴포넌트(WAR)가 어느 컨테이너에 설치되더라도 내부 로직이 일관되게 동작할 것이다.

그러나 이것은 공통 클래스의 관리를 어렵게 할 가능성이 높다. 다음 예를 보자.

 



OracleConnection은 컴포넌트에 의존적이라기 보다는 외부자원(DBMS)에 의존적인 클래스 이다. JDBC드라이버가 WAR파일 안에 존재 한다면, JDBC 드라이버의 버전을 관리하는데 있어 모든WAR파일을 재배포해야 하는 상황이 발생하게 된다. 또한 위와 같이 Container의 공통클래스가DB를 사용하기 위해서 OracleConnection을 사용해야 하는 상황이 발생하고 이 클래스의 내용이WAR파일의 클래스와 참조관계가 형성되는 경우에는 VerifyError혹는 ClassCastException등이 발생할 수 있다.

 

따라서 WAR파일에 JDBC드라이버와 같이 외부 의존적인 클래스 혹은 Framework과 같은 공통 클래스를 같이 두는 것은 좋은 정책이 아니다. 내부 로직만을 위한 클래스이면서 외부요인에 의해서 변경되지 않아도 되는 라이브러리 클래스(ex. Regexp, Parser) WAR파일 내에 두는 것이 좋다.


'코딩과 개발' 카테고리의 다른 글

Java Launcher만들기  (0) 2012.09.19
The GNU C Library Reference Manual  (0) 2009.10.30
멀티 쓰레드 패턴  (0) 2009.10.26
Eclipse RCP 따라하기  (1) 2009.10.26
Posted by sjokim
,

아키텍쳐가 처음에 의도했던 방향대로 제대로 설계되었는지를 검증하는 분석 방법론으로, 설계된 아키텍쳐가 시스템 성능, 가용성, 확정성 등과 같은 비기능 요구사항에 대한 항목에 대해 초기에 의도했던 품질 목표를 만족시키고 있는지 분석하고, 여러 가지 품질 목표가 상호간에 어떻게 작용하는지 파악하는 것이 주요 역할이다.

ATAM은 일반적인 아키텍쳐 분석 방법과 유사하지만, 특히 다음과 같은 점이 중요하다.

  • “이해 당사자의 능동적이고 적극적인 참여”,
  • “핵심 이해 당사자의 충분한 준비”,
  • “아키텍쳐 디자인 이슈와 분석 모델에 대한 이해”,
  • “비기능 요구사항에 대한 명확한 정리”

ATAM을 통해 비기능 요구사항에 대한 자세한 분석, 아키텍쳐의 결정사항에 대한 이해, 그리고 그 결정사항이 요구사항을 만족시킬 수 있는지를 분석할 수 있다.

아키텍쳐 평가의 목적은 설계된 아키텍쳐의 결함을 확인하고, 비기능 요구사항의 관점에서 평가하는 것이 목적이며 아키텍쳐의 잠재적인 위험 요소를 감지하는 도구 역할을 한다. 이 평가 절차는 소프트웨어 개발 주기의 초기 단계에서 수행할 수 있으며, 구현이 아닌 설계된 디자인을 평가하기 때문에 상대적으로 비용이 저렴하고 빠르다는 것이 장점이다.

또한 아키텍쳐의 중요성을 일깨우고 아키텍쳐와 관련된 산출물의 수준을 높이는 것과 함께 아키텍쳐 분석 시 위험요소, Trade-off 요소등에 대해 파악하고 향후 개선안을 도출하는 것이 이 평가의 중요한 목표이다.

ATAM Process


Present the ATAM

평가팀이 모든 이해 관계자에게 평가 절차에 대해서 설명하는 단계이다. 평가 자체에 대한 설명 및 평가를 진행하는 동안 지켜야 할 여러 가지 규칙에 대해서 설명한다. 참여자에게 평가를 통해 얻을 수 있는 기대사항 등을 질의하며, 평가팀 멤버의 역할 및 다른 참여자의 역할에 대해 설명한다. 평가가 진행되는 동안 생성되는 유틸리티 트리, 시나리오, 아키텍쳐 접근 방법, 아키텍쳐 분석을 위한 기술 및 위험요소, Trade-off 목록에 대해서 자세히 설명하여 적극적인 참여를 유도한다.

Present the Business Drivers

프로젝트의 PM이 비즈니스 관점에서 평가팀에게 시스템에 대해서 설명하는 단계이며 다음의 사항을 위주로 설명한다.
  • 가장 중요한 기능적 요구사항?????
  • 기술적, 관리적, 정치적 제약사항
  • 비즈니스 목표
  • 중요한 이해관계자
  • 품질 목표를 만족시키기 위한 아키텍쳐의 중요사항 평가팀은 비즈니스 드라이버 소개를 듣고 난 후 평가될 시스템의 범위를 정하고, 언급된 이해 관계자, 중요 품질 목표, 제약사항 등을 이해하고 목록을 작성한다.

    Present the Architecture

    아키텍트가 평가팀에게 아키텍쳐에 관해서 가능한 자세하게 설명하는 단계이다.

  • OS, 하드웨어, 미들웨어 등 이미 결정된 기술적인 제약사항
  • 연동해서 사용해야 하는 다른 시스템
  • 품질 요소를 만족시키기 위해 사용한 아키텍쳐 접근 방법

    절차 기록자는 아키텍트가 설명할 때 중요 부분을 기록한다.

    평가팀은 소개된 아키텍쳐 접근 방법, 잠재 위험요소, 추가적인 이해 관계자의 역할 등을 이해한다.

    Identity the Architectural Approaches

    [Present the Architecture]에서 소개된 아키텍쳐 고유의 접근 방법과 아키텍쳐 스타일을 파악하는 단계이다.

    아키텍쳐 접근방법을 확인하는 방법으로는 S/W 아키텍트에게 질의할 수도 있으며 각각의 평가팀 멤버에게서 투표로써 접근방법을 조사할 수도 있다.

    시나리오 기록자는 파악된 아키텍쳐 접근 방법을 기록한다 .

    Generate the Quality Attribute Utility Tree

    평가팀, 아키텍쳐 팀, 프로젝트 매니저 등이 협력하여 유틸리티 트리를 작성하는 단계이다.

    이 단계에서 만들어진 유틸리티 트리는 이후의 평가 스텝에서 가이드 역할을 하며 분석의 목표를 구체화하는 효과를 기대할 수 있다.

    유틸리티 트리를 통해 평가팀이 아키텍쳐의 어느 부분에 집중해야 할 지 등을 파악하고 평가의 범위를 결정하는 데 도움이 된다.


    유틸리티 트리를 생성하는 절차
    1. 루트에 “유틸리티”를 할당한다.
    2. 루트의 하위 노드인 레벨2에 시스템의 품질요소를 할당.(예: Performance, Maintainability 등)
    3. 레벨2 노드를 정제하여 레벨3 노드를 생성한다.
    4. 레벨4 노드로서 품질 시나리오를 생성한다.
    5. H/M/L 단위를 사용하여 시나리오의 중요도를 선정한다.
    6. H에 할당된 시나리오에 대해 그 시나리오를 수행하기가 얼마나 어려운지 아키텍트에게 질의한다.
    7. 품질요구 사항과 트리에서 나타난 중요 품질 요소 차이를 확인한다.
    8. 유틸리티 트리를 기록한다 .

    Analyze the Architectural Approaches

    유틸리티 트리를 통해 평가 범위를 결정한 후, 아키텍쳐 접근 방법과 결정사항을 평가하는 단계로 아키텍쳐의 중요한 부분을 알아낸다.

    이 단계의 가장 중요한 결과물은 Risk, Sensitivity point, Trade-off 등이며, 이들을 유틸리티 트리의 시나리오와 연계하여 품질요소에 대해 평가한다.



    Brainstorm and Prioritize Scenarios

    전체 이해 관계자로부터 시나리오를 생성하는 단계이다. 이 시나리오는 전체 이해관계자가 참여하는 투표 프로세스를 통해 우선순위가 정해진다.

    유틸리티 트리는 시나리오를 생성하기 위한 하향식 메커니즘을 제공하는 반면에, 시나리오 Brainstorming은 상향식 접근법으로 시나리오를 생성하는 것이다.

    평가 리더는 이해 관계자가 차례로 시나리오에 대해 말할 수 있도록 라운드로빈 방식으로 진행시킨다.

    시나리오 기록자는 Brainstorming 결과를 기록하여 전 참여자가 볼 수 있도록 게시한다.

    참여자는 게시된 시나리오 결과에 대해 토론하여 합치거나 삭제하여 시나리오를 정제한다.

    시나리오가 결정된 후 투표를 실시한다.

    결정된 시나리오의 수의 30%의 투표권을 할당한다. 
    예를 들면 시나리오의 개수가 20 개라면 각각의 참여자가 투표수는 여섯 표씩 투표할 수 있다. 투표 결과로 높은 우선순위의 시나리오는 다음 스텝에서 분석 대상이 된다


    상위에 랭크된 시나리오 사례


  • 시나리오 별 관련 품질속성

    Analyze the Architectural Approaches

    태스크2에서 선정된 높은 우선순위의 시나리오를 분석한다. 부가적인 아키텍쳐 접근 방법, 위험 요소, 민감 요소 등을 찾아낸다 .

    Present the Results

    스텝 1~2 를 통해 수행한 평가 결과에 대해 최종 보고서를 작성한다

    Two Faces of the ATAM



    '아키텍처와 공학' 카테고리의 다른 글

    프로젝트위험신호  (0) 2009.10.26
    CBD는 어디로 갔는가?  (0) 2009.10.26
    Software Architecture Analysis Method(SAAM)  (0) 2009.10.26
    파일럿(Pilot)과 프로토타이핑  (0) 2009.10.26
    재사용 효과  (1) 2009.10.26
    Posted by sjokim
    ,

    SAAM은 단순한 방법론이다. 특히 아키텍쳐 평가 경험이 없는 경우에 적용하기 적합하다.

    아키텍쳐에 대한 modifiability나 functionality를 평가하는 목적이라면 ATAM보다 유용하다.

    만약 S/W아키텍쳐와 infra아키텍쳐가 별도의 조직에 의해 유지되는 경우에 ATAM을 적용하게 되면 이해관계가 충돌하거나 오히려 평가의 본래 목적을 달성하지 못할 수 있다.이런 상황에서 Application Framework이나 공통 모듈을 집중적으로 검증하고자 한다면 SAAM은 적합한 방법론이라 할 수 있다.

    SAAM은 변화에 대한 아키텍쳐의 준비/고려 상태를 평가하기 때문에 정량화된 평가 결과를 도출하는데 어려움이 있을 수 있다. 다만 다양한 경험을 가진 전문가들의 의견을 하나의 시나리오를 기준으로 판단해봄으로써 향후 방향성을 설정하는데 의미 있는 결과를 얻을 수 있다.

    SAAM을 통해서 프로젝트는 다양한 변경요구가 프로젝트에 미치는 영향을 다양한 stakeholder와 공유할 수 있게 하는 장점이 있다.

    ATAM에 비해 Critical 한 Quality(ex 성능)를 다루지 않음으로써 보다 안전하게 적용할 수 있다.


    Develop Scenarios

    • 시스템이 지원해야 하는 모든 기능성에 대해서 도출한다.
    • 시나리오 도출에 있어 다음을 고려한다.
      • 시스템의 주요 사용
      • 시스템의 사용자
      • 미래의 변경 가능성
      • 시스템이 지원해야 하는 Qualities
    • 시나리오는 Brain storming을 통해서 추출된다. 다양한 관점의 관련 당사자들에 의해 시나리오는 도출될 것이며 경우에 따라서는 동일한 시나리오가 여러 사람에 의해 제기될 수도 있다. 또는 동일한 문제에 관련 있는 다른 관점의 시나리오들이 작성될 수도 있다.
    • 시나리오는 몇 번의 Iteration을 통해서 도출될 수 있다.

    Describe the Architecture(s)

  • 후보 아키텍쳐나 아키텍쳐는 반드시 분석에 참여하는 사람들이 이해 가능한 표기법으로 기술되어야 한다.
  • 아키텍쳐 Description은 시스템 컴퓨팅환경, data 컴포넌트, 그리고 그와 관련된 Connection을 포함해야 한다.
  • The development of scenarios and the description of architecture usually drive each other.
  • description of architecture는 시나리오에 관련한 아키텍쳐 결정을 관련 당사자들에게 알려주는데, 반면에 시나리오는 아키텍쳐에 대한 요구 사항을 반영하고 있다.

    Classify and Prioritize the Scenarios

  • 시나리오는 크게 direct scenario와 indirect scenario로 구분되어 진다.
  • Direct시나리오는 아키텍쳐 디자인 단계에서 이미 고려된 요구 사항들 이다. 따라서 SAAM을 통해서 관련 당사자들은 자신의 요구가 아키텍쳐에 어떻게 반영되었는지를 보다 잘 이해할 수 있다.
  • 아키텍쳐를 수정 없이 반영되어 있는 시나리오를 direct 시나리오라 하고 현재의 아키텍쳐는 지원하지 않고 뭔가 수정이 일어나야만 지원되는 시나리오를 indirect 시나리오라고 한다.
  • Direct시나리오는 Use case와 유사하고 Indirect시나리오는 Change case와 유사하다.
  • 시나리오는 중요한 순서로 정리되는데 이때 중요하다는 기준은 전적으로 관련 당사자들의 판단에 의존한다.

    Individually Evaluate Indirect Scenarios

    • 일단 시나리오가 선택되면 시나리오는 아키텍쳐 결정 사항에 멥핑된다.
      • Direct scenario인 경우 아키텍트는 시나리오가 아키텍쳐에 의해 어떻게 실행되는지를 보인다.
      • Indirect scenario인 경우 아키텍트는 시나리오를 위해 아키텍쳐를 어떻게 변경해야 하는지를 제시한다 ? SAAM
    • Review에 참가하는 사람들은 아키텍쳐의 구조와 각 컴포넌트의 상호 작용에 대해 보다 깊이 이해하게 된다.
    • 모든 indirect scenario를 위해 아키텍쳐 변경에 대한 비용이 추정되어야 한다.
    • 아키텍쳐의 변경이라 함은 새로운 Component혹은 Connect 추가나 기존 Component/Connect의 변경을 의미한다.
    • 본 타스크가 끝나면 모든 시나리오에 대해 direct/indirect구분이 되어야 하고 indirect 시나리오에 대한 아키텍쳐 변경의 비용이 리스트업 되어야 한다.

    Assess Scenarios Interactions

    • 둘 이상의 indirect시나리오를 위해 하나의 컴포넌트 변경을 수반할 때 그 컴포넌트에서 시나리오가 interact한다라고 말한다.
    • 시나리오 interaction이 중요한 이유
      • Product design에서 기능성 배치에 문제가 있음을 의미할 수 있고( poor separation of concerns)
      • 시나리오 interaction은 아키텍쳐의 structural decomposition이 적절하게 이루어 지지 않았음을 암시한다.
    • 만약 시나리오 interaction을 발견하고 해당 컴포넌트를 분할하여 interaction이 나타나지 않는다면 다시 Step2-Describe the Architecture(s)를 수행해야 한다.

    Create the Overall Evaluation

  • 마지막으로 시스템의 성공에 중요한 시나리오 순으로 가중치를 부여한다.
  • 가중치는 주로 시나리오가 표현하는 비즈니스의 중요도와 상관관계를 갖는다.
  • 가중치는 하나를 시스템을 위한 여러 아키텍쳐를 평가하는데 중요한 기준이 된다.
  • 만약 여러 개의 아키텍쳐를 비교한다면 direct 시나리오 수를 평가하는 것도 가능하다 direct시나리오는 아키텍쳐를 수정하지 않고 수행 가능한 것들이기 때문에 아키텍쳐의 완성도를 판단하는데 도움을 줄 수 있다.
  • 경우에 따라서 tabular summary를 만드는 것도 도움이 된다.

    Sample Agenda for a SAAM





  • Posted by sjokim
    ,

    파일럿이란 향후 완성하고자 하는 시스템의 특성(비기능 요구사항 및 기능적 요구사항에 대한 아키텍쳐적 결정)을 갖는 초기의 모형시스템을 만들어 고객의 요구가 적절히 반영되었는지를 파악하기 위한 과정이다. 
    이것은 아키텍트의 결정이 주요 품질 요소들을 충족하는지를 실증적으로 검토하기 위한 과정으로 고객의 만족도를 높일 수 있고 프로젝트 관리자는 개발 생산성에 대한 확신을 얻을 수 있으며, 개발자는 새로운 아키텍쳐를 학습할 수 있는 기회를 갖게 된다.
    파일럿 과정에서 누락된 고객의 요구사항이나 고객의 요구에 대한 잘못된 반영이 발견되면 과감히 문제가 시작된 곳으로 복귀(Feedback)시켜 문제를 해결해야 한다.

    파일럿의 목적으로는 사용자와 개발자 사이에 신속한 피드백을 제공하고 상호간 의견을 명확하게 해주어 추상적인 생각의 차이를 운영 가능한 모형시스템을 통해 사용자의 요구 사항을 충분히 만족할 수 있도록 하는데 그 목적이 있다. 

    1. 프로토타이핑
    1.1 특성
    프로토타이핑이란 최종 시스템이 어떻게 동작하는 지를 보여 주는 것으로, 문서로 된것이 아니라 실제적인 물리적인 모델을 말한다. 다시 말해서 빠른 시간내에 개발된 미완성 시스템인 것이다.

    1.2 사용효과
    프로토타이핑은 소프트웨어의 생산성 및 품질을 향상시켜주고 개발 또는 유지보수의 비용을 절감시켜 준다. 또 개발 초기부터 사용자를 참여시키기 때문에 사용자 만족도를 제고시키고 갑작스러운 변경 요구들의 부작용도 최소화 시킬수 있다.  구체적인 사용효과로는 아래와 같다.
    1) 소프트웨어 생산성 향상
    소프트웨어 생산성이 낮은 이유 중의 하나는 시스템 분석의 불완전성, 부정확성에서 기인한 유지 보수 필요성 때문이다. 프로토타이핑이 개발 기간은 단축시켜 주지 못하더라도 분석을 보다 치밀하게 할 수 있게 함으로 개발 생산성을 향상 시킬수는 있다.

    2) 소프트웨어 품질보증
    프로토타이핑은 사용자의 충족도를 기본 목표로 하여 탄생된 기술이므로 품질 보증 기법으로 사용될 수 있다. 왜냐하면 프로토타이핑이 오류를 감소시킬 것이기 때문이다. 또 시작부터 사용자의 참여를 중시하기 때문에 품질 보증의 개념이 깊숙이 박혀있다.

    3) 개발과 유지 보수비용 절감
    요구 분석의 정확성은 개발의 효율성을 높이고 유지 보수 필요성을 낮게 만들어 전체적으로 비용 절감 효과를 가져온다.

    4) 사용자의 만족도 재고
    시스템 오류의 대부분은(60 ~ 80%) 부정확한 요구 분석에서 기인한다. 잘 알려진 구조적 개발 방법들을 사용해도 사용자는 개발 지연과 품질 미흡에 불평을 하기 십상이다. 그러나 프로토타이핑의 WYSIWYG 의사소통방법과 사용자 참여 환경은 사용자의 기대를 충족시키는 효과를 가져온다.

    5) 사용자 요구의 수용
    사용자의 요구는 시스템에 대한 이해도가 높아지면서 혹은 상상했던 것을 실제 접하면서 변하기 마련이다. 개발자는 이러한 사용자의 애매 모호함과 심정의 변화에 불만 이겠지만 이것은 현실일 수밖에 업다. 따라서 개발자는 생명 주기의 시험 단계에서 크나큰 고충을 겪곤한다. 프로토타이핑은 개발 과정에 사용자의 참여를 유도하고 변할 수밖에 없는 많은 요구들이 생명 주기의 첫 단계에서 수용될 수 있는 기회를 부여하기 때문에 시험 단계에서의 고통을 크게 절감시킬수 있다.

    6) 소프트웨어 유지 보수요구의 평가
    현업 부서의 소프트웨어 개발 및 개선 요구는 흔히 알려진 것보다는 훨씬 많다. 전산 부서의 현실적인 한계 때문에 변경, 추가 요구가 절제되고 있을 뿐이다. 프로토타이핑은 이와 같은 방대한 유지 보수 요구의 타당성 조사 혹은 설득용 도구로 활용될 수 있다.

    7) 기타
    가) 의사소통을 원할히 한다.
    나) 프로젝트 관리를 쉽게하고, 사용자 훈련 시간을 줄인다.
    다) 유지 보수 노력을 줄여준다. 즉 개발 초기에 만족감을 준다.

    2. 프로토타이핑의 개발단계
    아래의 내용은 프로토타이핑을 위한 소프트웨어 개발단계를 기술한 것이다.

    2.1 계획수립
    시스템에 관한 기초적인 이해를 토대로 프로토타이핑 개발방식이 선택되면 계획이 수립되어야 한다. 계획단계에서는 다음과 같은 내용을 포함한다.
    1) 프로토타이핑 방식의 타당성
    프로토타이핑 프로젝트가 필요한 이유, 기대효과 등을 설명한다.

    2) 목표 
    달성하고자 하는 프로젝트의 목표를 기술한다.

    3) 작업범위
    프로젝트 기간동안 수행할 작업과 인력 소요정도, 작업의 한계를 명확히 하고 무슨 기법과 도구들이 활용될 것인지 밝힌다.

    4) 사용자의 책임
    사용자가 수행해야 하는 작업과 정보 제공의 책임을 기술한다.

    5) 산출물
    최종 산출물 즉, 프로토타이핑, 하드웨어 구성, 요구 분석서, 설계서, 그리고 사용자 지침서 등이 모두 프로토타이핑의 산출물에 속한다.

    6) 일정표
    상세한 일정 계획을 도표를 이용하여 그린다.

    2.2 요구분석 및 설계
    프로토타이핑을 설계하기 위해서는 먼저 환경 분석을 한후, 개발방법론에 따라 여러가지 도표(Diagram-자료 흐름도, E-R 도표 및 제어 흐름도) 을 차례로 작성한다.
    OMT의 객체지향방법론을 사용할 경우에는 아래의 Diagram이 아닌 통합 표준 객체 지향 방법론인 UML(Unified Modeling Language)방법론에 따라 여러가지의 다른 Diagram이 생성된다.
    1) 환경분석
    프로토타이핑이 시작되면 시스템과 관련된 사용자 및 조직들이 시스템과 무슨 인터페이스를 가질 것인가 파악해 보는 것부터 시작한다.

    2) 자료 흐름도 작성
    사용자 그룹들과 함께 자료 흐름도(DFD)를 작성하여 시스템의 전체 흐름을 우선 파악한다.

    3) ERD 작성
    데이터베이스의 구성을 위해 E-R 도표를 작성한다.

    4) 제어 흐름도 작성
    시스템의 구조나 제어 흐름도를 그려 시스템의 단계적 활용도를 파악한다.

    2.3 구현
    프로토타이핑을 하려면 프로토타이핑 도구 또는 이러한 기능을 갖는 CASE 도구가 필요하다. 따라서 4세대 언어 기능(4GL)을 갖춘 개발도구와 관계형 DBMS가 있어야 한다.
    1) 데이타베이스 설계 및 구축
    객체간 관계를 설정하고 관계형 DBMS의 정규화된 테이블을 모형화한다.

    2) 사용자 인터페이스 구현
    요구 분석 및 설계 단계에서 설계되었던 제어 흐름도에 따라 개발한다. 또한 메뉴 상의 특정 항목이 선택 되었을때 무슨 화면을 띄우고 또한 무슨 프로시저를 불러 기능을 수행할 것인지를 4GL툴을 이용해 개발한다.

    2.4 프로토타입 데모
    사용자 집단의 정확한 요구를 파악하기 위해서 데모를 수행한다. 이것을 통해 시스템에 대한 사용자의 이해를 돕고, 새로운 의견을 청취해서 본격적인 설계를 할 수 있는 분석자료로 사용한다.

    2.5 프로토타입의 지속적인 발전과 사용자의 승인
    기존의 프로토타이핑은 새로운 요구나 변경 요청이 있을 경우에 앞서 설명된 개발주기(SDLC)에 따라 다시 추가적인 요구 분석 및 설계, 개발과정을 반복하며 발전시킬수 있다. 그러기 위해서는 사용자의 승인을 필요로 한다. 단 기능 요구 충족도에 국한된 승인만을 얻고 본격적인 상세 설계에 착수한다.

    2.6 상세 설계 및 개발
    프로토타이핑을 할때 설계된 내용들을 설계의 원칙을 따져가며 다시 검토하고 시스템 전체를 위한 상세 설계를 수행한다. 그리고 이를 구현시켜 완벽한 시스템이 되도록 한다.

    2.7 성능조율(System Tunning)
    성능 조율이란 개발된 프로토타입에 부하 시험을 가하여 신뢰성을 향상 시키고 데이터베이스의 구조를 최적화 시켜 효율성을 높이는 작업이다. 또한 시스템의 요구가 필요한 경우 변경을 가하고, 관계형 DBMS의 성능강화를 위해 불필요한 데이터는 다른 곳으로 옮기거나 압축시켜 저장하는 등의 작업도 수행한다.

    2.8 품질평가
    개발자에 의해 시스템으로 제작되는 과정에서 품질에 관한 평가를 받아야 한다. 일반적인 시스템 인수 시험제도가 이용될 수 있다. 또, 이용자와 함께 개발되는 시스템이므로 프로젝트 계획에 따라 점검 목록을 만들어 활용하는 것도 가능하다.

    2.9 유지보수
    사용자와 함께 개발된 시스템이므로 유지 보수의 요구가 줄어들지만, 새로운 기능의 추가나 다른 하드웨어로의 이식이 요구될 경우  프로토타이핑의 주기를 다시 수행함으로써 효율적인 유지 보수를 할수 있다.


     


    Posted by sjokim
    ,