위 파일을 다운받아 리눅스 서버에 갖다 놓는다.

tar xvzf cronolog-1.6.2.tar.gz 로 압축을 푼다

명령어는 다음과 같다

./configure
make && make install

설치 완료!
/usr/local/sbin/ 에 설치되어 있음을 확인.

httpd.conf 를 수정

vi /usr/local/apache/conf/httpd.conf

기존

CustomLog logs/access_log combined

이걸 이렇게 변경

CustomLog "|/usr/local/sbin/cronolog /data2/server/apache/logs/info.daum.net.access_log.%Y.%m.%d" common

이 설정은 info.daum.net.access_log 파일을

info.daum.net.access_log.20060322
info.daum.net.access_log.20060323

이런 식으로 일자별로 분할해 주는 옵션이다.

그리고 마지막으로 /bin/apachectl restart

끝~!
Posted by 서오석
,

이번 회사소개 만들면서 버츄얼 호스트때문에 머리 깨지는 줄 알았다.

2일을 그냥 날려먹었다..--;;

recruit.daum.net 도메인을 받았는데 아파치 설정에 rewrite할 줄 몰라 너무 애먹었다.

물론 이번 공채 지원하는 사람들이 이것 때문에 불편했을거다..

아파치 설정에서 httpd.conf를 연 다음에 대략 중간에 다음과 같이 쓰면 된다.

 RewriteEngine On      
   RewriteCond %{HTTP_HOST} ^recruit\.daum\.net$ 
        이건 Rewrite Condition이다 만약  %{HTTP_HOST}가 recruit.daum.net이라면
        True로 반환해서 아래의 RewriteRule을 진행하게 된다.

   RewriteRule ^/$ http://recruit.daum.net/Daum/recruit/currentOpportunities.do [L]
        URL창에 들어온 URL 뒷부분이 그냥 / 이면
        http://recruit.daum.net/Daum/recruit/currentOpportunities.do를 수행한다.
        뒤에 붙은 [L]은 수행후 RewriteRule을 종료하란 것이다.
        그러니까 저 currentOpportunities.do를 날려준 후에 위의 컨디션에 대한 RewriteRule을
        종료시키는 것이다.

   RewriteCond %{HTTP_HOST} ^ir\.daum\.net$
       다시 컨디션을 체크하고..
   RewriteRule ^/$ http://ir.daum.net/Daum/ir/stockInformation.do [L]
       다시 Rewrite를 수행 후 Rule 종료.
뭐 대략 이렇다.
 

원본 소스를 긁어다 대충 약간 붙여야겠다.

httpd.conf의 일부



Posted by 서오석
,
http://www.cyworld.com/lovemo_two/1864531

리눅스에서 ip보실 경우에 우선 ifconfig의 권한은 다음과 같습니다.

-rwxr-xr-x 1 root root 121680 8월 26 2003 /sbin/ifconfig

소유자가 root이므로 슈퍼유저(root)로 ifconfig 명령어가 실행되어ip를 볼 수 있습니다.

[root@ip199 up2]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:30:6E:F3:DB:6E
inet addr:192.168.1.43 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1497719 errors:1 dropped:0 overruns:0 frame:1
TX packets:1507129 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1421021260 (1355.1 Mb) TX bytes:1439077789 (1372.4 Mb)
Interrupt:53 Base address:0xd00 Memory:80020000-80020038

위의 /sbin/ifconfig 권한은 other 사용자도 읽기와 실행이 가능합니다.
따라서 badugizzang 사용자로 ifconfig 실행시 다음과 같은 메시지가 나옵니다.

[badugizzang@ip199 badugizzang]$ ifconfig
-bash: ifconfig: command not found

이것은 badugizzang의 PATH에 /sbin이 없기 때문입니다.

[badugizzang@ip199 badugizzang]$ echo $PATH
/usr/kerberos/bin:/bin:/usr/bin:/usr/local/bin:/usr/bin/X11:/usr/X11R6/bin:/home/badugizzang/bin

따라서 절대경로(/sbin/ifconfig)를 사용하여 다음과 같이 확인 할 수 있습니다.

[badugizzang@ip199 badugizzang]$ /sbin/ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:30:6E:F3:DB:6E
inet addr:192.168.1.43 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1497897 errors:1 dropped:0 overruns:0 frame:1
TX packets:1507266 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1421038138 (1355.2 Mb) TX bytes:1439094067 (1372.4 Mb)
Interrupt:53 Base address:0xd00 Memory:80020000-80020038

* 결론
ifconfig 권한의 설정에 따라서 소유자, 그룹, 그외의 사용자가 읽거나 쓰거나 실행 할 수 있는 것입니다.
님의 경우 먼저 ifconfig의 권한을 확인하시면 문제점이 해결 될 것입니다.

'서버 이야기 > Linux 이야기' 카테고리의 다른 글

리눅스 명령어 모음  (0) 2009.08.05
apache 재시작 문제  (0) 2009.07.31
리눅스 파일 내용 검색  (1) 2009.07.28
chown 사용하기  (0) 2008.10.27
회사에서 배운 리눅스 명령어들.  (1) 2008.09.19
Posted by 서오석
,
 nslookup file.youthvoice.daum.net  -> 서버 이름과  주소를 보여준다.

iconv -f utf-8 -t euc-kr index.html > index2.html -> 인코딩을 변경한다.

grep -r 10.10.10.10 *  -> 하위 폴더에 10.10.10.10이란 내용을 죄다 찾는다.

tail -f * -> 로그를 실시간으로 본다.

find / -name index.html -print  -> 루트 밑에 index.html을 찾는다~

grep -v ^# httpd.conf | more -> 아파치 httpd.conf 안에 주석달린거 다 날려버리고 주석 없는거 만 보여주기

 cat /proc/meminfo -> 서버의 메모리 사양 확인

cat /proc/cpuinfo -> 서버의 Cpu 사양 확인

mpstat -P ALL 1 -> 메모리 사용률 보여주기

iostat -> I/O 상태 보여주기 뒤에 숫자 붙이면 그 숫자 초 만큼 보여줌



'서버 이야기 > Linux 이야기' 카테고리의 다른 글

리눅스 명령어 모음  (0) 2009.08.05
apache 재시작 문제  (0) 2009.07.31
리눅스 파일 내용 검색  (1) 2009.07.28
chown 사용하기  (0) 2008.10.27
리눅스 IP, Path 설정  (0) 2008.09.25
Posted by 서오석
,
지금 다음 커뮤니케이션 인턴을 하고 있다.

난 울트라 초급개발자다..--;;

모델2도 간신히하고 모델1은 거의 모른다.

오늘 느낀 건 개발자에게서 시간이란 것은 실력과 많은 관계가 있다는 것이다.

어디선가 봤는데 초급개발자와 고급개발자의 실력차이가 24배까지 난다고 했다.

요즘 절실하게 느낀다..

개발업무는 계속들어오는데 내가 워낙 못해서 일이 계속 밀린다..

오늘도 하루종일 했는데 안된다.

아..

웹개발 역시 나랑 안맞다..--;;

'사는 이야기' 카테고리의 다른 글

RFID Tag 이야기  (0) 2009.04.03
OCP 이야기  (0) 2008.12.23
알티베이스 면접 후기  (1) 2008.07.09
"쥐코" (Jay Kim 제작 )  (0) 2008.06.19
우리가 멈추면 세상이 멈춘다.  (0) 2008.05.08
Posted by 서오석
,

타일즈에서 extends가 이상하게 안될때는..

toolbox.xml 에 있는 노드의 경로들이 제대로 잘 박혀 있는지 확인해보자.
기본 default tool들은 괜찮은데, 보통 커스텀으로 박아넣은것들에서 오타가
날 확률이 많으니 조심하자.



삽펐던 사연은 아래 자세히..















=============================================================================


어제 타일즈 삽 펀 사연..



스프링이 대새인데.. 스트러츠로 그냥 하던대로 프로젝트 빌딩을 하고 있었다.

다 하고 나니 이상하게

tiles-defs.xml 에 설정한것과 다르게 동작을 했다.


빌딩과정..
struts-config.xml 에 타일즈 설정을 했고..
<plug-in className="org.apache.struts.tiles.TilesPlugin">
  <set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml, /WEB-INF/tiles-defs-info.xml" />
  <set-property property="definitions-parser-validate" value="true" />
  <set-property property="moduleAware" value="true" />
 </plug-in>

라고 정상적으로 설정을 했고..




벨로시티로 타일즈를 구성한곳에 박아야 하니..
velocity.properties 에도 정상적으로 잘 등록을 했고..

velocimacro.library = VM_global_library.vm
velocimacro.permissions.allow.inline = true
velocimacro.permissions.allow.inline.to.replace.global = false
velocimacro.permissions.allow.inline.local.scope = false 
velocimacro.context.localscope = false

resource.loader = webapp

webapp.resource.loader.class = org.apache.velocity.tools.view.servlet.WebappLoader
webapp.resource.loader.path = /WEB-INF/template/
webapp.resource.loader.cache = false
webapp.resource.loader.modificationCheckInterval = 60

input.encoding=UTF-8
output.encoding=UTF-8
default.contentType=text/html;charset=utf-8

directive.foreach.counter.name = velocityCount
directive.foreach.counter.initial.value = 1




web.xml 에도 vm파일을 사용할 수 있도록 정상적으로 등록을 하고..
<servlet>
  <servlet-name>velocity</servlet-name>
  <servlet-class>
   org.apache.velocity.tools.view.servlet.VelocityViewServlet
  </servlet-class>
  <init-param>
   <param-name>org.apache.velocity.toolbox</param-name>
   <param-value>/WEB-INF/toolbox.xml</param-value>
  </init-param>
  <init-param>
   <param-name>org.apache.velocity.properties</param-name>
   <param-value>/WEB-INF/velocity.properties</param-value>
  </init-param>
  <load-on-startup>10</load-on-startup>
 </servlet>

<servlet-mapping>
  <servlet-name>velocity</servlet-name>
  <url-pattern>*.vm</url-pattern>
 </servlet-mapping>



toolbox.xml 에도 잘 설정을 한듯했다..


그런데 어쩐지 tiles-defs.xml 과 tiles-defs-info.xml 요렇게 2개로 갈라서
처리하려고 했는데..

 tiles-defs.xml
<tiles-definitions>

 <!-- 1단 레이어  -->
 <definition name="layout_onecolumn.tiles" path="/layout/layout_onecolumn.vm">
  <put name="tab" value="/layout/top_tab.vm" />
  <put name="bottom" value="/layout/bottom.vm" />
 </definition>

 <!-- Blank 레이아웃 -->
 <definition name="layout_blank.tiles" path="/layout/layout_blank.vm" />
  <definition name="blank.tiles" path="/layout/blank2.vm" />

</tiles-definitions>




tiles-defs-info.xml
<tiles-definitions>

  <definition name="survey.top.tiles" extends="blank.tiles">
  <put name="content" value="/top/topContent.vm" />
 </definition>
 
 <definition name="survey.survey.tiles" extends="layout_onecolumn.tiles">
  <put name="content" value="/test/topContent.vm" />
 </definition>

</tiles-definitions>



이렇게 설정해서  blank.tiles를 extends 하려고 했는데.. extends를 하는 놈은
안중에도 없고, tils-defs.xml 에 있는 blank.tiles name을 가진 녀석의
/layout/blank2.vm 파일 내용만 보여지는것이다. extends 한녀석도 같이 박혀야
하는데..

그래서 vm파일을 옮겨도 보고, 바꿔도 보고.. 타일즈 문법이 틀렸는지 확인도 해보며
수십번 삽질하다가..

toolbox.xml 의 어떤 한 노드의 경로에 오타가 있단느것을 발견해서
경로를 제대로 잡아주니, extends 가 안되던 것이 에러가 해결됐다..
<!-- Struts -->
 <tool>
  <key>tiles</key>
  <scope>request</scope>
  <class>org.apache.velocity.tools.struts.TilesTool</class>
 </tool>
 
 
 <!-- Custom -->
 <tool>
  <key>strUtil</key>
  <scope>application</scope>
  <class>net.coader.util.velocity.StringUtilsTool</class>
 </tool>

class의 경로에 오타가 있다거나 틀리면 extends문제가 발생한다.
보통 사용자가 java를 통해 custom tool을 만들때 경로를 집어 넣다가 발생할 수 있는
에러 이다.


이건 뭐 차라리 아예 안되서 에러를 내든지 하면 첨부터 설정을 봤을텐데 말이다..
삽질한 내 시간을 돌려줘 ㅠ_ㅠ 


- 내 사수인 종민님 블로그에서 퍼온 것임 -

'개발 이야기 > 유용한 Coding' 카테고리의 다른 글

Java로 쉽게 메일 보내기 메소드 만들기  (0) 2008.11.17
Collections.sort 로 쉽게 소트하기  (0) 2008.11.17
ANT FTP 에러 해결하는 방법  (1) 2008.07.28
chat Server  (0) 2008.05.14
간단한 ChatClient  (0) 2008.05.14
Posted by 서오석
,
이클립스에서 ant java.lang.NoClassDefFoundError: org/apache/commons/net/ftp/FTPClient

이클립스에서 ANT를 이용해 FTP 로 올릴려고 build.xml 작성하는 도중에 에러발생!!


미친에러 자식..--;

에러 : java.lang.NoClassDefFoundError: org/apache/commons/net/ftp/FTPClient

해결 방법 : commons-net-1.4.0.jar을 이클립스 window - preferences - ant - runtime - classpath - ant home entries에 추가해 준다.

Posted by 서오석
,
어제 알티베이스에서 전화가 왔다.

면접보라고..ㅎㅎ

음.. 기대된다.

근데 솔직히 아는게 별로 없어서 붙을 수 있을지 모르겠다..;;

다만 참 멋진 것 같다.

국내 기업이면서 DBMS를 한다는 것도 그렇고 Oracle을 이길라고 한다는 것도 그렇고 말이다.

뭐든 불굴의 의지로 이기려한다는 것.

포기하려 하지 않는다는 것은

세상에서 정말 멋진 일이다.

오늘 3시에 면접인데 토익학원 갔다 가야겠다..ㅎ

토익 숙제 빨랑 해야지.

면접 후기


'사는 이야기' 카테고리의 다른 글

OCP 이야기  (0) 2008.12.23
초급개발자와 중급개발자의 차이.  (1) 2008.07.29
"쥐코" (Jay Kim 제작 )  (0) 2008.06.19
우리가 멈추면 세상이 멈춘다.  (0) 2008.05.08
연구실 이야기 - 졸업프로젝트..  (0) 2008.04.30
Posted by 서오석
,

SQL의 성능은 무엇에 의해 좌우되는가? 여러 가지 요소에 의해 SQL의 성능은 좌우될 것이다. SQL의 성능은 다음의 세 가지 항목에 의해 좌우된다.

● 처리 범위의 양
● 랜덤 액세스의 양
● 정렬의 양

그 럼 처리 범위가 적다는 뜻은 무엇을 의미할까? 처리 범위가 적다는 말은 액세스해야 하는 데이터가 적다는 것을 의미한다. 액세스해야 하는 데이터가 적다면 우리는 인덱스를 이용하여 성능을 보장 받을 수 있을 것이다. 이는 마치 우리가 사전에서 GIRL이라는 단어를 찾을 때 사전의 인덱스를 이용하여 찾는 것과 같을 것이다. 다음 예제를 확인해 보자.

SQL> SELECT 카드번호, 사용액
FROM 거래내역
WHERE 거래일자 = ‘200803’
AND 사용_구분 = ‘정상’;

여기에서 인덱스에 의한 처리 범위를 확인해 보자. 그렇다면 위의 SQL을 위해 생성할 수 있는 인덱스의 종류는 어떻게 되는가?

● 거래일자 인덱스
● 사용_구분 인덱스
● 거래일자+사용_구분 인덱스
● 사용_구분+거래일자 인덱스

거래일자 인덱스

거 래일자 인덱스를 이용한다면 처리 범위는 거래일자 칼럼에 의해서만 감소하게 된다. 따라서, 거래일자 칼럼의 값이 ‘200803’인 데이터를 모두 액세스할 것이다. 액세스한 데이터에 대해 사용_구분 칼럼의 값이 ‘정상’인 데이터만을 결과로 추출하게 된다. 결국, 거래일자 칼럼에 의해서만 처리 범위가 감소하게 되며 사용_구분 칼럼에 의해서는 처리 범위가 감소하지 않게 된다.

사용_구분 인덱스
사 용_구분 칼럼으로 인덱스를 생성하면 사용_구분 칼럼의 값이 ‘정상’인 모든 데이터를 액세스한다. 거래일자 칼럼의 값은 처리 범위를 감소시키기 위한 어떠한 역할도 수행하지 않게 된다. 결국, 사용_구분 인덱스로 인덱스를 생성하게 되면 사용_구분 칼럼의 값만으로 처리 범위가 감소하게 된다.

거래일자+사용_구분 인덱스
해당 인덱스는 거래일자 칼럼의 값이 ‘200703’인 데이터 중 사용_구분 칼럼의 값이 ‘정상’인 데이터만 액세스한다. 거래일자+사용_구분 인덱스를 이용하는 순간 처리 범위는 거래일자 칼럼에 의해 감소하게 되며 감소된 처리 범위에서 사용_구분 칼럼의 값이 ‘정상’인 데이터만을 액세스하게 된다. 거래일자 칼럼과 사용_구분 칼럼에 의해 처리 범위가 감소한다. 따라서, 앞서 언급한 단일 칼럼 인덱스에 비해 처리 범위가 더 많이 감소하게 되므로 성능은 더욱 향상될 것이다.

사용_구분+거래일자 인덱스
세 번째 인덱스와 마찬가지로 사용_구분 칼럼의 값이 ‘정상’인 데이터 중에 거래일자 칼럼의 값이 ‘200803’인 데이터만을 추출하게 된다. 따라서, 해당 인덱스도 사용_구분 칼럼과 거래일자 칼럼에 의해 동시에 처리 범위가 감소하게 된다. 이와 같이 결합 칼럼 인덱스를 생성한다면 처리 범위를 더 많이 감소시킬 수 있게 된다. 이와 같은 이유에서 단일 칼럼 인덱스보다는 결합 칼럼 인덱스를 생성하는 것이 해당 SQL에 대해 더 빠른 성능을 기대할 수 있게 한다.



WHERE 절에 사용되는 연산자

그렇다면 WHERE 조건에 존재하는 모든 칼럼으로 순서에 상관 없이 결합 칼럼 인덱스를 생성하면 인덱스를 구성하는 모든 칼럼에 의해 처리 범위가 감소하게 되는가? 당연히 그것은 아니다. 이를 이해하려면 WHERE 절에 사용하는 연산자의 종류를 이해해야 한다.

● 점 조건 : IN, = 연산자를 이용한 조건을 의미하며 해당 연산자는 하나의 점만을 의미하게 된다.
● 선분 조건 : LIKE, BETWEEN, <, > 등과 같이 점 조건을 제외한 연산자를 사용한 조건을 의미한다. 선분 조건은 하나의 점만을 의미하는 것이 아니면 해당 조건을 만족하는 모든 실수를 의미하게 된다.
WHERE 절에 사용하는 조건은 점 조건과 선분 조건으로 구분된다. 이와 같이 조건에 사용된 연산자에 의해 액세스해야 하는 처리 범위의 차이가 발생한다.
● 점 조건+점 조건 : 두 조건에 의해 처리 범위 감소
● 점 조건+선분 조건 : 두 조건에 의해 처리 범위 감소
● 선분 조건+선분 조건 : 앞의 선분 조건에 의해 처리 범위 감소
● 선분 조건+점 조건 : 앞의 선분 조건에 의해서만 처리 범위 감소

이 내용은 간단하지만 매우 중요한 의미를 내포하고 있다. 예를 들어 확인해 보자.

SQL> SELECT 카드번호, 사용액
FROM 거래내역
WHERE 거래일자 > ‘200803’
AND 사용_구분 = ‘정상’;

이 런 SQL을 수행한다면 앞서 언급한대로 거래일자 조건은 선분 조건이며 사용_구분 조건은 점 조건이 된다. 따라서, 해당 SQL에 대해 최적의 인덱스를 이용하고자 한다면 사용_구분+거래일자 인덱스를 생성해야 한다. 이와 같이 인덱스를 생성한다면 점 조건+선분 조건으로 구성되므로 두 개의 조건에 의해 처리 범위가 감소하게 된다.
이와 같은 현상이 왜 발생하는지는 다음 호에서 자세히 언급하도록 하겠다. 인덱스에서 가장 중요한 요소는 처리 범위를 최소화 시킬 수 있어야 한다는 것이다. 그 중심에는 결합 칼럼 인덱스가 존재한다는 것을 명심하길 바란다. 또한, 결합 칼럼 인덱스를 생성하고자 한다면 점 조건과 선분 조건의 순서에 의해 처리 범위가 변한다는 것에 주의해야 할 것이다.


제공 : DB포탈사이트 DBguide.net

출처 : 마이크로 소프트웨어
Posted by 서오석
,
 
 

지난 회에서 우리는 UML의 전체 구성에 대하여 알아보았다. 전체적인 구성을 보았으니 앞으로 각 다이어그램을 하나씩 보도록 하자.  이번 회에는 유스케이스 다이어그램에 관하여 알아보도록 하겠다.  많은 다이어그램 중에 왜 유스케이스 다이어그램을 가장 먼저 설명을 하는가에 대한 의문이 일것이다.  물론 필자의 마음일 수도 있지만 이 보다도 더 명확한 이유가 존재한다.  독자 여러분이 어떠한 방법론을 배우고 있다 하더라도 프로젝트를 수행함에 있어서 가장 먼저 수행되는 일이 동일할 것이다. 그것은 프로젝트가 무엇인지에 대한 기술이다. 프로젝트가 무엇인지 모르고 어떻게 프로젝트를 수행하겠는가?  이렇게 프로젝트가 무엇인지에 대해서 알아보는 것이 요구분석(Requirement Analysis)이다.  글의 흐름으로 보아 유스케이스 다이어그램이 요구분석을 위한 다이어그램이라는 것을 유추할 수 있을 것이다.  결국 유스케이스 다이어그램은 프로젝트 수행시 가장 먼저 나오는 다이어그램이고 다른 다이어그램의 배경이 되는 중요한 다이어그램이다.  이제부터 유스케이스 다이어그램을 자세히 알아보도록 하겠다.
 
1. 표기(Notation)과 의미(Semantics)
(1) 유스케이스(Usecase)
사용자 삽입 이미지
그림 1. 유스케이스

유스케이스의 표기는 그림 1에서와 같이 타원으로 표시하고 이름을 속에 명시하게된다.
(2) 유스케이스의 의미.
유스케이스는 말 그대로 쓰임새를 나타낸다. 다시 말해 한 프로젝트의 결과물이 작동하여 사용되는 쓰임새를 분류하여 나타내는 것이다. 예를 들어 우리가 늘 상주하는 집을 들면 집이 사용되어지는 예를 들 수가 있다. 집은 식사를 위한 장소를 사용되어질 수 있고 아니면 휴식을 위한 장소 아니면 수면을 취하기 위한 장소.. 등등 여러가지 용도의 사용 예를 들 수 있다. 결국 이러한 여러 사용 예들이 집의 구조를 결정하는 사항이 될 것이다.
(3) 액터(Actor)
사용자 삽입 이미지

그림 2 - 액터
사용자 삽입 이미지

그림 3 - 스테레오 타입이 액터인 클래스
액터의 경우 그림 2에서 보는 바와 같이 스틱맨으로 표시하고 그 하단에 액터의 이름을 명시한다.  또한 그림 3와 같이 스테레오타입(Stereotype)을  'Actor' 로 가지는 클래스로 표기하기도 한다.
(4) 액터의 의미
액터는 구축해야할 시스템과 상호 교류하는 어떠한 사람이나 어떤 것이 될 수 있다. 예를 들어 입출금할 수 있는 ATM기계를 보면 입출금을 하는 행위자인 손님의 경우 하나의 액터가 될 수 있다. 그리고 ATM기계가 입출금의 처리를 위해 연결하는 은행의 주 전산망 또한 하나의 액터가 될 수 있다. 이렇듯이 구축하고자 하는 시스템의 쓰임새와 교류하는 외부적인 것들의 추상적인 역할을 액터라고 한다.
 
2. 액터들간의 관계(Relationship)
(1) 일반화(Generalization) 관계의 표기
사용자 삽입 이미지

그림 4 -액터와 액터 사이의 일반화 관계
(2) 일반화 관계의 의미
일반화 관계는 객체지향의 상속의 의미와 유사하다. 일반화된 액터의 모든 특성을 특수한 액터가 모두 가지게 된다. 그림 4에서와 같이 고객 액터의 모든 특성을 상업고객이 모두 포함하게 된다.
 
3. 액터와 유스케이스, 유스케이스와 유스케이스 사이의 관계
유스케이스와 유스케이스사이의 관계를 말하기에 앞서 알아두어야 할 사항이 있다. 현재 UML의 표준화된 버전은1.1 이다. 하지만 현시점에도 계속 버전업을 위한 수정이 가해지고 있다. 결과적으로 현재 1.3 RTF라는 표준화되지 않은 버전 또한 나와 있다.  유스케이스와 유스케이스와의 관계에서 1.1버전과 1.3버전의 차이점이 존재함을 유념하기 바란다.  필자는 표준인 1.1 을 대상으로 설명을 하도록 하겠다.
(1) 통신(Communicates) 관계
사용자 삽입 이미지

그림 5 - 통신(Association) 관계
(2) 통신 관계의 의미
통신관계의 의미는 이러한 관계로 묶인 두 개체가 상호 작용을 한다는 의미이다.  그림 5에서와 같이 현금자동출납기계의 시스템에서 그 사용자와 사용자확인의 유스케이스는 상호작용을 하게 된다. 이를 관계로 표시한 것이 통신 관계이다. 참고로 UML1.3 RTF의 경우 통신관계는 연관(Association) 관계로 대체되어 사용되게 된다.
(3) 확장(Extends) 관계
사용자 삽입 이미지

그림 6 - 확장(Extends) 관계
(4) 확장 관계의 의미
확장(Extends)관계는 유스케이스가 어떤한 조건이 만족할 경우 확장할 수 있는 확장시점(Extention Point)를 가지고 그 때 연관된 유스케이스를 포함하는 관계이다 예를 들면 그림 6에서와 같이 추가 요구시라는 확장시점에서 카탈로그요구의 유스케이스가 주문접수의 유스케이스에 포함되게 된다.
(5) 사용(Uses) 관계
사용자 삽입 이미지

