본문 바로가기
CS 지식/소프트웨어 공학

애자일 소프트웨어 개발 (Agile Software Development) 방법론(1) - 기법

by 코딩하는 동현😎 2024. 10. 8.

애자일 소프트웨어 개발 (Agile Software Development)

신속한 소프트웨어 개발 (Rapid Software Development)

  • 신속한 개발과 전달의 중요성: 현재 소프트웨어 시스템에서 가장 중요한 요구사항 중 하나는 빠른 개발과 신속한 전달입니다. 이는 소프트웨어가 변화하는 비즈니스 요구사항을 신속하게 반영해야 하기 때문입니다.
    • 비즈니스 요구사항의 변화 반영: 비즈니스 환경은 빠르게 변할 수 있으며, 소프트웨어는 이러한 변화를 즉각적으로 반영할 수 있어야 합니다.
    • 계획 중심 개발의 한계: 전통적인 계획 중심 개발 방법론(예: 워터폴 모델)은 이러한 빠른 변화에 효과적으로 대응하지 못합니다. 계획을 세우고 그에 따라 개발을 진행하는 방식은 유연성이 부족하여 비즈니스 요구사항의 변화에 적응하기 어렵습니다.

애자일 개발 방법(Agile Development Methods)의 등장

  • 배경: 1990년대 후반에 애자일 개발 방법론이 등장하게 되었습니다. 이는 작동 가능한 소프트웨어 시스템의 전달 시간을 급격히 단축하기 위해서였습니다.

애자일 개발의 특징:

  1. 버전 또는 increment로 시스템 개발: 시스템은 일련의 버전 또는 increment으로 개발되며, 이해관계자가 각 버전의 사양과 평가에 참여합니다.
  2. 빈번한 새로운 버전의 전달: 새로운 버전을 자주 전달하여 지속적으로 평가받습니다.
  3. 광범위한 도구 지원: 자동화된 테스트 도구와 같은 다양한 도구가 지원되어 개발 과정을 효율적으로 만듭니다.
  4. 최소한의 문서화: 작동하는 코드에 집중하기 위해 문서화는 최소화됩니다.

Plan-Driven(waterfall model) vs Agile 


애자일 방법론 (Agile Methods)

동기 (Motivation)

  • 전통적인 소프트웨어 설계 방법(waterfall)에 대한 불만: 1980년대와 1990년대의 소프트웨어 설계 방법론(예: 워터폴 모델)은 과도한 관리와 설계에 많은 시간을 소모하게 했습니다.
  • 오버헤드 감소와 유연한 대응: 애자일 방법론은 소프트웨어 프로세스의 오버헤드를 줄이고, 과도한 재작업 없이 변화하는 요구사항에 신속하게 대응할 수 있도록 설계되었습니다.

애자일 방법론의 특징

  1. 코드에 중점: 애자일 방법론은 설계(Design)보다는 실제 코드에 중점을 둡니다. 이는 실질적으로 작동하는 소프트웨어를 빠르게 개발하는 데 초점을 맞추기 위함입니다.
  2. 반복적 접근 (Iterative Approach): 소프트웨어 개발을 여러 번의 반복 주기로 나누어 진행합니다. 각 반복 주기마다 소프트웨어의 일부 기능을 개발하고, 이를 점진적으로 완성해 나갑니다.
  3. 신속한 작동 소프트웨어 전달 및 진화: 작동하는 소프트웨어를 빠르게 제공하고, 이를 바탕으로 변화하는 요구사항에 맞춰 지속적으로 발전시킵니다.

애자일 방법론의 두 가지 유형

  1. 애자일 개발 기법 (Agile Development Techniques): 실제 소프트웨어 개발 과정에서 사용하는 구체적인 기술과 방법론을 말합니다. 예를 들어, 스크럼(Scrum), 익스트림 프로그래밍(XP) 등이 이에 해당합니다.
  2. 애자일 프로젝트 관리 (Agile Project Management): 프로젝트 관리 측면에서 애자일 원칙을 적용하는 방법론입니다. 프로젝트의 계획, 실행, 모니터링, 통제를 유연하게 관리하여 변화에 효과적으로 대응합니다.

