•
통합이란 개별적인 소프트웨어 컴포넌트를 하나의 시스템으로 결합하는 소프트웨어 개발 행위를 말한다.
◦
작은 프로젝트라면 클래스를 연결하는 데 반나절 정도 걸릴 것이다.
◦
큰 프로젝트에서는 여러 개의 프로그램을 연결하는 데 몇 주 혹은 몇 달이 걸릴 것이다.
◦
그럼에도 작업의 크기에 상관없이 공통적으로 적용되는 원칙이 있다.
•
통합이라는 주제는 구현 순서라는 주제와 밀접한 연관이 있는데, 클래스나 컴포넌트를 작성하는 순서는 그것을 통합하는 순서에 영향을 미친다.
•
아직 만들어지지 않은 것을 통합할 수 없기 때문으로 통합과 구현 순서는 아주 중요한 주제다. 이 장에서는 통합이라는 관점에서 이 두가지를 다룬다.
1. 통합 접근 방법의 중요성
•
경기장이 완공되었을때 얼마나 튼튼한지는 구현에 있어서 중요한 가치가 아니다. 경기장은 각 단계를 버틸 수 있을만큼 튼튼해야 한다.
•
소프트웨어를 잘못된 순서로 구현하고 통합하면 코드를 작성하거나 테스트하거나 디버깅하는 것이 어렵다.
•
통합은 개발자가 개발자 테스트와 시스템 테스트를 마치고 난 다음에 수행되기 때문에 때때로 테스트 활동으로 여겨지기도 한다. 하지만 통합은 매우 복잡해서 개별 활동으로 다뤄야 한다.
•
통합을 신중히 잘 했다면 다음과 같은 이익을 기대할 수 있다.
◦
더 쉬운 결함 진단, 더 적은 결함, 더 적은 비계, 첫 번째 제품 완성 시간 단축, 전체적인 개발 일정 단축, 더 나은 고객과의 관계, 의욕 고취, 프로젝트 완성 기회 향상, 더 신뢰할 수 있는 일정 측정, 더 정확한 상황 보고, 향상된 코드 품질, 더 적은 문서
2. 통합 빈도-단계별 또는 점증적 접근 방법
•
프로그램은 보통 단계별 또는 점증적인 접근 방법으로 통합된다.
단계별 통합
•
단계별 통합은 다음과 같이 잘 정의된 과정 혹은 단계를 따른다.
1.
각 클래스를 설계하고 작성하고 테스트하고 디버깅한다. 이 단계를 단위 개발이라고 한다.
2.
클래스를 하나의 큰 시스템으로 결합한다. 이 단계를 시스템 통합이라고 한다.
3.
전체 시스템을 테스트하고 디버깅한다. 이 단계를 시스템 분해라고 한다.
•
단계별 통합이 가진 한 가지 문제점은 시스템에 있는 클래스가 처음 통합될 때 불가피하게 새로운 문제점이 발생하고 그러한 문제점의 원인이 발생한 곳을 찾기가 어렵다는 것이다.
◦
수많은 클래스가 이전까지는 함께 동작해본적이 잆기 때문에 문제의 원인이 제대로 테스트되지 않은 클래스 일수도 클래스 간의 인터페이스일 수도 상호작용으로 발생한 오류일 수도 있다. 모든 클래스를 의심해야 한다.
•
특정한 문제가 발생한 위치가 불확실성을 가지고 한 순간에 발생하므로 더 이는 더 심각해진다. 이러한 이유로 단계별 통합을 빅뱅 통합이라고도 한다.
•
아주 작거나 적당히 작은 프로그램에선 단계별 통합이 최고의 방법일 것이다. 하지만 대부분의 경우에는 다른 접근 방법이 더 나을 것이다.
점증적 통합
•
점증적 통합에서는 작은 단위로 프로그램을 작성하고 테스트한 다음, 한 번에 하나씩 코드를 결합한다. 다음과 같은 과정을 따른다.
1.
시스템에서 크기가 작고 기능적인 부분을 개발한다. 그것은 가장 작은 기능이 수행하는 부분이 될 수도 있고 가장 어려운 부분이나 핵심적인 부분 또는 몇 부분들을 결합한 것일수도 있다.
•
그러한 부분을 전체적으로 테스트하고 디버깅한다. 그것이 시스템의 나머지 부분을 구성하는 근육과 신경, 피부를 붙일 수 있는 뼈대 역할을 한다.
2.
클래스를 설계하고 코드를 작성하고 테스트하고 디버깅한다.
3.
새로운 클래스를 뼈대에 통합한다. 뼈대와 새로운 클래스를 결합한 것을 테스트하고 디버깅한다.
a.
새로운 클래스를 추가하기 전, 결합한 부분이 잘 동작하는지 확인한다.
점증적 통합의 이점
•
오류를 찾기가 쉽다.
◦
새로운 문제점이 발생하는 경우, 새롭게 통합된 클래스가 문제와 관련이 있을 확률이 높다.
•
시스템이 초기부터 작동한다.
◦
시스템을 사용할 수는 없더라도 코드를 통합하고 결과물이 작동하면 시스템도 정상적으로 작동할 것임이 분명해진다.
◦
진행 상황을 좀 더 잘 관찰할 수 있다.
◦
고객과의 관계가 향상될 것이다.
◦
시스템 요소를 더 완전히 테스트한다.
◦
더 짧은 개발 일정으로 시스템을 만들 수 있다.
•
점증적 통합은 다른 점증적인 전략을 지지하고 장려한다.
3. 점증적 통합 전략
•
단계별 통합에서는 프로젝트 컴포넌트를 만드는 순서를 계획할 필요가 없다. 모든 컴포넌트가 동시에 통합되므로 순서에 상관없이 통합이 가능하다.
•
점증적 통합에서는 좀 더 신중하게 접근한다. 대부분의 시스템은 다른 컴포넌트를 통합하기 전에 몇몇 컴포넌트가 미리 통합되어 있어야 한다. 따라서 통합 계획은 구현 계획에 영향을 미친다.
•
통합 순서 전략은 형태가 규모나 다양하고 모든 상황에 적합한 최고의 전략은 없다. 가장 훌륭한 통합 접근 방법은 프로젝트에 다라 다르며 최고의 해결책은 언제나 프로젝트에 특화된 요구사항을 충족하도록 만든 전략이다.
하향식 통합
•
하향식 통합에서는 계층 구조의 상위에 있는 클래스를 먼저 작성하고 통합한다.
•
클래스 사이의 인터페이스를 신중하게 명시해야 하는데, 디버깅하기 가장 어려운 오류가 어느 한 클래스에 영향을 미치는 오류가 아닌, 두 클래스 사이의 미묘한 상호작용으로 발생하는 오류기 때문이다.
•
시스템 제어 논리 구조를 비교적 일찍 테스트할 수 있다는 장점을 가지는 반면 계층 구조의 상위에 있는 클래스는 모두 많이 사용되기 때문에 크고 개념적인 설계상 문제점이 빨리 노출된다.
•
제대로만 계획한다면 프로젝트 초기 단계부터 부분적으로 작동하는 시스템을 완성할 수 있다.
상향식 통합
•
상향식 통합에서는 계층 구조의 맨 아래부터 클래스를 작성하고 통합한다.
•
상향식 통합 그대로 점증적 통합 전략이라고 할 수 있는 이유는 저수준 클래스를 한꺼번에 추가하지 않고 한 번에 하나씩 추가하기 때문이다.
•
상향식 점증적 통합에서 얻는 이점은 한정되어 있는데, 오류의 원인을 통합하고 있는 단일 클래스로 제한하기 때문에 오류를 찾기가 쉽다.
•
상향식 통합의 가장 큰 문제점은 마지막에 가서야 고수준 시스템 인터페이스를 통합할 수 있다는 점이다. 시스템이 상위 수준에서 개념적인 설계상 문제점을 갖고 있다면 모든 세부 작업이 처리되고서야 발견할 수 있다.
샌드위치 통합
•
순수 하향식, 상향식 통합들이 가지는 문제점 때문에 샌드위치 접근 방법을 권장하기도 한다.
•
우선 상위 수준에서 고수준 비즈니스 객체 클래스를 통합한다. 그리고 장치-인터페이스르 클래스와 하위 수준에서 널리 사용되는 유틸리티 클래스를 통합한다.
◦
여기서 고수준 클래스와 저수준 클래스가 샌드위치의 빵 역할을 한다.
•
중간 수준의 클래스는 나중까지 남겨두는데, 이 클래스가 샌드위치의 고기, 치즈, 토마토 역할을 한다.
•
이러한 접근법은 순수 하향식, 상향식 통합의 엄격함을 피해간다.
위험 지향적인 통합
•
어려운 부분 우선 통합이라고도 불리기도 하는 접근 방법으로 샌드위치 통합과 마찬가지로 최상, 최하위 클래스를 먼저 통합하고 중간 수준을 나중을 위해 남겨두는 경향이 있다.
기능 지향적인 통합
•
기능을 구성하는 작은 부분을 반복적으로 통합하고 나서 점증적으로 기능을 통합해 하나의 시스템을 구성할 수 있다.
•
다음과 같은 주요한 세 가지 장점을 제공한다.
◦
저수준 라이브러리 클래스를 제외하고는 어떠한 기능에도 테스트 더블이 필요하지 않다.
◦
새로 통합된 기능을 점증적으로 추가할 수 있다.
◦
객체지향 설계에서 잘 동작한다.
T-자형 통합
•
초기 개발과 통합을 위해 특정한 수직적인 부분이 선택되고 이를 먼저 구현하고 연관된 문제점이 수정되면 시스템의 전체적인 부분을 개발할 수 있다.
⇒ 해당 부분은 시스템을 구석구석 사용해야 하며 시스템의 설계 시 가정한 중요한 문제점을 제거할 수 있어야 한다.
통합 접근 방법 요약
•
한 가지를 독단적으로 따르기보다는 진행하는 프로젝트에 맞게 바궈 자기만의 전략을 만들어야 한다.
4. 일일 빌드와 스모크 테스트
•
소프트웨어를 통합하는 좋은 접근 방법의 하나는 일일 빌드와 스모크 테스트다.
◦
모든 파일을 매일 컴파일하고 링크하며 실행 프로그램으로 만든다. 그러고 나서 해당 프로그램을 실행했을 때 연기를 내뿜는지 확인하는 간단한 스모크 테스트를 거친다.
•
이는 커다란 장점을 제공해준다.
◦
우선 실패하거나 문제가 있는 통합 위험과 관련된 품질 저하 위험을 줄여준다.
◦
모든 코드를 매일 스모크 테스트하면 품질 문제가 프로젝트로 퍼지는 것을 예방할 수 있다.
•
더 쉽게 결함을 진달할 수 있게 해주는데, 제품을 매일 빌드하고 테스트하면 어떤 날에 왜 제품이 작동하지 않는지 확인하기 쉽다.
•
일일 빌드를 사용할 때의 장단점
•
매일 빌드한다.
•
깨진 빌드를 확인한다.
•
매일 스모크 테스트한다.
•
스모크 테스트를 최신으로 유지한다.
•
일일 빌드와 스모크 테스트를 자동화한다.
•
빌드 그룹을 만든다.
•
타당한 경우에만 빌드에 수정된 내용을 추가한다.
•
개발자가 작성한 코드를 시스템에 추가하기 전에 스모크 테스트하게 한다.
•
아침에 빌드를 배포한다.
요점 정리
•
구현 순서와 통합 접근 방법은 클래스를 설계하고 개발하고 테스트하는 순서에 영향을 미친다.
•
통합 순서를 신중하게 고려한다면 테스트하는 데 드는 노력을 줄일 수 있고 디버깅을 쉽게할 수 있다.
•
점증적인 통합은 다양한 형태가 존재하며 프로젝트가 아주 작지 않다면 이들 중 하나를 사용하는 것이 단계적 통합보다 나을 수 있다.
•
특정한 프로젝트에 대한 최고의 통합 접근 방법은 일반적으로 통합 접근 방법들을 조합한 것이다. T-자형 통합과 수직적인 부분 통합도 자주 적용되는 접근 방법이다.
•
일일 빌드는 통합에서 발생하는 문제를 줄여주고 개발자의 사기를 향상시키고 프로젝트 관리에 유용한 정보를 제공할 수 있다.