본문 바로가기

더 괜찮은 개발자가 되기위한/프로젝트 관리하기

소프트웨어 개발 방법론

□ 소프트웨어 개발 방법론


○ 소프트웨어 개발 방법론이란?


소프트웨어 개발 방법론의 구성


소프트웨어 생명주기 관리 모델에서는 프로젝트가 어떤 순서로 진행될지 그리고 중간에 어떤 산출물을 점검할 지에 대해 주로 관심을 가졌다면, 소프트웨어 개발 방법론은 소프트웨어를 어떻게 만들지에 대해 관심을 가진다. 따라서 개발 방법론에는 단계별 산출물뿐만 아니라 산출물은 누가 어떤 순서로 어떻게 만들어야 하는지 그리고 어떤 도구를 사용해야 하는지 구체적으로 정의하고 있다. 학교에서 배우는 소프트웨어 공학이 산업계에서 실무적으로 구현된 결과물이 개발방법론이라고 할 수 있다


소프트웨어 개발 방법론의 종류


소프트웨어 개발방법론은 정보공학 방법론, 객체지향 방법론, CBD(Component Base Development) 방법론, 애자일 방법론이 이렇게 크게 4가지로 나눌 수 있다. 산업계에는 다양한 개발방법론이 나와있고 대규모 IT회사에는 자체적인 개발방법론을 보유하고 있지만, 이는 완전히 새로운 개념이 아니라 앞서 열거한 4가지 방법론의 단점을 보완하거나 각각의 방법론의 장점을 따와 합성한 것들이 대부분이다.


앞으로 4가지 개발방법론의 개념과 특징을 살펴보고 프로젝트에서 실무적으로 사용할 수 있는 방법론이 무엇인지 하나씩 알아보도록 하자.

 

○ 정보공학 개발 방법론


정보공학 개발 방법론 절차


정보공학 개발 방법론은 비즈니스 시스템 규모 성장과 소프트웨어 공학 발전에 따라 1980년대 중반에 등장한 방법론으로 기업의 전사적인 관점에서 출발해 데이터 중심으로 시스템을 구축하는 방법론이다. 기업의 중장기 정보화 전략을 수립하는 ISP와 업무 영역을 분석하는 BAA(Business Area Analysis), 업무시스템을 설계하는 BSD(Business System Design) 그리고 시스템을 구축하는 SC(System Construction) 단계로 구성된다.


ISP 단계에서는 기업의 경영전략을 뒷받침할 수 있는 정보화 전략을 수립하기 위해 현행 업무프로세스와 시스템을 분석하고 미래 아키텍처와 전략계획을 수립하게 된다.


BAA 단계는 기업의 업무 현황을 분석해서 개념 수준의 데이터와 프로세스를 설계하는 업무분석 단계이다.


BSD 단계는 실질적으로 시스템을 설계하는 단계로 우리가 많이 사용하고 있는 논리적 ER 다이어그램으로 데이터를 설계하고 분할 다이어그램, 액션 다이어그램, 의존 다이어그램을 사용해 프로세스를 설계한다.


SC 단계에서는 물리적 데이터베이스를 설계하고 BSD 단계에서 작성한 산출물을 바탕으로 프로그램을 개발하게 된다. 이론적인 정보공학 방법론에서는 BSD 단계에서 작성한 산출물을 바탕으로 프로그램 코드를 생성할 수 있는데, 대부분의 프로젝트에서는 설계문서만 만들고 코드는 개발자가 직접 만드는 방식으로 개발을 진행한다.


정보공학 개발 방법론의 특징


정보공학 개발 방법론은 다양한 특징을 가지고 있지만 대표적으로 다음과 같이 세 개로 요약할 수 있다. 첫째 정보공학 개발 방법론은 ISP 중심이다. ISP를 통해 기업 전체적인 업무와 정보화 현황을 정리한 다음 시스템 구축을 위한 계획을 수립한다. 둘째로 데이터 중심 방법론이다. 비즈니스의 중심은 데이터에 있다고 생각하고 IT도 데이터 관점으로 설계한다. 마지막으로 공학적으로 접근한다는 특징을 가지고 있다. 캐이스 툴(Case Tool)과 같은 자동화 도구를 사용해 설계하고 코드를 자동 생성한다. 물론 생성된 코드는 프로그램으로 동작하지 않는다. 하지만 프로그램이 가져야 하는 전체적인 윤곽을 잡아주는 역할을 한다.