그림 7 - 사용(Uses) 관계
(6) 사용 관계의 의미
사용관계는 특정한 유스케이스가 다른 유스케이스를 포함하고 있는 경우를 나타낸다. 그림 7에서는 고객확인의 유스케이스가 주문접수의 유스케이스와 주문조사의 유스케이스를 모두 포함하게 되는 경우이다. UML 1.3 RTF에서는 Uses의 관계가 include의 관계로 이름이 바뀌어서 사용되게 된다.
(7) 일반화(Generalization) 관계
사용자 삽입 이미지

그림 8 - 일반화(Generalization) 관계
(8) 일반화 관계의 의미
일반화 관계는 액터 사이의 일반화 관계와 동일하게 객체지향의 상속의 개념과 유사하다.
 
4. 액터와 유스케이스의 추출법.
실제로 시스템을 구축하기 위해 유스케이스 다이어그램을 그릴 때 액터와 유스케이스를 만들기가 막막할 것이다. 물론 정확한 액터와 유스케이스를 추출하기 위해서는 여러 번의 반복이 필요하지만 처음으로 추출할려는 사람은 다음과 같은 대충의 지표 등을 통해 추출해보는 것도 좋다.
(1) 액터의 추출법
  1. 시스템의 주기능을 사용하는 사람은 누구인가.
  2. 누가 시스템으로부터 업무 지원을 받는가?
  3. 누가 시스템을 운영, 유지 보수하는가?
  4. 시스템과 정보를 교환하는 외부 시스템은 무엇인가?
  5. 시스템이 내어놓은 결과물에 누가 관심을 가지는가?
(2) 유스케이스 추출법
  1. Actor가 요구하는 시스템의 주요 기능은 무엇인가?
  2. Actor가 시스템의 어떤 정보를 수정, 조회, 삭제, 저장하느가?
  3. 시스템이 Actor에게 주는 어떠한 Event가 있는가?,  Actor가 시스템에는 어떠한 Event가 있는가?
  4. 시스템의 입력과 출력으로 무엇이 필요한가? 그리고 입력과 출력이 어디에서 오고 어디에로 가는가?
  5. 시스템의 구현에서 가장 문제가 되는 점은 무엇인가?
 
5. 시나리오
유스케이스 다이어그램을 그리면서 빠뜨려서는 안될 내용이 시나리오이다. 유스케이스 다이어그램을 완성하였다면 유스케이스 다이어그램의 명세가 필요하게 된다. 즉 유스케이스 다이어그램이 무엇을 해야하고 어떻게 해야하는가에 같은 부연 설명이 필요한 것이다. 유스케이스는 순서에 의해 배열이 가능하고 이러한 순서를 일반적인 자연어 문장으로 표현하되 외부인이 보아도 알기쉬운 정도로 쉽게 기술하여야 한다.
마무리?
유스케이스 다이어그램은 다른 다이어그램을 그리기 위한 바탕이 되는 다이어그램이다. 즉 유스케이스 다이어그램이 잘못 되었다면 결과물은 잘못된 것일 수밖에 없다. 유스케이스 다이어그래이 잘 되었다면 이후 그려나갈 다른 다이어그램이 원래의 목적에 맞게 그릴 수 있는지 비교할 수 있는 좋은 바탕이 될 수 있다.
참고로 유스케이스 다이어그램을 잘 그리기 위해 다음의 단계로 넘어가는 것을 주저하지 말기 바란다. 프로젝트를 잘 수행하기 위해서는 여러 번의 반복적 개발을 통해 오류의 수정 과정이 필요하고 이에 유스케이스 다이어그램을 수정하는 일도 포함된다. 즉 어느 정도 유스케이스 다이어그램이 완성되면 다음의 다이어그램을 진행하길 바란다.

'소프트웨어공학 > UML이야기' 카테고리의 다른 글

3. B Usecase Discription  (0) 2009.05.26
5. Sequence Diagram  (1) 2009.02.06
4. Class Diagram  (0) 2008.10.26
2. UML의 구성  (0) 2008.06.16
1. UML이 무엇이며 왜 중요한가.?  (0) 2008.06.16
Posted by 서오석
,
Posted by 서오석
,
심원도
E-mail:wideeye@www.plasticsoftware.com
플라스틱 소프트웨어
Homepage:www.plasticsoftware.com


앞회에서 UML이 무엇이며 UML이 어떻게 만들어졌는지 대략적으로 알아보았다. 이번 호에서는 UML의 전반적인 구성에 대해서 알아보도록 하겠다.
1. UML과 방법론의 차이
UML의 구성을 알아보기에 앞서 먼저 UML과 방법론의 차이를 알아야 한다. 필자는 UML을 공부하는 초기에 UML을 하나의 방법론으로 착각하는 오류를 하였다. 물론 똑똑한 독자는 이러한 오류를 범하지 않으리라 생각하지만 혹시나 하는 마음에 먼저 언급하려고 한다.
방법론이란 말그대로 어떠한 작업을 할 때 이러저러한 절차를 가지고 작업을 하면 된다라고 하는 것을 이론적으로 정립을 하여놓은 것이다. 소프트웨어공학에서 많은 방법론이 있어왔고 현재도 수많은 방법론이 존재한다. 사실 프로그램을 하는 모든 사람은 나름대로의 방법론을 가지고 있다. 그러한 나름의 방법론이 작업을 얼마만큼 효과적으로 만드는지에 따라 좋은 방법론인지 아닌지 결정 날 것이다.
그럼 UML은 무엇인가?  UML은 이러한 방법론을 적용할 때의 결과물을 나타내기 위한 도구이다.  예를 들면 모든 소프트웨어를 설계 할 때 어떠한 표준적인 규칙을 가지고 설계도를 그려야한다. 이때 설계의 표준이 되는 것이 UML이다.  건축도면에서 나오는 건물 내부의 여러가지 표준적인 표기라 보면 될 것이다.  즉 각자 다양한 방법론을 자기의 프로젝트에 적용하더라도 UML을 공통적으로 적용할 수 있다.
2. UML의 구성
이제 UML이 어떻게 구성되어있는지 알아보도록 하겠다.  전체 UML은 8가지 다이어그램으로 나타난다. 시스템의 정적인 면을 나타내는 클래스 다이어그램(Class Diagram)이 있고 동적인 면을 나타내는 콜레버레이션 다이어그램(Collaboration Diagram), 시퀸스 다이어그램(Sequence Diagram), 상태 다이어그램(Statechart Diagram), 액티비티 다이어그램(Activity Diagram), 디플로이먼트 다이어그램(Deployment Diagram), 컴포넌트 다이어그램(Component Diagram)으로 구성되어져 있다.
이외로 유스케이스 다이어그램(Usecase Diagram)이 존재한다. 유스케이스 다이어그램을 두 부류로 나누지 않은 이유는 다른 모든 다이어그램을 그리기 위해 기반이 되는 다이어그램이기 때문이다.이제 각 다이어그램이 시스템의 어떠한 면을 반영하는지 간단하게 알아보도록 하자.
(1) 유스케이스 다이어그램 (Usecase Diagram)
유스케이스 다이어그램은 유스케이스를 그려놓은 다이어그램이다. 여기서 유스케이스란 말 그대로 컴퓨터 시스템과 사용자가 상호작용을 하는 하나의 경우이다. 예를들어 보험처리 프로그램의 경우에 "고객이 보험증권에 sign한다.",  "보험 판매원이 판매통계량을 종합한다." 등이 use case가 된다. 이러한 유스케이스 다이어그램은 시스템 구축의 초기에 이 시스템이 어떠한 일을 하는지에 대한 부분을 사용자 입장에서 이해할 수 있을 정도로 기술을 하여야 한다. 이러한 유스케이스 다이어그램은 사용자와의 대화수단으로 그리고 앞으로 구축해 나갈 때의 밑바탕이 되는 것이다.
사용자 삽입 이미지

그림 1 - 유스케이스 다이어그램
(2) 클래스 다이어그램 (Class Diagram)
클래스 다이어그램의 경우 시스템 내부에 존재하는 클래스들을 선별하여 나타내고 각 클래스들의 속성(Attribute)과 행위(Behavior)를 기입한다. 여기서 클래스들 사이에 여러가지 관계(Relationship)를 가질수 있다. 예를 들어 연관관계(Association)은 클래스와 클래스가 어떠한 연관을 가지고 있음을 나타내고 여기서 세부적으로 복합연관(Composition)과 집합 연관관계 (Aggregation) 등으로 나뉘어 질 수 있다. 이외에 상속관계(Generalization), 의존관계(Dependency)가 나타날 수 있다. 클래스 다이어그램을 그리고자 할 때 항상 추상화 단계를 고려하여서 그리도록 하여야 할 것이다. 추상화의 단계가 높은 경우 대충의 속성과 행위를 기입하고 대충의 관계를 기입하여도 충분할 것이다. 이 단계에서 너무 상세한 내용을 찾고 기입하다 보면 클래스 다이어그램 내부에서 구현의 단계에서 이루어져야 할 일이 이루어지는 오류를 범하게 된다. 이러한 오류는 실제 구현 단계에서 커다란 위험의 요소를 내재하게 된다.
사용자 삽입 이미지

그림 2 - 클래스 다이어그램
(3) 시퀸스 다이어그램 (Sequence Diagram)
시퀸스 다이어그램은 콜레버레이션 다이어그램과 함께 시스템의 동적인 면을 나타내는 대표적인 다이어그램이다. 시스템이 실행시 생성되고 소멸되는 객체를 표기하고 객체들 사이에 주고 받는 메시지를 나타내게 된다. 콜레버레이션 다이어그램 또한 메시지의 흐름을 나타내지만 시퀸스 다이어그램 만의 특징이라면 횡축을 시간축으로 하여 시간의 흐름을 나타내어 메시지의 순서에 역점을 두고있다.
사용자 삽입 이미지

그림 3 - 시퀀스 다이어그램
(4) 콜레버레이션 다이어그램 (Collaboration Diagram)
콜레버레이션 다이어그램 또한 시퀸스 다이어그램과 함께 메시지의 흐름을 나타낸다. 하지만 콜레버레이션 다어그램은 객체와 객체들 사이의 관계 또한 표기하게 된다. 실제 UML에서 클래스의 인스턴스인 객체를 표기하는 다이어그램이 명시적으로 존재하지 않는다. 이러한 객체들 사이의 관계를 나타내기 위해 별도로 오브젝트 다이어그램(Object Diagram)을 사용하여도 되지만 오브젝트 다이어그램은 클래스 다이어그램과 크게 차이점이 없는 관계로 UML의 표준에는 포함되어있지 않다. 갑자기 이러한 오브젝트 다이어그램을 여기서 언급하는 이유는 객체들 사이의 관계를 표기하기 위해 클래스 다이어그램과 거의 동일한 오브젝트 다이어그램을 그리기 보다는 특별히 클래스 다이어그램과 차이점이 되는 부분을 여기 콜레버레이션 다이어그램에 기입하는 것이 좋을 것이다.
사용자 삽입 이미지

그림 4 - 콜레버레이션 다이어그램
(5) 상태 다이어그램 (Statechart Diagram)
상태 다이어그램은 한 객체의 상태 변화를 다이어그램으로 나타낸 것이다. 시스템의 실행시 객체의 상태는 메시지를 주고 받음으로써 또한 어떠한 이벤트를 받음으로써 많은 변화가 있을 수 있다.  실제 시스템에서 실행시 많은 객체가 생성되고 소멸된다. 이렇게 무수한 객체의 상태 전부를 모두 다이어그램으로 나타내는 것은 불가능하다.  결국 상태 다이어그램은 특별히 관심을 가져야 할 객체에 관하여 그리고 특정 조건에 만족하는 기간동안의 상태를 표시하여야 한다.
사용자 삽입 이미지

그림 5 - 상태 다이어그램
(6) 액티비티 다이어그램 (Activity Diagram)
액티비티 다이어그램은 플로우챠트가 UML에 접목이 되었다면 가장 이해가 빠를 것이다.  시스템 내부에 존재하는 여러가지 행위들 그리고 각 행위의 분기, 분기되는 조건 등을 모두 포함 하게 된다. 이러한 액티비티 다이어그램에서 기존 플로우 챠트와 다른 점은 어떠한 행위에 따라 객체의 상태를 표기할 수 있다는 것이다. 이러한 점을 제외하고 기존 플로우챠트와 표기법과 의미가 약간씩 달라질 뿐 크게 다르지 않다라고 보아도 좋다.
사용자 삽입 이미지

그림 6 - 액티비티 다이어그램
(7) 디플로이먼트 다이어그램 (Deployment Diagram) 과 컴포넌트 다이어그램 (Component Diagram)
이 두 다이어그램은 시스템의 물리적인 부분의 구성을 나타낸다. 디플로이먼트 다이어그램은 실제 하드웨어적인 배치와 연결상태를 나타낸다. 그리고 컴포넌트 다이어그램은 소프트웨어의 물리적 단위(Exe, dll 등 기타 library)의 구성과 연결상태를 나타내게 된다.
사용자 삽입 이미지

그림 7 - 디플로이먼트 다이어그램
사용자 삽입 이미지

그림 8 - 컴포넌트 다이어그램
3. 이외의 사항들
지금까지 UML의 다이어그램적인 구성에 대하여 알아보았다. 하지만 UML은 이러한 다이어그램적인 사항이 아닌 확장을 위한 여러가지 도구들을 준비되어있다. 예를들어 스테레오타입(Stereotype)이나 컨스트레인트(Constraint) 등의 의미적 변환을 위한 도구가 있다. 그리고 UML은 의미적인 무결성을 위해 메타모델을 위해 준비해 두었다. 이제 전체적인 UML의 구성이 어떻게 되어있는지 알수 있을 것이다.  다음 회부터 본격적으로 UML의 세부적 사항을 요목조목 알아보도록 하겠다.

'소프트웨어공학 > UML이야기' 카테고리의 다른 글

3. B Usecase Discription  (0) 2009.05.26
5. Sequence Diagram  (1) 2009.02.06
4. Class Diagram  (0) 2008.10.26
3. A. Usecase Diagram  (0) 2008.06.23
1. UML이 무엇이며 왜 중요한가.?  (0) 2008.06.16
Posted by 서오석
,


 



현재 많은 회사에서 소프트웨어에 대한 전략적인 가치가 증가됨에 따라 산업계에서는 소프트웨어
생산의 자동화, 소프트웨어의 시간과 비용을 절감, 소프트웨어의 질을 향상시킬 수 있는 기술을
모색하고 있다. 이러한 기술들로 현재 부상하고 있는 것이 컴포넌트 기술, 시각적(Visual) 프로그
래밍, 패턴(Pattern)과 프레임워크(Framework) 등이 있다.

업무의 처리과정에서 그 업무의 범위와 규모가 커짐에 따른 시스템의 복잡성을 처리할 필요성을
느끼게 되었다. 특히 물리적인 시스템의 분산, 동시성(Cuncurrency), 반복성(Replication), 보안,

결점보완, 시스템들의 부하에 대한 균등화(Load balancy)와 같은 반복해서 발생하는
구조적 문제 대한 처리가 필요하게 되었다.

추가적으로 웹의 발전에 따라 시스템을 만들기는 쉬워졌으나 이러한 구조적 문제는 더욱 악화되었다.  
UML은 이러한 모든 필요성에 의해 만들어졌다.

UML은 소프트웨어 시스템이나 업무 모델링(Business Modeling) 그리고

기타의 비 소프트웨어 시스템등을 나타내는 가공물(Artifact)을 구체화(Specifying)하고,

시각화(Visualizing)하고, 구축(Construction)하고, 문서화(Documenting)하기 위해 만들어진 언어이다.

UML은 복잡하고 거대한 시스템을 모델링함에 있어 성공적으로 증명된 공학적인 경험들을 포함하고 있다.

UML은 Rational Software와 그의 동료 회사에 의해 개발되었다.

UML은 OMT, Booch, OOSE/Jacobson에서 발견되는 모델링 언어의 장점을 계승하였다.

그리고 대부분의 회사들이 표준으로 제정된 UML을 가지고 그들의 개발 프로세스에 적용하고 있다.

이러한 개발 프로세스들은 업무의 모델링과 요구의 관리, 분석과 디자인, 프로그래밍과 테스트를

모두 포함하고 있다.

▶ 모델링의 중요성.
강력한 소프트웨어 시스템을 만들기 위해 구축(Construction)하고 개선(Renovation)하기에 앞서
모델을 만드는 것이 건물을 만들기 위한 청사진 만드는 것과 같이 핵심적인 요소이다.

잘 만들어진 모델은 프로젝트 팀간의 통신수단으로써 그리고

구조적인 문제를 해결하기 위한 수단으로써 핵심적인 것이다.

시스템의 복잡성이 증가함에 따라 좋은 모델링을 하기 위한 기술은 더욱 중요하게 되었다.

성공적인 프로젝트에서의 성공요소는 여러가지가 존재하지만 표준적이고 엄격한 모델링 언어를

가지는 것이 핵심적이다.

▶ 모델링 언어가 반드시 포함하여야 하는 것.
모델 요소(Model elelements) -> 기본적 모델링 개념과 의미
표기(Notation) -> 모델요소의 시각적인 그림
Guideline -> 관용적인 사용방법.
시스템의 복잡성이 증가함에 따라 시각화(Visualization), 모델화(modeling)가 핵심적인 사항이
되어가고 있다. UML은 이러한 필요성에 부응하기 위해 잘 정의되어져 있고 넓은 범위를 수용하도
록 되어있다. 결과적으로 객체지향 시스템과 컴포넌트 기반 시스템을 구축하기 위해 시각적 모델
링 언어를 선택하는 것도 필연적이다.

▶ UML의 목적
UML로 디자인함에 있어서 최우선 목표는 다음과 같다.

사용자에게 즉시 사용가능하고 표현력이 강한 시각적 모델링 언어를 제공함으로써 사용자는 의미
있는 모델들을 개발하고 서로 교환할 수 있다.
핵심적이 개념을 확장할 수 있는 확장성과 특수화 방법을 제공한다.
특정 개발 프로세스와 언어에 종속되지 않는다.
모델링 언어를 이해하기 위한 공식적인 기초를 제공한다.
객체 지향 툴 시장의 성장을 장려한다.
콜레버레이션(Collaboration), 프레임워크(Framework), 패턴(Pattern)과 Component와 같은 고수준
의 개발 개념을 제공한다.


▶ OMG-UML의 범위
UML은 소프트웨어가 중심이 되는 시스템을 나타내는 가공물(Artifact)을 구체화되고 시각화하고,
문서화하기 위한 언어이다. 이러한 특징을 가진 UML의 범위를 다음의 세가지로 요약할 수 있다.
첫째로 UML은 Booch, OMT, OOSE의 개념을 융화 시켜서 만들었기 때문에 그 결과는 사용자나 다른
어떤 방법론에도 일반적이고 유일하며, 넓게 사용될 수 있다.

둘째로 UML은 기존의 방법론들을 가지고 있는 어떠한 작업에도 적합한 방편을 제공한다.

예를 들면 UML 저자들은 동시에 발생하는(Concurrent), 분산된(Distributed) 시스템의 모델링을 UML의 목표로 삼았다.

셋째로 UML은 표준적인 방법론에 역점을 두지 않고 표준적인 모델링 언어에 역점을 두었다.

이와 같이 표준 방법론을 제시하지 않는 이유는 서로 다른 문제 영역에 대해 서로 다른 방법론을 요구하기 때문이다.

그래서 표준적 언어로의 UML은 첫째로 일반적인 메타모델(Metamodell)과 둘째로 일반적인 표기
(Notation)에 노력이 집중되었다. 하지만 UML에서도 사용사례유도(UseCase Driven)의, 구조중심
(Arcitecture-centric)의, 반복적인(Iterative), 점진적인(increment) 개념을 방법론에 적용하도
록 권장하고 있다.

▶ UML의 범위 외부
UML은 모든 것을 포함하는 언어가 아닌, 단순하고 표준화된 모델링의 제공을 목표로 하고 있다.
이러한 점이 산업계 전반에 걸쳐 존재하는 다양한 시스템의 디자인에 UML이 사용될 수 있는 유연
성을 제공한다.

▶ 프로그래밍(Programming) 언어
UML은 비주얼 모델링 언어이지 비주얼 프로그래밍 언어가 아니다. 하지만 UML은 어떤 의미에서는
비주얼 모델링 언어가 제공하는 모든 시각적이고 의미적인 모든 지원을 가지고 있다. UML은 소프
트웨어가 중심이 되는 시스템을 나타내는 가공물(Artifact)을 구체화되고 시각화하고, 문서화하
기 위한 언어이다. 하지만 UML은 실제 코드로의 지향을 위해 사용될 수 있다. 예를 드어 UML은 객
체 언어와 밀접하게 묶여 사용이 가능하고 이것은 최고의 결과를 낼 수 있다.

▶ 툴(Tools)
표준화 된 언어는 툴과 방법론을 위한 기본을 제공한다. OMG RFP(Request For Proposal) 의 목적
은 툴들 상호 운용성(Interoperability)에 목적을 둔다. 이러한 툴 들의 상호 운용성은 UML이 제
공하는 것과 같이 견고한 의미(Semantic)와 표기의 정의에 의존하고 있다. 즉 UML은 툴들의 상호
운용성을 위해 툴인터페이스, 저장방법(Storage), 실행시간 모델(run-time model)등과 같은 방법
을 제공하는 것이 아니라 의미적 메타모델(Metamodel)을 제공한다.

▶ 방법론(Process)
세계 많은 업체들이 그들의 프로젝트 산출물(Artifact)을 위한 일반적인 언어로 UML을 사용할 것
이다. 하지만 이들 업체들은 상이한 방법론에 동일한 UML 다이어그램을 사용하게 될 것이다. 즉
UML은 의도적으로 방법론에 독립적인 언어로 만들어졌고 또한 표준화된 방법론을 정의하는 것이
UML이나 OMG RFP의 목적이 아니다.

▶ UML의 기원과 어떻게 UML이 OMG의 표준이 되었는가
객체지향적 분석과 디자인에 대해 다양한 방면으로 실험적인 접근을 하던 방법론자들에 의해서
1970년 중반부터 1980년대까지 주목할 만하고 다양한 객체지향 모델링 언어가 나타나기 시작했
다. 1989년에서 1994년까지 확연한 모델링 언어가 적게는 10개미만에서 많게는 50개 이상으로 증
가하게 되었다. 객체 지향의 방법론을 사용하는 많은 사용자들이 하나의 모델링 언어에서 완벽하
게 만족을 찾기 위해 많은 논쟁이 있었다.  이를 방법론전쟁(Method War)이라 한다. 1990년대 중
반부터 이러한 방법론들이 새로운 모습으로 나타났고 이러한 방법론들이 서로 다른 방법론의 기술
들을 융합하게 되었다. 그 결과 몇 개의 특출한 방법론들이 드러나게 되었다.

UML의 개발은 1994년 후반에 Grady Booch와 Jim Rumbaugh에 의해 그들의 방법론인 Booch와 OMT의
통합으로 시작되었다. 1995년 가을 Ivar Jachobson이 소속된 회사 Objectory와 Rational과 병합되
면서 통합의 노력이 있었고 이에 Jacobson의 OOSE 방법론이 통합되었다.

Booth, OMT, OOSE의 주요 저자인 Grady Booch, Jim Rumbaugh, Ivar Jacobson는

다음의 세가지 이유로 통합된 모델링 언어를 만들게 되었다.

첫째, 각각의 방법론들이 이미 각자 독립적인 발전하고 있었다.

각자 방법론에서 사용자에게 혼란을 일으킬 불필요한 부분을 제거하여 같이 발전하는 것이 더 이치에 맞았다.

둘째로 완벽한 의미와 표기의 통일로써 안정된 객체지향 시장을 형성할 수 있다.

또한 프로젝트에 완벽한 모델링 언어를 제공하고 툴들에게 더 나은 특징을 제공하게 된다.

셋째로 각자의 방법론이 서로 보완하여 더 나은 발전을 이룰 수 있고 각자의 방법론이 해결
할 수 없는 문제를 해결할 수 있도록 도와준다.

이들 세사람이 통합을 하기 위해 먼저 그들은 다음의 4가지의 목표를 두고 노력을 기울였다.

객체지향 개념을 이용하여 소프트웨어 영역 뿐만 아니라 소프트웨어가 아닌 영역의 시스템도 모델
링 할 수 있게 한다.
실행 가능하거나 개념적인 산출물들을 명확하게 결합할 수 있게 만든다.
복잡하고 프로젝트 성공여부에 민감한 시스템들에 준하는 논점에 역점을 둔다.
인간이나 기계에 모두 유용한 모델링 언어를 만든다.
Booth, Rumbaugh, Jacobson은 1996년 6월에 UML 0.9를 내놓았고 10월에 0.91의 문서를 내놓았다.
1996년내에 UML저작자들은 여러가지 피드백을 받았고 이를 반영하게 되었다.

Rational은 UML을 표준 모델링 언어로의 확정을 위한 노력도 들였다.

1995년 초 Ivar Jacobson(Objectory의 기술담당 대표)과 Richard Soley(OMG의 기술 담당 대표)는

방법론의 시장에 표준으로 정하기 위한 어려운 노력을 시작하였다.

이러한 노력의 결과 1995년 6월에 쟁쟁한 방법론자들이 참석한 OMG의 주요 회의에서

OMG의 비호아래 방법론의 표준으로 제정되었다.

1996년 한 해동안 몇몇 기구에서 그들의 사업에 UML을 전략적인 도구로 보기 시작하였다.

OMG에 의해 제공된 RFP(Request For Proposall)가 몇몇 기구들에게 그들의 의견을 많이 반영시킬 수 있
도록 촉매제로서 제공되어졌다. 이에 Rational은 몇 개의 기구들과 함께 UML 파트너 협회를 만들
었고 강력한 UML1.0을 만들기 위한 다양한 정보를 제공하게 되었다.

이러한 모든 원조들의 UML1.0에 반영되었다. 이러한 협력업체로는 다음과 같다.

Digital Equipment Corp, HP,  I-Logix, Intellicop, IBM, Icon Computing, MCI Systemhouse,
Microsoft, Oracle, Rational Software, TI, Unisys.

이러한 협력들이 잘 정의되었고 표현력이 강하고 강력하고, 일반적인 언어인 UML1.0를 만들게 되었다.

이것은 결국 1997년 1월에 OMG에 의해 RFP의 응답으로 받아들여지게 되었다.