이번 포스트에서는 애자일 개발 기법 (Agile Development Techniques)에 대해서 알아보겠습니다.


애자일 선언문 (Agile Manifesto) 

"우리는 소프트웨어를 개발하고, 다른 사람들이 이를 개발하도록 돕는 과정을 통해 더 나은 개발 방법을 발견하고 있습니다. 이 작업을 통해 우리는 다음을 중요하게 여긴다는 것을 깨달았습니다."
 
애자일 개발 방법론의 근본적인 가치와 원칙을 담은 선언문입니다.이 선언문은 애자일 개발이 단순한 방법론이 아니라, 더 나은 소프트웨어 개발 방식을 지속적으로 탐구하고 개선하려는 철학을 담고 있음을 나타냅니다.

 


 애자일 방법의 적용 가능성 (Applicability of Agile Method)

 

소규모 또는 중규모 제품의 개발

  • 일반적인 소프트웨어 제품과 앱 개발: 현재 거의 모든 소프트웨어 제품과 애플리케이션이 애자일 접근 방식을 사용하여 개발되고 있습니다. 이는 애자일 방법이 다양한 규모와 유형의 프로젝트에 유연하게 적용될 수 있음을 보여줍니다.

조직 내 맞춤형 시스템 개발

  • 고객의 명확한 참여 의지: 애자일 방법을 적용하려면 고객이 개발 과정에 적극적으로 참여하고 협력해야 합니다. 이는 요구사항을 명확히 하고, 지속적인 피드백을 통해 소프트웨어를 개선하는 데 중요합니다.
  • 외부 규제나 규칙의 제한이 적은 경우: 소프트웨어에 영향을 미치는 외부 규제나 규칙이 적을수록 애자일 방법을 적용하기 용이합니다. 이는 애자일이 유연성과 신속한 대응을 중시하기 때문입니다.

 

애자일 소프트웨어 개발은 변화하는 비즈니스 요구사항에 신속하게 대응하고, 고객과의 지속적인 협력을 통해 고품질의 소프트웨어를 효율적으로 개발할 수 있는 접근 방식입니다. 이를 통해 개발 과정의 유연성을 높이고, 불필요한 오버헤드를 줄여 보다 효과적인 소프트웨어 개발을 실현할 수 있습니다.


1. 애자일 개발 기법 (Agile Development Techniques)

 

익스트림 프로그래밍 (Extreme Programming, XP)

익스트림 프로그래밍(XP)은 반복적(iterative) 개발 접근 방식을 '극단적으로' 적용한 애자일 방법론입니다. XP는 소프트웨어 개발 과정에서의 유연성과 품질을 극대화하기 위해 여러 가지 실천 방안을 도입합니다.

 

 

XP의 주요 특징

  1. 극단적인 반복 개발:
    • 매일 여러 번의 빌드: XP에서는 새로운 버전이 하루에도 여러 번 빌드될 수 있습니다. 이는 빠른 피드백과 지속적인 통합을 가능하게 합니다.
    • 2주마다 고객에게 인크리먼트 제공: 2주 단위로 완성된 소프트웨어 인크리먼트를 고객에게 전달하여 지속적인 피드백을 받습니다.
    • 모든 빌드에 대한 테스트: 모든 빌드는 자동화된 테스트를 거쳐야 하며, 테스트가 성공적으로 완료될 경우에만 빌드가 승인됩니다. 이는 소프트웨어의 안정성과 품질을 보장하는 데 중요한 역할을 합니다.

XP의 원칙 (XP Principles)

XP는 몇 가지 핵심 원칙을 바탕으로 개발 프로세스를 진행합니다. 이 원칙들은 소프트웨어 개발의 효율성과 품질을 높이는 데 중점을 둡니다.

  1. Incremental 개발:
    • 소프트웨어는 작고 빈번한 시스템 릴리스를 통해 점진적으로 개발됩니다. 이는 복잡성을 줄이고, 변화에 유연하게 대응할 수 있게 합니다.
  2. 고객 참여 (Customer Involvement):
    • 고객이 팀과 전일제로 참여하여 요구사항을 지속적으로 제공하고 의사결정에 관여합니다. 이는 고객의 요구를 정확히 반영하고, 개발 과정에서의 오해를 줄입니다.
  3. 집단 소유 (Collective Ownership):
    • 팀 내 모든 개발자가 코드의 소유권을 공유하며, 페어 프로그래밍(pair programming)을 통해 코드 품질을 유지하고 지식을 공유합니다.
  4. 변화 수용 (Embracing Change):
    • 정기적인 시스템 릴리스를 통해 변화하는 요구사항을 수용하고, 유연하게 대응할 수 있도록 합니다.
  5. 단순성 유지 (Simplicity):
    • 지속적인 리팩토링(refactoring)을 통해 코드의 단순성과 명확성을 유지하며, 불필요한 복잡성을 제거합니다.

XP의 실제 적용 (XP in Practice) 

 

XP 방법론 자체는 현재 널리 사용되지는 않지만, XP에서 제안한 여러 실천 방안들은 다른 개발 방법론에서 널리 채택되고 있습니다. 주요 XP 실천 방안들은 다음과 같습니다:

  1. 사용자 스토리(User Stories)를 통한 요구사항 명세
  2. 리팩토링(Refactoring)
  3. 테스트 우선 개발(Test-First Development, TFD)
  4. 페어 프로그래밍(Pair Programming)

이 중 몇 가지를 자세히 살펴보겠습니다.


1. 사용자 스토리(User Stories)를 통한 요구사항 명세

사용자 스토리(User Stories)는 사용자 요구사항을 간단하고 명확하게 표현하는 방법입니다. 주로 카드에 작성되며, 개발 팀은 이를 기반으로 구현 작업을 세분화합니다.

 

 

  • 작성 및 분해:
    • 사용자 스토리는 사용자의 시나리오나 기능 요구사항을 간단한 문장으로 작성합니다.
    • 개발 팀은 이러한 스토리를 분석하여 구현 작업(task)으로 세분화합니다.
  • 일정 및 비용 추정:
    • 각 작업은 프로젝트 일정과 비용 추정의 기초가 됩니다.
  • 고객 참여:
    • 고객 또는 사용자는 XP 팀의 일원으로 참여하여 요구사항에 대한 결정을 내립니다.
    • 다음 릴리스에 포함될 스토리를 고객이 선택합니다.

2. 리팩토링(Refactoring)

리팩토링(Refactoring)은 기존 코드를 변경하여 코드의 구조를 개선하지만, 외부 동작은 변경하지 않는 과정을 말합니다. XP에서는 리팩토링을 통해 코드를 지속적으로 개선함으로써 변화에 유연하게 대응합니다.

  • XP의 관점:
    • 전통적인 소프트웨어 공학에서는 변경을 대비한 설계를 권장하지만, XP는 변경을 예측하는 대신 지속적인 코드 개선을 통해 변경을 용이하게 만듭니다.
  • 리팩토링의 이점:
    • 코드 구조가 명확하고 잘 조직되어 있어 변경이 쉬워집니다.
  • 리팩토링의 예시:
    • 중복 코드를 제거하기 위해 클래스 계층 구조를 재조직.
    • 속성과 메서드의 이름을 정리하여 가독성을 향상.
    • 인라인 코드를 프로그램 라이브러리의 메서드 호출로 대체.
  • 리팩토링의 수준:
    • 아키텍처 > 디자인 > 코드 > 데이터

3. 테스트 우선 개발(Test-First Development, TFD)

테스트 우선 개발(TFD)은 코드를 작성하기 전에 테스트를 먼저 작성하는 개발 방식입니다. XP에서는 테스트가 개발의 중심에 있으며, 모든 변경 사항 후에 테스트가 실행됩니다.

  • XP 테스트의 특징:
    • 테스트 우선 개발: 코드를 작성하기 전에 테스트를 먼저 작성하여 요구사항을 명확히 합니다.
    • 시나리오 기반의 점진적 테스트 개발: 시나리오에 기반한 테스트를 점진적으로 개발합니다.
    • 사용자 참여: 고객이 테스트 개발과 검증에 참여하여 요구사항이 충족되었는지 확인합니다.
    • 자동화된 테스트 도구 사용: 새로운 릴리스를 빌드할 때마다 모든 컴포넌트 테스트를 자동으로 실행합니다 (CTIP: Continuous Testing and Integration Platform).
  • TFD의 어려움:
    • 테스트 작성에 대한 선호도: 개발자는 테스트 작성보다는 코딩을 선호할 수 있으며, 테스트 작성에 소홀해질 수 있습니다.
    • 점진적 테스트 작성의 어려움: 일부 테스트는 점진적으로 작성하기 어려울 수 있습니다.
    • 테스트 완성도 판단의 어려움: 많은 테스트의 완성도를 판단하기 어렵습니다.

테스트 주도 개발(Test-Driven Development, TDD)

테스트 주도 개발(TDD)은 TFD의 일종으로, 코드를 작성하기 전에 테스트를 먼저 작성하는 개발 방식입니다. 이는 구현해야 할 요구사항을 명확히 하고, 자동화된 테스트를 통해 지속적인 검증을 가능하게 합니다.

  • TDD의 특징:
    • 요구사항 명확화: 테스트를 먼저 작성함으로써 구현할 요구사항을 명확히 합니다.
    • 자동화된 테스트: 테스트는 데이터가 아닌 프로그램으로 작성되어 자동으로 실행됩니다.
    • 정확한 검증: 테스트는 올바르게 실행되었는지 확인하는 검증 절차를 포함합니다.
  • 자동화된 테스트 실행 환경:
    • 새로운 기능이 추가될 때마다 이전의 모든 테스트와 새로운 테스트가 자동으로 실행되어, 새로운 기능이 기존 기능에 오류를 도입하지 않았는지 확인합니다.

CTIP(Continuous Testing and Integration Platform)은 소프트웨어 개발 과정에서 지속적인 테스트와 통합을 자동화하여, 코드 변경 시 즉각적으로 테스트를 실행하고 통합 상태를 확인할 수 있게 도와주는 플랫폼을 의미합니다. 이러한 플랫폼은 개발 팀이 신속하게 피드백을 받고, 버그를 조기에 발견하며, 소프트웨어의 품질을 유지하는 데 중요한 역할을 합니다.

 


CTIP의 주요 기능

  1. 지속적인 통합 (Continuous Integration):
    • 개발자가 작성한 코드를 중앙 저장소에 빈번하게 병합하여, 충돌을 최소화하고 통합 과정을 자동화합니다.
  2. 지속적인 테스트 (Continuous Testing):
    • 코드 변경 시 자동으로 테스트를 실행하여, 새로운 코드가 기존 기능에 영향을 미치지 않는지 검증합니다.
  3. 자동화된 빌드 (Automated Builds):
    • 소스 코드를 자동으로 빌드하여, 실행 가능한 소프트웨어 패키지를 생성합니다.
  4. 피드백 제공 (Feedback Mechanism):
    • 테스트 및 빌드 결과를 개발자에게 신속하게 전달하여, 문제를 빠르게 해결할 수 있도록 지원합니다.

고객 참여 (Customer Involvement)

XP에서는 고객이 팀의 일원으로 참여하여 개발 과정에 적극적으로 관여합니다.

  • 고객의 역할:
    • 다음 릴리스에 구현될 스토리에 대한 수용 테스트를 개발하는 데 도움을 줍니다.
    • 개발 과정에서 테스트를 작성하며, 새로운 코드가 고객의 요구에 부합하는지 검증합니다.
  • 고객의 기여:
    • 모든 새로운 코드는 고객의 요구를 충족하는지 검증됩니다.
    • 테스트 케이스 != 테스트 데이터 , 테스트 케이스는 요구사항을 검증하는 데 사용됩니다.
  • 고객의 한계:
    • 고객이 전일제로 참여할 시간이 제한적일 수 있으며, 요구사항 제공만으로 충분하다고 생각할 수 있어 테스트 과정에 참여하는 것을 꺼릴 수 있습니다. 

테스트 자동화 (Test Automation)

테스트 자동화는 테스트를 실행 가능한 컴포넌트로 작성하여 구현 작업 전에 테스트를 수행하는 방식입니다. 이는 지속적인 통합과 테스트의 효율성을 높입니다.

  • 테스트 자동화의 특징:
    • 실행 가능한 테스트 작성: 테스트는 구현 작업 전에 작성되며, 자동으로 실행됩니다.
    • 독립성: 각 테스트는 독립적으로 실행될 수 있어야 합니다.
    • 입력 시뮬레이션: 테스트는 입력을 시뮬레이션하고, 결과가 출력 명세에 부합하는지 확인합니다.
  • 자동화된 테스트 프레임워크:
    • 테스트 작성 및 실행 용이성: 테스트를 쉽게 작성하고 실행할 수 있는 시스템이 필요합니다.
    • 예시: xUnit 계열의 프레임워크(JUnit 등)가 널리 사용됩니다.
  • 테스트 자동화의 장점:
    • 테스트가 항상 준비되어 있어 빠르게 실행할 수 있습니다.
    • 새로운 기능이 추가될 때마다 테스트를 실행하여 새로운 코드가 기존 기능에 오류를 도입하지 않았는지 즉시 확인할 수 있습니다 (CTIP: Continuous Testing and Integration Platform).

4. 페어 프로그래밍 (Pair Programming)

페어 프로그래밍두 명의 프로그래머가 한 컴퓨터에서 함께 코드를 작성하는 개발 방식입니다. 이는 지식 공유와 코드 품질 향상에 기여합니다.

  • 페어 프로그래밍의 특징:
    • 동적 페어 구성: 팀 내 모든 구성원이 서로 교대로 페어를 이루어 작업함으로써 지식이 팀 전체에 퍼지게 합니다.
    • 공동 소유권: 코드에 대한 공동 소유권을 통해 코드의 일관성과 품질을 유지합니다.
  • 페어 프로그래밍의 장점:
    • 지식 공유: 팀원 간의 지식 공유가 촉진되어, 팀의 전반적인 역량이 향상됩니다.
    • 비공식적인 코드 리뷰: 코드를 작성할 때마다 두 사람이 함께 검토하므로, 버그나 오류를 초기에 발견할 수 있습니다.
    • 리팩토링 촉진: 팀 전체가 시스템 코드를 개선함으로써 코드의 단순성과 명확성을 유지합니다.
    • 효율성 향상: 일부 연구에서는 페어 프로그래밍이 두 명의 프로그래머가 개별로 작업하는 것보다 효율적일 수 있음을 시사합니다.

요약

익스트림 프로그래밍(XP)은 애자일 방법론 중 하나로, 소프트웨어 개발의 유연성과 품질을 극대화하기 위해 반복적 개발, 고객 참여, 테스트 중심 개발, 페어 프로그래밍 등의 실천 방안을 채택합니다. XP는 변화하는 요구사항에 신속하게 대응하고, 고품질의 소프트웨어를 지속적으로 제공하는 것을 목표로 합니다. 비록 XP 자체는 널리 사용되지는 않지만, XP에서 제안한 여러 실천 방안들은 다른 개발 방법론에서도 널리 활용되고 있습니다.

XP를 효과적으로 적용하기 위해서는 팀 내의 높은 수준의 협력, 고객의 적극적인 참여, 자동화된 테스트 환경 구축 등이 필수적입니다. 이를 통해 소프트웨어 개발 과정에서 발생할 수 있는 리스크를 최소화하고, 변화하는 비즈니스 요구사항에 유연하게 대응할 수 있습니다.

 

 

다음 포스트에서는 애자일 프로젝트 관리 (Agile Project Management)과 스크럼에 대해서 알아보겠습니다!

 

 
반응형

댓글