현재 산업계에서 가장 많이 사용하는 방법론은 무엇일까? 바로 정보공학 방법론이다. 많은 기업에서 3~5년 주기로 ISP 프로젝트를 통해 정보화 전략을 수립하고 그에 따른 정보시스템을 구축한다. 기업 업무 중심에는 데이터베이스가 있으면 시스템은 데이터를 어떻게 하면 잘 쌓을지 그리고 어떻게 데이터를 활용해 기업의 생산성을 높일지 고민하면서 발전하고 있다. 지금 화두가 되고 있는 인공지능 기술도 기업에서 쌓아놓은 데이터 기반 하에 성능을 발휘할 수 있다


정보공학 개발 방법론 개념도


그럼 프로젝트 관점에서 정보공학 방법론을 다시 한 번 살펴보자. 실제로 프로젝트 개발 과정에서 필요한 산출물 종류는 그렇게 많지 않다. 설계할 때는 스토리보드, 데이터 설계서, UI 설계서 정도를 작성하고 개발 과정에서는 이를 바탕으로 물리적 테이블과 프로그램 코드가 만들어 진다. 이런 관점에서 정보공학 방법론을 바라 본다면 BAA에 해당하는 요구분석 단계에서는 요구사항 명세서가 만들어지고 BSD에 해당하는 시스템 설계 단계에서는 논리 ERD와 업무 프로세서를 설명하는 프로세스 구조도/흐름도가 만들어 진다. 그리고 SC에 해당하는 개발 단계에서는 물리 ERD, UI, 프로그램 코드가 개발된다.


정보공학 방법론이라고 해서 거창한 무엇인가 있는 게 아니라 일반적으로 수행하는 개발방식이 정보공학 방법론의 간소화 버전이라 생각하면 된다. 앞으로 설계와 개발 과정에서는 간소화된 정보공학 방법론을 기반으로 설명하도록 한다.

 

○ 객체지향 개발 방법론


객체의 개념


객체지향 개발 방법론을 알아보기 전에 먼저 객체의 개념부터 살펴보자. 간단히 얘기하면 객체란 사물을 논리적으로 추상화한 것이다. 예를 들어 자동차가 있다고 생각해보자. 자동차는 바퀴, 유리창, 사이드 미러, 기어, 엑셀, 브레이크 등 눈으로 볼 수 있는 수천 가지 부품으로 구성돼 있다. 추상화란 우리가 관심 있는 부분만 추려내는 것이다. 자동차 객체를 만드는데 다른 건 다 필요 없고 앞뒤로 움직이는 것에만 관심이 있다면 기억, 엑셀, 브레이크 속성과 전진, 후진, 정지, 가속 기능만 있으면 된다. 따라서 객체는 사물에 대해 관심 있는 부분만 추려내 추상화한 것이다.


이렇게 만들어진 객체는 데이터와 기능을 동시에 가지고 있다. 하나의 객체는 다른 객체가 가지고 있는 데이터와 기능을 사용할 수 있고, 이런 능력은 객체 간 결합을 가능하게 한다. 객체지향 개발 방법론은 이런 객체의 특성을 활용해 객체를 생성하고 구체화하면서 프로그램을 진행한다. 정보공학 개발 방법론처럼 데이터와 프로세스를 따로 설계하지 않고 데이터와 프로세스를 모두 객체에 담아 오로지 객체의 관점에서 프로그램을 개발한다.


객체지향 개발방법론 개념


객체지향 개발 방법론에서는 분석, 설계, 구현의 전 과정을 객체 중심으로 진행한다. 심지어 데이터를 저장하는 테이블도 따로 설계하지 않고 데이터 객체로 설계한다. 데이터는 결국 데이터베이스에 저장되는데 만일 데이터베이스가 객체형 DB라면 별다른 변환과정 없이 데이터 객체를 그대로 저장하면 되지만, 관계형 DB를 사용한다면 객체를 관계형 테이블로 변환하는 과정이 필요하다. 이 과정을 객체-관계 매핑(Object Relation Mapping)이라 하며 현재 대부분의 회사에서 관계형 데이터베이스를 사용하고 있기 때문에 객체-관계 매핑은 필수적인 과정이라 할 수 있다.


객체지향 개발 방법론은 실 세계를 정확하게 반영하며, 높은 재사용성과 안정성을 갖고 있다는 장점이 있지만, 관계형 DB로 구성되어 있는 현재 산업계에서는 객체-관계 매핑 과정이 필수적이기 때문에 활발하게 사용되지는 않는다. 관계형 DB에서 제공하는 SQL은 풍부한 기능을 가지고 있어 많은 개발자 들이 이 분야에서 지식과 노하우를 축적하고 있다. 이 또한 관계형 DB에서 객체형 DB로의 이전을 가로막는 장애물이 되고 있다.


많은 프로젝트에서 Java와 같은 객체지향 언어를 사용하기 때문에 프로세스 설계 과정에서는 객체지향 개발 방법론 개념이 많이 사용되고 있으며 데이터 설계 과정에서는 기존의 정보공학 방법론이 많이 사용된다. , 프로그램은 객체지향 언어를 사용하고 데이터베이스는 관계형으로 설계한다.


○ CBD 개발 방법론

컴포넌트의 개념


CBD(Component Base Development) 개발 방법론의 핵심 기술인 컴포넌트 개념에 대해 알아보자. 컴포넌트는 인터페이스로 접근 가능하고 독립적인 기능을 수행하는 모듈로써 교체가 가능한 소프트웨어 부품이다. 컴포넌트는 사용방법을 알려주는 설명서를 제공해야 한다. 우리가 주변에서 쉽게 볼 수 있는 컴포넌트들에는 윈도우에서 사용할 수 있는 DLL, OCX와 자바로 개발된 Spring, Struts 등이 있다


CBD 개발 방법론의 개념


CBD 개발 방법론은 크게 컴포넌트를 개발하는 CD(Component Development) 단계와 개발된 컴포넌트를 사용해서 개발을 진행하는 CBD(Component Base Development) 단계로 나눌 수 있다. CD 단계에서는 도메인을 분석해 컴포넌트 대상 업무를 선별하고 컴포넌트를 개발해 저장소에 입력한다. CBD 단계에서는 요구 분석을 통해 컴포넌트 기반으로 설계하고 필요한 컴포넌트를 저장소에서 찾아서 조립하는 방식으로 프로그램 개발을 진행한다. 만일 필요한 컴포넌트가 저장소에 없다면 CD 단계로 돌아가서 컴포넌트를 개발하고 이를 사용해 개발을 계속 진행한다.


프로젝트 제안서를 보면 많은 업체에서 CBD 개발 방법론을 사용해 프로젝트를 진행한다고 하는데 이것은 정확한 표현이 아니다. 전자정부 프레임워크를 사용하는 웹프로젝트를 예로 들면 대부분의 공통 기능을 프레임워크에서 제공하지만 도메인에 특화된 기능들은 현장에서 개발하는 경우가 많다. 순수한 CBD 프로젝트가 되려면 그러한 기능들을 컴포넌트화해서 회사의 다른 프로젝트에서 재사용할 수 있도록 개발해야 한다.


CBD 방법론은 적절한 컴포넌트가 개발된 상황에서 사용한다면 재사용성이 우수하고 컴포넌트 조립을 통한 개발을 통해 생산성을 획기적으로 높일 수 있다는 장점이 있지만, 높은 설계 및 개발 수준을 요구하는 컴포넌트의 특성 상 국내 컴포넌트 개발 기술이 부족하고 먼저 개발된 컴포넌트를 공유하고 활용할 수 있는 유통 체계가 미흡하다는 한계점을 가지고 있다.

 

