2009년 11월 7일 토요일

프로그램에 개발 방법론

  1. 구조적 프로그래밍 vs 객체지향 프로그래밍
  2. 객체지향 개발 패러다임
  3. 객체지향적인 개발이란?

1. 구조적 프로그래밍 VS 객체지향 프로그래밍

소프트웨어의 복잡성(complexity)이 증대됨에 따라 소프트웨어 산업에는 많은 위기가 찾아 왔다. 원칙 없는 주먹구구식의 개발은 소프트웨어의 불량률이 증대되며 완성도가 떨어지고, 프로젝트의 실패율이 높아졌고 납기일이 지연되며 버그 수정등과 같은 유지 보수를 어렵게 만들었다. 이러한 이유로 소프트웨어 공학자들은 이런 문제를 해결하자는 취지로 소프트웨어 개발에 대한 가이드 라인을 만들어 나가기 시작 했는데 이러한 가이드는 ‘구조적, 정보공학, 객체지향’ 이라는 이름이 붙여 지면서 진화 되었고 또한 진화 되고 있다.

(1) 구조적 프로그래밍
구조적 프로그래밍은 프로그래밍 언어에서 ‘go to’ 구문에 의해 제기 되었는데 이는 프로그램의 판독성을 떨어뜨리고 복잡하게 해서 결국 프로그램의 완성도 및 유지 보수성을 떨어뜨린다는 문제 제기로 시작 되었으며 곧 ‘구현’ 뿐 아니라 분석, 설계 또한 구조적인 방법을 적용시키자는 의견으로 구조적 방법론이 만들어졌다.

구조적 방법론은 Top-Down 방식으로 먼저 개발할 시스템 전체를 추상화 시켜 명시한 후 이를 모듈화 시켜 부분 적으로 상세화 시켜 나가며 개발하자는 즉, 전체를 부분적으로 나누어 해결해 가는 Divide & Conquer 원리에 따르고 소프트웨어 개발 주기(SDLC: Software Development Life Cycle)에 따라 개발 프로세스를 체계적으로 관리하자는 취지에 따라 만들어진 방법론이다.

이는 데이터 흐름도(DFD: Data Flow Diagram)와 구조도(Structure Chart)가 중심이 되어 시스템 전체를 그려 나가며 Data의 입력에 따른 결과를 위해 일정 절차에 따른 진행(Process)에 초점이 맞춰져 있다. 또한 DFD를 좀더 상세화 시켜 데이터 사전(DD: Data Dictionary)으로 사용하는 데이터에 대해 상세하기 기술하며 명세서(Specification)를 사용해 N-S Chart등과 같은 도구로 하위 로직(low-level logic)을 설계해 나가며 시스템을 설계 하며 완성 시킨다.

구조적 개발 기법은 컴퓨터 산업계에는 큰 혁명을 가져왔지만 데이터 베이스 설계에 대한 가이드가 부족하고 MIS와 같은 소규모 시스템 개발에는 적합하지만 기업 규모(Enterprise Level)의 시스템을 개발하기에는 부적절한 개발 방법론이다. ? (주: 기업 규모의 시스템은 아주 복잡하고 크기 때문에 좀더 체계적인 요구 사항 수집, 분석, 설계가 필요하며, 유시 보수성에서도 모듈을 컴포넌트화 시켜 수정을 최소화 하고 수정을 했더라도 다른 영역에 영향이 없게 해야 하며 테스트, 관리 차원에서도 좀더 세밀하고 체계적인 원칙이 필요하다.)

(2) 객체지향 프로그래밍
구조적 방법론에서 데이터의 중요성의 부각되면서 데이터 중심인 ‘정보 공학 (Information Engineering) ’이 대두 되었다. 정보 공학은 구조적 방법론의 대부분을 수용했지만 ‘데이터 중심’으로 시스템을 그려 나가자는 취지로 만들어졌으며 더욱 복잡해진 데이터 구조를 체계화 안정화 시키자는 취지로 개발 되었다.

시스템의 규모, 복잡도가 더욱 커지면서 Business Logic이 복잡해 짐에 따라 전체 시스템 모델을 여러 시각에 따라 논리적으로 분할하고 각 관점에 완전히 분리하여 체계적으로 관리함에 따라 복잡한 시스템을 더욱 효율적으로 개발 할 수 있으며 유지보수도 훨씬 용이하게 된다. 이는 결국 계획에 따른 효율적인 인력 관리, 비용의 감소, 시스템의 안정화, 정확한 납기일, 돌발 상황에 대한 대처능력을 현저히 증대 시킬 수 있다.
또한 이는 개발자에게도 개발의 편의성을 가져왔는데 기본의 프로세스, 데이터 중심이 아닌 객체를 중심으로 이 객체에 대한 행동(Behavior)을 분석하고 설계함으로써 좀더 직관적인 구현 모델을 제시한다. 그리고 의뢰자(Domain Export)와의 의사 소통에도 더욱 직관적이므로 개발 하려는 시스템을 더욱 정확이 이해, 검증하며 개발할 수 있다. 다시 말해 시스템의 모든 것을 객체 단위로 바라보고 객체들간의 상호 관계를 중심으로 바라보는 관점은 우리가 살고 있는 실세계와 같기 때문에 훨씬 손쉬운 접근이 가능하다.
또한 각 개발 프로세스의 일관성이 유지되어 요구 사항 수집에서부터 분석, 설계, 구현, 테스트까지 끊어짐 없는(Seamless) 일관적인 개발이 가능하다. 즉 요구 사항 수집에서 개발 완료 까지 추적성(tracibility)가 유지되어 문제점 발생에 따른 그 위치와 원인 파악, 그리고 수정이 원활히 이루어 질 수 있다.
- 유스케이스 관점 (Use-Case Driven)
- 반복, 점증적 (Iterative & Incremental).
- 아키텍쳐 중심 (Architecture Centric)

