'SE > RF_DP' 카테고리의 다른 글

Decorator Pattern  (0) 2010.07.15

안녕하세요. moltak입니다.

오늘은 디자인 패턴 중 데코레이터 패턴입니다.

 

 

의도:

데코레이터 패턴은 어떤 클래스를 꾸미는 역할을 합니다.

예전에 우리가 만들었던 코드를 "감싸"서 새로운 임무를 부여하는 것이 가능합니다.

"감싸"다는 말은 이 패턴에서 굉장히 중요합니다.

 

 

활용성:

제가 보는 책(head first design patterns)에서는 데코레이션 패턴을 커피 예를 들어서 설명을 했습니다.

커피집에 가면 커피가 굉장히 많은데 그 커피에 대한 클래스를 만들고 모든 재료, 기능들을 넣는 것 보단 커피 클래스 따로 재료 클래스 따로 만들고 있었습니다.

커피 클래스, 재료 클래스를 따로 만들게 되었을 때 서로 유기적으로 잘 묶기만 한다면 한 클래스에 모든 기능을 넣는 것 보단 당연히 구조적으로 좋겠죠?

데코레이션 패턴에서는 유기적으로 묶는 방법으로 "감싸"는 것을 선택했습니다.

 

 

 

 

위 클래스 다이어그램을 보시면 가장 상위에 Coffee 추상 클래스가 보입니다.

그 아래로 그것을 상속받는 Americano, Espresso, Cafelatte같은 클래스가 있습니다.

또, Decorator라는 추상클래스가 있는데 이 클래스는 getDescription이라는 순수가상함수를 갖고 있습니다.

그래서 아래 재료들이 무조건 이 함수를 새로 정의하게 만들었습니다.

 

 

 

 

이 패턴의 시나리오는 위 소스에서 보는 것과 같이 원하는 커피 인스턴스를 생성하고 원하는 재료를 만들어서 서로에게 계속 참조를 시킨다는 것입니다. (감싼다는 의미가 이것입니다.)

 

사용자가 getDescription함수를 호출하거나 cost 함수를 호출하면 제어가 계속 참조하는 곳으로 올라가게 됩니다.

(아래 소스 참조)

 

 

 

이런 식으로 사용자는 예전부터 있던 클래스를 하나도 수정하지 않고 단지 "감싸"서 예전 클래스에 새로운 기능을 부여하는 것이 가능합니다.


 

Bloger : moltak.net

'SE > RF_DP' 카테고리의 다른 글

Design Pattern 도움 사이트  (0) 2011.03.15
네이버 블로그에 고​또​ (kottodat) 라는 분이 UML 클래스 다이어그램의 기초에 대해 잘 설명해 주셨네요. 문법이 틀렸을 수도 있다고 말하셨는데 제가 아는 것과 일치하니 맞는 듯?? (저도 제 멋대로 공부해서 틀릴 수도 -_-;) 
블로깅 하시라고 하셔서 전부 복사 합니다. ㅋㅋ


http://blog.naver.com/kottodat?Redirect=Log&logNo=80104635200


몇몇 분들의 요청으로 간략하게 적어보겠습니다만...

 

제가 UML을 정식으로 배운 것도 아니고 그냥 대충 제멋대로 이해하고 사용하는 것 이기 때문에

 

실제 정석으로 배운 분들이 보기에 여러가지 잘못된 점이 많이 있을겁니다.

 

잘못된 부분이 보이거나 의견이 있으시다면 코멘트로 달아주시면 감사하겠습니다.

 

잘못된 점을 수정하고 좋은 조언을 달게 받아 수정을 하겠습니다.

 

 

아참... 스크롤의 압박이 무지 심합니다.

 

 

일단 StarUML 프로그램 다운로드 링크입니다.

 

http://sourceforge.net/projects/staruml/files/staruml/5.0/

 

 

프로그램을 다운받아서 설치하시면 되겠습니다.

 

비지오로 사용하시는 분들은 비지오로 하셔도 무관합니다.

 

 

 

UML로 클래스 다이어그램을 그리는 목적

 

왜 우리는 클래스 다이어그램을 그려야 하는가.

 

소스코드를 작정해 놓고 그것만 보고서 구조가 어떻게 되어있고 동작이 어떻게 이루어 지는가를

 

알아내기는 무척 어렵습니다.

 

하지만...

 

 

이정도만 보면 대충 어떻게 되는지 알 수 있지 않을까요?

 

 

여튼 직접 코드를 짜지 않고서도 구조를 어느정도 미리 그려보는 용도도있고

 

타인이 코드를 직접 분석하는 것 보다 이렇게 다이어 그램을 통해 어떻게 돌아가는지

 

알 수 있기도 하고 그 외에도 여러가지 이점이 많습니다.

 

 

 

자~ 그럼 이제부터 하나씩 파보도록 하겠습니다.

 

일단 클래스입니다.

 

 

클래스를 만드는 것은 매우 간단합니다.

 

클래스를 선택하고 드래그 하면 끝이니까요.

 

그리고 변수와 함수들을 추가해 줍니다.

 

 

클래스에 마우스 커서를 대고 오른클릭을 하면 메뉴가 뜹니다.

 

변수와 함수를 각각 추가해 줍니다.

 

 

아참

 

생성한 클래스명 변수명 함수명은

 

더블클릭을 하면 아래 그림처럼 에딧창이 나타나면서 변경이 가능합니다.

 

 

 

 

이녀석의 이름을 바꿔주고 구성품 클래스를 하나 만들어 보겠습니다.

 

 

 

 

player는 equip를 가지고 있습니다.

 

하지만 처리를 좀 원할하게 하기 위해서 클래스로 만들었습니다.

 

그리고 player가 소유한 변수중에 equip라고 있는게 보이시죠?

 

 

좀 더 쉽게 예를 들어볼까요?

 

 

 

자동차 바퀴라는 클래스에

 

휠과 타이어라는 변수가 있습니다.

 

하지만 휠과 타이어는 각각 여러가지 속성이 존재하죠

 

제가 차 바퀴에 대해 잘 몰라서 제조회사, 특성 이라고만 적어 놓았지만

 

타이어의 경우 스노 타이어인지 차종이나 크기 등은 어떤거에 맞는 것인지 등등

 

여러가지 속성이 있습니다.

 

그런 모든값을 자동차 바퀴 라는 클래스에 몰아넣는 것은 별로 좋은 생각이 아니라고 봅니다.

 

그래서 따로 클래스를 만들어서 자동차 바퀴라는 클래스에 포함시키는 것이죠

 

 

 

 

뭐 간단하고 친절하게 composition이라고 쓰여저 있는걸 선택해서 둘을 이어주면 됩니다.

 

그 위에 Aggregation이라고 속이 빈 마름모가 보일겁니다.

 

이건 아주 살짝 다릅니다.

 

차이점이 하나 존재하거든요

 

 

바로 그 클래스가 릴리즈되는 시점의 차이 입니다.

 

composition의 경우 소유하는 클래스가 죽을때 소유당하는 클래스가 같이 죽지만

 

aggregaton의 경우에는 소유하는 클래스가 죽을때 소유당하는 녀석들이 같이 죽지 않는다는

 

차이점이 있습니다.

 

 

 

aggregation의 경우에도 클래스가 다른 한 클래스를 보유한다는 것에는 차이가 없습니다.

 

하지만!

 

속이 빈 마름모로 연결을 해 놓을경우 자식(?)보다 부모(?)가 먼저 죽을 수 있습니다.

 

예를 들면 다음과 같습니다.

 

 

 

맵을 띄울때 맵이 가진 요소들이 있을겁니다.

 

예로 나무 가로등 건물 등이 있다고 가정하죠

 

이때 맵은 분명히 오브젝트들을 소유하고 있습니다.

 

하지만 오브젝트를 읽어서 초기화 하고 삭제하는 일은 맵이라는 클래스가 하지 않습니다.

 

맵은 리소스 관리자 클래스에게 오브젝트를 읽어달라고 하고 포인터를 받아서 소유합니다.

 

 

맵이라는 클래스에서 release라는 함수를 불러서 자신을 릴리즈 할 경우에도

 

리소스 관리자에게 오브젝츠들을 릴리즈 해달라고 요청하지 않는 이상 오브젝트들은 살아남습니다.

 

오브젝트들은 자기 소유자가 죽더라도 자신은 죽지 않습니다.

 

 

소스코드로 보면 좀 더 이해가 잘 되실까 해서 간단히 적어보겠습니다.

 

 

 

aggregation의 경우 다른 클래스에게서 리소스를 읽어달라고 요청하고 포인터만 받아서 사용하고

 

자신이 리소스를 릴리즈 하지 않습니다.

 

하지만 composition의 경우 자신이 직접 리소스를 읽어서 사용하고 자신 스스로 해제해 버립니다.

 

 

클래스 자신만 쓰고 버리면 그만인 경우에도

 

리소스 관리자에게 한번 읽었으면 지금 당장은 사용하지 않더라도 나중에 다시 사용할 일이 있으면

 

현재 사용하는 리스트만 초기화 해버리고 메니저에게 일일히 해제하라고 이야기 하지 않는 경우가

 

많이 있습니다.

 

자주 사용하는것은 남기고 크기가 크거나 자주 쓰지 않는건 물론 자주 릴리즈 해야겠지요

 

 

 

이야기가 삼천포로 좀 빠졌지만...;

 

다시 돌아와서

 

 

 

 

이번엔 좀 큰그림을 그려놓고 설명하겠습니다.

 

 

일단 graphics라는 package를 하나 바닥에 깔아놓은 것이 눈에 띄죠

 

저녀석은 namespace입니다.

 