1997년 1월에 IBM, Objectime, Platinum Technology, Ptech, Taslson, Reich Fechnologies and Softeam은

OMG에 개별적으로 RFP에 대한 응답을 제출했다.

이러한 회사들은 자신들의 의견을 반영하기 위해 UML협회에 참여하게 되었고, 결과적으로 UML은 1.1로 개선되었다.

UML1.1의 중점사항은 UML의 의미적인 무결성을 추구하고 새로이 참여한 회사들의 의견을 반영하는 것에 있었다.

결국 UML1.1은 1997년 가을에 OMG에 제출되었고 표준으로의 인정을 받았다.

▶ UML의 현재와 미래
UML은 한 회사에 독점적이지 않고 모두에게 개방되어 있다. 이것은 일반 사용자나 과학단체의 필
요성을 겨냥하여 나왔고 또한 기존의 주요한 방법론의 경험에 기초하여 만들어졌다.

많은 방법론자들과 협의체, 툴 업체들로 UML을 사용하기에 동의했다.

UML은 Booth, OMT, OOSE와 기타 주요한 방법론들과 유사한 의미론과 표기를 바탕을 만들어졌고

또한 여러 회사들의 폭 넓은 의견을 반영되었기 때문에 매우 직접적이다.

UML에서 목표로 하는 통합(Unified)의 의미로 다음의 두 가지 면을 가지고 있다.

기존의 방법론들의 다양한 모델링 언어들 사이의 사소한 차이를 끝내는 것이다.
여러 종류의 시스템(소프트웨어와 업무) 사이의 관점과 개발 단계(요구 분석, 디자인, 구현) 내부
적인 개념의 통합을 의미한다.
UML은 매우 상세한 언어로 정의 되어 있음에도 불구하고 미래의 모델링 개념으로 발전에 대한 벽
은 존재하지 않는다. 우리는 아주 많은 앞서가는 기술에 관심을 두고있다. 이러한 모든 기술이
UML의 차후 버전에 반영되기를 바랄 것이다. 앞서가는 많은 기술이 UML을 기초로 정의 될 수 있
고 또한 이러한 UML의 확장으로 UML의 핵심이 변화되는 일은 없을 것이다.

현재의 상황으로 보면 UML은 시각적 모델링을 위한, 시뮬레이션을 위한, 개발 환경으로써 많은 툴
들의 기본이 될것으로 기대되어진다. 통합개발 환경이 개발됨에 따라 UML을 기초로한 구현은 점
점 더 많이 늘어날 것이다.

▶ The Meta Object Facility
OMG MOF의 핵심 목적은 CORBA의 인터페이스 집합을 제공하는 것이다.  MOF는 CORBA기반의 분산 개
발 환경구축에 있어서 핵심적인 단위이다.

MOF는 분산 객체의 환경에서의 객체 저장소, 객체 모델링 툴, 메타데이타 등의 영역에서 진행중
인 작업을 통합적으로 표현한 것이다. MOF의 스펙은 UML 표기를 이용한다.  MOF의 인터페이스와
의미들은 실제 상업적인 객체 저장소, 모델링 툴들, 객체의 프레임워크 제품들에 의해 구현된 메
타데이터 관리의 앞서나가는 개념들을 포함하고 있다.

MOF의 스펙은 일반적으로 분산 객체의 환경에서, 특수하게 분산 개발 환경에서 메타데이타의 호환
성(Interoperability)과 메타데이타의 관리적인 측면을 강화하고 있다.

이러한 강화의 초기작업으로 객체분석과 디자인의 영역에서 메타데이타의 호환성을 강화하고 있고

이것은 앞으로 추가적인 영역을 제공하기에 충분할 것으로 기대되어진다.

 OMG는 이러한 추가적인 영역을 담당할 수 있는 새로운 RFP를 기대한고 있다.

'소프트웨어공학 > UML이야기' 카테고리의 다른 글

3. B Usecase Discription  (0) 2009.05.26
5. Sequence Diagram  (1) 2009.02.06
4. Class Diagram  (0) 2008.10.26
3. A. Usecase Diagram  (0) 2008.06.23
2. UML의 구성  (0) 2008.06.16
Posted by 서오석
,

우리 프로젝트의 이상덕군이 번역한 IEEE standard Testing 문서이다.

1. Scope and References

 

1.1 Inside the Scope

Software unit testing is a process that includes the performance of test planning, the acquisition of a test set, and the measurement of a test unit against its requirements.

소프트웨어 단위 테스팅은 테스트 계획의 수행과 test set의 획득, 그리고 그들이 요구하는 것과 반대하는 단위 테스트의 측정을 포함하는 process이다.

 

Measuring entails the use of sample data to exercise the unit and the comparison of the unit's actual behavior with its required behavior as specified in the unit's requirements documentation.

측정은 unit을 활용시키기 위한 샘플데이터의 사용법과 unit’s 요구사항 문서에 명세 된 것처럼

unit’s의 실제 행동과 그것이 요구되는 행동의 비교가 필요하다.

 

This standard defines an integrated approach to systematic and documented unit testing.

이 표준은 조직적이고 문서화되었던 단위 시험의 통합된 접근법(연구법-길잡이)을 정의한다.

 

The approach uses unit design and unit implementation information, in addition to unit requirements, to determine the completeness of the testing.

시험의 완전함을 결정하기 위해,unit의 요구 사항들에 더하여,이 접근법은 unit 디자인과 unit 구현 정보를 사용한다.

 

This standard describes a testing process composed of a hierarchy of phases, activities, and tasks and defines a minimum set of tasks for each activity.

이 표준은 단계의 계층, 활동들, 그리고 task 그리고 각 activity의 최소화된 tasks set의 정의로 구성된 testing process를 묘사한다.

 

Additional tasks may be added to any activity.

추가의 작업들은 어떤 활동이라도 추가하게 될지도 모른다.

 

This standard requires the performance of each activity.

이 표준은 각 활동의 실행을 필요로 한다.

 

For each task within an activity, this standard requires either that the task be performed, or that previous results be available and be reverified.

활동 내의 각 task를 위해 이 표준은 어느 쪽이든지 요구된다. task는 수행되어야 한다 또는 이전의 결과들은 이용 가능하고 검사된다.

 

This standard also requires the preparation of two documents specified in ANSI/IEEE Std 829-1983 [2]

이 표준도 ANSI/IEEE Std 829-1983[2]에 명세 된 2개의 문서들의 준비를 필요로 한다

 

These documents are the Test Design Specification and the Test Summary Report.

이 문서들은 Test 설계 명세서 와 Test 요약 보고서이다.

 

General unit test planning should occur during overall test planning.

전반적인 단위 시험 계획은 전반적인 test planning동안 일어나야 한다.

 

This general unit test planning activity is covered by this standard, although the balance of the overall test planning process is outside the scope of this standard.

비록 전반적인 test planning process의 균형은 이 표준의 범위 밖에 있지만, general unit test planning activity는 이 standard에 있다.

 

This standard may be applied to the unit testing of any digital computer software or firmware.

이 표준은 어떤 디지털 컴퓨터 소프트웨어 또는 firmwareunit testing에 적용하게 될지도 모른다.

 

However, this standard does not specify any class of software or firmware to which it must be applied, nor does it specify any class of software or firmware that must be unit tested.

그러나, software 또는 firmware의 어떤 클래스도 반드시 지정 되어야 한다거나 반드시 지정되지 않아야 한다는 것이 이 표준에서는 소프트웨어의 어떤 class 또는 firmware도 지정되지 않았다.

 

This standard applies to the testing of newly developed and modified units.

이 표준은 새로이 발전되고 수정되었던 unitstesting하는 것을 적용한다.

 

This standard is applicable whether or not the unit tester is also the developer.

Unit 시험자가 또한 개발자 일지라도 하여간 이 표준은 적용할 수 있다.

 

1.2 Outside the Scope

 

The results of some overall test planning tasks apply to all testing levels (for example, identify security and privacy constraints).

약간의 전반적인 test planning tasks의 결과들은 모든 testing 수준들(예를 들어 identify security(기밀 보호성 확인) privacy constraints(비밀제약))에 적용한다.

 

Such tasks are not considered a part of the unit testing process, although they directly affect it.

비록 그들이(tasks) 직접 그것에(unit testing process)영향을 끼치지만, 그러한 tasks unit testing process의 일부로서 간주되지 않는다.

 

While the standard identifies a need for failure analysis information and software fault correction, it does not specify a software debugging process.

이 표준이 실패 분석 정보와 소프트웨어 결함 정정의 필요성을 확인할지라도, 그것을 software debugging process라고 지정하지 않는다.

 

This standard does not address other components of a comprehensive unit verification and validation process, such as reviews (for example, walkthroughs, inspections), static analysis (for example, consistency checks, data flow analysis), or formal analysis (for example, proof of correctness, symbolic execution).

이 표준은 비평들(e.g. 검토회, 검사들) 정적 분석 (e.g. 일관성 검사, data flow 분석), 또는 공식적인(formal) 분석(e.g. 정확함의 증명, 기호 실행)과 같은 광범위한 unit 확인과 유효한 process들에 관해 언급하지 않는다.

 

This standard does not require the use of specific test facilities or tools.

이 표준은 특정의 test 설비들 또는 도구들의 사용이 필요하지 않는다.

 

This standard does not imply any particular methodology for documentation control, configuration management, quality assurance, or management of the testing process.

이 표준은 자료관리, 형상관리, 품질보증 또는 testing process의 관리를 위한 어떤 특정한 방법론을 의미하지 않는다.

 

1.3 References

This standard shall be used in conjunction with the following publications.

이 표준은 동시 발행될 아래의 출판물들에 사용될 것이다.

[1] ANSI/IEEE Std 729-1983, IEEE Standard Glossary of Software Engineering Terminology.

[2] ANSI/IEEE Std 829-1983, IEEE Standard for Software Test Documentation.

 

2. Definitions

This section defines key terms used in this standard but not included in ANSI/IEEE Std 729-1983 [1] or ANSI/IEEE Std 829-1983 [2].

이 섹션은 이 표준에서 사용되는 key 단어들을 정의한다. 그러나 ANSI/IEEE Std 729-1983[1] or ANSI/IEEE Std 829-1983[2]에는 포함되지 않는다.

 

characteristic: See: data characteristic or software characteristic.

특징: See: 데이터 특징 또는 소프트웨어 특징

data characteristic:  An inherent, possibly accidental, trait, quality, or property of data (for example, arrival rates, formats, value ranges, or relationships between field values).

data characteristic: 하나의 고유의, 아마도 비본질성,특징,품질 또는 data의 속성(예를 들면 arrival ratesformatsvalue ranges 또는 field values 사이의 관계들)

 

feature: See: software feature. (feature: 특징)

 

incident: See: software test incident. (incident: 우발 사건, 부수적인 것)

 

nonprocedural programming language: A computer programming language used to express the parameters of a problem rather than the steps in a solution (for example, report writer or sort specification languages). Contrast with procedural programming language.

비 절차형 프로그래밍 언어: 컴퓨터 프로그래밍 언어로 solution에서 명령을 하나 실행 시키는 것(step)보다도 문제의 매개변수를 나타내기 위해 사용된다. procedural programming language와 대조된다.

 

procedural programming language: A computer programming language used to express the sequence of operations to be performed by a computer (for example, COBOL). Contrast with nonprocedural programming language.

절차형 프로그래밍 언어: 컴퓨터(예를 들면 COBOL)로 실행되는 operations의 순서를 나타내기 위해 사용되는 프로그래밍 언어. nonprocedural programming language와 대조된다.

 

software characteristic: An inherent, possibly accidental, trait, quality, or property of software (for example, functionality, performance, attributes, design constraints, number of states, lines of branches).

software characteristic: 하나의 고유의, 아마도 비본질성,특징,품질 또는 software의 속성(예를 들어 기능성, 운용, 속성들(attributes), 설계 제약들, number of states, 분기의 수

 

software feature:  A software characteristic specified or implied by requirements documentation (for example, functionality, performance, attributes, or design constraints).

software feature: 요구 사항 문서에 의해 명기 또는 내포되는 소프트웨어 특징. (예를 들어, 기능성, 운용, 속성들, 설계 제약들)

 

software test incident: Any event occurring during the execution of a software test that requires investigation.

software test incident: software test를 실행하는 동안 일어나는 어떤 이벤트로 조사가 요구된다.

 

state data: Data that defines an internal state of the test unit and is used to establish that state or compare with existing states.

test unit의 내부의 상태를 정의하고 상태를 확립하거나 또는 현재의 상태와 비교하기 위하여 사용되는 데이터이다.

 

test objective: An identified set of software features to be measured under specified conditions by comparing actual behavior with the required behavior described in the software documentation.

test objective(조사 목적): software문서에 묘사된 요구되는 행동과 실제 행동을 비교하는 것에 의해 하나의 지정된 software feature의 집합은 지정된 조건하에 측정된다.

 

test set architecture: The nested relationships between sets of test cases that directly reflect the hierarchic decomposition of the test objectives.

test set architecture: test objectives의 계층적인 분해를 직접적으로 반영하는 test cases sets사이의 이입되는(포개지는) 관계

 

test unit:  A set of one or more computer program modules together with associated control data, (for example, tables), usage procedures, and operating procedures that satisfy the following conditions:

test unit: 아래의 조건을 만족하는 하나 또는 하나 이상의 computer program modules과 함께 연합된 제어 자료(e.g. tables), 사용 과정 및 절차

 

A test unit may occur at any level of the design hierarchy from a single module to a complete program.

하나의 Test unit은 하나의 module에서 완전한 프로그램까지 design 계층의 어떤 level에서도 일어날 수 있다.

 

Therefore, a test unit may be a module, a few modules, or a complete computer program along with associated data and procedures.

그러므로 test unit은 연합된 data와 절차들과 함께 하나의 module, 약간의 modules 또는 완전한 컴퓨터 프로그램일지도 모른다.

 

1) All modules are from a single computer program

모든 modules은 단 한 개의 컴퓨터 프로그램으로부터 있다.

 

2) At least one of the new or changed modules in the set has not completed the unit test

unit test가 완료되지 않은 적어도 1개의 새로운 또는 변화된 modules을 가지고 있다.

 

A test unit may contain one or more modules that have already been unit tested.

Test unit은 이미 unit test가 준비된 하나 또는 그 이상의 modules를 포함할지도 모른다.

 

3) The set of modules together with its associated data and procedures are the sole object of a testing process

modules의 집합은 그것이 연합된 data와 절차들과 함께 testing process의 단 하나의 object이다.

 

unit: See: test unit.

 

unit requirements documentation: Documentation that sets forth the functional, interface, performance, and design constraint requirements for the test unit.

unit requirements documentation: test unit을 위한 외적 기능, interface, 성능과 설계 제약 요구사항을 기록한 문서화 작업

 

3. Unit Testing Activities

This section specifies the activities involved in the unit testing process and describes the associated input, tasks, and output. The activities described are as follows:

이 섹션은 unit testing process가 포함된 활동을 지정(명기)하고 연합된 input, tasks, output을 기술한다. 그 활동의 기술은 다음과 같다.

 

1) Perform test planning phase

 test planning 단계를 실행한다.

a) Plan the general approach, resources, and schedule

일반적인 접근법, 자원, 그리고 일정을 계획하라

b) Determine features to be tested

test될 특징을 결정하라.

c) Refine the general plan

대체적인 계획안을 정의해라.

 

2) Acquire test set phase

test set 단계를 습득하라.

a) Design the set of tests

tests의 집합을 설계하라.

b) Implement the refined plan and design

정의한 계획과 설계를 구현하라.

 

3) Measure test unit phase

test unit phase를 측정하라.

a) Execute the test procedures

test 절차를 실행하라.

b) Check for termination

종단(종료)를 검사하라.

c) Evaluate the test effort and unit

test effort(공수)unit을 평가하라.

 

When more than one unit is to be unit tested (for example, all those associated with a software project), the Plan activity should address the total set of test units and should not be repeated for each test unit.

하나 이상의 unit unit 시험될 때(예를 들어 software project와 관련된 모든 것들) 시험 활동은 전체 test units의 집합을 언급해야 하고, test unit를 반복해서는 안 된다.

 

The other activities must be performed at least once for each unit.

다른 활동은 각 unit을 위해 적어도 한번 수행되어야 한다.

 

Under normal conditions, these activities are sequentially initiated except for the Execute and Check cycle as illustrated in Fig 1.

일반적인 조건들 하에, 이 활동들은 Fig 1. 에 도시되는 것처럼 Execute Check cycle을 제외하고 순차적으로 시작한다.

 

 When performing any of the activities except Plan, improper performance of a preceding activity or external events (for example, schedule, requirements, or design changes) may result in the need to redo one or more of the preceding activities and then return to the one being performed.

Plan을 제외하고 활동들의 무엇이든지 실행할 때, 진행 활동 또는 외부의 사건(예를 들어 일정, 요구사항들, 또는 설계 변경)의 부적당한 실행은 하나 또는 그 이상의 활동들의 진행을 다시 하는 필요를 가져올지도 모른다. 게다가 실행되고 있는 하나로 돌아올지도 모른다.  

 

사용자 삽입 이미지

Fig 1 – Unit Testing Activities

 

During the testing process, a test design specification and a test summary report must be developed. Other test documents may be developed.

testing 과정(process) 동안, test 설계 명세서와 test 요약 리포트는 자세히 기술해야 한다. 다른 test 문서들도 자세히 기술해야 할지도 모른다.

 

 All test documents must conform to the ANSI/IEEE Std 829-1983 [2]. In addition, all test documents must have identified authors and be dated.

모둔 test 문서는 반드시 ANSI/IEEE Std 829-1983 [2]를 따라야 한다. 게다가, 모든 test 문서는 반드시 저자의 신원은 확인되어야 하고 연대는 추정되어야 한다.

 

The test design specification will derive its information from the Determine, Refine, and Design activities. The test summary report will derive its information from all of the activities.

test 설계 명세서는 Determine, Refine, Design 활동들로부터 그 정보를 끌어낼 것이다. test 개요 리포트는 모든 활동들로부터 그것의 정보를 끌어낼 것이다.

 

3.1 Plan the General Approach, Resources, and Schedule.

일반적인 접근법, 자원들, 그리고 일정을 계획해라.

General unit test planning should occur during overall test planning and be recorded in the corresponding planning document.

일반적인 unit test planning은 전체의 test planning동안 일어나야만 하고 일치하는 계획문서에서 기록되어야 한다.

 

3.1.1 Plan Inputs: Inputs을 계획해라

1) Project plans: 프로젝트 계획들

2) Software requirements documentation: 소프트웨어 요구사항 문서

 

3.1.2 Plan Tasks: 계획 작업들

(1)Specify a General Approach to Unit Testing.

: Unit testing을 위해 일반적인 접근법(방법)을 열거하라.

 

Identify risk areas to be addressed by the testing. Specify constraints on characteristic determination (for example, features that must be tested), test design, or test implementation (for example, test sets that must be used).

testing에 의해 언급되는 위험 지역을 확인해라. characteristic determination(특질 있는 결정-

예를 들어 반드시 test된 특징), test 설계, 또는 test 구현(예를 들어, 반드시 사용된 test sets)의 제약을 열거(상술)하라.

 

Identify existing sources of input, output, and state data (for example, test files, production files, test data generators).

입력과 출력 그리고 state data(예를 들어, test 파일들, 제작 파일들, test data generators(생성 프로그램-발생기)) source들이 존재하는지 확인해라.

 

Identify general techniques for data validation.

자료 확인(비준)을 위한 일반적인 기술들을 확인해라

 

Identify general techniques to be used for output recording, collection, reduction, and validation.

기록, collection, 정리, 확인을 출력하기 위해 사용되는 일반적인 기술을 확인해라.

 

Describe provisions for application software that directly interfaces with the units to be tested.

test units을 직접적으로 인터페이스와 연결한 응용 소프트웨어를 위한 조항(규정)을 기술하라.

 

(2)Specify Completeness Requirements.

요구사항 완전성을 열거하라.

Identify the areas (for example, features, procedures, states, functions, data characteristics, instructions) to be covered by the unit test set and the degree of coverage required for each area.

unit test set과 각 area를 위한 요구된 적용범위의 정도(등급)에 의해 덮이는(에 포함되는 아니면 보호되는) areas(예를 들어, 특징들, 절차들, 상태들, functions, data characteristics, 명령어들) 를 확인해라.

 

When testing a unit during software development, every software feature must be covered by a test case or an approved exception.

소프트웨어 개발과정 동안 하나의 unit testing할 때, test case(선례) 또는 승인된 예외에 의해 모든 소프트웨어 특징은 반드시 보유해야 한다.

 

The same should hold during software maintenance for any unit testing.

마찬가지로 어떠한 unit testing이라도 소프트웨어 유지기간 중에 보유해야 한다.

 

When testing a unit implemented with a procedural language (for example, COBOL) during software development, every instruction that can be reached and executed must be covered by a test case or an approved exception, except for instructions contained in modules that have been separately unit tested.

소프트웨어 개발 중에 절차적인 언어(e.g. COBOL)로 구현된 unit testing할 때, modules (개별적으로(단독으로) test unit)을 포함하는 명령어들을 제외하고, test case 또는 승인된 예외에 의해 도달가능하고(=be reached) 실행될 수 있는 모든 명령어는 보호되어야 (포함되어야) 한다.

 

The same should hold during software maintenance for the testing of a unit implemented with a procedural language.

마찬가지로 절차상의 언어로 구현된 unit testing을 소프트웨어 유지보수 중에 (기억장치에)남겨둬야 한다.

 

(3)Specify Termination Requirements.

종료 요구사항을 열거하라

Specify the requirements for normal termination of the unit testing process.

unit testing process(처리단위)의 일반적인 종료 요구사항들을 열거하라.

 

Termination requirements must include satisfying the completeness requirements.

종료 요구사항들은 반드시 충분한 요구사항 완전성을 포함해야 한다.

 

Identify any conditions that could cause abnormal termination of the unit testing process (for example, detecting a major design fault, reaching a schedule deadline) and any notification procedures that apply.

어떤 조건 - 비정상적인 종료를 야기할 수 있는 unit testing process(예를 들어, 주요한 설계 결점을 찾거나, 일정 마감에 도달했는지)와 적용하는 어떤 통지절차들 - 을 확인해라(식별해라)

 

(4) Determine Resource Requirements.

resource 요구사항을 결정하라.

 

Estimate the resources required for test set acquisition, initial execution, and subsequent repetition of testing activities.

test set의 획득, 최초의 실행, 그리고 testing 활동들 다음의 반복에 요구된 자원을 측정하라.

 

Consider hardware, access time (for example, dedicated computer time), communications or system software, test tools, test files, and forms or other supplies.

하드웨어, 접근 시간(e.g. 바쳐진(?) 컴퓨터 시간), 통신수단들 또는 system software, test 도구들, test 파일들 그리고 다른 form(서식) 또는 다른 소모품들을 고려해라.

 

Also consider the need for unusually large volumes of forms and supplies.

또한 보통과는 달리(드문 방식으로) 많은 양의 서식과 소모품들의 필요성을 고려해라.

 

Identify resources needing preparation and the parties responsible.

준비와 책임 당사자들이 필요한 자원을 확인해라.

 

Make arrangements for these resources, including requests for resources that require significant lead time (for example, customized test tools).

이 자원들을 신청한 자원(중요한 lead time을 요구하는- e.g. customized test tools)을 포함한 준비(정렬)하라. (customize: 자기 취미에 맞도록 설정을 바꾸다)

 

Identify the parties responsible for unit testing and unit debugging.

unit testing unit debugging의 책임이 있는 당사자들을 확인해라.

 

Identify personnel requirements including skills, number, and duration.

능력(기술들), 동료, 존속기간을 포함하는 인사 요구사항을 확인해라.

 

(5)Specify a General Schedule.

 

Specify a schedule constrained by resource and test unit availability for all unit testing activity.

모든 unit testing 활동을 위한 자원과 test unit 유효성에 의해 강요 받는 일정을 확인해라.

 

3.1.3 Plan Outputs

(1) General unit test planning information (from 3.1.2 (1) through (5) inclusive)

정보를 계획하고 있는 전반적인 단위 시험

 

(2) Unit test general resource requests-if produced from 3.1.2 (4)

전반적인 자원 requests-if 3.1.2에서 만들어 내었던 단위 시험

 

3.2 Determine Features To Be Tested: test된 특징들을 결정하라

 

3.2.1 Determine Inputs: 입력을 결정하라.

(1) Unit requirements documentation: unit 요구사항들 문서화

(2) Software architectural design documentation-if needed:

소프트웨어 구조 설계 문서화 필요하다면

 

3.2.2 Determine Tasks: task들을 결정해라.

(1)Study the Functional Requirements.

기능적 요구사항들을 연구해라.

 

Study each function described in the unit requirements documentation.

unit 요구 사항 문서에 기술된 각 기능에 대해 연구해라.

 

Ensure that each function has a unique identifier.

각 기능이 유일한 식별자를 가지는 것을 (보증한다).

 

When necessary, request clarification of the requirements.

필요하다면, 요구 사항들의 설명(해명)을 요청해라.

 

(2)Identify Additional Requirements and Associated Procedures.

추가적인 요구 사항 들과 관련된 절차들을 확인해라.

 

Identify requirements other than functions (For example, performance, attributes, or design constraints) associated with software characteristics that can be effectively tested at the unit level.

요구 사항들 이외의 unit level에서 효과적으로 test할 수 있는 소프트웨어 characteristics와 관련된 기능(e.g. 성능, 속성들 또는 설계 제약들)들을 확인해라.

 

Identify any usage or operating procedures associated only with the unit to be tested.

오직 test unit과 연관된 어떤 사용()또는 운용 절차들을 확인해라.

 

Ensure that each additional requirement and procedure has a unique identifier.

각 추가적인 요구 사항과 절차는 유일한 식별자를 가지는 것을 보증한다.

 

When necessary, request clarification of the requirements.

필요하다면,필요 조건들의 설명 요청해라.

 

(3)Identify States of the Unit.

unit의 상태를 확인해라.

If the unit requirements documentation specifies or implies multiple states (For example, inactive, ready to receive, processing) software, identify each state and each valid state transition.

만약 unit 요구 사항 문서가 복수의 상태 소프트웨어(e.g. 비활동, ready to receive, processing)를 명기하거나 의미하면, 각 상태와 각 유효한(타당한) 상태 변화를 확인해라.

 

Ensure that each state and state transition has a unique identifier.

각 주립이고 주립의 이행이 유일한 식별자를 가질 것을 확인해라.

 

When necessary, request clarification of the requirements.

필요하다면,필요 조건들의 설명을 요청해라.

 

(4)Identify Input and Output Data Characteristics.

data characteristics의 입력과 출력을 확인하라.

 

Identify the input and output data structures of the unit to be tested.

test unit의 입출력 자료 구조들을 확인하라.

 

For each structure, identify characteristics, such as arrival rates, formats, value ranges, and relationships between field values.

각 구조(=structure)를 위해 characteristics – arrival rates(도착 비율들), formats, 값의 범위, 그리고 field 값들 사이의 관계와 같은 을 확인하라.

For each characteristic, specify its valid ranges.

characteristic를 위해 그들의 유효한 범위를 지정하라.

 

Ensure that each characteristic has a unique identifier.

characteristic는 유일한 식별자를 가지는 것을 보증하라.

 

When necessary, request clarification of the requirements.

필요하다면,필요 조건들의 설명을 요청하라.

 

(5)Select Elements to be Included in the Testing.

testing에 포함시키게 되는 요소들을 선택하라.

 

Select the features to be tested. test된 특징들을 선택하라.

 

Select the associated procedures, associated states, associated state transitions, and associated data characteristics to be included in the testing.

관련된 절차들, 관련된 상태들,관련된 상태의 변화 그리고 관련된 data characteristics(testing에 포함시키게 되는)를 선택하라.

 

Invalid and valid input data must be selected.

무효하고 유효한 입력 자료들은 반드시 선택되어야 한다.

 

When complete testing is impractical, information regarding the expected use of the unit should be used to determine the selections.

완전한 시험이 비현실(비 실용)적일 때, 기대되는(예상되는) unit의 사용에 관한 정보는 선택들을 결정하기 위해 사용되어야 한다.

 

Identify the risk associated with unselected elements.

선택되지 않은 요소들과 관련된 위험을 확인하라.

 

Enter the selected features, procedures, states, state transitions, and data characteristics in the Features to be Tested section of the unit’s Test Design Specification.

unit Test 설계 명세서의 ‘test된 특징들의 섹션에 선택된 특징들, 절차들, 상태들, 상태 변화, 그리고 characteristics를 넣어라.

 

3.2.3 Determine Outputs

(1) List of elements to be included in the testing (from 3.2.2 (5))

요소들(from 3.2.2)의 목록은 testing에 포함시키게 된다.

 

(2) Unit requirements clarification requests-if produced from 3.2.2 (1) through (4) inclusive

unit 요구 사항들 설명을 요청한다 만약 3.2.2 (1)에서부터 (4)를 포함하여 만들어지면

 

3.3 Refine the General Plan

전반적인 계획을 세밀히 구별하라(상세히 논술하라)

 

3.3.1 Refine Inputs: 입력들을 상세히 논술하라.

(1) List of elements to be included in the testing (from 3.2.2 (5))

요소들(from 3.2.2)의 목록은 testing에 포함시키게 된다.

 

(2) General unit test planning information (from 3.1.2 (1) through (5) inclusive)

전반적인 단위 시험 계획 정보(3.1.2 1에서 5까지 포함하여)

 

3.3.2 Refine Tasks: Tasks를 상세히 논술하라.

(1)Refine the Approach: 접근법을 상세히 논술하라.

 

Identify existing test cases and test procedures to be considered for use.

사용을 위해 고려되는 현재의 test cases들과 test 절차들을 확인하라.

 

Identify any special techniques to be used for data validation.

data 확인을 위해 사용되는 특별한 어떤 기술들을 확인하라.

 

Identify any special techniques to be used for output recording, collection, reduction, and validation.

출력 기록, collection, 정리, 그리고 확인을 위해 사용되는 어떤 특별한 기술을 확인하라.

 

Record the refined approach in the Approach Refinements section of the unit’s test design specification.

unit test 설계 명세서의 Approach Refinements 섹션에 상세히 논술된 접근법을 기록하라.

 

(2)Specify Special Resource Requirements.

특별한 자원 요구 사항들을 확인하라.

 

Identify any special resources needed to test the unit (for example, software that directly interfaces with the unit).

Unit (e.g. unit에 직접적으로 인터페이스로 접속하는 소프트웨어) test하기 위해 필요로 하는 어떤 특별한 자원을 확인하라.

 

Make preparations for the identified resources.

확인된 자원을 위한 사전 준비를 하다.

 

Record the special resource requirements in the Approach Refinements section of the unit’s test design specification.

unit test 설계 명세서의 Approach Refinements 섹션에 특별한 자원 요구 사항들을 기록하라.

 

(3) Specify a Detailed Schedule.상세한 계획을 지정하라.

Specify a schedule for the unit testing based on support software, special resource, and unit availability and integration schedules.

지원 소프트웨어, 특별한 자원, unit 유효성과 통합 일정에 근거하여 unit testing을 위한 일정을 지정하라.

 

Record the schedule in the Approach Refinements section of the unit’s test design specification.

unit test 설계 명세서의 Approach Refinements 섹션에 일정을 기록하라.

 

3.3.3 출력들을 정련해라

(1) 정보(완전히 3.3.21)(3)로부터 포함하게 되는)를 계획하고 있는 특정의 단위 시험

(2) 만일 3.3.22)에서 만들어 내게 되면 특별한 자원이 요청하는 단위 시험.

 

3.3.3 Refine Outputs – 출력들을 상세히 논술하라.

 

(1) Specific unit test planning information (from 3.3.2 (1) through (3) inclusive)

특정의 단위 시험을 계획하는 정보(3.3.2 (1)에서 (3)을 포함하는)

 

(2) Unit test special resource requests - if produced from 3.3.2 (2).

특별한 자원이 요청하는 단위 시험 만약 3.3.2(2)로부터 만들어졌다면.

 

3.4 Design the Set of Tests: tests의 집합 설계

 

3.4.1 Design Inputs: 입력들을 설계하라.

(1) Unit requirements documentation: 단위 요구 사항 문서

(2) List of elements to be included in the testing (from 3.2.2 (5))

(3.2.2 (5)로부터)testing에 포함시키게 되는 요소들의 목록

(3) Unit test planning information (from 3.1.2 (1) and (2) and 3.3.2 (1))

(3.1.2 (1) 3.3.2(1)로부터) 단위 시험을 계획하는 정보

(4) Unit design documentation: 단위 설계 문서

(5) Test specifications from previous testing - if available:

이전의 시험으로부터의 시험 명세서 만약 이용할 수 있다면

 

3.4.2 Design Tasks: 태스크들을 설계하라.

 

(1) Design the Architecture of the Test Set. - 시험 집합의 구조 설계를 설계하라.

Based on the features to be tested and the conditions specified or implied by the selected associated elements (for example, procedures, state transitions, data characteristics), design a hierarchically decomposed set of test objectives so that each lowest-level objective can be directly tested by a few test cases.

시험된 특징들과 선택된 연관된 요소들(e.g. 절차들, 상태 변화, data characteristics)에 의해 지정되거나 포함된 조건들에 근거하여 시험 계층적으로 분석된 목적들의 집합을 설계하면 각 최하의 수준 목적은 약간의 시험 사례에 의해 직접적으로 시험될 수 있다.

 

Select appropriate existing test cases. 적절한 현재의 시험 사례를 선택하라.

 

Associate groups of test-case identifiers with the lowest-level objectives.

최하 수준 목적들로 시험 사례 식별자들의 집단을 결합시켜라.

 

Record the hierarchy of objectives and associated test case identifiers in the Test Identification section of the unit’s test design specification.

목적들의 계층과 연관된 시험 사례 식별자들을 단위 시험 설계 명세서의 Test identification 섹션에 기록하라.

 

(2) Obtain Explicit Test Procedures as Required.

필요에 따라 명백한 시험 절차들을 획득하라.

 

A combination of the unit requirements documentation, test planning information, and test-case specifications may implicitly specify the unit test procedures and therefore minimize the need for explicit specification.

단위 요구사항 문서, 시험 계획 정보, 그리고 시험 항목 규정의 조합은 내재적으로 단위 시험 절차들을 지정할지도 모르고, 그 결과 명백한 명세서의 필요성을 최소화한다.

 

Select existing test procedures that can be modified or used without modification.

수정될 수 있거나 수정 없이 사용될 수 있는 현재의 시험 절차들을 선택하라.

 

Specify any additional procedures needed either in a supplementary section in the unit’s test design specification or in a separate procedure specification document.

단위 시험 설계 명세서의 보충하는 섹션 또는 독립된 절차 규정 문서의 어느 하나라도 필요 되는 추가적인 시험 절차들을 규정한다(명시한다)

 

Either choice must be in accordance with the information required by ANSI/IEEE Std 829-1983 [2].

어느 하나를 선택하더라도 ANSI/IEEE Std 829-1983 [2].에 의해 요구된 정보에 따라야 한다.

 

When the correlation between test cases and procedures is not readily apparent, develop a table relating them and include it in the unit’s test design specification.

시험 사례들과 절차들 사이의 상호작용이 쉽사리 명백하지 않을 때, 그들과 관련된 일람표()를 개발하고 단위 시험 설계 명세서에 포함시켜라.

 

(3) Obtain the Test Case Specifications. 시험 사례 명세서(규정)들을 얻어라.

 

Specify the new test cases. - 새로운 시험 사례들을 지정해라.

Existing specifications may be referenced. 현재의 명세서(규정)들은 참조사항을 붙이게 될지도 모른다.

 

Record the specifications directly or by reference in either a supplementary section of the unit’s test design specification or in a separate document.

직접적으로 또는 단위 시험 설계명세서의 보충하는 섹션이나 독립된 문서의 어느 한쪽의 참조에 의해 명세서(규정)들을 기록하라.

 

Either choice must be in accordance with the information required by ANSI/IEEE Std 829-1983 [2].

어느 한 쪽의 선택은 ANSI/IEEE Std 829-1983 [2]에 의해 요구된 정보와 일치하여야 한다.

 

(4) Augment, as Required, the Set of Test-Case Specifications Based on Design Information.

필요에 따라서, 설계 정보에 근거한 시험 사례 명세서들의 집합을 증가시켜라.

 

Based on information about the unit’s design, update as required the test set architecture in accordance with 3.4.2 (1).

단위 설계에 관한 정보에 근거하여 필요하다면 3.4.2 (1)과 일치하는 시험 집합 구조를 갱신하라.

 

Consider the characteristics of selected algorithms and internal data structures.

선택된 알고리즘과 내부의 데이터 구조들의 characteristics를 고려하라.

 

Identify control flows and changes to internal data that must be recorded.

제어 흐름들과 반드시 기록되어야 하는 내부의 데이터 변화들을 확인해라.

 

Anticipate special recording difficulties that might arise, for example, from a need to trace control flow in complex algorithms or from a need to trace changes in internal data structures (for example, stacks or trees).

예를 들어 복잡한 알고리즘의 제어 흐름을 추적하는 필요성으로부터 또는 내부의 데이터 구조(e.g. stack이나 트리)들의 변화들을 추적하는 필요성으로부터 일어날지도 모르는 특별한 난제들을 기록하는 것을 예기하라.

 

When necessary, request enhancement of the unit design (for example, a formatted data structure dump capability) to increase the test-ability of the unit

필요하다면, 단위의 시험 능력의 상승을 위해 단위 설계(e.g. 포맷된 데이터 구조의 덤프 능력)의 향상을 요청하라.

 

Based on information in the unit’s design, specify any newly identified test cases and complete any partial test case specifications in accordance with 3.4.2 (3).

단위 설계의 정보에 근거하여 어떤 새롭게 지정된 시험 사례를 지정하고 3.4.2 (3)에 따르는 부분적인 시험 사례 명세서들을 완료하라.

 

(5) Complete the Test Design Specification. - 시험 디자인 규정을 완료해라

Complete the test design specification for the unit in accordance with ANSI/IEEE Std 829-1983 [2].

ANSI/IEEE Std 829-1983 [ 2 ]와 일치하는 단위를 위해 시험 설계 규정(명세서)들을 완료해라

 

3.4.3 Design Outputs 출력들을 설계하라.

(1) Unit test design specification (from 3.4.2 (5)) - 단위 시험 설계 규정(3.4.2 (5)로부터)

 

(2) Separate test procedure specifications - if produced from 3.4.2 (2)

만약 3.4.22)에서 만들어 내게 되면 시험 절차 규정들을 분리하라.

 

(3) Separate test-case specifications if produced from 3.4.2 (3) or (4)

만약 3.4.2 (3) 또는 (4)로부터 만들어졌다면 시험 사례 규정들을 분리하라.

 

(4) Unit design enhancement requests - if produced from 3.4.2 (4)

만약 3.4.2 (4)에서 만들어 졌다면 단위 설계 향상을 요청하라.

 

3.5 Implement the Refined Plan and Design - 정확한 계획과 설계를 구현해라.

 

3.5.1 Implement Inputs – 입력들을 구현하라.

 

(1) Unit test planning information (from 3.1.2 (1), (4), and (5) and 3.3.2 (1) through (3) inclusive)

단위 시험 계획 정보 (3.1.2 (1), (4), (5) 3.3.2 (1)에서 (3)을 포함한 것으로부터)

 

(2) Test-case specifications in the unit test design specification or separate documents (from 3.4.2 (3) and (4)

단위 시험 설계 명세서들 또는 독립된 문서들(3.4.2 (3), (4)로부터)의 시험 사례 규정들.

 

(3) Software data structure descriptions - 소프트웨어 데이터 구조 설명서

(4) Test support resources – 시험 지원 자원들

(5) Test items – 시험 데이터 항목들

(6) Test data from previous testing activities - if available

이전의 시험 활동들로부터의 시험 자료 만약 이용가능 하다면

(7) Test tools from previous testing activities - if available

이전의 시험 활동들로부터의 시험 도구들 만약 이용가능 하다면

 

3.5.2 Implement Tasks - Task들을 구현하라.

 

(1) Obtain and Verify Test Data. - 테스트 데이터를 얻고 검증하라.

Obtain a copy of existing test data to be modified or used without modification.

현재의 수정된 시험 데이터 또는 수정 없이 사용된 사본을 얻어라.

 

Generate any new data required. – 요구된(필요한) 어떤 새로운 자료들을 생성해라

 

Include additional data necessary to ensure data consistency and integrity.

데이터의 일관성 및 무결성을 보증하기 위해 필요한 추가적인 데이터를 포함해라.

 

Verify all data (including those to be used as is) against the software data structure specifications.

소프트웨어 데이터 구조 규정들에 반대하는 모든 데이터(그들을 대용하는 것을 포함한)를 검증하라.

 

When the correlation between test cases and data sets is not readily apparent, develop a table to record this correlation and include it in the unit’s test design specification.

시험 사례들과 데이터 집합들 사이의 상관관계가 쉽사리 명백하지 않을 때, 이 상관관계를 기록하는 테이블을 개발하고 단위 시험 설계 명세서에 그것을 포함하라.

 

(2) Obtain Special Resources. ­- 특별한 자원들을 얻어라

 

Obtain the test support resources specified in 3.3.2 (2).

3.3.22)에 지정된 시험 지원 자원들을 얻어라

 

(3) Obtain Test Items. - 시험 데이터 항목들을 얻어라.

Collect test items including available manuals, operating system procedures, control data (for example, tables), and computer programs

이용 가능한 매뉴얼, 운영 시스템 절차들, 제어 데이터(예를 들어, ) 그리고 컴퓨터 프로그램을 포함한 시험 데이터 항목들을 모아라

 

*Obtain software identified during test planning that directly interfaces with the test unit.

시험 계획(직접적으로 인터페이스로 접속하는 시험 단위)을 식별(확인)하는 동안 소프트웨어를 얻어라.

 

When testing a unit implemented with a procedural language, ensure that execution trace information will be available to evaluate satisfaction of the code-based completeness requirements.

절차적 언어로 구현되는 단위를 시험할 때, 실행 추적 정보는 코드기반 완전성의 만족을 평가하기 위해 이용가능 할 것이라는 것을 확보해야 한다.

 

Record the identifier of each item in the Summary section of the unit’s test summary report.

단위 시험 요약 보고서의 Summary 섹션에 각 데이터 항목의 식별자를 기록해라.

 

3.5.3 Implement Outputs 출력들을 구현하라.

(1) Verified test data (from 3.5.2 (1)) – 검증된 시험 데이터 (3.5.2(1)로부터)

(2) Test support resources (from 3.5.2 (2)) – 시험 지원 자원들 (3.5.2 (2)로부터)

(3) Configuration of test items (from 3.5.2 (3)) – 시험 데이터 항목들의 구성(3.5.2 (3)로부터)

(4) Initial summary information (from 3.5.2 (3)) – 최초의 요약 정보(3.5.2 (3)로부터)

 

3.6 Execute the Test Procedures시험 절차들을 실행하라

3.6.1 Execute Inputs입력들을 실행하라.

 

(1) Verified test data (from 3.5.2 (1)) – 검증된 시험 데이터(3.5.2 (1)로부터)

(2) Test support resources (from 3.5.2 (2)) – 시험 지원 자원들(3.5.2 (2)로부터)

(3) Configuration of test items (from 3.5.2 (3)) – 시험 데이터 항목의 구성(3.5.2 (3)로부터)

(4) Test-case specifications (from 3.4.2 (3) and (4)) – 시험 사례 명세서들(3.4.2 (3) (4)로부터)

(5) Test procedure specifications (from 3.4.2 (2))-if produced

시험 절차 명세서들(3.4.2 (2)로부터) – 만약 만들어졌다면

(6) Failure analysis results (from debugging process)-if produced

실패 분석 결과들(디버깅 프로세스로부터) – 만약 만들어졌다면

 

3.6.2 Execute Tasks태스크들을 실행하라.

(1) Run Tests. 시험들을 실행하라

Set up the test environment. – 시험 환경을 설정하라.

Run the test set. – 시험 집합을 실행하라.

Record all test incidents in the Summary of Results section of the unit’s test summary report.

단위 시험 요약 보고서의 Summary of Results 섹션에 시험 시험에서 일어난 일을 기록하라.

 

(2) Determine Results. 결과들을 결정하라.

For each test case, determine if the unit passed or failed based on required result specifications in the case descriptions.

만약 단위가 사례 설명서의 요구된 결과 명세서에 근거하여 통과되거나 실패하게 되면 각 시험 사례를 결정하라.

 

Record pass or fail results in the Summary of Results section of the unit’s test summary report.

단위 시험 요약 보고서의 Summary of Results 섹션에 통과하고 실패한 결과들을 기록하라.

 

Record resource consumption data in the Summary of Activities section of the report.

보고서의 Summary of Activities에 자원 소모 데이터를 기록하라.

 

When testing a unit implemented with a procedural language, collect execution trace summary information and attach it to the report.

절차적 언어로 구현된 단위를 시험할 때, 실행 추적 요약 정보를 모으고 그것을 보고서에 붙여라.

 

For each failure, have the failure analyzed and record the fault information in the Summary of Results section of the test summary report.

각 실패들은, 실패를 분석하고, 시험 요약 보고서의 Summary of Results섹션에 기록하라.

 

Then select the applicable case and perform the associated actions.

그리고 나서 적용할 수 있는 사례를 선택하라 그리고 관련된 동작들을 실행하라.

 

Case 1: A Fault in a Test Specification or Test Data.

시험 명세서 또는 시험 데이터의 결점

Correct the fault, record the fault correction in the Summary of Activities section of the test summary report, and rerun the tests that failed.

결점을 정정하고, 장애 교정을 시험 요약 보고서의 Summary of Activities에 기록하고, 실패했던 시험들을 재 실행하라.

 

Case 2: A Fault in Test Procedure Execution.시험 절차 실행의 결점.

 

Rerun the incorrectly executed procedures.

부정확하게(틀리게) 실행된 절차들을 재실행하라.

 

Case 3: A Fault in the Test Environment (for example, system software).

시험 환경의 결점(예를 들어, 시스템 소프트웨어)

 

Either have the environment corrected, record the fault correction in the Summary of Activities section of the test summary report, and rerun the tests that failed OR prepare for abnormal termination by documenting the reason for not correcting the environment in the Summary

of Activities section of the test summary report and proceed to check for termination (that is, proceed to activity 3.7).

시험 요약 보고서의 Summary of Activities 섹션에 장애 교정을 기록하고, 실패한 시험들을 재실행하거나 시험 요약 보고서의 Summary of Activities에 환경을 정정하지 않은 이유를 문서로 증명한 것에 의해 비정상적인 종료를 준비하고, 종료에 대한 점검을 속행한다는 것 중 하나로 환경은 정정된다. (이것은, proceed to activity 3.7)

 

Case 4: A Fault in the Unit Implementation.단위 구현의 결점

 

Either have the unit corrected, record the fault correction in the Summary of Activities section of the test summary report, and rerun all tests OR prepare for abnormal termination by documenting the reason for not correcting the unit in the Summary of Activities section of the test summary report and proceed to check for termination (that is, proceed to activity 3.7).

시험 요약 보고서의 Summary of Activities에 장애 교정을 기록하고, 모든 시험들을 재실행하거나

시험 요약 보고서의 Summary of Activities에 환경을 정정하지 않은 이유를 문서로 증명한 것에 의해 비정상적인 종료를 준비하고, 종료에 대한 점검을 속행한다는 것 중 하나로 단위는 정정된다. (, activity 3.7까지 진행하라)

 

Case 5: A Fault in the Unit Design.단위 설계의 결점

 

Either have the design and unit corrected, modify the test specification and data as appropriate, record the fault correction in the Summary of Activities section of the test summary report, and rerun all tests OR prepare for abnormal termination by documenting the reason for not correcting the design in the Summary of Activities section of the test summary report and proceed to check for termination (that is, proceed to activity 3.7).

시험 명세서와 데이터를 적절하게 수정하고, 시험 요약 보고서의 Summary of Activities 섹션에 장애 교정을 기록하고, 시험 요약 보고서의 Summary of Activities에 환경을 정정하지 않은 이유를 문서로 증명한 것에 의해 비정상적인 종료를 준비하고, 종료에 대한 점검을 속행한다는 것 중 하나로 설계와 단위는 정정된다. (이것은, proceed to activity 3.7)

 

NOTE - The cycle of Execute and Check Tasks must be repeated until a termination condition defined in 3.1.2 (3) is satisfied (See Fig 3).

참고사항 - 사이클의 실행 및 검사 태스크들은 3.1.2 (3)에서 만족한(Fig. 3을 보라) 정의된 종료 조건이 될 때까지 반복해야 합니다.

 

Control flow within the Execute activity itself is pictured in Fig 2.

Execute 활동내의 제어 흐름 그 자체는 Fig 2에서 그려진다.

사용자 삽입 이미지

                         Fig 2 Control Flow Within the Check Activity
사용자 삽입 이미지

Fig 3 Control Flow Within the Check Activity

 

3.6.3 Execute Outputs출력들을 실행하라.

(1) Execution information logged in the test summary report including test outcomes, test incident descriptions, failure analysis results, fault correction activities, uncorrected fault reasons, resource consumption data and, for procedural language implementations, trace summary information (from3.6.2 (1) and (2))

실행 정보는 시험 결과들, 시험 사건 설명서들, 실패 분석 결과들, 장애 교정 활동들, 정정되지 않은 장애 이유들, 자원 소모 데이터 그리고 절차적 언어 실현들, 추적 요약 정보를 포함한 시험 요약 보고서에 기록된다. (3.6.2 (1) (2)로부터)

 

(2) Revised test specifications - if produced from 3.6.2 (2)

수정된 시험 규정들 - 만약 3.6.2 (2) 에서 만들어 내게 되면

 

(3) Revised test data - if produced from 3.6.2 (2)

수정된 테스트 데이터 - 만약 3.6.2 (2) 에서 만들어 내게 되면

 

3.7 Check for Termination 종료를 검사하라.

 

3.7.1 Check Inputs – 입력들을 검사하라.

 

(1) Completeness and termination requirements (from 3.1.2 (2) and (3))

완전성과 종료 요구사항들(3.1.2 (2) (3)로부터)

 

(2) Execution information (from 3.6.2 (1) and (2))

실행 정보(3.6.2 (1) (2)로부터)

 

(3) Test specifications (from 3.4.2 (1) through (3) inclusive) - if required

시험 규정들(3.4.2 (1)에서 (3)을 포함한 것으로부터) – 만약 필요하다면

 

(4) Software data structure descriptions - if required

소프트웨어 데이터 구조 기술들 만약 필요하다면

 

3.7.2 Check Tasks  - 태스크들을 검사해라.

 

(1) Check for Normal Termination of the Testing Process.

testing process의 정규(normal) 종료를 검사하라.

 

Determine the need for additional tests based on completeness requirements or concerns raised by the failure history.

요구사항들의 완전성 또는 실패 역사에 의해 올라간 관심에 근거하여 필요한 추가적인 시험들을 결정하라.

 

For procedural language implementations, analyze the execution trace summary information (for example, variable, flow).

절차적 언어 구현을 위해, 실행 추적 요약 정보를 분석하라(예를 들어, 변수, 흐름)

 

If additional tests are not needed, then record normal termination in the Summary of Activities section of the test summary report and proceed to evaluate the test effort and unit (that is, proceed to activity 3.8).

만약 추가적인 시험들이 필요하지 않다면, 시험 요약 보고서의 Summary of Activities 섹션의 정규 종료를 기록하고, 시험 공수와 단위의 평가를 속행한다. (, activity 3.8까지 진행하라)

 

(2) Check for Abnormal Termination of the Testing Process.

testing process의 비정상적인 종료를 검사하라

 

If an abnormal termination condition is satisfied (for example, uncorrected major fault, out of time) then ensure that the specific situation causing termination is documented in the Summary of Activities section of the test summary report together with the unfinished testing and any uncorrected faults.

만약 비정상의 종료 조건이 만족된다면(예를 들어, 교정되지 않은 주요한 결함(장애), 시간 초과)

종료를 일으키는 특정한 상황은 시험 요약 보고서의 Summary of Activities에 상세히 기록된다는 (종료되지 않은 시험과 어떤 정정되지 않은 결점들과 함께)것을 확인하다.

 

Then proceed to evaluate the test effort and unit (that is, proceed to activity 3.8).

그리고 나서 시험 노력과 단위의 평가를 계속한다. (, activity 3.8까지 진행하라)

 

(3) Supplement the Test Set. 시험 집합의 보충(추가)

 

When additional tests are needed and the abnormal termination conditions are not satisfied, supplement the test set by following steps (a) through (e).

추가의 시험들이 필요하고 비정상의 종료 조건들이 만족되지 않을 때, 다음의 (a)에서 (e)까지 단계들에 의해 시험 집합(class)들을 보충하라.

 

(a) Update the test set architecture in accordance with 3.4.2 (1) and obtain additional test-case specifications in accordance with 3.4.2 (3).

3.4.2 (1)과 일치하는 시험 집합 구조를 갱신하고, 3.4.2 (3)과 일치하는 추가의 시험-사례 규정들을 얻어라.

 

(b) Modify the test procedure specifications in accordance with 3.4.2 (2) as required.

필요에 따라서 3.4.2 (1)과 일치하는 시험 절차 규정들을 수정하라.

 

(c) Obtain additional test data in accordance with 3.5.2 (1).

3.5.2 (1)과 일치하는 추가의 시험 데이터를 얻어라

 

(d) Record the addition in the Summary of Activities section of the test summary report.

시험 요약 보고서의 Summary of Activities 섹션에 추가를 기록하라.

(e) Execute the additional tests (that is, return to activity 3.6).

추가적인 시험들을 실행하라. (, activity 3.6으로 돌아가라)

 

3.7.3 Check Outputs출력들을 검사하라.

 

(1) Check information logged in the test summary report including the termination conditions and any test case addition activities (from 3.7.2 (1) through (3) inclusive)

종료 조건들과 어떤 시험 사례 추가 활동들 (3.7.2 (1)에서 (3)을 포함하는 것으로부터)을 포함한 시험 요약 보고서의 기록된 정보를 검사하라

 

(2) Additional or revised test specifications - if produced from 3.7.2 (3)

추가되거나 수정되었던 시험 규정들 만약 3.7.2 (3)에서 만들어 지면

 

(3) Additional test data - if produced from 3.7.2 (3)

추가의 테스트 데이터 만약 3.7.2 (3)에서 만들어 지면

 

3.8 Evaluate the Test Effort and Unit

시험 공수와 단위를 평가하라.

 

3.8.1 Evaluate Inputs – 출력들을 평가하라.

(1) Unit Test Design Specification (from 3.4.2 (5)

단위 시험 설계 규정들(3.4.2 (5)로부터)

 

(2) Execution information (from 3.6.2 (1) and (2))

실행 정보(3.6.2 (1) (2)로부터)

 

(3) Checking information (from 3.7.2 (1) through (3) inclusive)

검사 정보(3.7.2 (1)에서 (3)을 포함한 것으로부터)

 

(4) Separate test-case specifications (from 3.4.2 (3) and (4)) - if produced

독립된 시험-사례 규정들(3.4.2 (3) (4)로부터) – 만약 만들어졌다면

 

3.8.2 Evaluate Tasks 태스크들을 평가하라.

(1) Describe Testing Status. 시험 상태를 설명하라.

 

Record variances from test plans and test specifications in the Variances section of the test summary report.

시험 요약 보고서의 Variances 섹션에 시험 계획들과 시험 규정들로부터 변화들을 기록하라.

 

Specify the reason for each variance.

각 변화의 이유를 상술하라.

 

For abnormal termination, identify areas insufficiently covered by the testing and record reasons in the Comprehensiveness Assessment section of the test summary report.

비정상의 종료는, 시험하는 것과 시험 요약 보고서의 Comprehensiveness Assessment 섹션에 이유들을 기록하는 것으로 불충분하게 포함되는 범위들을 확인하라

 

Identify unresolved test incidents and the reasons for a lack of resolution in the Summary of Results section of the test summary report.

미해결의 시험 사건을 확인하고 시험 요약 보고서의 Summary of Results 섹션에 해결의 부족을 논리적으로 생각하라.

 

(2) Describe Unit’s Status. - 단위의 상태를 기술해라.

 

Record differences revealed by testing between the unit and its requirements documentation in the Variances section of the test summary report.

시험 요약 보고서의 Variances 섹션에 단위들 요구사항들의 문서화와 단위 사이의 시험에 의해 밝혀진 차이들을 기록하라.

 

Evaluate the unit design and implementation against requirements based on test results and detected fault information.

시험 결과들과 발견된 결점 정보에 근거한 요구사항들에 반대하여 단위 설계와 구현을 평가하라.

 

Record evaluation information in the Evaluation section of the test summary report.

시험 요약보고서의 Evaluation 섹션에 평가 정보를 기록하라.

 

(3) Complete the Test Summary Report.

시험 요약 보고서를 완성시켜라.

 

Complete the test summary report for the unit in accordance with ANSI/IEEE Std 829-1983 [2].

ANSI/IEEE Std 829-1983 [2]와 일치하는 단위를 위한 시험 요약 보고서를 완성시켜라.

 

(4) Ensure Preservation of Testing Products.

시험 산출물들의 보존을 확인하라.

 

Ensure that the testing products are collected, organized, and stored for reference and reuse.

시험 산출물들을 재사용성과 참조를 위해 수집하고 조직하고 저장하는 것을 확인하라.

 

These products include the test design specification, separate test-case specifications, separate test procedure specifications, test data, test data generation procedures, test drivers and stubs, and the test summary report.

이 산출물들은 시험 설계 명세서, 독립된 시험-사례 명세서, 독립된 시험 절차 명세서들, 시험 데이터, 시험 데이터 생성 절차들, 시험 드라이버들과 스터브들, 그리고 시험 요약 보고서를 포함한다.

 

3.8.3 Evaluate Outputs - 출력들을 평가하라

 

(1) Complete test summary report (from 3.8.2 (3))

완전한 시험 요약 보고서(3.8.2 (3)으로부터)

 

(2) Complete, stored collection of testing products (from 3.8.2 (4))

완전한, 시험 산출물들의 저장된 집합 (3.8.2 (4)로부터)

                                                                   - 번역: 이상덕 -

 

Posted by 서오석
,

기말고사로 제출했던 영상 A+받았다. 후후..ㅋ

Posted by 서오석
,

Oracle BPEL Process Manager를 이용한 PeopleSoft CRM과 Oracle E-Business Suite의 통합
저자: Lawrence Pravin

BPEL을 이용하여 PeopleSoft 8.9 CRM과 Oracle Applications 11i를 통합하는 방법을 단계별로 설명합니다

샘플 코드

많은 기업들이 서로 다른 부서, 지역, 지사 별로 다양한 이기종 애플리케이션을 운영하고 있습니다. 비즈니스 조직의 요구사항을 만족하기 위해서는 다수의 ERP 시스템이 필요할 수 있으며, 이로 인해 데이터의 파편화(fragmentation)가 발생할 수 있습니다. 이러한 시스템의 통합 작업은 복잡할 뿐 아니라 비표준적인 방법으로 처리되는 것이 일반적입니다. 또 의사결정을 위해 다수의 ERP 시스템에 존재하는 분산된 정보를 수집하는 과정에서 많은 시간과 노력이 소모되곤 합니다.

BPEL은 이기종 시스템의 통합을 위한 표준적, 프로세스 중심적 방법론을 제공합니다. Oracle BPEL Process Manager는 SOA(service-oriented architecture)의 구현을 위한 Oracle Fusion Middleware의 핵심 툴로써, Microsoft, IBM, SAP, BEA 등에 의해 제안된 이후 통합 프로젝트의 비용, 복잡성 절감 및 유연성 개선을 위한 엔터프라이즈 청사진으로써 활용되고 있는 BPEL 표준을 지원합니다.

이번 BPEL Cookbook 시리즈에서는 BPEL을 이용하여 PeopleSoft 8.9 CRM과 Oracle Application 11i를 통합하는 방법을 설명하기로 합니다. 특히, 샘플 비즈니스 시나리오를 통해 PeopleSoft의 모듈을 웹 서비스의 형태로 공개하고, 오라클 애플리케이션과의 연동을 위해 BPEL Applications 어댑터를 설정하는 방법을 예시하게 될 것입니다.

비즈니스 시나리오

일반적으로 주문 관리 비즈니스 시나리오에서는, 주문이 CRM 시스템에 입력된 후 백-오피스 ERP에 의해 처리되는 과정을 거칩니다. 본 문서의 예제에서는, PeopleSoft를 프론트 애플리케이션으로 사용하여 마케팅, 세일즈, 서비스 업무를 관리하고 Oracle E-Business Suite를 ERP (주문 관리, 인벤토리, 재무) 솔루션으로 사용하고 있습니다. 여기에서는 Quote-to-Order(주문 견적) 프로세스를 중심적으로 다루기로 합니다.

견적 및 주문 입력을 위한 비즈니스 프로세스는 CRM 시스템 상에서 실행되며, 주문 처리 작업은 ERP 시스템을 통해 실행됩니다. 전체 Quote-to-Order 비즈니스 프로세스는 작업 능률의 최적화를 위해 완전 자동화됩니다.

비즈니스 프로세스의 통합 과정에서 구현되는 기능이 다음과 같습니다. (그림 1 참고):

PeopleSoft에서 Sales Orders 생성
  • PeopleSoft에서 견적을 세일즈 주문으로 변환하거나 Order Capture 스크린을 이용하는 방법으로 세일즈 주문(sales order)가 생성됩니다.
  • 주문이 입력되면, 시스템은 필요한 정보를 점검하고 상태(status)를 OPEN으로 변경합니다. (그렇지 않은 경우 HOLD 상태가 유지됩니다.)
  • Sales Order Process는 주문 정보를 호출하여 Integration Process에 제출합니다. 이 과정에서 BPEL Process Manager가 호출됩니다.
  • BPEL Process Manager는 메시지 데이터를 Oracle ERP Order Management 모듈에서 요구하는 포맷으로 변환합니다.
  • 세일즈 주문 생성 작업은 Oracle ERP 애플리케이션 상에서 실행되며, 주문의 실행 결과가 PeopleSoft로 전달.
Oracle ERP의 ATP Check
  • 주문 생성 프로세스가 진행되는 동안, 세일즈 담당자는 발송 일자를 확정하기 위해 재고를 점검할 수 있습니다.
  • PeopleSoft CRM은 ERP 애플리케이션에 동기식 호출을 발생시키고, Item/Product Availability 질의 컴포넌트를 이용하여 현재 사용 가능한 물량을 확인합니다.
  • BPEL Process Manager는 ATP Check 요청을 Oracle ERP에 전달합니다.
  • Oracle ERP는 해당 아이템의 수량을 인벤토리에서 확인한 후, 상세 정보를 BPEL Process Manager에 전달합니다.
  • BPEL Process Manager는 ATP 응답 정보를 PeopleSoft CRM에 전달합니다. 이 작업 결과에 따라, 고객에게 발송 가능 일자를 전달합니다.
주문 상태의 업데이트 정보를 Oracle ERP에서 PeopleSoft CRM으로 전달
  • 세일즈 주문이 ERP 애플리케이션으로 전달되면, 주문은 ERP에서 예약 처리되고, 그 결과가 BPEL Process를 거쳐 PeopleSoft CRM 시스템으로 전달됩니다. PeopleSoft CRM 시스템은 주문 상태(order status)를 “In Process"로 변경합니다.
  • Oracle ERP는 주문 상태가 변경될 때마다 그 내역을 CRM으로 전달합니다. ERP의 상태 정보는 CRM 상의 대응되는 상태 정보로 매핑됩니다.

 
사용자 삽입 이미지

그림 1

여기에서는 주문 생성(order creation) 단계에 초점을 맞추기로 합니다. 디자인 타임 viewlet을 통해 실제 설정 및 실행 방법을 확인하실 수 있습니다. 자세한 방법은 Oracle Apps Integration Cookbook을 참고하시기 바랍니다.

솔루션 개요

비즈니스 프로세스를 개략적으로 이해했다면, 이제 아키텍처에 대해 살펴보기로 합시다. 그림 2는 Oracle BPEL Process Manager를 플랫폼으로 하여 PeopleSoft CRM과 오라클 애플리케이션을 통합한 환경의 하이 레벨 아키텍처를 예시하고 있습니다.

 
사용자 삽입 이미지

그림 2

Enterprise Integration Point (EIP)란 PeopleSoft 애플리케이션이 써드 파티 시스템 또는 다른 PeopleSoft 소프트웨어와 연동하기 위해 사용되는 웹 서비스 연결입니다. PeopleSoft CRM에 주문이 입력되면, PeopleSoft의 EIP가 주문을 XML 포맷으로 변환합니다. 그런 다음 Order XML이 PeopleCode 메소드(WSDL_ORDER)로 전달됩니다. (PeopleCode는 비즈니스 룰 구현, 또는 기타 커스터마이즈 작업을 위해 사용되는 PeopleSoft의 프로그래밍 언어입니다.) WSDL_ORDER는 수신된 Order XML을 SOAP XML로 변환하고 PeopleSoft 원격 노드에 요청을 전달합니다. 원격 노드(remote node)란 BPEL Process Manager의 웹 서비스와 핸드쉐이크(handshake) 작업을 수행하는 노드를 의미합니다.

WSIF(Web Service Invocation Framework) 바인딩을 이용하여 원격 노드를 WSDL로 매핑함으로써 PeopleSoft의 웹 서비스 호출 작업이 수행됩니다. BPEL Process Manager는 WSIF 바인딩을 완벽하게 지원합니다. SOAP XML을 수신한 PeopleSoft 노드는 해당 노드에 임포트 및 설정된 WSDL을 기준으로 웹 서비스를 호출합니다. 그런 다음, 웹 서비스가 BPEL Process Manager에서 호출 및 실행됩니다.

BPEL Process Manager는 데이터를 SOAP XML로 처리하고 오라클 애플리케이션에 전달합니다. 이때 Oracle Applications (OA) Adapter를 이용하여 11i와의 커뮤니케이션을 수행합니다. OA Adapter는 퓨어 JCA 1.5 Resource Adapter로, E-Business Suite 환경의 메시지 전송/수신을 위해 사용됩니다. 오라클 애플리케이션은 이 어댑터를 통해 외부 애플리케이션으로 API 및 테이블의 일부를 노출합니다.

오라클 애플리케이션이 주문을 처리한 후 결과를 전송하면, BPEL Process Manager가 이를 수신하여 PeopleSoft 노드에 전달합니다. PeopleSoft 노드는 웹 서비스를 요청한 PeopleCode에 결과를 전달합니다. PeopleCode는 XML 데이터를 인출하여 PeopleSoft에 구성된 컴포넌트 인터페이스에 전달합니다. 컴포넌트 인터페이스(component interface)란 (Java 또는 PeopleCode로 작성된) 다른 애플리케이션으로부터의 동기식 접근을 위해 PeopleSoft 컴포넌트를 노출하는 인터페이스를 말합니다.

PeopleSoft와 오라클 애플리케이션 간에 이루어지는 Order 데이터의 하이 레벨 플로우가 지금까지 설명한 바와 같습니다. 다음으로, PeopleSoft CRM 모듈을 웹 서비스의 형태로 노출하고, BPEL 프로세스를 구성하고, OA Adapter를 설정하는 방법에 대해 알아 보겠습니다.

PeopleSoft CRM과 Oracle ERP의 통합

주문이 PeopleSoft CRM에 입력되고 나면, 해당 주문에 대한 정보 오라클 애플리케이션으로 전달되어야 합니다. 이 과정에서 세 단계의 작업이 수행됩니다.

  1. Oracle BPEL Process Manager에서 비즈니스 프로세스를 설계합니다.
  2. Oracle Applications Adapter를 설정합니다.
  3. PeopleSoft를 설정합니다.

각 단계별로 자세히 살펴보도록 합시다:

1 단계: BPEL 프로세스의 설계

이 단계에서는 BPEL Designer를 이용하여 프로세스를 생성합니다. BPEL Process Manager는 세일즈 주문 정보를 포함한 SOAP XML을 PeopleSoft로부터 수신하고, 이를 OA Adapter의 XML 포맷으로 변환합니다. (스키마는 호출 API를 위한 파트너 링크가 생성되는 시점에 OA Adapter에 의해 자동으로 생성됩니다.) 그런 다음, OA Adapter Partner 링크가 호출되어 변환 작업을 거친 Order XML이 오라클 애플리케이션으로 전달됩니다. Oracle API는 주문을 처리하고 결과 확인(output acknowledgement) XML을 통해 주문 번호(order number)를 반환합니다.

BPEL Process Manager는 원격 폴트(remote fault) 및 바인딩 폴트(binding fault)를 처리합니다. 연결이 끊어진 경우, 5 차례에 걸쳐 접속이 재시도된 후 익셉션(exception)을 발생시킵니다. 바인딩 익셉션이 발생하고 나면 바인딩 폴트가 자동으로 처리됩니다.

BPEL Process Manager를 위해 설계된 통합 비즈니스 프로세스의 예가 아래와 같습니다.

사용자 삽입 이미지


(이미지를 클릭하면 큰 그림을 보실 수 있습니다)

이 프로세스에서 실행되는 작업이 아래와 같습니다:

  1. Applications > New Application Workspace > New Project > BPEL Process Project 메뉴를 선택합니다.
  2. Schema를 임포트하고 BPEL Process의 입력/출력 변수를 정의합니다.
    1. Structure 윈도우에서 project schemas > import Schema를 선택합니다.
      Input schema name(createorder.xsd)을 입력합니다.
    2. Structure 윈도우에서 Message Types를 선택합니다.
      • CreateOrderRequestMessage를 선택하고 createorder.xsd의 CreateOrderIn루트 엘리먼트를 매핑합니다.
      • CreateOrderResponseMessage를 선택하고 createorder.xsd의 CreateOrderOut 루트 엘리먼트를 매핑합니다.
    3. Structure 윈도우에서 Variables를 선택합니다.
      • InputVariable CreateOrderRequestMessage로 매핑되었음을 확인합니다.
      • OutputVariableCreateOrderResponseMessage로 매핑되었음을 확인합니다.
  3. OA Adapter를 위한 파트너 링크를 생성합니다 .
    1. 컴포넌트 팔레트에서 partner link activity를 CreateOrder Process에 추가하고 “CreateOrderPL”이라 명명합니다.
    2. Define Adapter Service를 클릭하고 아래 작업을 수행합니다.
    3. 파트너 링크를 위한 BPEL Process Manager와 OA Adapter를 설정합니다(뒷부분에서 자세히 설명합니다).
  4. OA Adapter를 호출하는 Invoke 액티비티를 추가합니다.
    1. invoke 액티비티를 프로세스 위에 드래그-앤-드롭하고 더블클릭 합니다.

      사용자 삽입 이미지

    2. 파트너 링크를 CreateOrderPL로 매핑하고 입력/출력 변수를 생성합니다.
  5. invoke 액티비티 위에 transform 액티비티를 추가하고 PeopleSoft outbound XML을 Oracle Apps inbound XML로 변환합니다.
    1. transform 액티비티를 더블클릭 합니다. inputVariable 을 source variable로 선택하고, invokeCreateOrderInputVariable을 target variable로 선택한 뒤 “create mapping” 아이콘을 클릭합니다.

      사용자 삽입 이미지

    2. source/target schema를 아래와 같이 매핑합니다.

      사용자 삽입 이미지

  6. invoke 액티비티 아래에 transform 액티비티를 추가하고 Oracle Apps outbound XML을 PeopleSoft 인바운드 XML로 변환합니다.
    1. transform 액티비티를 더블클릭 합니다. invokeCreateOrderOutputVariable 를 source variable로 outputVariable을 target variable로 선택하고 “create mapping” 아이콘을 클릭합니다.

      사용자 삽입 이미지

    2. 소스/타겟 스키마를 아래와 같이 매핑합니다.

      사용자 삽입 이미지

샘플 코드 다운로드에 포함된 아래 파일들을 이용하면, BPEL Designer를 통해 위에서 설명된 프로세스를 재구성할 수 있습니다.

Bpel.xml BPEL 프로세스 플로우에 의해 호출되는 서비스들을 위한 WSDL 파일의 위치를 정의한 deployment descriptor 파일입니다.
CreateOrder.xsd PeopleSoft 애플리케이션에 의해 제출되는 input XML의 스키마입니다.
CreateOrder.bpel 프로세스 플로우, 파트너 링크, 데이터 변수, 폴트 핸들러 등을 포함하는 process source 파일입니다.
CreateOrder.wsdl BPEL 프로세스 플로우, 지원 클라이언트 인터페이스 및 기타 기능을 위한 입력/출력 메시지를 정의하는 WSDL 클라이언트 인터페이스입니다. 이 인터페이스를 이용해서 BPEL 프로세스 플로우를 서비스 형태로 호출할 수 있습니다.

이것으로 BPEL Process의 설계 작업을 완료했습니다. 다음으로 PeopleSoft 환경의 설정에 대해 자세히 살펴보기로 합니다.

2 단계: OA Adapter의 설정

OA Adapter는 매니지드 모드(managed mode)로 Oracle Containers for J2EE에 deploy되며, E-Business Suite로부터 메시지를 전송/수신하는데 사용됩니다. 어댑터의 설정 방법이 아래와 같습니다 .

  1. Adapter Service를 정의하고 Oracle Applications Adapter를 선택합니다.

    사용자 삽입 이미지

  2. 서비스 네임을 입력합니다. 이 서비스 네임은 선택된 API/테이블을 위한 웹 서비스로서 사용됩니다.

    사용자 삽입 이미지

  3. 프로젝트에 정의된 데이터베이스 연결을 선택합니다. DB 연결이 현재 사용 불가능한 경우, New를 클릭하고 마법사를 실행합니다.

    사용자 삽입 이미지

  4. Oracle Application Data에 대한 Table/Views/APIs 인터페이스를 선택합니다.

    사용자 삽입 이미지

  5. BPEL Process로부터 호출할 PROC_ORDERENTRY_ARRAY API를 검색하여 선택합니다.

    사용자 삽입 이미지

    참고: 위의 경우, BPEL Process Manager가 오라클 레코드 타입을 지원하지 않기 때문에, PROC_ORDERENTRY_ARRAYPROCESS_ORDER pre-seeded API를 위한 래퍼(wrapper) API로 사용됩니다. 따라서 PROCESS_ORDER에서 사용된 레코드 타입과 유사한 오브젝트 타입을 래퍼 프로시저(wrapper procedure)에서 사용해야 합니다. 이 인터페이스는 오라클 애플리케이션에서 세일즈 주문을 처리하는 작업을 담당합니다.

  6. API를 Adapter Service에 추가합니다.

    사용자 삽입 이미지

  7. 오라클 애플리케이션 파트너 링크를 BPEL Process에 추가하고, APPS_PROC_ORDERENTRY_ARRAY.xsd를 생성합니다.

    사용자 삽입 이미지

    Adapter Service에 의해 PROC_ORDERENTERY_ARRAY API를 위한 WSDL 파일이 생성됩니다. 이 파일은 웹 서비스와 같은 형태로 동작하며 WSIF를 이용하여 ERP를 바인딩하는 역할을 담당합니다.

    샘플 코드 다운로드에 포함된 아래 파일들은 BPEL Designer에서 OA Adapter를 설정하는데 사용됩니다.

Proc_orderentry_array.sql OA seeded Process_Order API를 호출하기 위한 커스텀 래퍼 API입니다
Create_ObjectScript.sql PROC_ORDERENTERY_ARRAY 커스텀 API에 사용되는 Creation of Object 스크립트를 포함하고 있습니다
CreateOrder.bpel 프로세스 플로우, 파트너 링크, 데이터 변수, 폴트 핸들러 등을 포함하는 프로세스 소스 파일입니다.
CreateOrder.wsdl BPEL 프로세스 플로우, 지원 클라이언트 인터페이스 및 기타 기능의 입력/출력 메시지를 정의하는 WSDL 클라이언트 인터페이스입니다. 이 인터페이스를 이용해서 BPEL 프로세스 플로우를 서비스 형태로 호출할 수 있습니다.

이것으로 BPEL 프로세스의 설계 및 OA Adapter의 설정을 완료하였습니다. 마지막 단계로, PeopleSoft를 설정하기로 합니다.

제 3단계: PeopleSoft의 설정

BPEL 프로세스의 생성을 완료하였다면, 이제 네 단계에 걸쳐 PeopleSoft의 설정 작업을 수행할 차례입니다.

  • 첫 번째 단계로, BPEL 프로세스 WSDL을 PeopleSoft에 임포트합니다. 그런 다음 임포드된 WSDL을 이용하여 BPEL 프로세스와 커뮤니케이션을 수행할 노드의 설정 작업을 수행합니다.
  • 두 번째 단계로, Sales Order EIP를 설정하여 새로운 세일즈 주문이 생성될 때마다 노드를 호출하도록 합니다.
  • 마지막으로, 노드가 BPEL 프로세스에 주문 정보를 전달하기 전에, 주문 정보를 SOAP XML로 변환합니다. 세 번째, 그리고 네 번째 단계에서는 간단한 PeopleCode 함수를 작성하여 변환 작업을 수행하고 노드와의 관계를 설정하는 작업을 수행하게 됩니다.

각 단계별 설명이 아래와 같습니다.

1. PeopleSoft 노드와 BPEL Process 간의 커뮤니케이션 설정

이 단계에서는, BPEL Process와 커뮤니케이션을 수행할 노드를 설정하게 됩니다. 요청/응답 메시지와 메시지가 전달되는 채널을 정의합니다.

먼저, URL 옵션을 사용하여 (앞에서 생성한) CreateOrder.wsdl을 PeopleSoft에 임포트합니다. CreateOrder는 프로세스로 정의되며, 새로운 주문이 PeopleSoft에서 생성될 때 호출됩니다. WSDL을 PeopleSoft에 임포트하는 시점에, Integration Broker는 WSDL을 WSDL 리포지토리에 추가합니다.

CreateOrder.wsdl을 임포트하려면, PeopleTools > Integration Broker > Web Services > Import WSDL를 선택합니다.

사용자 삽입 이미지

이제 WSDL Repository 페이지를 이용하여 WSDL 리포지토리의 WSDL에 액세스할 수 있습니다.

CreateOrder WSDL을 PeopleSoft에 임포트한 다음에는, BPEL 프로세스와의 커뮤니케이션을 위해 원격 노드를 설정해야 합니다. 이를 위해 request message, response message, and message channel를 아래와 같이 추가합니다.

새로운 원격 노드를 생성하는 방법이 아래와 같습니다:

  1. Create a New Node Definition 버튼을 선택합니다.

    사용자 삽입 이미지

  2. Node Name 필드에서, BPEL_CREATEORDER를 입력하여 새로운 노드를 정의합니다.
  3. Node Description 필드에 노드에 대한 설명을 입력합니다.
  4. Authentication 드롭다운 리스트에서 인증 방법(None, Certificate, Password)을 선택합니다. (디폴트는 None입니다.)
  5. (옵션) Password 필드에 암호를 입력합니다.
  6. (옵션) Confirm Password 필드에 암호를 다시 입력합니다.

Next 버튼을 클릭하여 WSDL Operation Wizard의 다음 페이지로 진행하여 서비스의 요청/응답 메시지(request/response message)를 선택합니다. 요청/응답 메시지는 PeopleSoft 내부에서 비구조형 메시지로 정의되며 SOAP Request / Response 메시지로 활용됩니다.

새로운 요청/응답 메시지를 생성하는 방법이 아래와 같습니다:

  1. 해당 섹션에서 Create a New Message 옵션을 선택합니다.
  2. 새로운 요청 메시지를 생성하기 위해 Request Message 섹션의 옵션을 선택합니다. message name 필드에는 BPEL_ORDER_REQ를 입력합니다.
  3. 새로운 응답 메시지를 생성하기 위해 Response Message 섹션의 옵션을 선택합니다. message name 필드에는 BPEL_ORDER_RES를 입력합니다.
  4. d. 새로 생성된 메시지의 버전은 디폴트로 VERSION_1로 정의됩니다. PeopleSoft Integration Broker는 이 값을 이용하여 Message Version 필드를 채웁니다.

    사용자 삽입 이미지

    PeopleSoft Integration Broker는 새로운 메시지 채널에 자동으로 메시지를 할당합니다. 마법사 실행이 완료되면, 새로운 메시지를 이용하여 노드에 아웃바운드 동기식 트랜잭션이 생성됩니다.

  5. channel name 필드의 New Message Channel Name을 BPEL_SERVICES로 입력합니다.

     
    사용자 삽입 이미지

이로써 1 단계가 완료되었습니다. WSDL을 임포트함으로써 어떤 웹 서비스를 호출할 것인지 PeopleSoft에 알리고, 웹 서비스(CreateOrder BPEL Process)에 정보를 전달하기 위한 노드, 메시지, 채널 등을 설정하였습니다. 다음 단계에서는 Sales Order EIP와 새로 설정된 노드 간의 관계를 설정합니다.

2. EIP와 노드 간의 관계 설정

이 단계에서는 CRM_SALES_ORDER EIP와 새로운 노드 간의 링크를 생성합니다. CRM_SALES_ORDER EIP가 Integration Broker를 통해 공개되고, 생성된 링크를 통해 CRM_SALES_ORDER 요청 메시지를 노드에 전달합니다.

  • People Tools > Integration Setup에서 Node Definition을 선택하고, BPEL_CREATEORDER 노드를 검색합니다.

    사용자 삽입 이미지

  • 선택한 노드에서, Transaction Type을 “Outbound Asynchronous”로 변경하고 Request Message에 "CRM_SALES_ORDER"를 입력합니다.
3. Transformation Code의 생성

이 단계에서는 WSDL_ORDER Application Engine 프로그램을 생성합니다. (Application Engine은 PeopleSoft의 대용량 애플리케이션 프로세서입니다. Application Engine 프로그램은 Application Designer를 통해 작성되며, 레코드, PeopleCode, SQL 오브젝트와 같은 PeopleTool의 기능을 활용할 수 있습니다.) WSDL_ORDER는 EIP로부터 수신된 세일즈 주문 메시지를 BPEL 요청 메시지(SOAP 메시지)로 변환하고 변환된 메시지를 노드 채널로 배포합니다.

아래 코드를 추가하여 요청 메시지를 변환한 후 노드에 전송합니다. 요청이 노드에 전송되고 나면, 노드가 웹 서비스를 호출하는 작업을 수행하게 됩니다. 웹 서비스가 호출되면, XML 메시지를 PeopleCode 메소드로 전송하고 응답 메시지를 노드에 전달하는 작업이 수행됩니다.

/* Get the data from the AE Runtime */
Local TransformData &transformData = %TransformData;
 
Local File &logFile = GetFile("TestSyncReqResStep3.log", "W", %FilePath_Absolute);
 
Local string &destNode = &transformData.DestNode;

&logFile.WriteLine("DestNode: " | &destNode);
 
/* Set a temp object to contain the incoming document */
Local XmlDoc &xmlDoc = &transformData.XmlDoc;

Local string &xmlStr = &xmlDoc.GenXmlString();
 
&logFile.WriteLine("Transformed XML : " | &xmlStr);

/* Maps the &xmlDoc  to the BPEL_ORDER_REQ and publish to the BPEL_CREATEORDER node. 
   Node will invoke BPEL CreateOrder process. 
   Response will be assigned to &response variable. */

Local XmlDoc &response = SyncRequestXmlDoc(&xmlDoc, Message.BPEL_ORDER_REQ, Node.BPEL_CREATEORDER);
 

&logFile.WriteLine("Response XML Data: " | &response.GenXmlString());
 
&logFile.Close();

4. WSDL_ORDER Application Engine 프로그램과 노드의 연결

이 단계에서는, 변환 코드를 CreateOrder 노드에 연결하는 작업을 수행합니다. 이와 같이 함으로써, BPEL Process Manager가 호출될 때마다 변환 코드가 실행되게 할 수 있습니다.

새로운 WSDL_ORDER 관계(relationship)를 생성하고, 생성된 관계를 WSDL_ORDER 노드에 연결합니다:

People Tools > Integration Setup에서 Relationships을 선택하고 Add New Value를 선택합니다.

  • Initial Node를 BPEL_CREATEORDER로, CRM_SALES_ORDER를 Request Message로, Transaction Type을 OA로, Result Node를 BPEL_CREATEORDER로, Request Message Name을 CRM_SALES_ORDER로 설정하고 디폴트 버전을 그대로 사용합니다. Add를 클릭합니다.

사용자 삽입 이미지

  • Transformation Request를 WSDL_ORDER로 설정합니다.

사용자 삽입 이미지

T이로써 Sales Order 생성 작업을 완료하였습니다. 디자인 타임 viewlet을 통해 설정 과정을 다시 한 번 확인하실 수 있습니다.
런타임 viewlet에서는 PeopleSoft에 입력된 세일즈 주문이 오라클 애플리케이션으로 전달되는 과정을 확인할 수 있습니다.

결론

각 부서별로 서로 다른 애플리케이션을 사용하는 기업 환경에서 정보를 통합하는 문제가 중요한 이슈로 떠오르고 있습니다. 시스템의 통합에는 많은 비용 투자가 필요합니다. 본 문서에서 제시한 것과 같은 방법을 이용하여 BPEL 표준 기반의 애플리케이션 통합을 수행함으로써 문제를 쉽게 해결하는 것이 가능합니다.

-  한국 오라클 -
Posted by 서오석
,

이기종 EAI 환경에 BPEL 추가하기
저자: Praveen Chandran and Arun Poduval

Oracle BPEL Process Manager의 통합(orchestration) 기능을 이용하여 고전적인 EAI 미들웨어를 아우르는 표준 기반 비즈니스 프로세스 통합 환경을 구현하는 방법에 대해 알아봅니다.

오늘날 대부분의 기업은 다수 벤더 제품으로 구성된 다양한 애플리케이션과 플랫폼, 그리고 서로 다른 테크놀로지를 포함하는 고도로 분산된 이기종 애플리케이션 인프라스트럭처를 보유하고 있습니다. 지난 10년 동안에는 TIBCO, webMethods, Vitria, SeeBeyond 등 고전적인 EAI(enterprise application integration) 벤더들이 통합 문제를 해결하기 위한 새로운 솔루션을 출시하는 움직임이 두드러지게 나타나기도 했습니다. 또 지난 몇 년 동안, 많은 기업이 이러한 EAI 솔루션에 많은 투자를 하면서, 기업 환경이 단일 벤더 환경에 종속되고 긴밀하게 커플링된(tightly coupled) 통합 컴포넌트 구성이 일반화되기 시작하였습니다.

이처럼 벤더 종속적인 통합 환경을 유지하고 관리하는 데에는 만만치 않은 비용이 듭니다. 비용과 안정성 문제를 해결하기 위해서는 전문적인 스킬이 요구될 뿐 아니라, 기존 EAI 솔루션을 다른 대안으로 완전하게 대체하려면 막대한 비용을 EAI 영역에 쏟아 부어야 할 수도 있습니다.

BPEL이 제공하는 표준 기반, 플랫폼 중립적인 솔루션을 이용함으로써 이러한 문제를 해결하는 것이 가능합니다. 느슨하게 커플링된(loosely coupled) BPEL 프로세스는 벤더 종속 요소를 제거하고, 통합 비용을 절감하고, 호환성을 개선하는 효과를 제공합니다. 또 보안, 예외 관리, 로깅 등을 위한 계층 구현을 가능하게 합니다. 가장 중요한 사실은 기업들이 기존 인프라스트럭처를 활용하여 서비스를 구현하고 BPEL을 이용하여 전체 서비스를 통합할 수 있다는 점입니다.

“BPEL Cookbook” 시리즈의 이번 연재에서는 Oracle BPEL Process Manager를 이용하여 새로운 통합 솔루션을 개발하고 기존 인프라스트럭처와 인터페이스 하기 위한 아키텍처의 청사진을 제시합니다. 또 TIBCO BusinessWorks와 webMethods에 기반한 이기종 EAI 솔루션을 웹 서비스와 통합하는 사례를 함께 살펴보기로 합니다.

또, 완벽한 비즈니스 프로세스의 구현을 위해서는 용의주도한 에러 관리, 보안, 로깅 프레임워크가 필수적입니다. 여기에서는 BPEL scope와 compensation handler를 이용하여 프로세스의 안정성을 높이고 BPEL 프로세스 및 서비스의 보안을 보장하는 방법에 대해 함께 알아보도록 하겠습니다.

사례 연구 배경정보

EAI는 기존 애플리케이션의 서비스화(service-enabling)을 위한 훌륭한 촉매제 역할을 합니다. 기존 미들웨어 프로세스를 웹 서비스로 공개하고, 이를 다시 BPEL을 통해 통합하는 것이 가능합니다.

아래 다이어그램은 Oracle BPEL Process Manager를 이용하여 기존 EAI 인터페이스와 새로운 애플리케이션을 통합하는 일반적인 접근법을 보여주고 있습니다. 아래에서는 미들웨어가 비즈니스 프로세스를 웹 서비스 형태로 공개할 수 있으며, 애플리케이션 서버 내부적으로 웹 서비스 인터페이스가 구현되어 있다고 가정하고 있습니다.

사용자 삽입 이미지

그림 1 EAI 환경의 Oracle BPEL Process Manager — 전체 개념도

본 문서에서는 두 가지 고전적인 EAI 미들웨어 제품에 대한 사례 연구를 통해, BPEL이 제품간 통합 과정에서 어떤 역할을 담당하는지 알아보기로 하겠습니다.

특정 고객의 “기록 시스템(system of record)”이 고객 데이터가 관리되고 있는 다른 시스템으로 원활하게 전달되지 않는 경우를 자주 찾아볼 수 있습니다. 이러저러한 이유로 기업이 두 가지 벤더의 미들웨어 제품(예: Siebel CRM과 TIBCO BusinessWorks, SAP R/3와 webMethods 등)을 동시에 사용하고 있는 경우를 고려해 봅시다. (그림 2 참고).

사용자 삽입 이미지

그림 2 Customer Details Management Module과 미들웨어 인터페이스

이러한 모델에서는, SAP 시스템과 Siebel 시스템 간의 고객 데이터 불일치로 인한 고객 서비스 수준의 저하, 또는 기업 매출의 저하가 발생할 소지가 높습니다. 따라서, TIBCO 및 webMethods와 다수의 인터페이스 포인트(interfacing point)를 갖는 공통 Customer Details Management Module을 구현함으로써 데이터 일관성을 보장하는 것이 바람직합니다. 예를 들어, Siebel 시스템에 고객 데이터가 접수된 경우, 시스템은 고객이 신규 고객인지 아니면 기존 고객인지 확인한 후 SAP 시스템에 새로운 데이터를 추가하거나 기존 데이터를 업데이트하는 작업을 수행하게 됩니다.

이러한 통합 목표의 달성을 위해 기존 미들웨어 툴(TIBCO와 webMethods)를 이용할 수도 있습니다. 하지만 이 경우 벤더 종속성이 더욱 심화될 뿐 아니라 표준 기반의 통합이 불가능하다는 문제가 있습니다. 따라서 이와 같은 환경을 애플리케이션의 서비스화(service-enabling)를 위한 새로운 기회로 활용하고, 표준 기반, 벤더 중립적인 솔루션을 구현하는 것이 바람직할 것입니다.

표준 기반의 EAI 인터페이스를 구현하기 위한 첫 단계로서, 프로세스를 웹 서비스로 공개하는 작업이 필요합니다. 대부분의 미들웨어 플랫폼은 웹 서비스를 이용한 다른 플랫폼 간의 커뮤니케이션을 지원합니다. 하지만 일련의 인터페이스 서비스를 관련된 비즈니스 로직과 연계해야 하는 경우에는 문제가 복잡해질 수 있습니다.

또 다른 미들웨어 프로세스, 또는 복잡한 Java 코드를 이용하여 웹 서비스를 통합하는 방법을 고려해 볼 수도 있습니다. 하지만 이 경우에도 아래와 같은 기능을 프로세스를 통해 직접 구현해야 한다는 문제가 남습니다:

  • 병렬 웹 서비스 호출
  • 비동기식 웹 서비스 호출
  • 서비스 간의 느슨한 커플링(loose coupling) 및 호환성
  • 표준 기반 인터페이스를 이용하여 전체 통합(orchestration) 환경을 공개
  • 통합 모니터링 (orchestration monitoring)
그림 3에서 확인할 수 있는 것처럼, BPEL을 기반으로 한 표준 기반 통합 솔루션을 이용하면 이러한 문제를 쉽게 해결할 수 있습니다.

사용자 삽입 이미지

그림 3 웹 서비스 인터페이스를 이용한 Customer Details Management Module

이와 같은 시나리오에 BPEL을 도입함으로써 기대할 수 있는 이점이 다음과 같습니다:

  • BPEL은 느슨하게 커플링된(loosely coupled) 웹 서비스 통합을 지원합니다.
  • 비즈니스 로직을 (심지어 병렬 플로우까지도!) 단순한 XML 태그를 이용해 표현할 수 있습니다.
  • 간단한 assign (copy 룰),invoke 구문을 이용하여 서비스 간의 데이터 라우팅을 수행할 수 있습니다.
  • 다른 통합 툴, 미들웨어 툴, 또는 웹 애플리케이션으로부터 Customer Details Management Module을 독립적인 웹 서비스 컴포넌트로 호출할 수 있습니다.
  • Oracle BPEL Process Manager 등의 제품이 제공하는 단순한 GUI를 통해 프로세스를 쉽게 관리할 수 있습니다.
대부분의 미들웨어 툴은 비즈니스 프로세스를 웹 서비스의 형태로 공개함으로써, BPEL을 이용한 통합을 한층 용이하게 하는 기능을 제공합니다. 더 나아가, 사용 중인 모든 미들웨어 서비스 인터페이스가 공통 메시지 포맷을 사용하도록 설정하는 것도 가능합니다.

이제, Oracle BPEL Process Manager를 이용하여 SAP 시스템과 Siebel 시스템의 고객 데이터를 동기화하는 방법에 대해 알아보기로 합시다.

Customer Details Management Module의 구현

BPEL은 SAP 시스템과 Siebel 시스템 간의 고객 데이터 동기화 프로세스를 자동화하는 과정에서 매우 중요한 역할을 담당합니다. BPEL 프로세스를 구현하기 위한 작업 단계가 아래와 같습니다:

  1. TIBCO, webMethods 프로세스를 웹 서비스로 공개합니다.
  2. BPEL 프로세스를 이용하여 웹 서비스를 통합(orchestrate)합니다.
  3. BPEL 프로세스에 예외 관리(exception management) 기능을 추가합니다.
  4. Oracle BPEL Process Manager, 애플리케이션 어댑터, EAI 툴 간의 커뮤니케이션 보안 환경을 구현합니다.
  5. 로깅, 통보 프로세스를 중앙집중화 합니다.
1 단계: TIBCO, webMethods 프로세스를 웹 서비스로 공개. 고객 정보는 정규 포맷(canonical format)으로 표시되며, 포맷 내에는 SAP과 Siebel이 사용하는 필드가 모두 포함되어 있습니다. TIBCO와 webMethods는 이 포맷을 각각 Siebel, SAP 고객 레코드 포맷으로 변환하여 사용합니다.

BusinessWorks 프로세스를 웹 서비스로 공개하기 위한 방법이 아래와 같습니다:

  1. BusinessWorks 프로세스가 제공하는 기능을 분석하고, 해당 기능이 통합 시나리오 내에서 독립적인 컴포넌트로써 구현될 수 있는지 확인합니다.
  2. 프로세스 입력 및 출력을 정의합니다.
  3. input output이 복잡한 경우, W3C XML 스키마(XSD)를 이용하여 정의합니다. XSD를 이용하여 커스텀 폴트 스키마(custom fault schema)를 정의할 수도 있습니다.
  4. WSDL 팔레트를 이용하여 WSDL을 생성하고inputoutput 메시지 포맷을 정의합니다 (이때 필요한 경우, 메시지 포맷을 사전정의된 XSD와 연결합니다). 기존 WSDL을 임포트(import)할 수도 있습니다.
  5. HTTP Connection 리소스를 설정합니다.
  6. SOAP Event Source 를 첫 번째 액티비티로 사용하고, 비즈니스 로직, SOAP Send Reply 등의 순으로 프로세스를 서비스 형태로 공개합니다.
  7. HTTP Connection 리소스와 Event Source를 연결(associate)합니다.
  8. WSDL과 Send ReplyEvent Source와 연결합니다.
  9. 발생 가능한 예외(exception)을 처리하고 SOAP Send Fault를 이용하여 서비스 클라이언트에 예외를 전달합니다.
  10. 10. 머신 네임이 mymachine이고, HTTP Connection 리소스를 위해 8000번 포트를 사용하며, 프로세스 네임이 SOAPService인 경우, 다음 URL을 통해 서비스에 접근할 수 있습니다. http://mymachine:8000/SOAPService.
  11. Event Source 액티비티의 WSDL 탭에서 서비스의 WSDL을 가져옵니다.
webMethods에서 사용하는 방법이 아래와 같습니다:
  1. webMethods Flow Service가 통합 시나리오에서 독립적인 컴포넌트로써 구현될 수 있는지 확인합니다.
  2. 해당 웹 서비스를 별도의 인증 과정 없이 webMethods 외부에서 호출하고자 하는 경우 Permissions 탭의 "Execute ACL to Anonymous"를 체크합니다.
  3. webMethods Developer에서 해당 Flow Service를 선택하고, Tools 메뉴에서 Generate WSDL을 클릭합니다.
  4. WSDL 다큐먼트를 생성하는 과정에서 프로토콜(SOAP-RPC/SOAP-MSG/HTTP-GET/HTTP-POST)과 전송 메커니즘(HTTP/HTTPS)을 정의합니다.
  5. WSDL 다큐먼트의 타겟 네임스페이스(target namespace)를 정의합니다.
  6. webMethods Integration Server가 실행되는 호스트명 또는 IP 주소를 Host 필드에 입력합니다.
  7. 현재 Integration Server에 연결할 때 사용하는 포트 넘버를 Port 필드에 입력합니다.
  8. WSDL 다큐먼트를 로컬 파일 시스템에 저장합니다. 생성된 WSDL 다큐먼트에서 서비스 엔드포인트(service endpoint)를 확인할 수 있습니다.
참고: webMethods Integration Server는 특정 에러 상황이 발생한 경우 사전 정의된 SOAP 폴트(fault)를 전송합니다. 커스텀 SOAP 폴트를 전송하고자 하는 경우에는 커스텀 SOAP 프로세서를 이용해야 합니다. 또 서비스를 다큐먼트/리터럴(document/literal) 웹 서비스로 공개하고자 하는 경우에는 래퍼 서비스(wrapper service) 또는 커스텀 SOAP 프로세서를 사용해야 합니다.

이제, 아래와 같은 3 개의 TIBCO 웹 서비스가 존재한다고 가정해 봅시다 (TIBCO BusinessWorks 프로세스와 TIBCO Adapter for Siebel을 사용하여 구현).

  • Siebel Add
  • Siebel Update
  • Siebel Query
마찬가지로, 아래와 같은 webMethods 웹 서비스가 존재합니다 (webMethods Integration Server와 webMethods SAP R/3 Adapter를 이용하여 구현).
  • SAP Add
  • SAP Update
솔루션 아키텍처는 아래와 같이 요약할 수 있습니다:

사용자 삽입 이미지

그림 4 솔루션 아키텍처

위 그림에서 확인할 수 있는 것처럼, BPEL 프로세스는 EAI 툴을 이용한 프론트 오피스 콜 센터와 백엔드 SAP 및 Siebel CRM 애플리케이션 간의 커뮤니케이션을 중개하는 역할을 담당합니다.

미들웨어 프로세스를 웹 서비스로 공개하기 위한 몇 가지 베스트 프랙티스가 아래와 같습니다:

  • 가능한 한 WS-I 표준을 준수합니다.
  • 서비스를 리터럴 인코딩(literal encoding)을 사용한 “document” 스타일로 공개합니다. 이것이 불가능한 경우에는, 리터럴 인코딩을 이용한 “rpc” 스타일로 공개합니다. 두 가지 스타일 모두 WS-I 표준에 의해 권장되고 있지만, document 스타일이 좀 더 사용하기 쉬운 것이 사실입니다 (특히 BPEL assign 액티비티에 대한 copy 룰을 생성하는 경우에 특히 그러합니다). rpc 스타일의 경우 모든 스키마 엘리먼트가 별도의 메시지 파트로 구성되는 반면, document 스타일에서는 전체 메시지가 하나로 전달됩니다. 따라서 전체 스키마를 하나의 copy 룰을 사용하여 복사할 수 있기 때문에, 개발 작업이 단순화되고 최종 WSDL 다큐먼트의 스타일과 인코딩을 검증하기 쉽다는 장점이 있습니다.
  • SOAP 인코딩의 사용을 피합니다. WSDL의 SOAP Action 속성은 빈 문자열(empty string)으로 구성됩니다.
  • 미들웨어가 웹 서비스의 인터페이스 기술을 위해 WSDL 1.1을 사용하고 있는지 확인합니다.
  • SOAP의 HTTP 바인딩을 사용합니다.
  • 스키마 기술에 사용되는 모든 XSD가 W3C가 제안한 XML Schema Specification을 준수하는지 확인합니다. 예를 들어, 글로벌 엘리먼트 선언에 다른 글로벌 엘리먼트에 대한 참조가 포함되어서는 안됩니다 (다시 말해, ref 속성 대신 type 속성이 사용되어야 합니다).
2 단계: 웹 서비스의 통합(orchestration). H미들웨어 프로세스를 웹 서비스로 공개했다면, 다음은 Oracle BPEL Process Manager의 강력한 GUI 기반 BPEL 인터페이스를 이용하여 서비스들을 통합할 차례입니다.

앞부분에서 Customer Details Management Module이 SAP 시스템 및 Siebel 시스템의 고객 데이터를 동기화하는 역할을 담당한다고 설명한 바 있습니다. 이 프로세스를 BPEL Designer의 비주얼 인터페이스를 이용하여 생성한 결과가 아래 그림과 같습니다.

사용자 삽입 이미지

그림 5 Oracle BPEL Process Manager를 이용한 Customer Details Management Module의 통합

프로세스 플로우는 아래와 같이 요약될 수 있습니다:

  1. receive 액티비티가 customer detail 정보를 접수합니다 (enterprise schema).
  2. Detail 정보가 assign, invoke (Siebel Query 서비스) 액티비티를 통해 Siebel에 전달됩니다.
  3. pick 액티비티에서 Siebel Query의 결과를 통해 고객이 신규 고객인지 기존 고객인지를 확인합니다.
  4. 신규 고객인 경우 병렬 플로우가 호출되고, flow 액티비티가 Siebel와 SAP에 고객 정보를 동시에 추가합니다. 또는 기존 고객인 경우, 양쪽 애플리케이션에 고객 정보를 업데이트하기 위한 병렬 플로우가 호출됩니다.
  5. 고객 정보가 SAP에 존재하지 않는 경우, Siebel Query 를 통해 필요한 필드를 가져옵니다. 업데이트가 필요한 SAP 필드는 일련의 assign copy 룰을 통해 SAP Update로 전달됩니다.
  6. reply 액티비티를 통해 Customer Update/Addition의 최종 결과가 반환됩니다.
그림에서 확인할 수 있는 것처럼, 양측의 비즈니스 프로세스에는 Siebel 및 SAP 데이터의 추가와 업데이트를 위한 웹 서비스가 각각 구현됩니다. 1 단계에서 설계되는 이 웹 서비스들은 내부적으로EAI 프로세스들을 호출합니다.

이 BPEL 프로세스는 고객 관에 관련한 비즈니스 요구사항을 해결하고 있지만, 여전히 예외 사항을 처리하고 있지 못하다는 문제가 있습니다. 예를 들어, 특정 고객의 레코드가 Siebel에서는 성공적으로 추가되었지만 SAP에서 실패한 경우에는 어떻게 해야 할까요? 이러한 문제를 해결하기 위해서는 비즈니스 프로세스에 예외 관리(exception management)가 구현되어야 합니다.

3 단계: 예외 관리(Exception Management) 기능의 추가. 예외 관리 기능을 구현함으로써 BPEL 프로세스 또는 웹 서비스 외부에서 반환되는 에러 메시지 및 기타 예외 사항을 처리하고 비즈니스 에러 또는 런타임 에러 발생시 대응되는 에러 메시지를 생성할 수 있습니다.

아래 표는 고객 관리 BPEL 프로세스를 보다 안정적으로 구현하기 위한 예외 상황을 요약하고 있습니다.

No. Case 해결 방안
1

Siebel Query 실패

프로세스 종료; 재시도
2

Siebel Add 실패; SAP Add 성공

SAP 레코드의 삭제를 통한 보정; 재시도
3

Siebel Add 성공; SAP Add 실패

정상 플로우; 재시도
4

Siebel Add 실패; SAP Add 실패

정상 플로우; 재시도
5

Siebel Update 성공; SAP Update 실패

정상 플로우; 재시도
6

Siebel Update 실패; SAP Update 성공

SAP 레코드 롤백을 통한 보정; 재시도
7

Siebel Update 실패; SAP Update 실패

정상 플로우; 재시도

1, 2, 6 번을 제외한 나머지 케이스는 별도의 예외 처리를 필요로 하지 않음을 확인할 수 있습니다.

Exception을 캐치하고 적절한 대응 조치를 취하기 위해서는 웹 서비스의 상태를 추적하는 것이 중요합니다. 케이스 1, 2, 6이 어떻게 처리되는지 논의 하기 전에, 특정 웹 서비스의 상태를 어떻게 추적할 수 있는지 설명해 보기로 하겠습니다.

BPEL 프로세스에는 아래와 같은 reply 스키마 속성이 포함됩니다:

  • Siebel_Add_Status
  • Siebel_Update_Status
  • SAP_Add_Status
  • SAP_Update_Status
위의 4가지 속성은 Failed , Success 또는 NA 의 값을 가지며, BPEL 프로세스에 의해 임의의 시점에 설정될 수 있습니다. Failed 상태로 설정하려는 경우, 프로세스는 타겟 웹 서비스에서 발생되는 SOAP 폴트(fault)를 캐치합니다 (이때 각각의 invoke 액티비티에 대해 catch handler가 사용됩니다). Customer Details Management Module을 호출하는 클라이언트는 에러가 발생한 경우 고객 상세정보를 재전송할 수 있습니다.

이제 각 케이스 별로 예외가 어떻게 관리되는지 살펴보기로 합시다:

Case 1
Siebel 쿼리가 실패한 경우, 프로세스를 종료하고 클라이언트 호출 과정을 재시도합니다.

Case 2
고객 상세정보의 INSERT 작업이 Siebel에서는 실패하고 SAP에서는 성공한 경우 (두 가지 작업은 병렬적으로 실행됩니다), 데이터 일관성이 훼손될 수 있습니다. 또, 같은 작업을 재시도하는 경우 아래와 같은 문제가 발생할 수 있습니다:

  • BPEL 프로세스를 호출하여 Siebel에 고객 상세정보를 INSERT하려 시도하는 과정에서, SAP에 중복된 정보가 입력될 수 있습니다.
  • 해당 고객의 정보를 업데이트하는 BPEL 프로세스를 호출하려 시도하는 경우, Siebel에서의 업데이트가 (해당 레코드가 존재하지 않기 때문에) 실패하게 됩니다.
위의 상황을 처리하려면, 같은 작업이 재시도되기 전에 다른 webMethods 웹 서비스와 BPEL compensation handler 및 scope를 사용하여 SAP 고객 레코드를 먼저 삭제해야 합니다.

scope와 compensate 액티비티는 가장 핵심적인 BPEL 개발 툴의 하나입니다. 스코프(scope)는 다른 액티비티에 대한 container 겸 context로써 활용됩니다. 스코프 액티비티(scope activity)는 프로그래밍 언어의 {} 블록에 대응됩니다. 스코프는 BPEL 플로우를 기능적으로 유사한 구조로 그룹화하고, 에러, 이벤트, 보정(compensation) 및 데이터 변수, correlation set 등을 위한 핸들러(handler)를 제공합니다.

Oracle BPEL Process Manager는 보정 처리를 위해 두 가지 컨스트럭트를 제공합니다:

  • Compensation handler—롤백 작업을 위한 비즈니스 로직을 처리합니다. 프로세스 및 스코프 별로 핸들러를 정의할 수 있습니다.
  • Compensate activity—이 액티비티는 성공적으로 완료된 inner scope 액티비티를 통해 compensation handler를 호출합니다. 그리고 이 액티비티는 fault handler 또는 다른 compensation handler 내부에서만 호출이 가능합니다.
Exception은 catch handler를 통해 스코프 레벨에서 캐치됩니다. 그런 다음, catch handler는 compensate activity를 이용하여 inner scope를 위한 compensation handler를 호출합니다. 이 compensation handler는 롤백에 필요한 작업을 수행하게 됩니다.

다시 예제로 돌아가, BPEL 프로세스가 내부(inner), 외부(outer)의 두 가지 스코프를 갖는다고 가정해 봅시다. SAP AddSiebel Add 서비스의 호출은 outer scope를 통해 수행되며, SAP Add 서비스 만이 inner scope를 통해 수행됩니다. compensation handler는 inner scope와 연계가 가능하며, SAP Delete 서비스를 위한 액티비티를 호출합니다.

BusinessWorks 웹 서비스가 전송한 SiebelAddfault 를 캐치하기 위해 catch block을 outer scope와 연계할 수 있습니다. SiebelAddfault가 발생할 때마다, compensate activity는 inner scope에 대한 보정작업을 수행하고 SAP 고객 레코드를 삭제합니다. 이때 inner scope의 모든 액티비티가 성공적인 경우에만 보정 작업이 성공적으로 완료될 수 있음을 참고하시기 바랍니다.

scope와 compensation handler를 수정한 BPEL 프로세스가 그림 6과 같습니다.

사용자 삽입 이미지

그림 6 SAP 고객 레코드 삭제를 위한 compensation logic

Case 6
Siebel 업데이트가 실패하고 SAP 업데이트만 성공한 경우에도 트랜잭션은 실패합니다. 이로 인해 데이터 일관성에 문제가 발생할 수 있습니다. 따라서, SAP에서 발생한 트랜잭션을 롤백 하기 위한 compensation logic이 필요합니다. Compensation handler는 SAP Update 서비스와 연계되어 SAP Rollback 서비스를 호출합니다. BPEL 프로세스의 수정 작업은 위에서 설명한 가이드라인을 준수하는 형태로 수행됩니다.

compensate activity를 명시적으로 호출할 수 있는 기능은 BPEL 에러 핸들링 프레임워크의 핵심으로 활용됩니다. 고전적인 EAI 보정 메커니즘과 달리, BPEL은 표준화된 롤백 방법론을 제공하고 있습니다.

TIBCO 및 webMethods 서비스의 통합을 위한 BPEL 프로세스를 생성했다면, 이제 BPEL 어댑터와 EAI 툴 간의 커뮤니케이션을 보다 효과적으로 수행할 수 있는 방법을 알아보기로 합시다.

4 단계: 비즈니스 커뮤니케이션의 보안. 보안은 아웃바운드(TIBCO, webMethods 서비스 호출의 보안)와 인바운드(BPEL 프로세스의 보안)의 두 레벨로 나누어 구현됩니다.

아웃바운드 보안 (Outbound Security)
먼저 TIBCO 및 webMethods 서비스에 대한 불법적인 액세스를 차단하기 위한 보안 대책이 필요합니다. Oracle BPEL Process Manager는 외부 서비스 호출 시 HTTP basic authentication 또는 WS-Security authentication을 지원합니다. 본 문서의 예제에서는 HTTP 인증을 사용하여 TIBCO 및 webMethods 서비스 및 BPEL 프로세스로부터의 호출 메커니즘의 보안을 구현하는 방법을 설명합니다.

TIBCO BusinessWorks와 webMethods Integration Server에 구현된 웹 서비스는 기본적으로 HTTP basic authentication을 지원합니다. TIBCO 웹 서비스를 설계하는 과정에서 SOAP event source activity의 Transport Details 탭에서 Use Basic Authentication 체크박스를 체크해야 합니다. TIBCO Administrator를 이용하여 웹 서비스를 구축하는 과정에서 사용자/역할 별로 서비스 액세스 레벨을 설정할 수 있습니다. 또 webMethods Developer를 이용하여 웹 서비스를 설정하는 과정에서 각각의 operation 별로 ACL(Access Control List)을 작성할 수 있습니다.

TIBCO, webMethods 서비스를 구축하는 과정에서 basic authentication을 사용하였다면, 서비스에 대한 호출이 수행될 때마다 인증정보가 BPEL 프로세스에 전달되어야 합니다. 두 개의 Partner Link 속성(httpUsername과 httpPassword)을 이용하면 이 작업을 쉽게 수행할 수 있습니다. 이 속성의 값은 아래와 같이 정적으로 설정될 수 있습니다.

사용자 삽입 이미지

그림 7 httpUsername과 httpPassword의 설정

인증정보를 다이내믹하게 전달하고자 하는 경우에는 copy rule을 사용합니다.

  
<copy>
  <from variable="varUsername"/>
  <to partnerLink="p1" bpelx:property="httpUsername"/>
</copy>
또, WS-Security를 이용하여 TIBCO, webMethods 서비스의 보안을 구현하는 것도 가능합니다. 이때 BPEL 프로세스는 WS-Security authentication header를 웹 서비스로 전달합니다. 이때 서비스가 지원하는 WS-Security 헤더를 WSDL 다큐먼트에 정의해 두어야 합니다. message body 데이터 엘리먼트와 마찬가지로, 이 헤더 필드는 BPEL 프로세스에 의해 변수로 활용됩니다. WS-Security 인증에 대한 자세한 정보는 OTN에서 HotelShopFlow 샘플 코드를 다운로드하셔서 확인하실 수 있습니다.

인바운드 보안 (Inbound Security)
HTTP 인증을 이용하면 BPEL 프로세스가 불법적인 사용자에 의해 차단되는 것을 방지할 수 있습니다. 또 각 BPEL 프로세스 별로 다른 인증 정보를 설정하는 것이 가능합니다.

이 기능을 사용하려면, 애플리케이션 서버 레벨에서 HTTP basic authentication을 활성화해야 합니다. 그런 다음 인증 정보는 BPEL 프로세스에 의해 호출되고 Partner Link 속을 통해 TIBCO, webMethods 웹 서비스로 전달됩니다.

BPEL 보안에 대한 보다 자세한 정보가 필요하신 경우 OTN의 "Securing BPEL Processes & Services" Webinar를 확인하시기 바랍니다.

5 단계: 중앙집중적 로깅 및 에러 핸들링. 비즈니스 프로세스의 보안과 안정성을 확보하는 것만큼이나, 중앙집중적인 로깅, 통보 기능을 구현하는 것 또한 중요합니다. 중앙집중적인 로깅, 에러 핸들링 프레임워크를 구현함으로써 애플리케이션의 안정성을 한층 더 강화하고, 재활용성을 증가시키고, 개발 비용을 절감할 수 있습니다. BPEL 프로세스의 웹 서비스 또는 미들웨어를 이용하여 이러한 프레임워크를 구축하는 것이 가능합니다. Oracle BPEL Process Manager의 파일 어댑터를 이용하여 서비스에 로깅 기능을 추가하고 에러 발생시 이메일 통보 기능을 구현할 수 있습니다.

프레임워크에 사용하게 될 샘플 스키마가 아래와 같습니다:

스키마 엘리먼트 설명
ROLE ERROR, DEBUG, WARNING, INFO 등
CODE 에러 코드
DESCRIPTION 에러 설명
SOURCE 에러 소스
EMAIL 통보를 전달할 이메일 ID

이 BPEL 프로세스는 비동기식 단방향 웹 서비스로서 공개되므로, 서비스의 클라이언트에는 별도의 시간 지연이 수반되지 않습니다. 중앙집중적 로깅 및 통보를 위한 LogNotify 프로세스가 아래 그림과 같습니다.

사용자 삽입 이미지

그림 8 Oracle BPEL Process Manager를 이용한 로깅 및 에러 핸들링 프레임워크

그림 8에서 확인할 수 있는 것처럼, LogNotify 프로세스는 아래와 같은 작업을 수행합니다:

  1. 외부 프로세스로부터 전달되는 정보를 로그에 저장합니다
  2. Log Service를 호출하여 데이터를 로그 파일에 저장합니다. 이 과정에서 Log Service는 파일 어댑터를 활용합니다.
  3. 로깅이 성공적인 경우 프로세스가 완료됩니다. 또 ROLE 필드에ERROR가 포함된 경우, 서비스는 이메일을 통해 담당자에게 통보를 수행합니다. 이메일 정보는 수신된 메시지 원본으로부터 추출됩니다 (샘플 스키마를 참고하십시오.).
  4. 이메일 통보 작업이 실패한 경우, 에러가 로그 파일에 저장된 후 프로세스가 종료됩니다.
메인 BPEL 프로세스에 포함된 각각의 invoke 액티비티는 별도의 try-catch 블록을 갖습니다. 미들웨어 프로세스가 전송한 SOAP 폴트(애플리케이션에서 발생한 exception 포함)는 catch블록에 의해 처리되며, 중앙 로깅/에러 핸들링 프레임워크에 라우팅됩니다.

그림 9는 Siebel Add가 실패한 경우 LogNotify 프로세스가 호출되는 과정을 보여주고 있습니다.

사용자 삽입 이미지

결론

오늘날의 통합 시장은 강력한 EAI 제품으로 넘치고 있으며, 많은 통합 기능이 구현되어 제공되고 있습니다. BPEL은 기존 EAI 솔루션의 서비스 전환을 위한 독자적인 대안을 제공합니다. 기존 미들웨어 프로세스를 웹 서비스로 공개하고, 웹 서비스들을 Oracle BPEL Process Manager로 통합함으로써, 기업은 SOA를 위한 첫 걸음을 내디딜 수 있을 것입니다.

- 한국 오라클 -
Posted by 서오석
,

로젝트에서 성능을 향상시키기 위해 SQL 튜닝에 전념하는 사이트들이 많이 있을 것이다. SQL 튜닝을 통해 성능 향상을 기대할 수 있는 것은 사실이다. 예전에는 성능 저하가 발생하는 경우 SQL 튜닝 보다도 해당 시스템의 CPU, 디스크 등의 자원을 증설하는 부분에 초점을 맞추었다. 이와 같이 자원을 증설하는 것보다 SQL을 튜닝하여 성능을 최적화하고자 하는 것은 매우 고무적인 현상임에는 틀림 없다.
그 만큼 관리자들의 생각이 IT 선진화로 가는 것은 아닐까? 하지만, 아직도 SQL 튜닝의 성능을 배가시킬 수 있는 물리적 구성에는 많은 허점과 편견이 존재한다. 이번 호에는 SQL 튜닝의 효과를 배가 시킬 수 있는 그 물리적 구성에 대해 자세히 확인해 보자.




성능을 향상시키는 물리적 구성을 이해해라


물리적 구성이 최적화되어 있지 않은 상태에서 SQL 튜닝으로 10배의 성능이 향상된다고 가정하자. 이런 경우 물리적 구성을 최적화한 후 SQL을 튜닝한다면 15배 이상의 성능 향상을 기대할 수 있을 것이다. 반드시 15배의 성능 향상은 아니지만 물리적 구성의 최적화 만으로도 우리는 성능 향상을 기대할 수 있게 된다.
필자가 어느 사이트를 지원했을 때의 일이다. 해당 사이트에서는 SQL 튜닝보다는 물리적 구성의 최적화에 초점을 두었었다. 디스크 I/O 분산과 파티션 테이블만을 이용하여 SQL 튜닝을 수행하지 않고 4배의 성능 향상을 확인했었다. 이 얼마나 놀라운 사실인가? 여기에 SQL 튜닝까지 수행한다면 10배의 성능이 향상될 SQL의 성능은 그 이상의 성능 향상을 기대할 수 있을 것이다. 이는 절대 놀라운 사실이 아니다. 이와 같은 이유에서라도 우리는 SQL 튜닝과 물리적 구성의 최적화를 병행해야만 할 것이다.
이제는 물리적 구성의 최적화를 간과해서는 안될 것이다. 한번 구성된 후에는 변경되기 힘든 것이 물리적 구성이다. SQL은 하나하나 최적화를 수행하여 적용하면 될 것이다. 하지만 물리적 구성은 한번 구성된 후 변경하기 위해서는 많은 어려움을 경험해야 할 것이다. 이와 같은 물리적 구성을 이제는 소홀히 여기지 말고 프로젝트 초기부터 성능과 연관 지어 수많은 고려를 해야 할 것이다.
성능을 고려할 경우에도 최적의 물리적 구성에 대한 정답은 없다. 하지만, 성능을 고려하여 물리적 구성에 대해 많은 고민을 한다면 우리는 성능을 보장할 수 있는 최적의 물리적 구성을 구현할 수 있을 것이다. 결국, 항상 생각하고 고민하는 습관이야 말로 해당 시스템을 최적의 시스템으로 구현할 수 있는 최선의 방법인 셈이다.
물리적 구성의 최적화는 여러 가지 요소에 의해 구성될 것이다. 그렇다면 어떠한 물리적 구성에 의해 성능은 향상되거나 저하될 수 있는 것일까? 아래와 같은 물리적 구성에 의해 우리는 성능 향상을 기대할 수 있을 것이다.


·데이터 저장 아키텍쳐 - 클러스터 팩터(CLUSTER FACTOR) 아키텍쳐
·테이블 아키텍쳐 - 파티션 테이블, IOT 테이블
·인덱스 아키텍쳐 - 결합 인덱스, 단일 컬럼 인덱스
·엑세스 아키텍쳐 - 병렬 프로세싱(PARALLEL PROCESSING) 아키텍쳐

위와 같은 물리적 구성 요소를 통해 우리는 성능을 향상시킬 수 있을 것이다. 새로운 시스템을 구축할 경우 위의 항목들을 항상 고려해야만 할까? 위의 항목들은 시스템이 서비스를 개시한 후에는 적용하기 힘들다. 그 이유는 물리적인 구성 요소이기 때문이다. 이제부터 각각의 항목에 대해 프로젝트 중에 어떻게 적용해야 그 성능을 최적화할 수 있는지 확인해 보자.




데이터 저장 아키텍쳐를 고려하자



여기서 언급하는 데이터 저장 아키텍쳐는 클러스터 팩터를 의미한다. 그렇다면 클러스터 팩터는 무엇을 의미하는가? 클러스터 팩터를 이해하기 위해서는 테이블에서 원하는 데이터를 액세스하는 유형과 저장되는 데이터에 대한 분석이 필요하다.
예를 들어 보자. 어느 카드사에 거래내역 테이블이 존재한다고 가정하자. 해당 카드사의 카드에 대한 거래가 발생하면 해당 테이블에 거래내역 데이터가 저장된다고 가정하자. 그렇다면 해당 테이블에는 어떻게 데이터가 저장되겠는가? 삭제되는 데이터가 없다면 테이블의 데이터는 INSERT되는 순서대로 데이터가 저장될 것이다. 그렇다면 거래일자에 의해 데이터가 발생하고 저장되므로 해당 테이블에는 거래일자 순으로 데이터가 저장될 것이다. 이는 무엇을 의미하게 되는가?
거래내역 테이블의 데이터를 저장하는 블록을 확인해보면 하나의 블록에는 동일한 거래일자가 저장된다. 데이터를 저장하는 하나의 블록을 확인해 보면 해당 블록에 거래일자 기준으로 2008년 4월 30일인 데이터가 저장되어 있다면 해당 블록에는 거의 대부분의 데이터가 2008년 4월 30일 데이터가 저장되어 있을 것이다. 물론 해당 블록이 2008년 4월 30일 데이터를 저장하는 처음 블록이라면 2008년 4월 29일 데이터가 같이 저장되어 있을 수도 있다.
여기서 중요한 것은 각각의 블록들은 대부분 동일한 거래일자 값을 가지는 데이터를 저장한다는 것이다. 이는 무엇을 의미하는가? 하나의 블록에는 10건의 데이터가 저장된다고 가정하자. 그리고 하루 데이터는 1000건의 데이터가 발생한다고 가정하자. 그렇다면 해당 1000건의 데이터는 몇 개의 블록에 저장되어 있겠는가? 1000건의 데이터는 100개의 블록에 10건씩 저장될 것이다.
이와 같기 때문에 해당 일자의 데이터를 모두 조회한다면 우리는 100개의 블록만 액세스하여 모든 데이터를 추출할 수 있게 된다. 그렇다면 우리는 불필요하게 액세스한 블록은 존재하지 않게 되며 또한 하나의 블록에서 대부분의 데이터를 결과로 추출하게 되므로 매우 효율적이라고 할 수 있을 것이다. 이와 같은 이유에서 거래내역 테이블은 거래일자 값에 의해 클러스터 팩터가 양호하다고 하게 된다.
결국 클러스터 팩터가 양호하다는 뜻은 각각의 블록은 클러스터 팩터가 양호한 컬럼의 값이 동일한 데이터로 저장되어 있어 우리가 액세스하고자 하는 데이터가 모여 있는 것을 의미하게 된다.
그렇다면 거래내역 테이블에서 거래일자 컬럼이 아닌 다른 컬럼에 대해 확인해 보자. 카드 회사의 가장 기본이 되는 카드번호 컬럼은 어떻게 되는가? 거래내역 테이블은 저장되는 순서에 의해 데이터가 저장될 것이다. 그리고 거래내역 테이블에서 많은 경우에 카드번호 컬럼의 값으로 데이터를 조회하게 된다. 그렇다면 ‘111’번 카드번호에 대해 거래내역 데이터를 조회한다고 가정하자. 해당 카드번호에 의해 생성된 거래내역 데이터는 100건이라고 가정하자.
그렇다면 해당 데이터를 액세스하기 위해 얼마나 많은 블록을 액세스해야 할 것인가? 거래일자 컬럼의 경우에는 각각의 블록에 동일한 거래일자 컬럼의 값을 가지는 데이터가 저장될 확률이 매우 높았다. 그 이유는 거래일자 값에 의해 순차적으로 데이터가 저장되기 때문이다. 그렇다면 카드번호 컬럼은 어떠한가? 해당 고객이 하루에 2번씩 사용하여 100번을 사용했다 하여도 각 데이터는 동일한 블록에 저장될 확률은 매우 낮게 된다. 이는 카드를 2번 연속해서 사용했다고 동일 블록에 저장되기 힘들 것이다.
그 이유는 전국에서 많은 사람들이 동시에 카드를 이용하게 되며 그렇기 때문에 해당 데이터들은 카드번호 값이 동일한 데이터들이 동일한 블록에 저장되기 매우 힘들게 된다. 이와 같은 상황에서 해당 카드번호 컬럼에 대해 조회를 수행해야 한다면 테이블에서 거의 100개의 블록을 액세스하게 된다.
결국 각 블록에 결과로 추출하고자 하는 데이터는 한건 씩 저장되어 있기 때문에 거래내역 테이블에 대해 카드번호 컬럼에 대해서는 클러스터 팩터가 불량하다고 이야기 하게 된다.
우리가 조회하는 데이터의 클러스터 팩터가 매우 양호하다면 각각의 블록에는 해당 컬럼의 값이 동일한 데이터들이 저장되므로 적은 블록을 액세스할 수 있게 되어 성능은 향상될 것이다. 우리가 조회하는 데이터의 클러스터 팩터가 불량하다면 각각의 블록에는 해당 컬럼의 값이 동일한 데이터들이 함께 저장되지 않게 되므로 많은 블록을 액세스해야 한다.
따라서 디스크 I/O의 증가로 성능은 저하될 것이다. 결국, 우리가 추출하고자 하는 데이터의 클러스터 팩터는 성능에 있어 매우 중요한 역할을 수행하게 된다.




클러스터 팩터의 정의를 이해하자


앞서 클러스터 팩터에 대한 예제를 통해 개념을 확인해 보았다. 클러스터 팩터는 우리가 추출하고자 하는 데이터가 얼마나 동일한 블록에 저장되어 있는가를 의미하게 된다. 그렇다면 클러스터 팩터는 어떤 기준으로 구분되는가? 아래 그림을 확인해 보자

사용자 삽입 이미지


클러스터 팩터 값은 위와 같이 정의할 수 있을 것이다. 인덱스를 통해 추출된 데이터가 100건이라고 가정하자. 인덱스를 액세스한 후에는 테이블을 액세스하게 되는 것은 당연한 사실일 것이다. 이 경우 인덱스에서 추출된 데이터는 100건의 데이터인데 테이블을 액세스하는 블록의 개수가 100이라면 위의 공식에 대입해보면 1이라는 값이 추출된다.
이와 같다면 우리가 원하는 데이터는 각 블록에 1건의 데이터만이 존재한다는 의미가 된다. 그러므로 해당 액세스는 클러스터 팩터가 불량하게 된다. 이와 같다면 우리도 모르게 성능 저하가 발생할 수 있게 된다. 반대로 인덱스에서 100건의 데이터가 추출되었지만 테이블 블록은 2개만 액세스했다면 위의 공식에 적용하면 값은 100/2이므로 50의 값이 추출되어 양호한 클러스터 팩터가 될 것이다. 클러스터 팩터가 양호하면 액세스하는 블록의 개수는 감소하게 되므로 자연스럽게 성능은 향상 될 것이다.
위의 클러스터 팩터 값의 정의에서 우리는 무엇을 이해해야 하는 것일까? 공식을 외운다고 우리가 클러스터 팩터에 대해 모든 것을 해결할 수 있는 것은 아니다. 우리에게 지금 필요한 것은 우리가 엑세스하는 데이터에 대해 클러스터 팩터를 최적화한다면 성능을 향상시킬 수 있다는 것이다. 이제부터 클러스터 팩터의 속성을 파악하고 우리가 엑세스하고자 하는 데이터에 대해 클러스터 팩터를 최적화하는 방법을 확인해 보자.




클러스터 팩터의 속성을 파악해라


클러스터 팩터에는 우리가 아직까지 언급하지 않은 하나의 속성이 존재한다. 그렇다면 클러스터 팩터의 속성은 무엇인가? 하나의 테이블에서는 하나의 컬럼에 의해서는 클러스터 팩터를 최적화할 수 있다는 것이다. 이는 우리에게 클러스터 팩터를 최적화하는 방법에 많은 고려 사항과 제한 사항을 발생시키게 된다.
그렇다면 정말로 하나의 테이블은 하나의 컬럼으로만 클러스터 팩터를 양호하게 할 수 있는 것인가? 앞서 언급한 거래내역 테이블을 다시 한번 확인해 보자. 거래내역 테이블은 거래일자 순으로 데이터가 저장되기 때문에 각각의 블록은 동일한 거래일자 데이터가 저장될 것이다. 그렇기 때문에 이 상태 그대로라면 해당 테이블은 거래일자 컬럼에 의해 클러스터 팩터가 최적화된다.
거래내역 테이블은 거래일자 컬럼의 값으로도 조회를 하지만 카드번호 컬럼의 값으로 많은 조회가 발생한다고 가정하자. 그렇다면 거래일자로 조회하는 액세스는 클러스터 팩터가 양호하기 때문에 자동으로 성능이 향상될 수 있지만 카드번호 컬럼으로 조회하는 액세스는 클러스터 팩터가 양호하지 않기 때문에 해당 액세스에 대해서는 성능이 저하될 것이다. 이와 같은 경우 우리는 카드번호 컬럼으로 클러스터 팩터 최적화를 수행해야 할 것이다.
거래내역 테이블에 대해 카드번호 컬럼으로 클러스터 최적화를 수행한다면 해당 거래내역 테이블에는 어떤 현상이 발생하게 되는가? 카드번호 컬럼으로 클러스터 팩터를 최적화하므로 거래내역 테이블은 각각의 블록에 카드번호 컬럼의 값이 동일한 데이터들이 저장될 것이다.
이와 같이 데이터가 저장되어야만 우리는 거래내역 테이블이 카드번호 컬럼에 의해 클러스터 팩터가 양호하다고 이야기할 수 있을 것이다. 이처럼 구성하는 방법을 클러스터 팩터 최적화라고 한다. 카드번호 컬럼으로 클러스터 팩터 최적화를 수행하면 어떤 현상이 발생하게 되는가?


·카드번호 컬럼 - 각각의 블록에 동일한 카드번호 컬럼의 값이 저장
·거래일자 컬럼 - 각각의 블록에 서로 다른 거래일자 컬럼의 값이 저장

위와 같은 현상이 발생하게 된다. 이 뜻은 거래일자 컬럼의 값에 대해서 기존에는 클러스터 팩터의 값이 양호했지만 카드번호 컬럼으로 클러스터 팩터 값을 최적화한다면 더 이상 거래일자 컬럼의 값으로는 클러스터 팩터가 최적화되지 않는다는 의미가 된다.
\2008년 4월 30일 사용한 거래내역 데이터를 확인해 보자. 2008년 4월 30일에 사용한 거래내역 데이터는 연속된 블록에 저장될 것이다. 따라서, 해당 블록들을 확인해 본다면 동일한 2008년 4월 30일 데이터들이 저장될 것이다. 이러한 이유에서 거래일자 컬럼에 의해 클러스터 팩터가 최적화되었었다.
하지만 해당 데이터의 카드번호 값은 어떠한가? 하루에 동일한 카드가 몇 번이나 사용되겠는가? 업무적으로 차이가 발생할 수 있지만 하나의 카드가 동일한 일자에 수 십번 아니 수 백번 사용되지는 않을 것이다. 그렇다는 이야기는 무엇인가? 각각의 블록에 동일한 카드번호 컬럼의 값을 가지는 데이터를 저장하는 순간 각각의 블록에는 동일한 거래일자 값의 데이터는 블록에 저장되지 못한다는 것이다. 그러므로 카드번호 컬럼으로 클러스터 팩터를 최적화한다면 그 동안 클러스터 팩터가 양호했던 거래일자 컬럼의 클러스터 팩터는 불량해 진다.
결국 하나의 컬럼으로 클러스터 팩터를 최적화 한다면 다른 컬럼들은 일반적으로 클러스터 팩터가 불량하게 된다. 이는 무엇을 의미하는 것일까? 카드번호 컬럼으로 클러스터 팩터를 최적화한다면 카드번호 컬럼의 값으로 조회하는 액세스의 성능을 최적화할 수 있지만 그에 반해 거래일자 컬럼으로 데이터를 액세스하는 경우에는 클러스터 팩터가 불량해 지므로 성능은 저하된다.
이처럼 클러스터 팩터의 최적화에는 장점과 단점이 존재하게 된다. 어떤 컬럼으로 클러스터 팩터를 최적화한다면 다른 컬럼들의 클러스터 팩터는 불량해 지게 된다. 어떤 카드회사에서 필자가 실제로 거래내역 테이블에 대해 카드번호 컬럼으로 클러스터 팩터를 최적화해 보았었을 때의 일이다. 카드번호 컬럼으로 데이터를 액세스하는 어플리케이션은 전체적으로 성능이 안정화되었다.
하지만 거래일자 컬럼으로 매일 작업을 수행하는 어플리케이션은 기존 성능에 비해 10배 정도의 성능 저하가 발생했었다. 그래서 개발자로부터 연락이 왔으며 필자는 내일이 되면 거래일자 컬럼으로 클러스터 팩터가 최적화되니 원래의 성능을 보장할 수 있을 것이라고 언급했다. 다음 날이 되자 필자가 말한 것이 현실로 나타났다. 기존 거래일자 컬럼으로 데이터를 액세스하는 애플리케이션은 기존 성능을 보장 받게 되었다.
이는 무엇을 의미하는가? 테이블의 클러스터 팩터는 해당 테이블을 액세스하는 어플리케이션에 엄청난 영향을 미친다는 것이다. 이와 같이 성능에 있어 큰 영향을 미치는 클러스터 팩터를 더 이상 간과해서는 안될 것이다. 프로젝트 중에 중요 테이블에 대해 클러스터 팩터를 고려했는지 안 했는지는 해당 시스템의 전체 성능에 있어 매우 중요한 역할을 수행하게 된다.
아직도 많은 사람들은 클러스터 팩터에 대한 중요성을 인식하지 못하고 있는 것이 현실이다. 관리자부터 클러스터 팩터에 대한 중요성을 인식해야지만 많은 시스템에 필요한 클러스터 팩터를 최적화할 수 있을 것이다. 데이터베이스의 데이터가 대용량으로 변하면서 또한 많은 애플리케이션이 수행되는 시스템에서는 클러스터 팩터가 성능에 있어서는 매우 중요한 역할을 수행하게 된다. 이제는 더 이상 클러스터 팩터를 간과해서는 안될 것이다. 우리가 많이 액세스하는 컬럼으로 클러스터 팩터를 최적화하는 순간 우리는 최적의 성능을 기대할 수 있을 것이다.
클러스터 팩터를 최적화하는 방법에는 많은 방법이 존재한다. 테이블 재구성 방법부터 파티션 테이블을 이용하는 방법까지 여러 방법이 존재하며 이에 대한 방법은 다음 호에 자세히 언급하도록 하겠다. 우리가 생각하지 못한 클러스터 팩터에 대한 생각의 전환이야 말로 대용량 데이터베이스에 대해 성능을 최적화할 수 있는 핵심 요소이다.



제공 : DB포탈사이트 DBguide.net

Posted by 서오석
,

Level의 KPA(Key Process Areas)

레벨2(반복)의 KPA의 목표

KPA

목표

요구사항관리

(RM: Requirements Management)

l  소프트웨어의 요구 사항은 소프트웨어 엔지니어링과 관리 활동을 위한 기준선을 제정하기 위해서 통제한다.

l  소프트웨어 계획, 산출물, 액티비티 등은 요구 사항과 일관성을 유지한다.

소프트웨어 프로젝트 계획

(SPP: Software Project Planning

l  프로젝트 계획과 추적에서 사용하기 위해 평가를 문서화 한다.

l  프로젝트 활동과 공약을 계획하고 문서화한다.

l  관련 그룹과 개인은 프로젝트와 연관된 공약에 동의한다.

소프트웨어 프로젝트 추적과 감독(SPTO: Software Project Tracking and Oversight)

l  실제 결과와 수행 성능은 소프트웨어 계획을 기준으로 추적한다.

l  실제 결과와 수행 성능이 소프트웨어 계획에서 많이 벗어났을 때는 사정 조치를 취하고, 종료 시까지 관리한다.

l  관련 그룹과 개인은 공약이 변경되는 것을 동의한다.

소프트웨어 협력 업체 관리(SSM: Software Subcontract Management)

l  주 계약자와 협력 업체는 그들의 공약(commitment)에 동의한다.

l  주 계약자는 공약 관련 협력 업체의 실제 결과를 추적한다.

l  주 계약자와 협력 업체는 지속적인 의사 교환을 유지한다.

l  주 계약자는 공약을 기준으로 협력 업체의 실제 수행 성능을 추적한다.

소프트웨어 품질보증 (SQA: Software Quality Assurance)

l  소프트웨어의 품질 보증 활동을 계획한다.

l  적절한 표준, 절차, 그리고 요구 사항 등에 대한 소프트웨어 산출물과 활동의 충실도를 객관적으로 확인한다.

l  관련 그룹과 개인에게 소프트웨어 품질 보증 활동과 결과를 통보한다.

l  프로젝트 안에서 해결되지 못한 미준수(noncompliance) 문제들은 선임 관리자에게 보고한다.

소프트웨어 형상관리 (SCM: Software Configuration Management)

l  소프트웨어의 형상 관리 활동을 계획한다.

l  선택된 소프트웨어의 작업 산출물을 확인, 통제, 이용한다.

l  식별된 소프트웨어의 작업 산출물에 대한 변경을 통제한다.

l  관련 그룹과 개인에게 소프트웨어 기준선의 상태와 내용을 통보한다.


레벨 3(정의)의 KPA의 목표

KPA

목표

조직 프로세스 초점(OPF: Organization Process Focus)

l  소프트웨어 프로세스의 개발과 개선 활동을 조직 전반에 걸쳐 조정한다.

l  사용된 소프트웨어 프로세스의 장점과 단점을 식별한다.

l  조직-레벨 프로세스 개발과 개선 활동을 계획한다.

조직 프로세스 정의 (OPD: Organization Process Definition)

l  조직을 위한 소프트웨어 프로세스의 표준을 개발하고 유지 관리한다.

l  소프트웨어 프로젝트에서 조직의 표준 소프트웨어 프로세스 이용과 관련된 정보를 수집, 검토, 이용할 수 있게 한다.

교육 프로그램(TP: Traning Program)

l  교육 활동을 계획한다.

l  소프트웨어 관리와 기술적인 역할을 수행하는 데 필요한 기술과 지식을 개발하는 교육을 제공한다.

l  소프트웨어 엔지니어링 그룹과 소프트웨어 관련 그룹의 개인은 자신의 작업을 수행하는데 필요한 교육을 받는다.

통합된 소프트웨어 관리 (ISM: Integrated Software Management)

l  프로젝트를 위해 정의된 소프트웨어 프로세스는 조직의 표준 소프트웨어 프로세스로부터 변경된(tailored)버전이다.

l  프로젝트는 정의된 소프트웨어 프로세스에 따라 계획하고 관리한다.

소프트웨어 제품 엔지니어링(SPE: Software Product engineering)

l  소프트웨어 생산을 위해 소프트웨어 엔지니어링 태스크를 정의하고, 통합하고, 일관되게 수행한다.

l  소프트웨어 작업 산출물은 서로 일관성을 유지한다.

그룹 간의 조정(IC: Intergroup Coordination)

l 모든 관련 그룹은 고객의 요구 사항에 동의한다.

l 모든 그룹은 다른 그룹과의 공약에 동의한다.

l 그룹은 그룹 간의 문제를 식별하고, 추적하고, 해결한다.

동료 검토(PR: Peer Reviews)

l  동료 검토 활동을 계획한다.

l  소프트웨어 작업 산출물의 결함을 식별하고 제거한다.


레벨4(관리)의 KPA 목표

KPA

목표

정량적인 프로세스 관리 (QPM: Quantitives Process Management)

l 정량적인 프로세스 관리 활동을 계획한다.

l 프로젝트의 정의된 소프트웨어 프로세스의 수행 성능을 정량적으로 관리한다.

l 조직의 표준 소프트웨어 프로세스에 대한 역량은 정량적인 용어로 표현한다.

소프트웨어 품질 관리 (SQM: Software Quality Management)

l 프로젝트의 소프트웨어 품질 관리 활동을 계획한다.

l 소프트웨어 산출물 품질의 평가 목표와 그 우선 순위를 정의한다.

l 소프트웨어 산출물의 품질 목표를 달성하기 위한 실제 진척을 평하고 관리한다.


레벨 5(최적화) KPA 목표

KPA

목표

결함 예방 (DP: Defect Prevention)

l  결함 예방 활동을 계획한다.

l  결함의 공통 원인을 찾아 식별한다.

l  결함의 공통 원인의 우선 순위를 정하고, 체계적으로 제거한다.

기술 변경 관리 (TCM: Technology Change Management)

l  변경된 기술의 편입을 계획한다.

l  신기술은 품질과 생산성에 미칠 영향을 정하기 위해 평가한다.

l  적절한 신기술은 조직 전체에 걸쳐 일반 실행 지침으로 바꾼다.

프로세스 변경 관리 (PCM: Process Change Management)

l  지속적인 프로세스 개선을 계획한다.

l  조직 전체적으로 조직의 소프트웨어 프로세스 개선 활동에 참여해야 한다.

l  조직의 표준 소프트웨어 프로세스와 프로젝트를 위해 정의된 소프트웨어 프로세스를 지속적으로 개선한다.


Posted by 서오석
,

iBatis 아파치 홈페이지에가면 한국어로 된 튜토리얼이 있는데 그걸 가져왔습니다.

혹시라도 iBatis 공부하는데 필요한 사람은 다운받아가세용~



이건 iBaits Jar 파일입니다.

'개발 이야기 > Java Story' 카테고리의 다른 글

JVM GC와 메모리 튜닝 (조대협)  (0) 2010.02.11
Java jstat로 메모리 모니터링  (0) 2010.02.11
Web Service 이야기  (0) 2008.05.08
Xpath Syntax  (0) 2008.05.03
Core J2EE Patterns - Business Delegate  (0) 2008.04.26
Posted by 서오석
,

본 코드는 Head first Java의 예제 소스이다.

import java.io.*;
import java.net.*;
import java.util.*;

public class VerySimpleChatServer {
  ArrayList clientOutputStreams;
 
  public class ClientHandler implements Runnable{
   BufferedReader reader;
   Socket sock;
   
   public ClientHandler(Socket clientSocket){
    try{
     sock = clientSocket;
     InputStreamReader isReader = new InputStreamReader(sock.getInputStream());
     reader = new BufferedReader(isReader);
     
    }catch(Exception ex){
     ex.printStackTrace();
    }
   
   }
   
   public void run(){
    String message;
    try{
     while((message = reader.readLine()) != null){
      System.out.println("read "+ message);
      tellEveryone(message);
     }
    }catch(Exception ex){
     ex.printStackTrace();
    }
   
   }
   
  }
  public static void main(String[] args){
   new VerySimpleChatServer().go();
  }
 
  public void go(){
   clientOutputStreams = new ArrayList();
   try{
    ServerSocket serverSock = new ServerSocket(5000);
    while(true){
     Socket clientSocket = serverSock.accept();
     PrintWriter writer = new PrintWriter(clientSocket.getOutputStream());
     clientOutputStreams.add(writer);
     
     Thread t = new Thread(new ClientHandler(clientSocket));
     t.start();
     System.out.println("got a connection");    
    }
   
   }catch(Exception ex){
    ex.printStackTrace();
   }
   
  }
 
  public void tellEveryone(String message){
   Iterator it = clientOutputStreams.iterator();
   while(it.hasNext()){
    try{
     PrintWriter writer = (PrintWriter)it.next();
     writer.println(message);
     writer.flush();
    }catch(Exception ex){
     ex.printStackTrace();
    }
   }
  } 

}

Posted by 서오석
,

아래 코드는 Head first Java의 예제이다.

import java.io.*;
import java.net.*;
import java.util.*;
import javax.swing.*;

import com.sun.corba.se.spi.servicecontext.SendingContextServiceContext;

import java.awt.*;
import java.awt.event.*;

public class SimpleChatclient {
 JTextArea incoming;
 JTextField outgoing;
 BufferedReader reader;
 PrintWriter writer;
 Socket sock;
 
 public static void main(String[] args){
  SimpleChatclient client = new SimpleChatclient();
  client.go();
 }
 
 public void go(){
  JFrame frame = new JFrame("Simple Chat Client");
  JPanel mainPanel = new JPanel();
  incoming = new JTextArea(15,50);
  incoming.setLineWrap(true);
  incoming.setWrapStyleWord(true);
  incoming.setEditable(false);
  JScrollPane qScroller = new JScrollPane(incoming);
  qScroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
  qScroller.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
  outgoing = new JTextField(20);
  JButton sendButton = new JButton("Send");
  sendButton.addActionListener(new SendButtonListener());
  mainPanel.add(qScroller);
  mainPanel.add(outgoing);
  mainPanel.add(sendButton);
  setUpNetworking();
 
  Thread readerThread = new Thread(new IncomingReader());
  readerThread.start();
 
  frame.getContentPane().add(BorderLayout.CENTER, mainPanel);
  frame.setSize(400, 500);
  frame.setVisible(true);  
 }
 
 private void setUpNetworking(){
  try{
   sock = new Socket("127.0.0.1",5000);
   InputStreamReader streamReader = new InputStreamReader(sock.getInputStream());
   reader = new BufferedReader(streamReader);
   writer = new PrintWriter(sock.getOutputStream());
   System.out.println("networking established");
  }catch(IOException ex){
   ex.printStackTrace();
  }
 }
 
 public class SendButtonListener implements ActionListener{
  public void actionPerformed(ActionEvent ev){
   try{
   writer.println(outgoing.getText());
   writer.flush();
   }catch(Exception ex){
    ex.printStackTrace();
   }
   outgoing.setText("");
   outgoing.requestFocus();
  }
 }
 
 public class IncomingReader implements Runnable{
  public void run(){
   String message;
   try{
    while((message = reader.readLine())!= null){
     System.out.println("read "+ message);
     incoming.append(message+ "\n");
     }
    }catch(Exception ex){
     ex.printStackTrace();
    }
   }
  }
 }

Posted by 서오석
,

Thread.sleep()이라는 정적 메소드는 적어도 sleep 메소드에 전달된 인자로 지정한 시간 동안 스레드를 실행중인 상태를 떠나있게 만든다. 값에 100을 주면 100밀리세컨드 동안 스레드가 멈춘다.

sleep()메소드에서는 확인 예외(interruptedException)를 던지기 때문에 sleep()을 호출할 때에는 반드시 try/catch로 감싸거나 예외를 선언해야 한다.

스레드 두 개 이상이, 힙에 있는 동일한 객체를 접근하는 경우에 심각한 문제가 생길 수 있습니다.
 
스레드를 두 개 이상에서 똑같은 객체에 접근하면 데이터가 엉망이 될 수 있다. 예를들어, 한 스레드가 객체의 중요한 상태를 조작하는 도중에 실행중인 상태에서 벗어나면 심각한 문제가 생길 수 있다.

스레드를 사용할 때도 객체를 안전하게 만들고 싶다면 어떤 선언문들이 원자적인 절차로 처리되어야 하는지 결정해야 한다. 즉 다른 스레드가 같은 객체의 같은 메소드에 들어가기 전까지 끝까지 실행되어야만 하는 메소드를 결정해야 한다.

스레드 두개가 메소드 하나에 동시에 들어가는 일을 방지하고 싶다면 메소드 선언부에 synchronized 키워드를 추가해야 한다.

모든 객체에는 자물쇠가 하나씩 있으며 그 자물쇠에는 열쇠가 하나뿐이 없다. 대부분의 경우에 그 자물쇠에 대해서 신경을 쓸 필요가 없지만 객체에 동기화된 메소드가 있으면 자물쇠가 중요한 역할을 한다.

스레드에서 어떤 동기화된 메소드로 들어가려면 그 객체에 대한 열쇠가 있어야 한다. 열쇠가 없으면 그 스레드는 대기실 같은 공간으르 들어가서 열쇠를 슬 수 있을 때 까지 기다려야 한다. 이는 운영체제의 세마포와 비슷하다.

객체에 동기화된 메소드가 두개 이상 있어도 열쇠는 여전히 하나뿐이 없다. 어떤 스레드가 그 객체에 동기화된 메소드에 들어가면 다른 어떤 스레드도 같은 객체에 있는 동기화된 메소드에 들어갈 수 없다. 이런 제한이 있어야 데이터를 조작하는 모든 메소드를 동기함으로 데이터를 보호할 수 있다.

Posted by 서오석
,
네트워크 Socket 통신

  • 클라이언트와 서버 APP는 Socket 연결을 통해서 통신한다.
  • Socket은 서로 다른 물리적인 시스템 두 개에서 실행될 가능성이 있는 애플리케이션 두 개사이의 연결을 나타낸다.
  • 클라이언트는 서버 애플리케이션의 IP주소와 TCP포트 번호를 알아야 한다.
  • TCP포트는 특정 서버 애플리케이션에 할당된 16비트 부호가 없는 정수이다. TCP 포트 번호는 서로 다른 클라이언트가 똑같은 시스템에 접속하여 그 시스템에서 돌아가고 있는 서로 다른 애플리케이션과 통신을 할 수 있게 해주는 역할을 한다.
  • 클라이언트에서 서버  Socket을 만드는 방법으로 서버에 연결을 한다.
    Socket s = new Socket("127.0.0.1",4200);
  • 일단 연결되고 나면 클라이언트는 소켓으로부터 입력 및 출력 스트림을 얻을 수 있다. 이런 스트림은 저수준 '연결' 스트림이다.
    sock.getInputStream();
  • 서버로부터 텍스트 데이터를 읽고 싶다면 Socket으로부터 가져온 입력 스트림에 연쇄된 InputStreamReader와 이와 연쇄된 BufferReader를 만들면 된다.
  • InputStreamReader는 바이트를 받아서 텍스트 데이터로 변환해주는 '다리' 역할을 하는 스트림이다. 주로 고수준의 BufferedReader와 저수준의 Socket 입력 스트림 사이에 들어가는 가운데 고리 역할을 한다.
  • 서버로 텍스트 데이터를 보낼 때는 소켓의 출력 스트림에 직접 연쇄된 PrintWriter를 만들면 된다. 이 객체의 Print() 또는 println()메소드를 호출하면 서버로 String을 보낼 수 있다.
  • 서버에서는 특정 포트 번호로 들어오는 클라이언트 요청을 기다리기 위해  ServerSocket을 사용한다.
  • ServerSocket으로 요청이 들어오면 그 클라이언트와 Socket 연결을 함으로써 그 요청을 수락한다.

스레드

  • thread는 자바에서의 실행 스레드를 의미한다.
  • 자바에서는 스레드마다 각각의 호출 스택이 있다.
  • 대문자 T로 시작하는 Therad는 java.lang.Thread 클래스를 의미한다. Thread 객체는 실행 스레드를 나타낸다.
  • Thread에는 처리할 작업, 즉 해야할 일이 있어야 한다. Thread에서 처리할 작업은 Runnable  인터페이스를 구현하는 클래스의 인스턴스로 지정할 수 있다.
  • Runnable 인터페이스에는 메소드가 run() 하나밖에 없다. 새로운 Call stack의 맨 밑으로 들어가는 것이 바로 이 메소드이다. 즉 새롱누 스레드에서 가장 먼저 실행되는 것이 바로 run()메소드이다.
  • 새로운 스래드를 시작하려면 Thread의 생성자에 전달 할 Runnable 객체가 필요하다.
  • Thread의 인스턴스를 만들긴 했는데 아직 start() 메소드를 호출하지 않았으면 그 스레드는 아직 새 스레드 상태에 있다고 부른다.
  • (Thred 객체의  start() 메소드를 호출하여) 스레드를 시작하면 새로운 stack이 생성되며 Runnable의 Run()메소드가  stack 맨 아래에 들어간다. 그러면 그 스레드는 이제 실행되기를 기다리고 있는 실행 가능한 상태가 된다.
  • JVM의 스레드 스케줄러에 의해 현재 실행중인 스레드로 선택 받으면 그 스레드는 실행중인 상태가 된다. 프로세서가 하나뿐인 시스템에서는 현재 실행중인 스레드가 하나밖에 있을 수 없다.
  • 스레드가 실행 중인 상태에서 봉쇄된 상태로 옮겨지는 경우도 있다. 스트림으로부터 들어오는 데이터를 기다리고 있을 때, 대기 상테로 들어갔을 때, 객체에 대한 잠금이 해제되기를 기다리고 있을 때와 같은 상황에서 스레드가 봉쇄돌 수 있다.
  • 스레드 스케줄링은 어떤 특정한 방식으로 작동한다는 보장이 없기 때문에 모든 스레드가 공평하게 기회를 부여받을 수 있으리라는 가정은 하지 말아야 한다. 스레드를 주기적으로 대기 상태로 전화시키는 방식으로 순번이 돌아가는 것에 영향을 미칠 수는 있다.


스레드 예제 소스

public class MyRunnable implements Runnable {
 public void run(){
  go();
 }
 
 public void go(){
  System.out.println("-0-;");
 }
}
                                                                                                                                     
public class ThreadTester {
 public static void main(String[] args){
  Runnable threadJob = new MyRunnable();
  Thread myThread = new Thread(threadJob);
 
  myThread.start();
 }

}

Posted by 서오석
,
  • 클래스를 만들 때 인스턴스를 만들 수 없게 하고 싶다면 (즉, 그 클래스 유형의 객체를 만들 수 없게 하고 싶다면) abstract 키워드를 사용하면 된다.
  • 추상 클래스에는 추상 메소드와 추상 메소드가 아닌 메소드를 모두 집어넣을 수 있다.
  • 클래스에 추상 메소드가 하나라도 있으면 그 클래스는 추상 클래스로 지정해야 한다.
  • 추상 메소드는 본체가 없으며 선언 부분은 세미콜론으로 끝난다.
  • 상속 트리에서 처음으로 나오는 구상 클래스에서는 반드시 모든 추상 메소드를 구현해야 한다.
  • 자바에 들어있는 모든 클래스는 직접 또는 간접적으로 Object의 하위 클래스입니다.
  • ArrayList에서 꺼내는 모든 객체는 Object 유형입니다.(즉, Object 레퍼런스 변수로만 참조 할 수 있다,)
  • 레퍼런스 변수를 캐스트해서 객체의 원래 유형으로 돌려놓을 수 있다.
  • 어떤 객체에 있는 메소드를 호출하려면 실제 객체의 유형과는 관계없이 그 메소드가 레퍼런스 변수로 쓰인 클래스(또는 인터페이스)에 들어있는 메소드여야만 한다.
  • DDD와 관련된 문제 때문에 자바에서는 다중 상속을 허용하지 않는다. 클래스는 단 하나만 확장할 수 있다.(즉 직속 상위 클래스는 하나밖에 없다.)
  • 인터페이스는 100% 순수한 추상 클래스입니다. 인터페이스에서는 추상 메소드만 정의한다.
  • 인터페이스를 만들 때는 Class 대신 interface라는 키워드를 사용한다.
  • 인터페이스를 구현할 때는 implements라는 키워드를 쓰면 된다.
  • 클래스를 만들 때 인터페이스를 여러 개 구현할 수 있다.
  • 인터페이스의 모든 메소드는 자동으로 public 메소드, 그리고 abstract 메소드가 되기 때문에 인터페이스를 구현하는 클래스에서는 인터페이스에 들어있는 모든 메소드를 구현해야한다.
Posted by 서오석
,