○ 애자일 개발 방법론


애자일 개발 방법론은 기존 방법론들이 너무 절차를 중시한 나머지 변화에 대응하기 어려웠던 단점을 개선하기 위해 나왔다. 애자일 방법론은 절차보다는 사람을, 문서보다는 작동하는 소프트웨어를, 미리 철저하게 계획하기 보다는 변화에 대한 민첩한 대응을, 계약과 협상에 얽매이기 보다는 고객과의 협력을 중요하게 생각한다


애자일 개발 방법론


애자일 방법론에서는 먼저 개발 범위 안에 있는 요구사항을 분석해 우선순위가 높은 요구사항을 먼저 개발한다. 개발된 부분에 대해 실행하는 모습을 보여줘서 고객의 평가를 받고 고객의 요구사항과 개선사항을 반영해 다음 요구사항 개발에 참고한다. 이런 방식을 계속 반복하면서 소프트웨어 개발 범위를 점진적으로 늘려가게 된다. 여기에서 가장 핵심이 되는 사항은 단계별로 고객에게 동작하는 소프트웨어를 계속 보여주고 요구사항에 대한 변경을 적극적으로 수용한다는 것이다.


애자일은 특정한 방법론을 지칭하는 것이 아니라 애자일(Agile: 날렵한, 민첩한)하게 개발하는 다양한 방법론을 통칭하는 것이다. 애자일 방법론에는 XP(eXtreme Programming), SCRUM, FDD, Crystal 방법론 등이 있는데 애자일 개발 방법론을 널리 보급시킨 주역으로 꼽히는 XP 방법론을 통해 애자일 프로세스를 이해해 보자.

XP 핵심가치와 실천 항목


XP 방법론은 고객이 원하는 핵심 기능부터 짧은 개발 주기를 반복하면서 실행 가능한 프로그램 형태로 개발하는 방식이다. XP는 위 표와 같이 4개 핵심가치와 12가지 실천 항목으로 구성되어 있다. 핵심가치는 개발자가 가져야 할 마음가짐을 알려주는 일종의 개발 철학이고 실천 항목은 실제로 프로젝트에서 생산성을 향상시킬 수 있는 구체적인 방법론이다.



XP 개발 프로세스


이제 XP 개발 방법론이 어떤 절차로 흘러가는지 알아보자. 프로젝트에는 다양한 요구사항이 들어 있다. 그 중에서 개발 우선 순위를 정하고 가장 시급한 부분부터 개발이 시작된다. 개발을 시작할 때 맨 처음에 개발하는 것이 유저스토리다. 이것은 UML에서 사용하는 유즈케이스와 유사한 역할을 하는데 고객에게 필요한 게 무엇인지 기술하는 하고 있다. 개발 시점에는 요구사항 명세서의 역할을 수행하고 테스트 할 때는 테스트 시나리오를 제공해 준다.


다음으로 스파이크를 개발한다. 스파이크는 불확실성을 제거하기 위한 일종의 프로토타입과 비슷한 역할을 수행한다. 개발자와 고객은 스파이크를 통해 개발에 대한 확신을 가지게 되며 요구사항을 구체화 할 수 있다.


배포 계획은 언제 프로그램을 배포할지 계획을 세우는 것이다. 반복적 개발 과정에서 유저스토리와 배포 계획을 유연하게 변경할 수 있다. 이제 프로그램 개발이 끝났으면 인수테스트를 통해 오류를 수정하고 작은 배포를 통해 동작하는 소프트웨어를 고객에게 오픈 한다.

XP는 위의 과정을 반복하면서 프로그램을 점진적으로 개발하는 방식이다. 산업계에서는 프로젝트에 전면적으로 XP 방법론을 도입하고 있지는 않지만, 개발 과정에서 XP에서 제시하고 있는 핵심 가치와 실천 항목을 광범위하게 사용하고 있다.