우리가 자주 사용하는 것 중에 namaspace std라는 것을 자주 사용하죠

 

그안에 vector map string 등등 우리가 좋아하고 자주 사용하는 것들이 들어있습니다만

 

저런 이름들은 자주 사용할지도 모르기 때문에 사용하는 것 입니다.

 

제가 위에 그린 예제도 저녀석들은 하나의 라이브러리로 만들어 놓았다고 가정할 경우

 

리소스라는 클래스가 있습니다만 물론 gsResource라던가로 하겠지만

 

혹여 어떤사람이 gsResource라는 클래스를 만들어 버린다던가

 

설마? 하는 문제를 위해서 라는 의미가 일단 가장 큽니다.

 

 

 

 

 

 

 

 

Association 실선으로 이어진 것을 제휴관계라고 하는데요

 

간단하게 말하자면 '두 클래스가 서로의 정보를 이용한다'라는 정도로 이해하시면 됩니다.

 

카메라는 자신의 눈에 해당하는 곳의 바로앞에 오게되면 카메라 위치를 강제적으로 옮기거나

 

못보게 해야하는 곳으로 맞추는 것 등을 방지하던가 맵의 데이터를 많이 사용합니다.

 

 

반대로 맵의 경우 카메라의 절두체에 해당하는 곳 밖의 오브젝트들을 그리지 않아야 하고

 

멀리 있는것이면 폴리곤을 조금 사용하는 대처품으로 교체한다던가 카메라를 강제로 옮기지 않고

 

카메라의 눈 앞에있는 오브젝트를 반투명하게 한다던가 기타 등등등

 

카메라의 위치 정보와 절두체 등의 정보를 많이 사용합니다.

 

서로 상대방이 가진 정보를 사용할 일이 많기 때문에 제휴관계 라고 표시를 해둡니다.

 

 

 

 

 

 

 

 

DirectedAssociation 일방적 제휴관계라고 하네요

 

클라이언트는 graphics라는 녀석중에서 그래픽이라는 facade클래스를 통해 그래픽 데이터를

 

처리합니다.

 

일단 이녀석은 라이브러리로서

#include "gsgraphic.h"

pragma commant( lib, "gsgraphic.lib" )

 

using namespace graphics ;

 

이렇게 해놓고 쓸 녀석인 만큼 그래픽이라는 클래스에서 클라이언트에 대해 뭔가를 특정하기엔

 

무리가 있으며 클라이언트쪽에 뭔가 요청하거나 할 일이 없습니다.

 

클라이언트가 일방적으로 뭔가 넣고 초기화 하라고 시켜서 초기화 하고

 

말 그대로 하라는 일만 소처럼 열심히 하는거죠

 

그래서 일방적 제휴라고 하는 것 같습니다.

 

 

 

 

 

 

위 그림처럼 점선으로 이어놓은 것을 Dependency 의존관계 라고 합니다.

 

지형지물이던 맵이던 이펙트던 스스로 리소스를 파일에서 읽는짓은 하지 못합니다.

 

왜냐구요?

 

만약 저녀석들이 각각 리소스를 파일에서 읽는 작업을 한다고 가정하면....

 

5개 클래스 각각 파일을 읽고 파일의 정보들을 구조체에 담고 분류하는일을 갖고 있어야 할겁니다.

 

5개 클래스에 동일한 코드와 비슷한코드가 똑같이 박혀있는 것부터가 일단 용납이 안되며

 

리소스 재사용이나 쌓아둔 양에따라 적당히 잘 안쓰는건 릴리즈 한다던가 하는 관리를 위해서라도

 

리소스를 관리하는 클래스를 따로 두고 관리해야 하지 않을까 합니다.

 

 

일단 딴 이야기는 이쯤 하고...;

 

클래스의 일부 기능을 타 클래스의 힘을 빌려서 해야할 경우에 의존적이라고 하고

 

저렇게 점선에 화살표로 표기합니다.

 

그 외에 의존하는 클래스의 변화에 영향을 받기도 한다고 기억하고 있습니다만

 

리소스를 읽는 과정 자체가 리소스 클래스가 가지고 있고 리소스 객체의 형태가 변한다면

 

각자 받아온 값을 활용하는 법도 확실히 바뀌는 일이 있을지 모르겠군요

 

 

 

 

다음은 Multiplicity입니다. 수량이라는 게죠

 

맵은 반드시 1개가 존재하고 오브젝트는 0개가 될수도 있고 몇개가 될수도 있습니다.

 

저런식으로 수치를 넣어주는 것 입니다만...

 

쓰기 나름입니다.

 

1 - * 이라고 해도 위 그림과 같은 의미이고

 

1 - 5 라고 하면 반드시 1개와 5개가 맞물린다는 것입니다.

 

10개짜리 분산서버와 유져들간의 커뮤니케이션은 10 - * 일테고 말이죠

 

 

하지만 이것을 꼭 표기해 줄 필요는 없다고 생각합니다.

 

대부분 1:1로 맞물리는 경우이고 꼭 필요하거나 강조하고 싶은 부분에서만 표기를 하고

 

당연하다 싶은 부분은 그냥 생략하는게 좋다고 생각합니다.

 

 

 

 

reflexive 반사?

 

클래스들은 자기 자신이 자기 자신과 영향을 주고받을 수도 있습니다.

 

스크롤의 압박도 심하고 머리도 아픈데 여기서 또 이상한게 나왔네

 

아... 이건 또 뭡니까? 하시는 분들이 계시겠지만 생각보다 간단합니다.

 

 

 

코드 자체는 엉터리지만 그런건 좀 넘어가 주세요...;

 

이녀석은 자기 자신을 일방적으로 제휴합니다.

 

next만 알지 자기 이전에 대해서는 알지를 못합니다.

 

push함수에서는 자기 다음녀석을 생성해서 값을 써 넣는일만 하겠죠

 

저런식으로 자기 스스로에게 영향을 미치는 것을 반사~ 라고 합니다.

 

지금껀 반사 일방적 제휴겠죠 reflexive DirectedAssociation

 

자기 전과 후의 값을 알면 그냥 반사제휴일테고 말이죠 reflexive Association

 

 

 

그 외에 이런것들이 있습니다.

 

 

위 그림은 싱글톤 클래스 입니다.

 

자기 자신에게 연결된 끝이 마름모꼴인 직선을 주시해 주세요

 

싱글톤 클래스도 반사제휴의 대표적인 예 입니다.

 

 

그 외에도 저 그림을 보고 알아야 하는 것이

 

myClass *test ;

 

test = test->getPointer( ) ;

 

위와같이 코드를 짤텐데 말이죠

 

저녀석이 static 정적 맴버를 사용한 정적 함수처럼 작동하고 있고

 

싱글톤 클래스의 포인터를 얻고있다는 의미로 getPointer( ) 와 <<static>>를 표기해 주었습니다.

 

그 다음

 

-m_pThis: myClass *

 

밑줄 underbar은 이 변수가 static 정적 변수라는 것을 의미합니다.

 

-기호는 이 변수가 private변수라는 것을 의미

 

 

맴버 변수의 속성

 

 

 

: myClass *는 m_pThis라는 변수의 변수형이 myClass형 포인터 라는 것을 의미합니다.

 

함수의 경우

 

-init( HWND hWnd, int width, int height ) : bool

속성 함수명 인자 : 반환값

 

위와같은 형식으로 표기가 가능합니다.

 

 

 

음... 거의 끝이 나 가는군요

 

 

 

 

위 그림은 데이터 팩토링에 대해서 나타난 것입니다.

 

일단 맵과 오브젝트를 잇는 선에 1 - 0.*이라고 해서 한개의 맵과 다수의 오브젝트가 있을 수 있고

 

<<Factoring>>라고 표기도 해줬습니다.

 

그리고 지형 지형지물 캐릭터 클래스를 보면 자기 스스로를 의존하고 있는 반사 의존을 표기해

 

준 상태인데요 저것은 자기 자신의 메모리를 할당해서 되돌리는 함수를 의존한다는 뜻 입니다.

 

가능하면 <<메모리를 할당해서 되돌려주는 함수명>>으로 하는 것이 좋을 듯 합니다.

 

 

오브젝트 클래스를 보면

 

오브젝트라는 클래스 이름과 operation1( ) operation2( ) 라는 두개의 함수명이

 

옆으로 살짝 기울어져 있는 것이 보이실겁니다.

 

일단 클래스 이름이 기울어져 있는 것은

 

저것이 추상 클래스로서 인스턴스를 생성하지 않을 것이라는 것을 의미하고

 

함수 두개의 이름이 기울어져 있는 것은 저 함수들이 가상함수라는 것을 의미합니다.

 

저런식으로 가상함수와 추상 클래스를 표기해서 인터페이스를 그리는 방법도 있겠지만

 

저는 자바사용자가 아니고 C++에서는 interface라는 개념도 없어서 인터페이스에 관해서는

 

자세히 모르겠네요 ;ㅅ;

 

 

 

 

제 블로그에 있는 정보들은 모두 수정 및 퍼가는것을 제한하고 있지 않으며

 

오른클릭과 Ctrl + C도 먹으니까 자유롭게 활용하시면 됩니다.

 

그리고 필요하신 것을 요청하시면 가능한 것이라면 도와드리는 주의랍니다.

 

마음껏 가져가세요~

'SE > agile' 카테고리의 다른 글

Observer Pattern  (0) 2010.06.18
① 사용자 요구조건 조사  (0) 2010.03.18
02] XP 개발 주기의 개괄  (0) 2010.03.18
01] XP 정의, 4개 구성  (0) 2010.03.18

옵져버 패턴입니다.

 

의도:

일대다의 관견성을 갖는 객체들의 경우 한 객체의 상태가 변하면 다른 모든 객체에게 그 사항을 알리고 필요한 수정이 자동으로 이루어지도록 할 수 있어야 한다.

 

 

활용성:

추상화 개념이 두 가지의 측면을 갖고 하나가 다른 하나에 종속적일 때. 이런 종속 관계를 하나의 객체로 분리시켜 이들 각각을 재사용할 수 있다.

한 객체에 가해진 변경으로 다른 객체를 변경해야 할 때 프로그래머들은 얼마나 많은 객체들이 변경되어야 하는지를 몰라도 된다.

객체는 다른 객체에 변화를 통보할 수 있는데, 변화에 관심 있어 하는 객체들이 누구인지에 대한 가정 없이도 이루어져야 할 때.

 

 

보통 GUI 툴킷을 이용해서 프로그램을 작성하면 사용자에게 보여주는 UI와 데이터는 따로 나눠서 관리하게 됩니다. 그런 상황에서 하나의 데이터와 여러 개의 UI가 있을 경우 데이터를 공유시켜야 합니다. 그런 상황에서 옵져버 패턴을 사용하게 되면 굉장히 편합니다. Subject의 상태가 변화됨에 따라 Observer들의 상태가 자동으로 바뀌기 때문입니다.

 

 

 



Subject를 상속받는 ObserverManager의 상태가 변경되면 그 변경사항들이 옵져버들에게 반영됩니다.

 

 

Bloger: moltak.net

'SE > agile' 카테고리의 다른 글

UML: 클래스 다이어그램 기초  (0) 2010.07.08
① 사용자 요구조건 조사  (0) 2010.03.18
02] XP 개발 주기의 개괄  (0) 2010.03.18
01] XP 정의, 4개 구성  (0) 2010.03.18

사용자 요구조건 조사

조사 단계는 시스템의 모습과 임무를 파악하는 단계이다. 이 단계에서 고객은 시스템의 목표 기술문(vision statement) 작성을 담당한다. 목표 기술문은 20~30 단어 정도로 구성되며 전체적인 시스템 메타포의 개발을 이끌 수 있어야 한다. 고개과 개발자는 이 단계에서 함께 일하면서 기술적 옵션, 요구 사항 분석을 조사하며 유저 스토리의 목록을 완성한다.


목표 기술문은 시스템의 목적을 기술하는 추상적인 문장이다. '이 시스템의 목적은 인터넷을 통해 서적을 판매하는 것이다' 와 같은 것이 그 예이다.
시스템 메타포는 팀에서 시스템을 개념화하는 방식이며 보통 비즈니스 분야의 말들로 쓰여진다. "고객이 들어와서 열람, 검색하고 책을 살 수 있는 가상의 서점" 같은 것이 그 예이다.
유저 스토리는 사용자의 요구 사항을 이해하는 하나의 도구이다. 유저 스토리는 사용 실례 같은 것과 비슷하며, 고객에 의해서 비전문적인 용어로 쓰여진다. 보통의 유저 스토리는 3~4 문장 정도의 길이이다.


유저 스토리 작성하기

프로젝트 시작 단계에서 고객은 중요하고 유저 추상적인 유저 스토리를 작성하고 개발자는 해당되는 개발에 필요한 시간을 추정해 본다. 물론 고객과 개발자 서로가 이 상태에서늬 예측은 상당히 추상적인 것이며 앞으로 개발이 진행되면서 이터레이션 단계에서 상세화될 것이라는 생각을 갖고 있다. 어떤 경우에는 개발자들이 좀 더 자세한 예측을 위해서 스파이킹(spiking - 프로토타이핑이나 기술적 연구)을 하는 경우도 있다. 기술 전문가나 컨설턴트가 추상적 수준에서의 타당성 검토나 관련 연구를 도울 수도 있다. 스파이킹은 단순하지만 개발에 필요한 노력과 방법론을 이해하는 데 커다란 도움이 된다.


스파이킹은 프로토타입을 만들면서 조사하는 것이다. 스파이킹은 일반적인 기술 연구에 시간을 들인다기보다는 특정 목적을 갖고 이루어진다.


스파이킹이 끝나면 개발팀이 그에 대한 지식을 얻게 되는 것이고 스파이킹에 사용된 코드는 버려진다. 스파이킹은 수시간에 이루어질 수도 있지만 보통의 경우에는 수일이 걸리게 된다. 작업이 진전되면서 어려운 문제에 대한 스파이킹을 포기하는 경우도 생기는데 이것은 일반적인 상황은 아니다.


스파이킹 기간에 작성된 코드는 보통 재사용할 만큼 품질이 좋지 못해서 버려지는 것이 일반적이다. 스파이킹을 할 때 개발자는 연구의 일환으로 코드를 작성하는 것이지 특정 디자인에 입각해서 짜는 것이 아니기 때문이다.