(1) Use-Case Driven
요구 사항 수집의 결과 모델인 Use Case Model을 기반으로 개발자는 유스케이스를 실현(Use Case Realization)함으로써 분석, 설계, 테스트로의 traceibility 및 일관성을 유지한다.

(2) 반복, 점증적(Iterative & Incremental)
소프트웨어 개발 시 전체 프로세스를 작은 단계로 나누어(mini-waterfall) 반복적(Iterative) 및 점증적 (Incremental)으로 개발 한다.
- 각 반복별로 실행 가능한 Release 가 도출된다. : 통합은 전달일자에 가까워졌을 때 한꺼번에 이루어지지 않는다. 진행 상황을 문서화나 공학적 추정치가 아닌 product로서 보여준다.
- 중요하고 높은 수준의 위험요소를 프로젝트 초기에 잡아내어 해결한다.
- 불명확한 요구사항이나 다른 변화에 대해 유연한 프레임웍(framework)을 제공한다. , 전체 프로세스에 사용자나 고객을 참여 시킨다.
- 프로젝트 스태프(Staff)들이 좀더 효과적인 계획을 세우고 작업할 수 있는 개발 프로세스를 지원한다.
- 프로그램은 반복의 진행에 따라 점증적으로 진화 되어진다.
- 특히 대규모 프로젝트 일수록 일정 기간 동안의 눈에 들어나는 정확한 목표의 설정으로 개발팀의 운영이 용이하다.
- 전체적으로 프로세스는 개념화(Inception), 상세화(Elaboration), 구축(Construction), 전이(Transition) 의 의미적 단위를 갖는다.
- 체계적인 위험(risk) 관리: 위험 요소가 높은 것부터 반복에 따라 체계적으로 위험을 제거해 나감으로써 큰 위험 요소를 초기에 해결한다.

- 하나의 반복(Iteration)은 하나의 waterfall 모델을 갖는다.

(3) 아키텍쳐 중심(Architecture Centric)
- 개발 초기에 전체적인 아키텍쳐를 안정화 시킨다. (대규모 시스템일수록 아키텍쳐의 중요성은 더더욱 증대된다.)
- 시스템을 개발할 때 초기에 위험순위가 높은 요소를 먼저 제거하여 나감으로써 초기에 시스템에 대한 핵심이 되는 안정적인 기본 아키텍쳐(architectural baseline)을 구축하여 프로젝트의 안정성을 높이고 프로젝트 중반 이후에는 이미 안정적으로 구축된 기본 아키텍쳐 위에 나머지 부분을 쌓아 올라감으로써 튼튼한 아키텍쳐를 갖은 유지 보수하기 좋은 시스템을 구축한다.

3.객체지향 개발이란 무엇인가?

우리의 실세계의 모든 것(thing)들은 객체들이고 우리는 이 객체들의 상호 작용 속에서 살아가고 있다. 객체지향 개발은 소프트웨어 또한 이와 연관되어 작동되는 모든 것을 복잡하게 엮지 않고 각각을 객체 단위로 보고 이와의 상호 작용을 생각하며 개발한다는 개념이다. 즉 실세계와 똑같다.
객체지향 언어를 사용했다고 객체지향 적인 개발이 되는 것은 아니다. 객체지향 적인 소프트웨어를 개발하려면 먼저 반드시 객체지향 적인 분석, 설계가 선행 되어야 한다. 그렇지 않고서 그냥 객체지향 언어만 사용해서 개발을 했다면 이는 구현적인 언어 차원의 ‘방법’ 만 객체지향 적인 기법을 사용한 것이지 이를 절대 객체지향 적인 소프트웨어를 만들었다고 할 수 없다.

객체지향 적인 소프트웨어 개발은 객체지향 분석, 설계, 구현, 관리 이 모든 박자가 맞추어져야만 제대로 된 방향을 갖은 객체지향 적인 소프트웨어를 개발 했다고 말 할 수 있다.
객체지향 적인 소프트웨어를 개발하기 위해 분석, 설계, 구현, 테스트, 관리 등 모든 것을 가이드 하고 있는 것이 객체지향 방법론 이다.
2. 객체지향 개발 패러다임

댓글 없음: