''에 해당되는 글 0건

TISTORY 로 이사를 했습니다.

분류없음 2008/04/15 14:16 posted by 전중
티스토리 로 이사했습니다.(joong.tistory.com)

자료는 그대로 티스토리로 옮겼으니(4월 13일 기준)

이사한 블로그에서 찾으시면 됩니다.

5초뒤에 자동으로 페이지 이동합니다.

DFD(Data Flow Diagram)

Study/Software Engineering 2008/04/11 12:23 posted by 전중
 

DFD(Data Flow Diagram)란?

 DFD(Data Flow Diagram)데이터가 소프트웨어 내의 각 프로세스를 따라 흐르면서 변환되는 모습을 나타낸 그림으로 소프트웨어 및 정보시스템의 분석과 설계에서 매우 유용하게 사용되는 다이아그램이다. 데이터 흐름도 또는 자료 흐름도 라고 칭하기도 한다.

 DFD는 시스템의 모형화 도구로서 가장 보편적으로 사용되는 것 중의 하나이며 데이타에 비해 기능이 매우 복잡하고 중요할 경우에 매우 유용하게 사용될 수 있다.

[그림 1] DFD의 예

 

 

구조적 방법론과 DFD

 DFD는 이른바 구조적 방법론을 대표하는 다이아그램이다.

   구조적 분석/설계 혹은 구조적 방법론은(DFD의 모습처럼 "자료흐름지향 방법론"이라고도 한다) 1968년 Dijskstra가 GOTO文의 폐해를 들어 구조적 프로그래밍(Structured Programming)의 개념을 소개하면서 시작되었다. 모든 방법론은 항상 프로그래밍으로부터 문제가 제기되고 이를 분석/설계에도 적용시켜보자는식으로 발전한다. 구조적 분석/설계에서의 데이터는 기능(또는 프로세스) 사이에서 주고 받는 형태로만 나타나며 기능의 계속된 분해와 이의 분석을 통해서만 데이터가 나타나게 된다.

 이 후 70년대를 거치면서 거의 대부분의 소프트웨어 개발은 '구조적'이라는 용어에 둘러싸이다시피 했으며 소프트웨어 공학에서도 가장 빈번한 이슈였다. 따라서 소프트웨어 개발과정의 중간 산출물로 DFD를 비롯한 DD(Data Dictionary), 구조도(Structured Diagram) 등이 많이 사용되었다. 그러나 소프트웨어의 규모와 복잡도가 커지고 기업에서 보다 많은 소프트웨어와 컴퓨터 시스템을 사용하게 됨에 따라 자료흐름 위주의 분석과 설계는 한계에 부닥치게 된다.

   정보시스템을 비롯한 MIS관련 소프트웨어는 많은 량의 데이터를 관리할 필요가 생기고 그 구조의 변경이 프로그램의 유지보수에 큰 영향을 미치기 때문이다. 따라서 프로세스 위주의 DFD보다는 데이터에 대한 분석/설계가 더 안정적이다. 최근의 정보시스템을 포함한 소프트웨어의 설계에서는 DFD의 중요성은 그만큼 덜 해지고 ERD(Entity Relationship Diagram) 같은 데이터 분석 도구가 더 유용하게 사용되고 있다.

 정보공학(Information Engineering)에서는 DFD를 거의 강조하지 않으며 데이터와 프로세스가 동시에 나타난다는 이유로 검증용 도구로 사용되는 정도에 그치고 있다. 그러나 실제 소프트웨어 개발 프로젝트에서는 아직도 DFD와 그에 따른 산출물들이 절찬리에 사용되고 있는데, 그 이유는 아마도 많은 개발자들이 이에 익숙해져 있고, 실제로 다른 다이아그램에 비해 DFD가 표현하고 이해하기가 매우 쉬운편이기 때문이 아닐까 생각된다.


DFD 작성의 이익

 다른 분석/설계용 문서 산출물들과 마찬가지로 다음과 같은 잇점을 가져다 줄 수 있다.

현업사용자의 업무 및 요구사항을 쉽게 문서화 할 수 있다.

현업사용자와 분석가(또는 개발자) 사이의 의사소통을 위한 공용어의 역할을 한다.

일관성 있고 정확한 사용자의 요구사항을 파악할 수 있는 요구분석용 도구의 역할을 한다


DFD의 특성

 DFD는 다른 다이아그램과 구별되는 다음과 같은 특징들을 갖는다.

도형으로 그려지는 그림 중심의 표현이다.

다차원적(Multidimensional)이다.

데이터(자료)의 흐름에 중심을 두는 분석용 도구이다.

제어(Control)의 흐름은 중요시 하지 않는다.


DFD의 구성요소

 DFD의 구성요소로는 프로세스, 데이터흐름, 데이터저장소, 외부엔티티 등이 있으며 표기법에 따라 표현하는 그림의 모양이 달라진다. 여기서는 Yourdon과 DeMarco에 의해 주장된 표기법을 기준으로 설명한다.

프로세스(Process) 

프로세스는 입력되는 데이터를 원하는 데이터로 변환하여 출력시키기 위한 과정으로 도형적 표기형태로는 원(Bubble)과 원안의 이름으로 표현한다.

원안에 기록하는 이름은 아래에 그림과 같이 프로세스가 수행하는 일 또는 프로세스를 수행하는 행위자를 기술한다.

프로세스는 자체적으로는 데이터를 생성할 수 없고 항상 입력되는 데이터가 있어야 한다.

프로세스는 항상 새로운 가치를 부가해야 한다.

[그림 2] Process

데이터흐름(Data Flow)

데이터흐름(Data Flow)은 DFD의 구성요소들간의 인터페이스를 나타낸다.

대부분의 데이터흐름은 프로세스들 사이를 연결하지만, 데이터 저장소(Data Store)로부터의 데이터흐름을 나타내기도  한다.

데이터흐름은 명칭이 부여거나 부여되지 않은 화살표로 표시한다. 단, 후속작업들의 참조를 위해 되도록 명칭이 부여되는 것이 바람직하다.

서로 다른 데이터 흐름에는 동일한 이름을 부여하지 않는다.

[그림 3] Data Flow

데이터저장소(Data Store) 

데이터저장소(Data Store)는 저장되어 있는 정보 집합이다.

데이터저장소는 테이프, 디스크, 카드 데이타, 캐비넷의 인덱스화일 등일 수도 있으며, 때로는 휴지통일 수도 있다.

데이터저장소는 단순한 데이터의 저장을 나타내는 것이지 데이터의 변동을 표시하는 것은 아니다.

데이터흐름을 표시함으로서 데이터의 입출력을 나타낸다.

데이터 흐름도에서 데이터저장소를 나타내는 표기법은 단순하게 두개의 직선 즉, 평행선으로 나타내고, 평행선 안에 데이터저장소의 명칭을 부여한다.

[그림 4] Data Store

  외부엔티티(External Entity) 

외부엔티티는 프로세스 처리과정의 데이터발생의 시작 및 종료를 나타낸다.

어떤 기업의 내적인(Inside) 외부엔티티는 관리, 부서, 기능, 시스템등을 포함하며, 기업 외적인(Outside) 외부엔티티는 고객, 거래처, 공공기관, 외부시스템등을 포함한다.

외부엔티티는 데이터 흐름도상에서 프로세스(Process)와의 상호관련성을 표시하며, 일반적으로 DFD 범위 밖에 사각형 형태로 표시한다.

[그림 5] External Entity

less..

작성방법

 DFD의 작성방법은 다음과 같다.

업무를 분석하여 프로세스에 대한 모든 입출력 데이터흐름을 식별한다. 그리고 업무의 주변 경계에 그들을 표시한다.

데이터흐름상 필요하거나 제공되어야 할 외부엔티티를 정의한다.

입력으로부터 출력으로, 출력으로부터 입력으로, 또는 중간 지점부터의 데이터흐름을 식별한다.

모든 접속관계 데이터흐름에 주의깊게 명칭(혹은 자료 내역)을 부여한다.

프로세스에 대해 입력 데이터흐름과 출력 데이터흐름의 명칭에 따라 이름을 부여한다.

프로세스에 관련된 데이터저장소를 정의한다.

검토하고 보완한다.

상위레벨 DFD완성후 다음 하위 레벨의 DFD로 분할하여 최하위 레벨까지 그린다.

데이터 흐름도의 규모가 너무 커서 한 장의 종이에 그릴 수 없을 때는 시스템을 서브시스템(Subsystems)들로 분할한다.

 분할된 서브시스템들의 규모가 클때는 다시 분할을 계속한다. 이렇게 세분화를 계속하여 마지막에는 데이타 흐름도를 단순한 기능들만으로 그릴 수 있는 단계까지 분할한다. (일반적으로 레벨3까지면 적당하다)

배경도(Context Diagram) 

배경도는 분석하고자 하는 시스템과 외부 세계와의 접속관계를 식별하기 위한 것으로 시스템 분석의 범위를 결정하게 된다.

최하위단계 데이터 흐름도

최하위 단계의 DFD는 DFD 내의 모든 프로세스가 더 이상 하위 단계의 DFD로 분할되지 않는 데이터 흐름도를 말하며, 모든 프로세스들이 명세서를 갖는 기본단위인 것을 말한다.       상하관계

다음 그림은 분할된 데이터 흐름도의 상하관계를 보여주는데 상위 단계의 번호1로 표시된 프로세스가 다시3개의 하위 단계의 프로세스들로 분할되는 것을 보여주고 있다.

하위 단계에서는 분할된 프로세스들과 그들 간의 접속관계를 보여주며 상위 단계의 프로세스와 데이터흐름을 더욱 상세히 설명한다.