추정과 발견(Estimating and Discovering)

조사의 단계는 대부분 발견에 관한 것이다. 고객은 그들이 원하는 것은 발견해가고 개발자는 그들의 문제에 대한 접근 방식을 발견해 가면서 또 스파이킹을 통해서 추정을 해나간다. 스파이킹을 하는 데 필요한 시간을 추정하고 실제 드는 시간과 비교하는 것만으로 간단하게 처리된다. 이렇게 해서 조사 단계에서는 개발팀이 좀더 정밀한 추정 기술을 습득하게 하는 장점도 갖게 된다. 이런 기술은 이후 이터레이션 계획이 시작해지면 아주 중요해진다.


'SE > agile' 카테고리의 다른 글

UML: 클래스 다이어그램 기초  (0) 2010.07.08
Observer Pattern  (0) 2010.06.18
02] XP 개발 주기의 개괄  (0) 2010.03.18
01] XP 정의, 4개 구성  (0) 2010.03.18

XP 개발 주기의 개괄

XP에서의 기본 전제는 고객과 개발자가 함께 진정한 가치를 지닌 소프트웨어를 만들어 나간다는 것이다. 고객은 XP 프로젝트의 개발 주기에 따라서 사업적 가치를 창출해내기 위해서 개발팀에 방향을 제시해 준다. 고객이 프로젝트에 능동적으로 참여하는 것이다.


Snap6.jpg 이 그림은 XP 개발 주기가 지속적으로 가치를 정의하고 만들어 가는 과정임을 보여준다. 이 과정은 이전의 패러다임과 다를 것이 하나도 없어 보인다. 모든 개발에서 고객은 가치를 정의하고 개발자는 가치를 만들어 낸다. XP에서의 차이점은 그런 주기가 매우 짧게 일어난다는 것이다. 개발팀은 새로운 기능을 매 분, 매 시간마다 만들어 낸다. 이것이 고객에게 프로젝트를 보완하고 수정할 수 있는 여지를 제공한다.












단계설명
조사 기간 프로젝트 시작, 추상적 수준의 사용자 요구분석, 기술적인 프로토타이핑
계획 작업의 우선순위 부여, 릴리즈 단위로의 분할, 초기 계획 작성
이터레이션(iteration) 시스템의 개발과 테스트, 2차로 작업을 나누어 이터레이션 계획 수립, 실 사용자가 이 단계에서 ㅇ이너페이스를 개량하고 사용 편의성을 확인하기 위해 일할 수 있다.
제품화 고객의 작업 환경에 소프트웨어를 설치
유지 보수 지속적 유지, 보수, 기능 향상


XP 프로젝트는 고객의 제품에 대한 시각을 우선 릴리즈 단위로 나누고 다시 릴리즈를 이터레이션 단위로 나눈다. 계획 단계는 프로젝트가 진행됨에 따라 점차 상세화, 발전되는 과정으로 인식된다.


Snap2(1).jpg 각각의 이터레이션에서 새 코드를 작성해서 통합될 때마다 build가 이루어지게 된다. 빌드의 수는 사용되는 기술의 종류와 팀에서 채택한 개발 스타일에 따라 다르다. 그렇다면 릴리즈와 이터레이션의 주된 차이점은 무엇인가? 릴리즈 단위가 끝날 때면 개발진은 작동하는 소프트웨어를 고객에게 넘겨주는 반면 이터레이션에서는 개발팀 내부적인 확인만 이루어진다. 이런 식으로 개발팀에 상주하는 고객과 개발자 사이에서 프로젝트의 진행 정도를 확인하고 조절하게 된다.





build는 시스템의 구성요소가 하나로 통합되어서 제대로 작동하는지 테스트하는 과정이다.


[그림 4.3]은 XP 가 가진 이터레이션 중심의 특징을 보여준다. 

Snap3(1).jpg 조사 이후에 개발팀은 릴리즈 계획을 세우고 소프트웨어가 완성되어 제품화 준비를 할 때 까지 이터레이션 작업을 계속하게 된다. 제품화나 각 릴리즈의 종료 시점에서는 소프트웨어가 작업 현장에 투입되어서 테스트된다. 제품화는 그 소프트웨어를 사용하여 실제 사업적 가치를 얻기 시작한다는 점에서 중요하다. 제품화가 이루어진 후의 다른 특성은 이제 제품의 문제로 생기는 비용이 훨씬 커진다는 것이다. 이 때문에 신중한 고객들은 최종 점검 테스트를 한다.




'SE > agile' 카테고리의 다른 글

UML: 클래스 다이어그램 기초  (0) 2010.07.08
Observer Pattern  (0) 2010.06.18
① 사용자 요구조건 조사  (0) 2010.03.18
01] XP 정의, 4개 구성  (0) 2010.03.18

1. XP 정의하기

