프로세스나 방법론을 공부하신 분들이라면 RUP(Rational Unified Process)라는 것을 많이 들어보셨을 겁니다. 인터넷에서 RUP로 검색해 보면 아주 많은 자료를 보실 수 있습니다. 하지만 대부분이 요약 수준의 자료뿐이라 그 진실(?)을 이해하는데는 한계가 있습니다. 그렇다고 그 자료가 가치가 없다는 것은 아닙니다. 좀 더 깊숙한 내면을 보기에는 어렵다는 것입니다.
앞으로 설명할 소프트웨어 개발 과정도 UP(앞으로 UP라고 언급하는 것들은 UP와 RUP를 포괄적으로 의미합니다.)를 기반으로 합니다. 따라서 UP에 대해 간략하게 설명하는 것이 필요하다고 생각합니다. 그래서 우선 UP에 대해서 간략히 설명하고자 합니다. 좀 더 깊이 있는 이해를 하고 싶은신 분들께서는 마지막에 관련 도서나 자료를 정리하니 그 목록에서 선택해서 보시면 될 것 같습니다.
우선 프로세스와 방법론에 대해서 말씀드려 보겠습니다. 제 주변 분들은 프로세스와 방법론이 같은 것이라고 오해를 많이 하고 계십니다. 저는 프로세스와 방법론을 다르게 보고 있으며 가장 큰 차이는
- 프로세스: 일을 처리하는 절차(순서)
- 방법론: 일을 처리하는데 사용하는 기법
라고 생각합니다. 조금 더 설명을 해 보자면 프로세스는 "어떤 자료가 있으면 그 자료를 참고해서 어떤 일을 해서 어떤 결과물을 내 놓는다."라는 것을 중심으로 설명합니다. 우리가 잘 알고 있는 업무 처리 방법이라고 생각하시면 될 것 같습니다. 방법론은 그 어떤 일을 하는데 어떤 기법을 사용하는지를 설명하는 것입니다. 따라서 기법이 추가되면 그 기법에 따라서 결과물(산출물)의 내용이 바뀝니다. 그런데 여기서 방법론을 설명하려고 하니 결국 절차(프로세스)로 설명할 수 밖에 없습니다. 그러다 보니 자연스럽게 방법론이 프로세스라는 개념을 포함하게 됩니다. 결국 프로세스와 방법론이 같은 것이라는 오해가 생기는 게 아닐까 생각합니다.
이제 UP를 간략히 살펴보겠습니다. UP는 누가 만들었고 이런 역사적인 내용은 각설하고 UP를 이해하는데 필요한(대부분은 인터넷에서 찾을 수 있는) 것을 그리고 믾이 접했을 만한 그림으로 다른 분들과 같은 요약 수준에서 설명해 보겠습니다. 하지만 조금은 다르게...
위의 그림은 소프트웨어를 개발하는데 소요되는 시간과 작업영역(흔히 부르는 요구/분석/설계/구현/테스트/배포)과의 관계를 한눈에 보여주는 그림입니다. 우리가 이 그림을 통해서 유추할 수 있는 것은 다음과 같습니다.
- 소프트웨어는 반복적으로 개발한다 - 폭포수 모델이 이해하기 쉽긴 하지만 소프트웨어는 반복을 통해 개발한다.
- 시간이 지나면서 우리가 집중해야 하는 역영은 변한다 - 그림에서 각 색이 칠해져 있는 부분이 우리의 노력을 집중하는 정도를 의미합니다. 즉, 프로젝트 초반에는 비즈니스 모델링(다루지 않음)과 요구도출에 상당히 많은 노력을 기울임을 알 수 있습니다. 그렇다고 분석/설계/구현/테스트/배포를 수행하지 않는 것은 아닙니다.
- 요구/분석/설계/구현/테스트/배포가 단계(Phase)는 아니다 - 맨 위에 보시면 Inception, Elaboration, Construnction, Transition이라는 단어가 나옵니다. 우리는 요구단계, 분석단계, 설계단계 이렇게 부르는데 UP에서의 단계는 다르다는 것을 알 수 있습니다. 물론 폭포수 모델로 간다면 요구단계, 분석단계라는 말이 틀린 것은 아닐 겁니다.
- 소프트웨어 개발의 시작부터 모든 영역의 활동을 수행한다 - 중복되지만 시간이 지나도 대부분의 활동을 모두 수행합니다. 단, 시간이 지나면서 그 비중이 요구도출 > 분석/설계 > 구현 > 테스트 > 배포로 이동할 뿐입니다.
- 시간 축에서 볼때 Construction 단계가 가장 많은 비중을 차지한다 - 개인적으로 너무 공감하는 부분입니다. 소프트웨어는 개발(실제 코딩)하는 시간이 절대적으로 많아야 합니다. 아무리 요구도출, 분석/설계를 잘 한다고 해도 구현 시점에는 앞서 수행한 것을 변경해야 하는 경우가 생깁니다.
위의 그림을 반복과 함께 설명하고 있는 그림을 추가로 넣어 봤습니다.
이 그림은 세번의 반복을 통해 소프트웨어를 개발하는 것을 예시로 들고 있습니다.
- 반복 #1(개발 초반) - 비즈니스 모델링, 요구도출, 분석/설계에 많은 비중을 차지합니다. 지속적으로 언급되지만 여기서 구현, 테스트, 배포도 합니다. 우리가 생각하는 실제 테스트와 배포를 하지 않을 수도 있지만 테스트와 배포에 관련된 활동을 합니다. 예를들어, 테스트케이스 설계 방법을 결정한다거나 요즘 유행하는 CI(Continuous Integration)를 위한 환경을 구축할 수도 있습니다.
- 반복 #2(개발 중반) - 분석/설계와 구현 그리고 테스트가 개발에서 많은 비중을 차지합니다. 비즈니스 모델링과 요구도출도 계속 수행하지만 이전 반복보다는 비중이 많이 줄어 들었음을 알 수 있습니다. 아마도 이 시점이 되면 미처 찾지 못한 요구사항을 간간히 발견하는 정도가 되지 않을까 생각합니다.
- 반복 #3(개발 마무리) - 이제 대부분의 요구사항이 도출되어 구현되었으면 테스트에 좀더 많은 노력을 기울입니다. 테스트에서 나온 결함을 가지고 분석/설계와 구현을 다시 검토하고 소프트웨어를 변경합니다. 그리고 실 사용자가 사용해 볼 수 있도록 개발계와 운영계에 배포가 활발히 진행됩니다.
폭포수와 반복 개발에 대해 질문을 하실 수 있을 것 같아서 추가로 설명해 보겠습니다.
- 제가 몸담고 있는 회사도 대부분 폭포수 모델처럼 일을 합니다. 즉, 일정도 폭포수, 진척률도 폭포수, 테스트도 시스템 배포 전에 몰아서 합니다. 즉, 처음에 요구도출을 합니다. 그리고 화면설계서를 작성하고 개발자들과 모여서 리뷰를 합니다. 그리고 디자이너가 화면을, 퍼블리셔가 HTML/CSS를 그리고 마지막으로 개발자가 여기에 로직을 붙입니다. 마지막으로 테스트를 하고 운영 서버에 배포합니다.
- 네, 일은 폭포수처럼 합니다. 그런데 가만히 보면 화면설계 리뷰를 할 때 개발자들이 많은 질문을 던집니다. 그러면 앞선 작업을 하신 담당자 분들이 다시 고민을 하고 고객과 얘기해서 화면설계를 변경합니다. 그리고 테스트 후에 발견된 결함들을 개발자에게 넘겨서 수정하도록 합니다. 여기서 제가 말씀드리고 싶은 것은 행정적(?)으로는 폭포수이지만 실제 수행하는 것은 반복적 요소가 절대적으로 더 많다는 것입니다. 즉, 우리는 폭포수라는 계획 아래에서 반복적 개발을 하고 있다고 보입니다.
두번째 그림은 시간이 지나면서 우리가 어떤 영역에 리소스를 투입하고 있는지를 보여줍니다. 앞서 언급했지만
우리의 리소스(저희 회사의 경우는 대부분이 HR)는 실제 코드작성을 제일 많이하는 Contrunction에 집중해야 한다는 것을 알 수 있습니다.
이상으로 제가 앞으로 설명할 UP에 대해서 간략하게 설명해 봤습니다. 그것도 제 방식으로 설명해 봤습니다. 지금까지 설명한 것이 실제 개발과는 직접적으로 연관이 없고 관리와 연관되어 보일 수도 있습니다. 하지만 큰 맥락에서 보면 소프트웨어 개발 과정에 대한 현실과 진실은 이해할 필요가 있다고 생각합니다.
물론, "현실에서는 불가능해!"라고 하시는 분도 계실거고 진짜로 "불가능 한 경우"가 있을 수 있습니다. 소프트웨어를 제대로(?) 개발해야 한다면 우리가 수행하는 방식을 바꿀 필요가 있고 어느 순간 짠~하고 해결하는 것이 아니라 체계적이고 논리적으로 사고하는 노력이 필요하다고 생각합니다. 저는 그렇게 생각합니다. 최종 판단은 이 글을 읽으신 분들께 넘기도록 하겠습니다.
설명에 도움이된 참고자료는 다음과 같습니다.
- Unified Software Development Process, 1999, Addison-Wesley Professional, Ivar Jacobson, Grady Booch, James Rumbaugh
- The Rational Unified Process An Introduction, 2003, 인터비전, 신인철 역
- Rational Unified Process, IBM