하위단계의 데이터 흐름도에서는 프로세스 분할뿐만 아니라 데이터 흐름의 변환과정도 자세히 나타나는데, 그림에서는 상위 단계의 데이터 흐름 A가 B와 C로 변환되는 과정을 상세히 설명하고 있다.

그러나 하위 단계는 상위 단계와 동일한 데이터변환을 하는 것이므로 순수입력과 순수출력은 상위와 하위 단계 모두 일치한다.

그림에서 또 유의해야 할 것은 상위 단계의 프로세스1이 분할된 하위 단계의 프로세스들은 1.1, 1.2, 1.3 등과 같은 번호를 부여받는다. 마찬가지로 하위 단계의 프로세스 1.2가 다시 분할된다면 그것의 하위 단계 데이타 흐름도는 다시 1.2.1, 1.2.2, 1.2.3 등과 같이 된다.

[그림 6] DFD의 분할


작성규칙

 DFD 만큼 애용되는 다이아그램도 없지만 또 DFD 만큼 잘못되게 그려지는 다이아그램도 없다. 많은 개발자들이 정확한 DFD의 작성 방법을 몰라서, 또는 시간이 부족해서 부실한 다이아그램을 그리고 만다.

   DFD는 일반적으로 Context Diagram을 포함해서 레벨 3까지 분할되면 적당하며, 레벨간의 데이터흐름, 외부엔티티, 데이터저장소가 반드시 일치해야 한다.

 또한 모든 데이터흐름과 데이터저장소는 프로세스에 연결되어 있어야 하고, 입력이나 출력 중 어느 하나만 있는 경우는 Blackhole과 Miracle이라 하여 옳지 않은 것으로 본다. 또한 데이터저장소간의 데이터흐름의 연결도 피해야 한다.

데이터 보존의 원칙(Conservation Rule)

어떤 프로세스의 출력 데이터흐름은 반드시 입력 데이터흐름을 이용하여 생성된 것이어야 한다는 것이다. 아래 예에서 사과라는 데이터는 쥬서라는 프로세스를 통해 사과 쥬스가 되어야 한다. 따라서 오렌지 쥬스라는 출력은 잘못된 것이다.

[그림 7] 데이터 보존의 원칙

최소데이터 입력의 원칙

최소데이터 입력의 원칙은 어떤 프로세스가 출력 데이터흐름을 산출하는데 반드시 필요로 하는 최소의 데이터흐름만을 입력해야 한다는 것이다.

아래 그림에서 보는 바와 같이 실급여액 계산이란 프로세스가 필요로 하지 않는 근무시간은 이 처리를 통과하지 않고 지나친 다는 것을 보여주고 있다.

[그림 8] 최소데이터 입력의 원칙

지속성의 원칙

프로세스는 입력 데이터흐름이 들어오기만 한다면 항상 수행할 준비를 갖추고 있어야 한다는 것이다. 다음 그림에서 보는 한영번역 처리는 어떤 개인용 컴퓨터에서 실행할 수 있는 소프트웨어로 구매할 수도 있다. 이 때 번역 프로그램을 수행시키면 항상 번역을 실행할 준비를 하고 한글단어가 입력되기를 기다리고 있다는 점에서 지속성을 갖게 된다.

[그림 9] 지속성의 원칙

순차처리의 원칙

순차처리의 원칙은 데이터흐름 또는 데이터저장소로부터 입력되는 데이터에 대한 처리 순서를 설명하는 데, 데이터흐름을 통해 입력되는 데이터는 도착되는 순서대로 처리하는 반면, 데이터저장소로는 어떤 순서에 의해 접근하여도 무방하다는 것을 의미한다. 다음 그림에서 주목해야 할 것은 한영사전이란 프로세스에서 보는 것처럼 한글단어 데이터흐름의 첫번째 단어인 책이 맨 먼저 처리되어 book이란 단어로 데이터저장소에 저장되는데, 이들은 접근 순서에 무관하게 저장되어 있다.

[그림 10] 순차처리의 원칙

영구성의 원칙

영구성의 원칙은 데이터흐름의 데이터는 처리된 후 없어지지만 데이터저장소의 데이터는 아무리 읽어도 없어지지 않는다는 것을 말한다.

데이터변환의 원칙

분석시 불명확한 점의 하나는 어떤 종류의 프로세스를 데이터 흐름도 상에 나타내야 하는지 판단하기가 어렵다는 것이다. 이러한 경우에 도움이 될 수 있도록 4가지 종류의 프로세스 형태가 존재한다. 데이터본질의 변환, 데이터합성의 변환, 데이터관점의 변환, 데이터구성의 변환 등이 있다.

데이터본질의 변환

아래 그림에서 보는 바와 같이 데이터흐름 본질의 변환은 일반적으로 입력 데이터흐름에 편집, 계산 등을 하여 출력 데이터흐름을 산출하는 것을 의미한다. 아래 그림에서 소득증가율 계산이라는 프로세스는 금액으로 표시된 소득의 값을 입력으로 받아 퍼센트로 표시된 증가율로 변환을 한다.

[그림 11] 데이터본질의 변환

데이터합성의 변환

아래 그림에서 예금처리라는 프로세스는 입력데이터의 본질을 변화시키지 않는다. 이러한 형태의 프로세스는 단순히 하나의 입력데이터를 여러가지 구성요소로 분리하여 2개 이상의 출력을 산출한다. 반대로 2개 이상의 입력 데이터흐름에 대하여 데이터합성의 변환이 발생할 수도 있는데, 그림에서와 같이 수표와 입금표라는 데이터항목이 합성되어 입력 트랜잭션이라는

       하나의 출력 데이터 흐름을 산출한다.

[그림 12] 데이터합성의 변환

  데이터관점의 변환

아래 그림에서 보는 것처럼 데이터관점의 변환은 데이터에 대해 실제적으로 변경을 하지는 않는다. 이러한 형태의 처리에서 입력 데이터 흐름은 동일하게 출력 데이터흐름으로 나타나게 된다. 그림에서 주문서 확인은 주문서에 대해 변경을 하지 않고 그대로 출력으로 내보내게 된다. 따라서 출력 데이터흐름의 이름을 적합한 주문서라 하였으며, 데이터사전에서도 주문서가 정의되어 있는 한 새롭게 정의할 필요가 없다.

[그림 13] 데이터관점의 변환

  데이터구성의 변환

데이터구성의 변환에서는 출력데이터가 입력데이터와 동일하지만, 데이터의 구성형태가 변환되게 된다. 구성의 변환은 포맷팅(Formatting) 또는 정렬(Sort) 등을 위한 처리를 필요로 하게 된다. 이러한 처리형태의 출력은 다른 데이터흐름으로 생각될 수도 있고 아닐 수도 있다.

다음 그림에서 판매보고서는 데이터사전에 새로운 데이터흐름으로 들어갈 수 있는데 보고서의 실물모형(Mock-Up)이 될 것이다. 만일 처리가 정렬을 위한 것이라면 출력을 입력과 다른 데이터흐름으로 간주하여 정렬된 판매데이터라 할 수 있다.

[그림 14] 데이터구성의 변환

출처 : Tong - byunji4558님의 Java, JSP, JDBC, Java Beans, and etc.통

정지훈 (필자) ( 마이크로소프트웨어 )   2004/10/06

우리가 현재 살고 있는 산업사회에 있어서 가장 중요한 것은 무엇인가? 혹자는 믿음이라고 답할 것이고, 혹자는 밥이라고 답할 것이며, 어떤 사람은 그저 애니메이션이나 실컷 보면서 살 수 있으면 그만이라고 말할 것이다. 무엇이 되었든 개인에게 있어서 틀린 답은 아니겠으나 산업사회의 발전을 위해서 가장 중요한 사회학적인 요인을 하나만 선택하라고 하면 그것은 곧 ‘생산성(productivity)’이 될 것이다. 소위 우리가 말하는 ‘산업혁명’이라는 것도 기실은 생산성의 폭발적인 증대로 귀결될 수 있다.

소프트웨어를 개발하는 입장에서도 이 생산성의 문제는 무척이나 중요하다. 같은 수준의 완성품을 만드는 데 있어서 가능하면 적은 시간과 적은 노동력과 원자재만을 이용하는 방법을 연구하는 것은 그런 측면에서 커다란 의미를 가지는 것이다. 이번 호 특집에서 언급하는 MDA(Model Driven Architecture) 역시 소프트웨어의 생산성과 관련해서 중요한 의미를 가진다.

소프트웨어의 생산성은 어떻게 높아지는가
그렇다면 과연 어떻게 하면 소프트웨어의 생산성을 높일 수 있는가? 이 문제는 비단 최근에 제기되는 문제가 아니다. 물론 과거에 비해 복잡한 시스템 요구사항과 수많은 기술들이 등장하고 있는 근래에 그 중요성이 높아지고는 있으나 이미 소프트웨어 초창기부터 이 문제는 많은 사람들의 고민거리였다고 말할 수 있다. 이 문제를 해결하기 위해서 등장한 대표적인 학문이 바로 소프트웨어 공학이다.

소프트웨어 공학의 영역은 상당히 포괄적이다. 소프트웨어 개발에 투여되는 수많은 자원들의 효과적인 관리 방법과 평가, 그리고 조직과 의사결정 구조, 심지어는 개발자들의 심리상태에 대한 것도 대상이 될 수 있다. 소프트웨어 공학에 대해서 자세한 이야기를 하자면 소프트웨어의 위기에서부터 많은 방법론에 대한 것까지 커다란 연구 분야라고 할 수 있으며, 그 중요성은 최근의 복잡해진 환경에 의해 점점 더 높아가고 있다. 거창하게 소프트웨어 공학을 이야기했지만 소프트웨어 생산성을 높이기 위해 그 동안 시도됐던 몇 가지 방법에 대해서 간단히 이해하는 것이 MDA에 대한 이야기를 풀어나가는 데 도움이 될 것이다.