XP는 4개의 부분, 가치, 원칙, 활동, 기법으로 구성된다. XP는 별도로 고안되었다기 보다는 협동, 작업의 흐름, 시스템 속에서 나타났다고 하는 편이 옳을 것이다. 이런 소프트웨어 개발의 유기적인 관점을 유지하면서 XP는 가치와 원칙들에 기반하여 만들어져서 그로부터 기법과 활동을 고안해냈다.


1) 가치

XP는 개발을 위한 공통의 가치(value)에 의해서 이끌어 진다.

가치설명
단순성 XP에서 단순성은 "동작하는 최대한 단순한 작업을 하는 것"으로 정의된다. 당장의 문제를 가급적 단순하게 해결하고 이후의 문제는 그 때 해결될 것이라고 믿는 것이다. 보통의 방법론들은 어느 정도 앞날을 대비한 계획을 세우고 고객은 전체 시스템에 대해서 예상해 보게 된다. 이런 방법론에 깔린 생각은 이후의 수정이 불가능하지는 않더라도 어려울 것이라는 것이다. XP는 당장 고객이 원하는 것을 하는 것으로 관점을 달리한다. XP 그룹들에서 하는 이야기가 있다. "아마 그건 필요 없을껄" 이것이 의미하는 것은 개발팀은 단순한 생각을 갖고 고객이 필요할 것 같은 것이 아니라 고객이 당장 필요로 하는 것을 구현해야 한다는 것이다. 왜 앞으로 필요할 것 같은 기능에 대해서 미리 디자인하는 걸까? 그것은 이후 수정이 일어날 경우 그 비용이 너무 높기 때문이다. 요약하자면, 단순한 시스템이 커뮤니케이션 비용이 적게 들고 통합이 용이하며 더 나은 확장성을 가지고 있다.
커뮤니케이션 모든 방법론은 내부적으로 커뮤니케이션 과정을 가지고 있지만 XP에서는 특별히 핵심 가치로 존재한다. 커뮤니케이션의 초점은 문서나 보고서, 계획서에 있지 않고 대화에 있다. 모든 팀 구성원간의 커뮤니케이션이 없이는 협업은 약해지고, 결국은 실패할 것이다. XP에는 작업에 커뮤니케이션을 요구하는 짝 프로그래밍 같은 기법을 사용한다. 1장 "XP 가 나오게 된 배경"에서 '이해'가 소프트웨어 개발에 얼마나 커다란 어려움인지에 대해서 이미 이야기했다. XP는 이를 인정하고 팀 멤버간의 장벽을 허물기 위해 노력한다. XP 에서 모든 문서는 사람들간의 커뮤니케이션을 돕는 데 쓰인다.
피드백 XP 에서는 모든 시스템에 대한 계속되는 질문에 대한 대답이 지속적이고 구체적인 피드백에 의해 이루어진다. 제품은 시행착오를 거쳐서만이 검증 될 수 있다. 이것은 엄연한 사실이기 때문에 개발팀은 소프트웨어를 빨리 만들어낸 후, 고객에게 데모를 해야 한다.
용기 용기는 빨리 작업하고, 필요시 다시 개발하겠다는 자신감이다. XP 에서의 용기는 다른 세 가지 가치들과 하나의 문맥에서 생각해 보아야 한다. 그만큼 중요한 것이다. 하지만 XP의 용기는 강력하고 자동화된 테스트에 기반한 대단함이지 모르는 것에 대한 무모한 노력은 아니다.


2) 원칙

XP의 핵심 가치를 바탕으로 소프트웨어 개발에 지침이 될 다섯 개의 주요 원칙(Principle) 이다.

원칙설명
피드백은 신속히 신속한 피드백은 개발자가 짧은 단위로 고객의 피드백을 받아서 고객의 요구를 잘 반영하고 있는지 확인하는 것을 의미한다.
단순함을 전제 단순함을 전제하는 것은 문제를 대할 때 간단히 문제가 풀릴 것이라 생각하라는 것이다. 또 그것은 현재 문제에 집중해서 작업하고 미래의 일에 대해서는 걱정하지 말라는 것을 의미한다.
점진적인 수정 문제를 풀 때의 과정을 작은 교정의 연속이라고 생각하라. 이것은 계획, 개발, 디자인에 모두 적용된다. 예를 들어 고객이 이미 웹 사이트를 가지고 있고, 거기에 JSP를 포팅하고 할 경우 XP 팀은 한번에 완성해서 끝내는 것을 목표로 하기 보다는 사업부에서의 요구에 따라서 여러 차례 소규모의 출시를 할 것이다.
변화의 인정 현존하는 문제를 풀면서 옵션의 여지가 있는 방법을 택하라.
고품질의 작업 작업의 품질은 타협의 대상이 아니다. XP는 테스트 위주 프로그래밍으로 그 무엇보다 코드와 테스트의 중요성을 강조한다


3) 활동