전통적인 방법론 vs. 창조적 프로그래밍
소프트웨어의 생산성을 높이기 위한 방법으로 그 동안 다양한 방법론과 이론이 등장했다. 이들에 대한 자세한 논의는 한 권의 책으로도 부족할 것이므로 여기서는 대표적인 몇 가지의 특징에 대해서 간단히 알아보기로 하자. 소프트웨어 공학의 정의로 본다면 모든 방법론들이 소프트웨어 공학으로 설명할 수 있겠으나 최근에 각광받는 몇 가지 방법론이 기존의 방법론과는 상당한 철학적인 차이를 보여주고 있기 때문에 여기서는 이들을 포괄적으로 ‘창조적 프로그래밍’으로 표현하고자 한다.

필자의 경우 소프트웨어 공학을 전문적으로 전공한 것은 아니므로 다소의 용어 선택과 학문적인 설명에 있어서는 오류가 있을 수 있으나 MDA를 설명하기 이전에 그 동안의 경험했던 것들을 바탕으로 접근하는 것이 도움이 될 것이라 생각하기 때문에 이 부분을 언급하도록 하겠다. 혹시라도 필자의 글에 대해 다른 의견이 있는 독자는 언제든지 필자에게 메일을 보낸다면 검토 후 다음 기회에 정정하도록 할 것이다.

전통적인 소프트웨어 공학 방법론은 소프트웨어의 개발 단계를 요구, 분석, 설계, 구현, 테스트와 유지보수로 분류하고 각 단계별로 소프트웨어의 생산성에 영향을 주는 여러 요소들을 관리하고 조정해 생산성을 높이는 방법과 절차, 그리고 이를 지원하는 여러 가지 도구 등으로 구성된다. 소프트웨어 개발에 관한 접근 방식에 따라 기능 중심의 개발방법론, 구조적 개발방법론, 객체지향 개발방법론 등이 있으며 최근에 가장 각광받는 것은 객체지향 개발방법론이라고 할 수 있다.

이러한 전통적인 소프트웨어 공학 방법론은 기본적으로 소프트웨어의 개발을 제조업에서의 생산 공정의 연장선상에서 소프트웨어라는 생산 대상의 특성을 고려하여 만들어지기 때문에 공정의 관리와 제어에 초점을 맞추게 되는 경우가 많다. 예를 들면 프로젝트의 관리를 위해 제안서 및 프로젝트 비용 산정, 프로젝트 계획과 스케줄링, 감독과 검토 과정을 거친 뒤 적합한 인력 배치 등을 하고 프로젝트 팀으로 구성된 조직은 조직 관리의 측면에서 최대한의 생산성을 갖출 수 있는 방향을 선택하도록 하는 것이다.

이런 소프트웨어 공학 방법론은 커다란 프로젝트의 위험성을 최대한 관리하면서 기존에 제조업과 사회과학 분야에서 개발된 여러 가지 형태의 도구를 응용할 수 있기 때문에 중간 규모 이상의 프로젝트에서 상당한 효과를 발휘한다. 이에 비해 창조적인 프로그래밍에 중점을 둔 방법론은 기본적으로 소프트웨어의 개발을 제조업에서의 생산 공정으로 보기보다는 개개인의 숨겨진 잠재력을 최대한 발휘해서 조합하는 것을 더욱 중요하게 생각한다. 그러므로 창조적인 프로그래밍에서는 소프트웨어 개발이란 일종의 공동 예술 작품을 완성하는 것과 비슷하다고 간주한다.

모든 방법론을 이러한 잣대로 분류하는 것은 무리이지만 최근에 각광을 받는 XP(eXtreme Programming), 애자일 소프트웨어 개발(Agile Software Development) 등의 방법론은 기존의 방법론에 비해 이러한 특성의 중요성을 많이 인정하고 있다. 필자는 개인적으로 이러한 두 가지 방법론을 모두 시험해 보았는데 어느 한 쪽의 방법론이 더 우월하다고 말하기는 어렵지만 전반적으로 프로젝트의 규모가 커지고 개발 인원의 수준의 차이가 많이 나는 구성원을 가질수록 전통적인 소프트웨어 개발 방법론이 효과적이며, 반대로 소규모 프로젝트이면서 개발 인원의 수준의 차가 적고 쌍방의 대화가 잘 이뤄질 수 있는 그룹이라면 창조적인 프로그래밍 방법론이 훨씬 효과적이었다.

소프트웨어 개발방법론에 관심이 있는 독자라면 시중에 좋은 책들이 많이 나와 있으므로 이들을 참고하면 큰 도움이 될 것이다. 전통적인 소프트웨어 공학적인 방법론은 교과서도 많이 나와 있고 방법론 자체에 대한 소개도 인터넷에서 쉽게 찾아볼 수 있다. 창조적인 프로그래밍과 관련해서는 켄트 벡(Kent Beck)이 쓴 ‘Extreme Programming Explained’와 애자일얼라이언스(AgileAlliance) 웹 사이트(http://www.aanpo.org/home)를 참고하기 바란다.

CASE vs. MDA
CASE(Computer Aided Software Engineering)는 소프트웨어 개발이나 각 과정별 작업을 컴퓨터의 도움을 받아 공학적 기술을 자동화하는 것으로 각각의 작업의 자동화에 이용되는 도구를 흔히 CASE 툴이라고 한다. 역사적으로 볼 때는 1980년대 초의 구조적 개발방법론이 80년대 후반의 CASE로 발전하게 되는데 초기의 CASE 제품들은 다양한 목적을 가지고 있었다. 대표적인 것으로는 모델링 작업을 도와주거나 데이터베이스를 생성하는 것에서부터 코드의 자동생성 및 역공학 툴, 그리고 프로그래머가 아닌 사람이 프로그래밍할 수 있도록 도와주는 GUI 툴 등이 있다.

초창기 CASE 제품들이 등장하던 시기에는 메인프레임에 대한 COBOL 프로그래밍과 관계형 데이터베이스에 대한 SQL CASE 툴이 주를 이뤘는데, 운영체제나 데이터베이스 아키텍처를 지원하기 위한 정보를 모아두는 공통적인 저장소(repository)가 존재하지 않아서 그 활용에 제한점이 있었다. 이를 극복하기 위해서 IBM에서는 AD 사이클/저장소(Cycle/Repository)를 만드는 프로젝트를 시도했지만 실패로 끝났다.

1990년대에 들어서면서 컴퓨팅 환경이 급속도로 메인프레임에서 유닉스, PC 기반의 운영체제로 그리고 컴퓨터 언어의 측면에서는 C와 베이직 같은 언어가 주류 언어로 자리를 잡게 되면서 기존의 CASE 툴의 활용도가 급속히 떨어지는 현상을 보여주게 된다. 1990년대 후반에 들어가면서 객체지향 프로그래밍 언어의 사용이 일반화되고 1997년에 OMG(Object Management Group)에서 UML(Unified Modeling Language)을 표준화한 것을 계기로 객체지향 모델링을 이용한 사례가 늘어나면서 기존의 CASE보다는 객체지향 개발방법론을 따르는 새로운 형태의 비주얼 툴들이 각광을 받게 되는데 대표적인 제품이 현재는 IBM에 합병된 래쇼날(Rational)의 로즈(Rose)나 볼랜드에 합병된 투게더(Together) 등이다.

CASE 툴의 경우 아직까지 성공과 실패를 논하기에는 이르지만 초기에 가졌던 거창한 목표 달성에는 이르지 못했다고 판단된다. 가장 큰 이유는 CASE가 지향하는 목표가 너무나 방대하고 이를 지원하는 툴들이 실제로 등장해서 소프트웨어 개발에 이용되기에는 실무 소프트웨어 개발 프로세스가 개발 방법론이라는 것을 모두 소화할 만큼 충분히 성숙하지 않았다는 것을 들 수 있을 것이다. 다시 말해, 이론은 좋았지만 현실세계에 받아들여지기에는 아직 먼 이상향이라고나 할까?

이러한 현상은 비단 CASE 툴에 국한된 것만은 아니다. OMG에서 최초로 표준화 작업을 했던 분산객체 표준인 CORBA(Common Object Request Broker Architecture) 역시 초기의 기대와는 다르게 그렇게 많은 영역에서 넓게 채택되지 못했다. 그 이유는 여러 가지가 있겠으나 가장 커다란 요인으로 생각되는 것 중의 하나가 지나치게 무겁고 복잡한 표준 규격으로 인해 실제 소프트웨어 개발에 있어서 쉽게 받아들여지기 어려웠다는 점이다. 그에 비해 최근의 웹 서비스가 그 자체가 가지고 있는 많은 약점에도 불구하고 비교적 쉽게 채택되고 있는 것은 가벼운 표준 규격으로 인해 자유로운 선택의 영역을 넓혔으며 여러 가지 지원 도구들을 통해 쉽게 구현이 가능했기 때문이라고 생각된다.

MDA는 이러한 CASE와 CORBA에서의 교훈을 바탕으로 CASE처럼 지나치게 야심차지 않으면서 보다 느슨하게 연관되어 있는 표준안들의 연결고리를 제공하는 방식으로 접근하고 있다. 또한 이러한 연결고리를 쉽게 구성할 수 있는 도구들을 적시에 제공함으로써 그 성공 가능성을 높이고 있다.

MDA 탄생 설화 - CORBA, UML, MOF 그리고 MDA
OMG는 1989년에 설립이 된 객체 기술에 대한 사용을 증진시키고 이에 대한 표준안을 만들기 위해 소프트웨어 산업계에서 구성한 컨소시엄이다. 이들이 모여서 최초로 만든 것이 바로 OMA(Object Management Architecture)인데, OMA에서 가장 중요한 역할을 하는 것이 바로 CORBA이다. CORBA는 다양한 프로그래밍 언어 간의 상호운용성을 위해 IDL(Interface Definition Language)이라는 것을 도입했다. 플랫폼에 독립적인 프로토콜을 위해 IIOP(Internet Inter-Operable Protocol)와 같은 프로토콜 표준안을 제시하였다. <그림 1>은 OMA를 도식화해서 나타낸 것이다.

<그림 1> Object Management Architecture

그리고 OMG에서는 객체지향 소프트웨어 디자인을 위해서 그동안 다양하게 제시되었던 모델링 시스템을 표준화해 UML을 1997년에 발표하게 된다. 그 밖에도 OMG에서 발표된 대표적인 표준안으로는 플랫폼에 독립적으로 메타 데이터와 데이터를 정의, 조작, 통합할 수 있는 모델 기반의 프레임워크인 MOF(Meta-Object Facility), MOF를 모델 기반의 XML 통합 프레임워크로 재구성하며 MOF 기반의 메타모델의 XML 맵핑을 지원하는 XMI(XML Metadata Interchange), 데이터 웨어하우스 도구, 웨어하우스 플랫폼 그리고 서로 다른 환경에 분산된 웨어하우스 메타 데이터 저장소들 사이의 비즈니스 메타 데이터의 상호교환을 가능하게 하는 표준 인터페이스인 CWM(Common Warehouse Metamodel) 등이 있다. 이들은 MDA를 구성한 하부 요소로서 그 역할을 하게 된다.

CORBA에서 UML로의 중심 이동
필자는 2000년부터 수년 간 OMG 총회를 참석하면서 매번 총회에 참석할 때마다 조금씩 변화해가는 분위기를 느낄 수 있었다. 2000년 초기의 OMG 총회만 하더라도 대부분의 업체들은 총회의 세부 모임에 있어서 CORBA를 중심으로 CORBA 표준 규격안을 발전시키는 데 주력하였다. 또한 CORBA를 분산객체 기술의 산업 표준안으로 발표했음에도 불구하고 이와 유사한 다양한 플랫폼들이 등장하였기 때문에 이들과의 상호운용성을 위한 작업들도 지속적으로 진행되었다. 대표적인 것이 CORBA/COM, CORBA/J2EE의 상호운용성을 확보하는 것이었다.

그리고 비교적 CORBA 표준안이 많이 채택되었던 통신업체와 국방 관련 업체들을 중심으로 해당 도메인 영역에서의 서비스(Service)와 퍼실리티(Facility)를 정의하는 작업들이 한창이었다. 그런데 해가 바뀌면서 OMG 총회에 참석하는 사람들의 움직임이 지속적으로 UML쪽으로 움직이기 시작했다. 그에 비해 CORBA 표준안과 관련한 것들은 특정 도메인 영역으로 축소가 되는 양상을 보이면서 OMG의 중심이 CORBA에서 UML로 넘어가기 시작했다.

이러한 변화는 기술 표준안의 우월성에서 기인한 것이 아니라 여타 다른 경쟁 기술들의 존재로 인해 더 이상 산업계 표준으로서의 추진동력을 점차 상실하고 있었던 CORBA에 비해 객체지향 프로그래밍의 폭발적인 증가와 경쟁이 되는 표준안이 없는 상태에서 사실상의 유일한 표준안으로서 그 위세를 떨쳐나가던 UML의 시장에서의 반응에 의한 것이다. UML은 기존의 플랫폼의 우월성이나 벤더들 사이의 제품 팔아먹기 경쟁에서 옆으로 비켜난 상태로 많은 개발자들에게 받아들여지면서 자연스럽게 OMG를 이끌어가는 핵심 표준안으로 각광받게 된 것이다.

MDA의 탄생과 그 이후
이때부터 OMG 내부에서는 MDA에 대한 구상을 의논하는 그룹들이 생겨나기 시작했다. UML의 시장주도적인 힘을 바탕으로 CORBA가 이뤄내지 못했던 이기종 플랫폼 및 언어독립성을 비교적 받아들이기 쉬운 방법으로 제시하려는 노력들이 모여서 MDA가 탄생하게 되었다. MDA는 2001년 3월 OMG의 CEO인 리차드 솔리(Richard M. Soley)가 ‘OMG Model Driven Architecture’라는 제목의 프리젠테이션을 통해 공식적으로는 처음 세상에 알려지게 되었다. 이 발표는 OMG 웹 사이트에서 현재도 10분 정도의 오디오 파일로 들을 수 있으므로 관심 있는 독자는 한 번쯤 들어보기 바란다. 이 발표를 시작으로 MDA에 대한 구체적인 규격을 논의하기 시작해서 2003년 6월에 공식적인 ‘MDA Guide v 1.0’이 공개되었다.

2001년 3월 MDA에 대한 발표가 있은 뒤부터 MDA 표준안을 실체화하고 MDA에서 내세운 개념들을 구체화하기 위한 움직임들은 점점 활성화되었는데, 그 이후의 OMG 총회에서는 이러한 논의들이 하나씩 소기의 성과를 거두게 된다. 필자는 처음 MDA를 발표하는 자리에 있었는데, 그 발표를 보는 순간 이것이 앞으로 갈 길은 멀어 보이지만 언젠가 세상에서 커다란 반향을 끌어낼 수 있을 것이라는 느낌을 받았다. 그러나 그 때만 하더라도 적어도 5년 안에는 저기서 이야기하는 것이 실체화하기는 어려울 것이라고 생각했었다.

이런 필자의 생각을 깨뜨린 것이 2001년 여름 OMG 총회에서 최초의 MDA를 지원하는 개발 툴로 소개된 아크스타일러(ArcStyler )였다. 당시의 제품은 UML 모델을 바탕으로 플랫폼에 독립적인 모델(PIM, Platform Independent Model)과 플랫폼 의존적인 모델(PSM, Platform Specific Model)을 따로 관리하는 기본적인 MDA의 형태를 갖추기는 했으나 실제로 지원하는 플랫폼은 J2EE 밖에 없는 것이었다. 그렇지만 MDA에 대한 기본적인 개념이나 구현 가능성을 실제로 보여줬기 때문에 당시에 커다란 반향을 불러일으켰다. 아크스타일러는 현재 볼랜드의 엔터프라이즈 스튜디오에 통합되어 있으며 이를 시발점으로 여러 MDA 지원 개발 툴들이 등장하기 시작했다.

MDA의 목표는 소프트웨어 분석가와 개발자가 소프트웨어와 비즈니스 자산을 기술하는데 이용할 수 있는 엔터프라이즈 아키텍처 모델링이 가능하도록 하는 것이다. 이러한 아키텍처를 소프트웨어 도구를 이용해서 만들어냄으로써 실제 소프트웨어 개발에 있어서 아키텍처를 구현하는 특정 애플리케이션을 쉽게 작성할 수 있게 되며 애플리케이션을 다양한 변경 요구에 맞게 쉽게 변경할 수 있을 것이다.

MDA 구성 요소
MDA는 여러 가지 모델과 표준들에 의해서 구성된다. 모든 MDA 모델 들은 MOF라는 추상적인 메타모델에 기초를 두고 있기 때문에 모두 연관되어 있다. 다시 말해 모든 MDA 모델은 MOF와 호환성이 있다. 이런 특징은 MDA에서 이용된 모든 모델들이 다른 MOF 호환 모델들과 호환성을 가진다는 것을 보장한다.

MDA에서 또 한 가지 중요한 부분이 UML 프로파일(profile)이다. UML 프로파일은 UML을 확장한 것이기 때문에 MOF와 호환성이 있으며, UML 2.0에서는 UML의 다양한 기능적인 사용 방법을 기술할 수 있다. UML 프로파일은 UML의 확장인 동시에 그 자체로 MOF 메타모델이다. 일부의 MDA 메타모델은 이미 OMG에서 과거에 정의된 것들이며 일부는 OMG 외부의 그룹 또는 벤더들에 의해 MOF 호환이 되는 형태로 만들어진 것이다. 이러한 OMG 외부의 메타모델들은 비록 공식적인 OMG 표준은 아니지만 MOF 호환성이 있기 때문에 MDA 개발 과정에는 사용되는 데 문제가 없다. 대표적인 MDA 모델들과 프로파일들로는 다음과 같은 것들이 있다.

CWM
CWM(Common Warehouse Metamodel)은 OMG에서 표준화한 데이터 웨어하우스를 관리하는 데 이용되는 메타 데이터 모델이다. CWM을 이용하면 개발자들이 관계형 데이터베이스 테이블, 레코드, 구조체, OLAP, XML 그리고 다차원 데이터베이스 디자인 등과 같은 수많은 데이터 모델 또는 포맷을 생성할 수 있다. 또한 CWM에는 데이터 웨어하우스 이외에도 사용될 수 있는 유용한 부분들도 있는데 예를 들면 데이터 모델이나 데이터 변환, 소프트웨어 배포 등에 관련된 내용도 포함되어 있다.

UML 메타모델
UML의 초기 버전은 MOF와의 완전한 호환성이 보장되지 않지만 UML 2.0은 MOF 호환성을 가진다. 이런 이유로 진정한 MDA 개발을 위해서는 UML 2.0이 사용돼야 한다. UML은 핵심 모델링 개념들과 이들을 위한 다이어그램들로 정의된다. 또한 개발자들이 UML 구성 요소에 다양한 제한(constraint)을 할 수 있도록 허용하고 있다. UML 2.0에서는 UML이 모델들의 행위를 지정할 수 있으며 이러한 행위의 표현들이 직접 코드로 변경된다.

XMI
XMI 표준은 MOF와 호환성이 있는 모델들을 XML 문서 형태로 표현하고 이를 MOF 호환 데이터베이스에 저장할 수 있도록 하는 표준이다. 그러므로 사실상 XMI 문서는 곧 MOF XML 문서라고 할 수 있다.

UML 프로파일
UML 프로파일은 특정 도메인에 대한 UML 모델을 작성하기 위한 일반 확장(generic extension) 메커니즘을 정의하는 것이다. 그러므로 UML 프로파일은 추가적인 스테레오타입(stereotype)과 태그 값(tagged value)이 적용된 엘리먼트(element), 애트리뷰트(attribute), 메쏘드(method), 링크(link) 등으로 이뤄진다. UML 프로파일은 이러한 확장 컬렉션을 이용해서 특정 도메인에 대한 모델링 문제를 기술하고 해당 도메인의 내용들을 모델링할 수 있도록 해준다.

현재 다양한 UML 프로파일이 나와 있으나 MDA와 관련해서는 플랫폼에 따라 각각의 프로파일이 정의될 수 있다. 현재 CORBA 프로파일, EAI 프로파일, EDOC 프로파일, 리얼타임 컴퓨팅을 위한 스케줄링 프로파일 등이 OMG에서 정의되었으며 EJB 프로파일은 JCP(Java Community Process)를 통해, 닷넷 프로파일은 마이크로소프트에 의해 정의되고 있다.

MDA 개발 프로세스와 특징
MDA는 이와 같이 그동안 발표된 여러 OMG의 표준 기술들이 하나로 접목되고 유기적으로 연결된 형태를 가지고 있다. 그 중에서도 MOF와 UML 프로파일의 역할이 가장 중요하다는 것을 아마도 독자도 느낄 수 있을 것이다. 이러한 구성상의 역할과는 별도로 MDA는 소프트웨어 리소스의 관리와 개발 자체에도 초점을 맞추고 있기 때문에 소프트웨어 개발 프로세스에서 모델들이 어떻게 이용돼야 하는지에 대해서도 기술하고 있다.

<그림 2>는 비즈니스 프로세스나 소프트웨어에 대한 기술서를 바탕으로 추상적인 모델을 추출하고, 추상적인 모델을 실행 가능한 구현 모델로 변환시키는 과정을 보여준다. 이런 프로세스에서 사용된 모델들은 UML과 같은 메타모델로 표현되는데 일부의 모델은 플랫폼과 무관하고 일부는 플랫폼과 밀접한 관계를 가진다.

<그림 2> MDA 개발 프로세스

<그림 2>에서 3가지 유형의 MDA 모델을 볼 수 있을 것이다. 일반적으로 비즈니스를 분석하고 요구사항을 추출하는 역할을 맡은 분석가가 CIM(Computation Independent Model)을 모델링하며, 비즈니스 아키텍트나 디자이너가 PIM(Platform Independent Model)을 만든다. PIM 모델은 특정한 구현 모델과는 독립적으로 어떤 형태의 아키텍처를 가질 것인지 기술한다. 그리고 나서 개발자와 테스터가 소프트웨어 툴을 이용해서 PSM을 PIM에서 뽑아낸 뒤에 이를 플랫폼 특성에 맞게 최적화를 하고 코드를 뽑아내게 된다.

MDA 개발 프로세스를 단계별 스텝으로 간단히 정리해 보면 다음과 같다.

[1] 애플리케이션에 대한 비즈니스 요구사항을 수집한다.
[2] 도메인 모델에 대한 UML 다이어그램을 작성한다. 먼저 J2EE, 닷넷, CORBA와 같은 특정 기술에 종속적이지 않은 모델을 먼저 만든다. 이렇게 작성된 UML 모델은 핵심 비즈니스 서비스와 컴포넌트를 나타내게 되는데, 예를 들자면 가격 결정 엔진이라든지 쇼핑 카트 모델이라든지 주문 모델 같은 것들이 될 것이다. 이러한 UML 모델을 PIM이라고 한다.
[3] 애플리케이션에 대한 특정 기술과 관련한 UML 모델을 작성한다. 이와 같이 특정 기술에 종속적인 UML 모델을 PSM이라고 한다. PSM은 직접 작성할 수도 있고 MDA 지원 툴을 이용해서 PIM에서 자동으로 만들어내거나 또는 만들어진 모델을 수정하는 방식으로 작업할 수 있을 것이다.
[4] 마지막으로 MDA 툴을 이용해서 애플리케이션 코드를 만들어낸다. 현재 이미 J2EE의 경우에는 MDA 툴들이 대부분의 서블릿, JSP, EJB와 관련한 코드를 자동을 생성해준다. 그 다음에 만들어진 코드를 바탕으로 수정과 최적화 과정을 거쳐서 프로젝트를 완성한다.

이와 같이 MDA에서는 결국 UML 모델에서 코드를 만들어낸다. 그런데 어찌보면 이것이 새삼스러운 것은 아니다. 아마도 많은 개발자들이 래쇼날 로즈를 이용해서 자바 클래스를 UML 모델에서 만들어낸 경험이 있을 것이다. 이러한 작업과 MDA와의 가장 큰 차이점이라면 MDA는 플랫폼 독립적인 모델에서 시작해서 다양한 플랫폼을 지원하는 프로세스와 툴을 거의 완벽하게 지원한다는 점일 것이다. 이런 측면에서 간단히 MDA에서 만들어지는 모델들과 코드에 대해서 정리를 하면 다음과 같다.

◆ MDA는 다른 디자인 프로세스보다 고수준의 추상화를 먼저 시작한다. 예를 들어 PIM은 매우 추상적이다. 여기에는 엔티티와 서비스만 정의되어 있을 뿐이다.
◆ PSM은 메타 데이터의 형태로 애플리케이션을 완전하게 기술한다. PSM 수준에서 개발자들은 해당 기술과 관련된 디자인을 직접 코드를 건드리지 않고 향상시킬 수 있다.
◆ PSM에서 만들어진 코드는 완성된 애플리케이션에 근접하게 된다. 기존에 많은 도구들이 자동으로 만들어낸 코드들이 애플리케이션의 일부에 해당하는 것에 비해서 그 범위와 정도에 큰 차이가 있다.
◆ PIM에서 PSM을 만들어내고 PSM에서 코드를 만들어내는 알고리즘은 기본적인 것은 제공되지만 아키텍트가 변경하거나 재정의할 수 있다.

MDA의 중요한 특징 중의 하나가 이와 같이 모델링 언어를 프로그래밍 언어처럼 이용하는 것이다. 모델링 언어는 일반적으로 자바나 C++와 같은 프로그래밍 언어에서 하는 것보다 더 높은 수준에서 ‘추상화(abstraction)’를 가능하게 하며, 이러한 추상화 프로세스를 통해 개발자들은 시스템 코드에 꼭 필요한 데이터 이외의 것들은 모두 숨길 수가 있다. 이런 과정은 개발 과정에서의 복잡도를 감소시키는 효과를 가져오기 때문에 개발의 생산성을 높일 수가 있다.

아마도 여기까지 읽은 독자는 일반적인 객체지향 프로그래밍 언어의 가장 큰 특징 중의 하나인 ‘캡슐화(encapsulation)’라는 단어를 떠올린 경우가 많을 것이다. 보통 객체지향 프로그래밍 언어의 3대 특징을 이야기하면 캡슐화, 상속성(inheritance) 그리고 다형성(polymorphism)을 언급한다. 그 중에서도 객체지향이라는 개념을 위해서 가장 중요한 것은 바로 캡슐화이다. 다른 두 가지 특징은 완전히 지원하지 않더라도 객체지향 언어라는 말을 할 수 있지만 캡슐화가 지원되지 않으면 객체지향이라고 말할 수가 없다. MDA는 이러한 객체지향 개념의 캡슐화를 극대화한 것으로 이해할 수 있다. 단순히 프로그래밍 언어 수준에서의 캡슐화가 아닌 모델링을 포함해서 구현에 이르는 과정을 단계별로 캡슐화한 것이 바로 MDA의 정체이다.

MDA 개발 프로세스에서의 이러한 추상화는 시스템의 규격을 하부의 컴퓨팅 환경에 덜 좌우되게 하기 때문에 시스템의 생산성을 높일 뿐 아니라 지속성도 높여준다. 이와 같은 추상화의 수준을 높임으로서 소프트웨어 개발 생산성을 높이려는 시도는 새삼스러운 것은 아니다. 가장 직접적인 예로 현재 우리가 사용하고 있는 대부분의 프로그래밍 언어는 3세대 언어(3GL, 3rd Generation Language)라고 할 수 있는데, 3GL 언어는 기본적으로 어셈블리 언어를 추상화한 것이라고 할 수 있다.

이를 통해 어셈블리 언어로 프로그래밍할 때 알아야 했던 많은 어려운 문제들을 간단하게 컴파일러에게 맡겨버린 뒤 소프트웨어의 생산성이 급속도로 높아졌다는 것은 모두가 인정할 것이다. 그러나 3GL이 처음 등장했을 때만 해도 여러 개발자들은 3GL이 개발자들이 코드를 작성하기 쉽게 해주고 높은 수준의 생산성을 보장하지만 만들어진 실행 프로그램의 수행 속도 문제 때문에 한동안 수많은 논쟁을 했었다. 이러한 문제는 하드웨어의 비약적인 성능 발전으로 인해 자연스럽게 작은 문제로 치부되기 시작했고 이를 통한 소프트웨어 생산성의 증가는 많은 것을 가능하게 하였다.

왜 MDA인가
지금까지 설명한 내용을 충분히 이해한 독자라면 아마도 MDA가 어떤 녀석인지 정도에 대해서는 감을 잡았을 것이다. 그렇다면 왜 MDA가 최근에 각광받게 되었는지에 대해서 조금 더 생각해 보도록 하자. MDA는 MDA 표준을 적용해서 모델의 자동화와 변환(transformation)을 통해 여러 플랫폼을 쉽게 지원하고 개발자의 입장에서는 시간을 많이 잡아먹는 코드 작성 부분을 줄일 수 있으며 개발 프로세스의 측면에서도 품질 관리(QA, Quality Assurance)를 수월하게 할 수 있다. 그리고 과거의 CASE나 4GL과는 다르게 구현시에 유연한 컨트롤이나 커스텀화가 가능하도록 하였다. 잘 알다시피 손으로 코딩하는 부분이 줄고 동시에 빨리 버그를 잡을 수 있다면 소프트웨어의 생산성은 월등히 증가하게 된다. MDA를 이용하는 것이 좋은 이유를 몇 가지 나열해서 설명하면 다음과 같다.

기술 플랫폼 및 기능 변화에 대한 신속한 대응
MDA에서는 PIM과 PSM을 분리했기 때문에 PIM을 변경하지 않고도 기술 플랫폼의 변화나 요구사항 변화에 발빠르게 대처할 수 있다. 예를 들어, 새로운 플랫폼에 대한 애플리케이션을 배포해야 하는 경우 PIM에는 수정이 필요 없으므로 단지 PIM을 이용해서 새로운 플랫폼에 대한 PSM을 자동으로 만들어내고, 이를 수정해서 코드를 다시 생성하는 과정을 통해 쉽게 새로운 기술 플랫폼에 대한 대응이 가능하다. 또한 기능의 변화를 요구하는 경우에도 PSM 수준에서의 변경을 고려하지 않고 PIM에 새로운 기능 변화와 관련된 수정을 가함으로써 쉽게 대응할 수 있다.

시스템의 지속성
플랫폼 의존적인 시스템은 기존의 아키텍처가 새로운 요구사항을 만족시키지 못하는 경우가 많이 발생한다. 이 경우에 완전히 새로운 아키텍처를 다시 잡기보다는 많은 사용자들은 작은 패치와 수정으로 이런 문제를 해결하기를 원하며 현실적으로도 그렇게 할 수밖에 없는 시간?경제적 여유만을 가지는 경우가 많다. MDA를 이용하면 기능과 아키텍처를 분리해서 정의하기 때문에 아키텍처의 변화가 있더라도 변환 과정을 거쳐 구현 과정으로 쉽게 진행할 수 있기 때문에 기능과 요구사항 변화에 의한 아키텍처 변경에 비교적 자유롭다. 이런 장점은 시스템의 생명주기를 연장시키며 더 안정된 시스템 유지를 가능하게 한다.

개발 생산성 증진
MDA는 모델의 자동화와 변환을 통해 여러 플랫폼을 쉽게 지원하고 시간을 많이 잡아먹는 코드 작성 부분을 줄일 수 있으며 쉽게 유지보수가 되도록 한다. 이와 같이 손으로 코딩하는 부분이 줄고 동시에 빨리 버그를 잡을 수 있다. 또한 한 번 작성된 PIM의 경우 비즈니스 핵심 부분에 대한 모델이기 때문에 향후 다른 시스템에서도 쉽게 이용될 수 있으며 재사용성이 높아지게 된다.

용이한 문서 작성
디자인 문서를 업데이트하고 관련 코드를 수작업으로 관리하는 것은 매우 시간이 많이 걸리고 귀찮은 작업이다. MDA에서는 모델과 코드, 문서가 항상 동기화되기 때문에 이러한 문서 작업에 필요한 일의 양을 줄여준다.

품질 관리 비용의 감소
개발 과정에서 소프트웨어의 문제가 늦게 발견될수록 이를 고치는 데 들어가는 비용은 증가한다. MDA 모델 자동화와 테스트 툴을 이용하면 개발자들이 애플리케이션을 모델 수준에서 테스트할 수 있기 때문에 디자인의 문제점이나 애플리케이션 로직의 에러를 빨리 잡을 수 있다. 이를 통해 품질 관리에 들어가는 비용도 감소한다.

양질의 시스템 구축
PIM의 단순함은 양질의 시스템 구축을 가능하게 한다. 모델링은 팀 멤버들 사이의 의사소통을 원활하게 만들고 동시에 결점이 있을 때 이를 빨리 제거할 수 있도록 도와준다. 또한 MDA의 자동화 도구들은 잘 정리된 코딩 패턴을 모델에 적용하기 때문에 손으로 직접 작성한 코드에 비해 결점이 적을 가능성이 많다.

기술 플랫폼 통합의 기로에 서서
OMG는 소프트웨어 개발에 있어서 운영체제와 프로그래밍 언어의 통합이라는 어려운 과제를 수행하기 위해 과거 CORBA를 통해 불철주야 노력했으나 현 시점에서 판단해 보면 그다지 성공적이라고 하기는 어렵다. 그렇지만 CORBA를 논의하면서 모였던 많은 지식과 경험들이 바탕이 되어 MDA라는 새로운 접근 방법을 합의하는 데 성공했으므로 그런 노력들이 헛되기만 한 것은 아니었다는 것을 보여준다. 마지막으로 MDA가 기술 플랫폼 통합의 기로에서 앞으로 어떤 길을 걷게 될 것인지 여러 가지 측면에서 살펴보자.

환경의 변화
최근의 소프트웨어 개발 환경은 과거 CORBA를 만들어낼 때보다도 더 많은 프로그래밍 언어와 기술 플랫폼들이 등장하고 있다. 그리고 소프트웨어의 복잡도도 나날이 증가하고 있으며 이런 복잡한 소프트웨어를 더 효과적으로 개발하는 것이 가장 커다란 도전이 되고 있다.

그렇지만 과거의 환경에 비해 좋은 점들도 있다. 그것은 실질적인 표준으로 받아들여지는 기술이 많이 등장하고 있다는 것이다. 네트워크 프로토콜에 있어서는 TCP/IP, 데이터베이스 질의와 관련한 SQL, 객체지향 모델링에 대한 UML 등은 이제 진정한 표준으로서의 입지를 굳혀가고 있다. 또한 리눅스에서 출발하고 아파치를 통해 더욱 널리 퍼져가고 있는 오픈소스 프로젝트와 이들의 개방 정신은 소프트웨어 개발 정신과 철학에도 지대한 영향을 미치고 있다. 모든 것을 처음부터 만들어내는 접근 방식을 채택하는 것보다 컴포넌트의 재사용과 ERP 애플리케이션을 개발하는 것과 같이 효율적인 소프트웨어 개발을 중요시하는 시각의 변화도 이러한 긍정적인 환경 요소이다.

그에 비해 날이 갈수로 레거시 애플리케이션과 데이터베이스가 늘어가고 ERP 애플리케이션과 같이 수정이 어려운 것들이 많아진다. 또한 다양한 미들웨어가 이용되는 최근의 환경은 다양한 요구사항을 수용하는 엔터프라이즈 아키텍처를 구성하는데 많은 장애가 되고 있다. 그렇지만 이런 장애는 바꾸어 보면 MDA의 성공을 촉진하는 계기가 될 수도 있다. 중요한 것은 MDA가 활약해야 할 환경의 조성은 확실히 되고 있다는 점이다. 그런 측면에서 현재의 환경 변화는 MDA의 성공에 긍정적이라고 할 수 있겠다.

시장의 반응
CORBA가 절반의 실패를 하게 된 가장 큰 이유는 무엇이었을까? 물론 기술적으로 여러 가지 문제를 지적하는 사람들도 많겠지만 필자는 시장의 반응에서 그 답을 찾고 싶다. OMG에서 CORBA를 처음 발표한 이후 실제 이 표준안 시장에 적용하여 내놓은 제품은 전무에 가까웠다. 기껏해야 아일랜드의 작은 벤처기업인 아이오나(IONA)가 오빅스(Orbix)를 통해 CORBA 시장에 뛰어들었고, 뒤를 이어 인도의 비지제닉(후에 볼랜드에 합병된다)이 비지브로커(Visibroker)로 승부를 해온 정도이다.

이들 회사는 마이크로소프트와 같은 거대 회사가 추진하는 COM이라는 강력한 적수를 상대로 나름대로 선전했지만 CORBA가 가지고 있었던 거대한 목표를 달성하는 데에는 실패했다. CORBA의 실패는 표준안이 만들어지는 것이 성공의 요소가 아니라 시장 주도 세력과의 타협을 이루는 것이 더 중요하다는 것을 보여주는 매우 중요한 사례이다.

그렇다면 MDA는 어떠한가? 기본적으로 MDA에 대한 시장은 객체지향 모델링과 개발 툴 벤더를 통해 활성화가 될 것이다. 이들은 MDA를 자신들이 제공하는 톨에 통합할 것이며 기존에 OMG에서 만든 표준안인 UML, MOF, CWM, XMI 등을 지원하는 툴들이 늘어나면서 자연스럽게 그 영역을 확장하고 있다.

이런 움직임은 이미 가장 커다란 벤더들을 통해 주도되고 있으며 여기에 반기를 들고 상대하는 벤더가 없는 상태이다. 쉽게 말하면 초기 장수들의 기세에 무혈 입성하는 분위기이다. 특집 3부에서 다뤄질 각 벤더들의 MDA 지원에 대한 기사를 읽어보면 이러한 움직임을 확실하게 느낄 수 있을 것이다. MDA의 성공 여부에 대해 의문을 가지고 있는 많은 독자들에게 필자는 과감하게 이야기하고 싶다. MDA는 기술의 우위성을 떠나 확실히 성공할 수밖에 없는 단계에 도달하고 있다는 것을… @

김진현 교수님(KIST)의 세미나

Trivialness 2008/03/27 22:17 posted by 전중
오늘 IT 특강 수업에 김진현 교수 (한국과학기술원) 세미나 강좌가 있었다.

처음에는 별로 기대를 안하고 가벼운 마음으로 들어갔는데 나올때는 뭔가 망치에 한 대

얻어 맞은 듯한 느낌이다. 내가 결심한 방향에 대해 더욱 더 강한 자극을 받게 되었다.

주된 내용은 현재 한국 IT 분야의 실태와 문제점 그리고 앞으로 어떻게 방향을

잡을 지 에 대한 내용이었다.

많은 컴퓨터 학과 학생들이 졸업하면 어디에 취직할지 방향성을 못 잡고 있는것 같은데

이번 세미나 수업을 듣고 한줄기 빛을 본 사람들이 있으리라. 나 역시 대략적인 방향은

잡고 있었지만 세계적인 시각으로는 보지 않은것 같다. 현재 세계에서 우리나라의 입지와

기술 발전 수준, 경쟁력 수준, 그리고 앞으로 어떻게 변화 될 것인가에 관한 여러가지 예측들.

1시간 30분이라는 수업이 짧게 느껴질 정도로 흥미로운 많은 것들을 듣게 되었다.

[ 대략적인 메모 내용 ]

1. World is Flat 라는 책을 읽어보라.

2. 2등은 의미가 없는 시대가 왔다.

3. Outsourcing, Offshoring 으로 우리가 설 자리가 없어진다.

4. 요즘 Software 들은 OEM, ODM 방식으로 제작한다.

5. 단순한 JOB 은 수명이 짧다.(싼 인력에 outsourcing 맡기기 때문)

6. 우리나라는 인프라가 잘 되어있지만 그것을 잘 사용할 줄 모른다.

7. 가까운 일본에서 업무를 따오고 북한에 outsourcing 맡기는 방법(앞으로 가능하다면)

8. 졸업을 함과 동시에 모든 IT 관련 직종은 Software Enginner 로 불린다.

9. 세계의 흐름을 항상 주시하고 숙지하고 있자.

1. Principle and  Practice(원리를 알고 그것을 연습하라)

2. Programming Skill and Experience of processing project (프로그래밍 기술과 프로젝트 경험)

3. Skill of communication and Leadership (남을 설득시킬 줄 아는 대화 능력과 리더쉽 길러라)

좋은 내용이 더 많았지만 생각나는 것은 이정도다. PPT 자료를 구할 수 있으면 좋으련만...

여튼 뜻깊은 시간이었고 목표가 더욱 뚜렷해진 만큼 흔들리지 말고 곧장 나아가자..!!!

고담대구??

Trivialness 2008/03/25 01:18 posted by 전중
고담대구, 라쿤광주, 마계인천, 심시티서울, 뉴올리언스수원, 갱즈오브부산

오랜만에 배꼽잡게 웃었다. 누가 저런 문구를 만들었는지 대단하다.ㅋㅋ

대구에서 어떤 넘들이 기름빼내서 40억 해먹었다는 기사를 보게 됐는데

리플에 "역시 고담대구" 이런 댓글이 3개 이상 달려있었다.

그래서 왜 사람들이 대구를 저렇게 싫어하는지 궁금했다. 뭔가 원수진일이 있는지

아니면 할일들이 그렇게나 없는지...궁금해서 지식검색에

"고담대구" 를 검색했는데 흥미로운 답변 하나를 찾아냈다.

밑에 링크를 따라가면 읽을 수 있는데
http://kin.naver.com/detail/detail.php? ··· 047trsbg=

음...나름 일리가 있는 답변이었다.ㅋㅋ 뭐 꼭 전라도 사람이 다 그렇다는건 아니지만ㅋㅋ

우리 부모님 세대에는 지역감정이 심한것 같다. 내친구들 중 몇몇 부모님은

집에 여자친구 데리고 가면 전라도 사람인지 확인하는 사람도 있다고 하니.;;;

여튼....잼있는 기사다....연구해볼 가치가 있는것 같음..

gmail 설정하기

ipod Touch 2008/03/10 09:47 posted by 전중

 

사용자 삽입 이미지


클릭해서 보기 바람...타자 치는게 귀찮아서..ㅡㅡ;;

출처 : http://cafe.naver.com/ipodtouchcafe.caf ··· %3D18818


TAG gmail

피부보정 방법

Photo 2008/01/05 13:57 posted by 전중
상당히 Quality 높은 피부 보정방법이다.

피부질감은 살리면서 깨끗한 피부를 만드는 방법인데..상당히 맘에 든다.


[ 보 정 방 법 보 기 ]

FLASH ELEMENT TD v1.0

Trivialness 2007/12/18 19:03 posted by 전중
사용자 삽입 이미지


플래쉬 게임으로 유닛의 그래픽은 워크래프트3에서 따 온것 같다.

게임 규칙을 간단히 설명하자면,

몹들이 길을 따라 쭉 도는데 타워를 세워 한바퀴 다 돌지 못하게 막는 게임이다.

보기와는 달리 타워배치를 상당히 신경써야 각 레벨을 클리어 할 수 있다.

그리고 gold 는 몹을 죽일때마다 얻을 수 있으며, 각 스테이지를 클리어 할때마다

남은 gold 의 10%를 돈으로 준다. 적절한 타워 건설과, 적절한 업그레이드를 해야

계속해서 스테이지를 클리어해나갈 수 있다.

[ 게 임 링 크 ]

G D B 사용법

Study/Linux 2007/12/18 15:31 posted by 전중
디버거(Debugger)란 프로그램 개발 도구로써, 프로그램을 개발하다가 에러가 발생하면 발생 위치 및 발생이유를 쉽게 찾을 수 있도록 도와 줍니다.

[gdb] 명령 요약
프로그램 실행과 추적(trace)에 관련된 명령들
---------------------------------------------------------
run 현재의 인수를 사용하여 프로그램을 실행
run 새로운 <인수>를 가지고 프로그램을 실행
continue 현재 위치에서 프로그램을 계속 실행시킵니다.break 명령이 작동 된 다음에 사용합니다.
(약자) c, cont
next 한 줄씩 실행 시킵니다. 이 때 함수를 포함하고 있으면 함수를 수행시킵니다. (약자) n
next 줄을 실행 시킵니다.
step 한 줄씩 실행 시킵니다. 이 때 함수를 포함하고 있으면 함수 내부로 들어가서 한 줄씩 실행합니다. (약자) s
step 줄을 실행시킵니다.
break 라인 번호에서 프로그램 실행을 멈추게 합니다.
(dbx) stop at (약자) b
break <함수 명> 함수 내부의 첫번째 라인에서 프로그램의 실행을 멈추게 합니다.
(dbx) stop in <함수명>
quit gdb를 종료 시킵니다.
------------------------------------------------------------

데이타에 관련된 명령들
-----------------------------------------------------------
whatis 지정한 <변수>에 관련된 정보를 보여줍니다.
print 에 지정된 식의 값을 보여줍니다.
(약자) p
display 현재 지정된 display 명령의 목록을 보여줍니다.
list 현재 위치에서 소스 파일의 내용을 10줄 보여줍니다.
list , <시작줄>과 <끝줄>사이의 소스파일 내용을 보여줍니다.
-----------------------------------------------------------

gdb 사용법을 알기 위해서 우선 bug가 있는 프로그램을 작성해보죠.
$ vi bugprogram1.c

---------------< bugprogram1.c 내용>--------------
#include <stdio.h>

int main(void)
{
int i;
double j;
char *bug = NULL;


/* 다음은 i/2 + i 의 값을 출력 시키는 문이다. */
/* i 가 1 이면, j 는 1.5 가 되도록 짠 것이다. */
/* 그러나 실제로 그렇지 않다. */

for( i = 0; i < 5; i++) {
j = i/2 + i;
printf(" j is %lf \n", j );
}

/* 다음은 bug 변수에 hi를 copy하려는 것이다. */
/* 변수명 bug에서 느끼겠지만, 일부려 bug를 만들었다. */
/* 무엇일까 ? */

strcpy(bug,"hi");
printf("bug is %s \n", bug);

return 0;
}
---------------------------------------------


위의 내용을 저장하고 나서,
$ gcc bugprogram1.c -g -o bugprogram1
$ gcc bugprogram1.c -o bugprogram1_g

$ ls -l
total 32
-rwxr-xr-x 1 oprix staff 16375 Apr 5 15:53 bugprogram1*
-rw-r--r-- 1 oprix staff 578 Apr 5 15:52 bugprogram1.c
-rwxr-xr-x 1 oprix staff 11927 Apr 5 15:53 bugprogram1_g*

<설명>------------------
-g option 은 형성된 실행화일을 가지고 debug될 수 있게 compile 해
달라는 일종의 부탁하는 option입니다. gdb를 작동시키려면 이렇게 compile을 해야 합니다.
-g 옵션을 주고 한 것과 안 한 것을 비교하면 -g 옵션을 준게 파일 크기가 큽니다. debug를 위해서
여러 코드가 삽입되고, 실제 소스도 들어가 있습니다.
-o option은 -o 뒤의 화일 이름을 가진 실행화일을 만들어 달라라는 것으로 이 옵션을 생략할 경우에
a.out 이라는 실행파일이 생성됩니다.
위의 bugprogram1.c를 compile하면 error 메세지가 없습니다..
------------------------------------------------------------

$ ./bugprogram1
j is 0.000000
j is 1.000000
j is 3.000000
j is 4.000000
j is 6.000000
Segmentation fault
$

<설명>-----------------------------------------------------
bugprogram1 실행화일을 실행시켰더니 작동되다가 Segmentation fault를 일으키는 군요.
프로그램은 에러없이 컴파일이 잘 되었는데...
어디서 문제가 일어난 걸까요?
-----------------------------------------------------------


$ gdb ./bugprogram1
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux"...
(gdb)

--<설명>------------------------------------------------------
프로그램 이름이 bugprogram1이고 현재 디렉토리에 있으니 이렇게 설정합니다.
그냥 쉘에서 gdb를 치시고
(gdb) file ./bugprogram1 이렇게 하는 방법도 있습니다.
편한대로 사용하세요.
-----------------------------------------------------------------

(gdb) list
1 #include < stdio.h >
2
3 int main(void)
4 {
5 int i;
6 double j;
7 char *bug = NULL;
8
9
10 /* 다음은 i/2 + i 의 값을 출력 시키는 문이다. */
(gdb)

--< 설명 > ----------------------------------------------------
list는 소스 내용을 보여줍니다. l 이라고 간단하게 쳐도 작동이 됩니다.
--------------------------------------------------------------

(gdb) l 4,16
4 {
5 int i;
6 double j;
7 char *bug = NULL;
8
9
10 /* 다음은 i/2 + i 의 값을 출력 시키는 문이다. */
11 /* i 가 1 이면, j 는 1.5 가 되도록 짠 것이다. */
12 /* 그러나 실제로 그렇지 않다. */
13
14 for( i = 0; i < 5; i++) {
15 j = i/2 + i;
16 printf(" j is %lf n", j );

--<설명> --------------------------------------------------------
list <첫번째 줄번호>, <끝줄번호>를 치면 위처럼 보입니다.
---------------------------------------------------------------

(gdb) break 14
Breakpoint 1 at 0x804840d: file bugprogram1.c, line 14.
(gdb) run
Starting program: /tmp/gdbproject/bugprogram1

Breakpoint 1, main () at bugprogram1.c:14
14 for( i = 0; i < 5; i++) {

--<설명>-----------------------------------------------------
먼저 가장 의심되는 곳 부터 찾기로 했습니다. for 문이 의심스럽군요.
그래서 for 문의 줄번호인 14에서 break를 걸어두었습니다.
break는 b라는 명령으로 사용할 수 있습니다.
run으로 실행을 시키니 작동되다가 14 줄에서 멈추었습니다.
---------------------------------------------------------------

(gdb) step
15 j = i/2 + i;
(gdb) step
16 printf(" j is %lf n", j );
(gdb) step
j is 0.000000
j is 1.000000
j is 3.000000
j is 4.000000
j is 6.000000

Program received signal SIGSEGV, Segmentation fault.
0x400787a4 in strcpy () at ../sysdeps/generic/strcpy.c:43
43 ../sysdeps/generic/strcpy.c: 그런 파일이나 디렉토리가 없음.

----<설명>----------------------------------------
이런 갑자기 프로그램이 종료가 되었군요.
16 번째 줄 다음에 step을 하면 안 되겠군요. step은 s명령으로도 쓸 수 있습니다.
다시 시작해서 해보죠. 이번에는 15번째 줄에 break를 넣어 보죠.
--------------------------------------------------

(gdb) quit
The program is running. Exit anyway? (y or n) y
$ gdb ./bugprogram1
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux"...
(gdb) b 15
Breakpoint 1 at 0x8048420: file bugprogram1.c, line 15.
(gdb) print i
$1 = 0
(gdb) print j
$2 = 4.8699524093964861e-270

----<설명>----------------------------------------
내용을 볼때 print 라는 명령을 사용합니다. 아직 j는 쓰레기 값을 가지고 있군요.
print는 p라는 명령으로도 쓰셔도 됩니다. 계속해 보지요.
--------------------------------------------------

(gdb) s
16 printf(" j is %lf n", j );
(gdb) s
j is 0.000000

Breakpoint 1, main () at bugprogram1.c:15
15 j = i/2 + i;
(gdb) print i
$3 = 1
(gdb) print j
$4 = 0
(gdb) s
16 printf(" j is %lf n", j );
(gdb) print i
$5 = 1
(gdb) print j
$6 = 1
(gdb) s
j is 1.000000

Breakpoint 1, main () at bugprogram1.c:15
15 j = i/2 + i;
(gdb) print i
$7 = 2
(gdb) print j
$8 = 1
(gdb) s
16 printf(" j is %lf n", j );
(gdb) print i
$9 = 2
(gdb) print j
$10 = 3

----<설명>----------------------------------------
자세히 보면 실제로 값이 적용되는 건 그 문장이 실행된다음에 값이 적용되고 있지요.
즉 15번째 문장에서 멈추었으면 15문장은 실행이 안 된 상태입니다. 그 다음에 step 명령이
작동되어야 값이 바뀌지요. 그런데 값을 잘 관찰해 보면 j는 1.0000 이 아니라 1.50000가 될
때도 있어야 되는데 없군요. 계속 정수값을 가지고 있군요.
j = i/2 + i ; 이 부분이 문제가 있군요.
이 부분을 이렇게 수정해 보지요. j = (double)i/2 + (double)i;
--------------------------------------------------

$ gcc bugprogram1.c -g -o bugprogram1
$ gdb ./bugprogram1
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux"...
(gdb) b 15
Breakpoint 1 at 0x8048420: file bugprogram1.c, line 15.
(gdb) r
Starting program: /tmp/gdbproject/./bugprogram1

Breakpoint 1, main () at bugprogram1.c:15
15 j = (double)i/2 + (double)i;
(gdb) s
16 printf(" j is %lf n", j );
(gdb) s
j is 0.000000

Breakpoint 1, main () at bugprogram1.c:15
15 j = (double)i/2 + (double)i;
(gdb) s
16 printf(" j is %lf n", j );
(gdb) s
j is 1.500000

----<설명>----------------------------------------
자! 원하는 결과가 나왔지요. 값의 변화를 천천히 추적해서 문제점을 파악하는 방법입니다.
하나의 문제는 해결 되었고 continue 문을 이용해서 break를 나와 보지요.
break 가 15번째 줄에 있었으니 continue 15라고 입력합니다.
--------------------------------------------------

(gdb) continue 15
Will ignore next 14 crossings of breakpoint 1. Continuing.
j is 0.000000
j is 1.500000
j is 3.000000
j is 4.500000
j is 6.000000

Program received signal SIGSEGV, Segmentation fault.
0x400787a4 in strcpy () at ../sysdeps/generic/strcpy.c:43
43 ../sysdeps/generic/strcpy.c: 그런 파일이나 디렉토리가 없음.

----<설명>----------------------------------------
전에 봤던 에러가 나왔군요. 자 이건 어떻게 할까요?
에러 메시지가 strcpy를 가리키고 있으니 strcpy라고 대략 예측을 해보지요.
23번째 줄에 break를 걸어보지요.
에러가 나므로 gdb를 다시 시작해서 break를 겁니다.
--------------------------------------------------


$ gdb ./bugprogram1
GNU gdb 4.18
Copyright 1998 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-redhat-linux"...
(gdb) b 23
Breakpoint 1 at 0x8048456: file bugprogram1.c, line 23.
(gdb) r
Starting program: /tmp/gdbproject/./bugprogram1
j is 0.000000
j is 1.500000
j is 3.000000
j is 4.500000
j is 6.000000

Breakpoint 1, main () at bugprogram1.c:23
23 strcpy(bug,"hi");
(gdb) p bug
$1 = 0x0
(gdb) p *bug
Cannot access memory at address 0x0.

---<설명>---------------------------------------
음 버그를 찾은 거 같군요. bug의 주소가 0x0인데 여기에 값을 복사하려고
했으니 작동이 안 되는 거지요. 0x0주소는 access 할 수 없는 주소인데..
그래서 프로그램이 제대로 작동하려면 bug에 메모리주소를 할당해주고
사용하면 됩니다.

bug = (char *)calloc(3, sizeof(char));
bug 선언 다음에 이렇게 설정해주면 되겠지요.
--------------------------------------------------------

$ ./bugprogram1
j is 0.000000
j is 1.500000
j is 3.000000
j is 4.500000
j is 6.000000
bug is hi

자 배운 걸 복습해 보세요. break, continue, step, file, print, list ,run


출처 : http://trlight.cafe24.com/tt/index.php? ··· 4eebae44
TAG GDB, 디버거

정규형

Study/Database 2007/12/18 12:55 posted by 전중

정규형에 대해 자세히 설명해놓은 블로그이다.

책으로 보면 이해하기 참 난해한데...이 블로그를 보고

난해한 정규형에 대해 쉽게 이해할 수 있었다.

데이터베이스를 배우는 사람이라면 꼭 한 번 읽어보길 바란다.