지금까지 가치와 원칙들에 대해 알아보았는데, 그렇다면 실제 XP에서 하는 일은 어떤 것 인가? 몇 가지 XP 사이클에서의 활동(Activity)에 대해 알아보자.

활동설명
듣기 XP는 능동적인 듣기를 요구한다. 형식적인 문서에 대한 의존도가 늦은 대신에 고수준의 구두 커뮤니케이션이 요구된다. 단순히 개발자가 고객의 말에 귀기울여야 한다는 것 이상으로 XP는 보다 나은 커뮤니케이션을 지향한다.  문서에 대한 의존 없이 XP 사용자들은 다른 형태의 구두 의사소통을 익히고 능숙해져야 한다.
테스트 XP에서의 테스트는 고객에게 출시하기 전에 하는 작업이 아니라 개발 전 과정에 걸쳐 일어나는 공정의 일부이다. 심지어 개발자는 코드를 작성하기 전에 테스트를 먼저 작성할 정도이다. XP 테스트는 정확성이나 결점을 측정하는 데 국한되는 것이 아니라 제품의 성능이나 적응도까지 점검한다. 코드를 짜기 전에 테스트를 만드는 것은 개발자에게 생각의 전환을 요구한다. 그 결과로 코드는 비용이 많이 드는 개발의 후반부에 별도의 디버깅 과정 없이 그 자체로 높은 품질을 지니게 된다.
디자인

문서화된 디자인이 적은 대신 XP 개발자는 코드를 작성할 때 의도적으로 그 의미를 표현하려 한다. 소스 코드를 읽는 것만으로 다른 팀의 멤버들은 논리와 알고리즘, 흐름을 이해할 수 있다. 여기서 이야기하는 것은 주석에 대한 이야기가 아니라 소스 코드 그 자체가 커뮤니케이션의 수단이 된다는 것임에 주의하기 바란다. 소스코드는 실제 제품에 우리가 가장 가까이 접근할 수 있는 것 이다.

XP의 기초 아이디어 중 하나는 디자인이 프로젝트 전체에 걸쳐서 발전해 나간다는 것이다. 디자인은 멈추어 있거나 특정 단계에서 이루어지는 것이 아니라 팀 기반의 동적인 것이다. 어떤 면에서 소프트웨어는 언제나 디자인 중이라고 이야기할 수도 있다. 디자인 단계를 제한해서 이런 점들을 무시하는 대신 XP는 자연스런 시스템의 발전을 수용한다.


4) 기법

그렇다면, 어떻게 XP의 활동들을 실행에 옮길 수 있을까? XP는 이들 활동들을 12개의 핵심적인 기법(Practice)으로 표현한다. 이 기법들이 XP팀들이 매일 현장에서 시스템을 개발하는 데 사용하는 것들이다.

번호기법설명
1 계획 짜기 게임 계획 짜기 게임의 역할은 빠른 시간 안에 다음의 출시 계획이나 일정을 빨리 세우기 위한 것이다.
2 짧은 릴리즈 XP 개발 사이클은 사업적 가치를 달성하기 위해 짧은 릴리즈로 이루어진다.
3 메타포 메타포는 프로젝트를 표현하는 데 쓰이는 시각적인 것, 단어, 언어이다.
4 단순한 디자인 디자인은 반드시 단순해야 한다. XP에서의 단순함의 의미는 동작하는 것 중에서 가장 단순해야 한다는 것이다.
5 테스트 XP 개발의 핵심은 자동화된 테스트이다. 개발시에는 가장 먼저 테스트부터 작성해야 하고 테스트 툴에 의해서 사용된다.
6 리팩토링 리팩토링은 시스템 외적 동작의 변화 없이 기존 코드의 디자인을 향상시키는 작업이다.
7 짝 프로그래밍 짝 프로그래밍은 두 명의 개발자가 한 컴퓨터 앞에 앉아서 같이 개발작업을 진행하는 것이다.
8 공동 소유 공동 소유는 언제, 누구라도 코드를 수정해서 더 좋게 만들 수 있게 해준다.
9 지속적인 통합 시스템의 부분은 하루에도 수 차례 통합 작업을 거친다.
10 주당 40시간 근무 초과근무가 많은 곳에서는 일괄적인 품질의 유지가 어려워진다. XP는 품질을 위해서 일반 업무시간의 준수를 요구한다.
11 현장의 고객 고객이 현장에 있고 개발팀에 참가한다.
12 코딩 표준 코딩 표준은 모든 개발자가 개발시 지키기로 합의한 약정이다.

아 빡시다. 계속 써놔야한디. 아나ㅋㅋ 언제 다하지...

'SE > agile' 카테고리의 다른 글

UML: 클래스 다이어그램 기초  (0) 2010.07.08
Observer Pattern  (0) 2010.06.18
① 사용자 요구조건 조사  (0) 2010.03.18
02] XP 개발 주기의 개괄  (0) 2010.03.18

+ Recent posts