Developer's Development

3.4.1 [SW공학] A to Z 본문

AI 활용 애플리케이션 개발/SW공학

3.4.1 [SW공학] A to Z

mylee 2025. 9. 28. 21:40
1. 요구사항 분석

 

  • 요구사항 분석 개요

소프트웨어 개발의 첫 단계는 요구사항 분석(Requirements Analysis)이다.

요구사항 분석은 시스템이 해결해야 할 문제를 명확히 정의하고, 이를 구현 가능한 형태로 문서화하는 과정이다.

올바른 요구사항 분석은 프로젝트의 성공 여부를 결정하는 중요한 요소 중 하나다.

 

👉🏻 핵심 목표

시스템이 해결해야 하는 문제를 명확히 정의한다.

다양한 이해관계자(사용자, 관리자, 개발자)의 요구를 체계적으로 수집한다.

요구사항을 구체적으로 문서화하여 이후의 설계 및 개발 과정에서 참조할 수 있도록 한다.

개발 중 발생할 수 있는 변경 사항을 관리할 수 있는 체계를 마련한다.

 

👉🏻  요구사항 분석 과정

1. 요구사항 개발: 새로운 요구사항을 식별하고 문서화하는 과정

2. 요구사항 관리: 요구사항이 지속적으로 변경될 수 있는 환경에서 이를 효과적으로 유지/관리하는 과정

 

 

  • 요구사항 개발

소프트웨어 시스템이 수행해야 할 기능과 제약 조건을 정의하는 과정이다.

요구사항 개발이 제대로 수행되지 않으면 이후의 설계, 구현, 테스트 단계에서 문제를 야기할 수 있다. 요구사항 개발은 단순한 정보 수집이 아니라 사용자의 기대치를 충족시키는 체계적인 과정이므로, 올바른 기법과 도구를 활용하는 것이 중요하다.

 

도출 → 분석  → 명세  → 검증

👉🏻 주요 단계

1. 도메인 분석: 시스템이 속한 특정 분야의 주요 개념 분석

2. 문제 정의와 범위 설정: 해결해야 할 문제를 명확히 정의하고, 프로젝트의 범위 한정

3. 요구사항 추출: 사용자 인터뷰, 워크숍, 문헌 조사 등을 통해 요구사항 수집

4. 요구사항 문서화: 수집된 요구사항을 체계적으로 정리하고 문서화

5. 요구사항 검증 및 확인: 문서화된 요구사항이 정확하고 일관성이 있는지 검토

 

👉🏻  도메인 분석

특정 시스템이 속한 분야(도메인)의 개념을 체계적으로 이해하는 과정이다.

도메인 분석을 통해 해당 분야의 주요 개념, 비즈니스 프로세스, 규칙을 정리하여 요구사항 개발의 기초를 마련한다.

 

👉🏻 도메인 분석의 주요 활동

- 도메인 정의, 핵심 개념 및 용어 수집, 비즈니스 프로세스 분석, 도메인 모델 생성

 

👉🏻 문제 정의와 범위 설정

프로젝트가 해결해야 할 문제를 명확히 규정하고, 프로젝트 수행 범위를 합리적으로 한정하는 과정이다.

- 문제 정의 단계

현황 분석, 이해관계자 요구 분석, 핵심 문제 정의

- 범위 설정 요소

기능적 범위, 비기능적 범위, 시스템 경계 정의, 프로젝트 제한 사항

🤔 범위 설정 기법
1. MoSCoW 기법
  - 요구사항을 Must have, Should have, Could have, Won't have으로 분류하여 우선순위를 결정한다.
2. WBS (Work Breakdown Structure)
  - 프로젝트를 세분화하여 각 단계의 범위를 명확히 정의한다.
3. Context Diagram
  - 시스템의 입력, 출력, 관계를 시각적으로 표현하여 프로젝트 범위를 정의한다.

 

👉🏻 요구사항 추출

수집된 정보를 바탕으로 핵심 요구사항을 분석하고 구체화하는 과정이다.

이는 프로젝트 성공의 중요한 단계이며, 요구사항을 올바르게 정의해야 개발 과정에서의 변경을 최소화할 수 있다.

 

요구사항 추출 과정

- 이해관계자 분석, 데이터 정제 및 구조화, 핵심 요구사항 도출, 우선순위 설정

🤔 이해관계자 요구사항 매트릭스
각 이해관계자가 요구사항을 정리하고 우선순위를 매기는 도구이다. 
이 매트릭스를 사용하면 여러 이해관계자가 제시한 요구사항을 비교하고, 각 요구사항의 중요도나 우선순위를 명확하게 정의할 수 있다. 이를 통해 효율적인 요구사항 관리가 가능해지며, 프로젝트가 정확한 방향으로 진행될 수 있다.
- 구성 요소: 이해관계자, 요구사항 ID, 요구사항 설명, 우선순위, 상호 관

 

주요 요구사항 수집 기법

- 인터뷰, 워크숍, 설문 조사, 브레인스토밍, 문헌 조사, 관찰

 

👉🏻 요구사항 문서화

1. 기능적 요구사항: 시스템이 수행해야 할 구체적인 기능 정의

2. 비기능적 요구사항: 성능, 보안, 유지보수성 등 시스템 품질 관련 요구사항

3. 사용자 스토리 및 유즈케이스: 실제 사용자 시나리오 기반 요구사항 설명

4. 요구사항 추적 매트릭스(RTM, Requirements Traceability Matrix): 요구사항 간 연관성을 추적하여 프로젝트 진행 중 변경을 관리

 

👉🏻 요구사항 검증 및 확인

1. 검토: 문서화된 요구사항을 이해관계자가 검토하여 오류 및 누락을 식별

2. 프로토타이핑: 초기 UI/UX 또는 시스템 시뮬레이션을 통해 요구사항을 시각적으로 검증

🤔 프로토타입
소프트웨어 개발의 초기 단계에서 중요한 도구로, 사용자 피드백을 빠르게 반영하고, 기능을 확인하는 데 매우 유용하다.
프로토타입을 활용하면 개발 과정에서 발생할 수 있는 오류를 최소화하고, 사용자와의 의사소통을 강화할 수 있다.

 

3. 테스트 기반 검증: 요구사항을 기반으로 초기 테스트 케이스를 작성하여 요구사항 충족 여부 확인

4. 모델링 및 시뮬레이션: 시스템 동작을 모델링하여 요구사항이 현실적으로 구현 가능한지 분

 

👉🏻 AI 서비스 요구사항 분석

인공지능(AI) 시스템을 개발하기 위한 필수 요구사항을 정의하는 과정이다.

AI 기반 서비스는 기존 소프트웨어와 달리 데이터 수집, 모델 선택, API 활용 등의 요소를 포함해야 한다.

 

1. 데이터 수집

  - AI 모델 학습을 위한 데이터의 유형 및 양을 결정

  - 데이터 전처리 및 정제 방법 정의

  - 개인정보 보호 및 윤리적 문제 고려

2. 모델 선택

  - AI 모델의 유형 결정 (ex. 딥러닝, 전통적인 머신러닝, 강화학습 등)

  - 사전 학습된 모델 활용 여부 검토

  - 모델 선택 기준(데이터 크기, 학습 속도, 비용, 성능 지표 - Precision, Recall, F1-score 등) 명확화

  - NIST AI 윤리 가이드라인 기반 모델 평가

3. API 필요성

  - 모델 배포 및 운영 방식 결정 (온프레미스 vs 클라우드)

  - 외부 API 연동 여부 검토 (ex. OpenAI API, Hugging Face 모델 활용 등)

  - API 성능 및 보안 고려 사항 정의 (ex. 인증 방식, 데이터 암호화 등)

 

 

  • 요구사항 관리

👉🏻 요구사항 합의

- 요구사항 문서화 검토, 우선순위 설정, 합의 도출, 변경 관리 프로세스 수립

👉🏻 요구사항 형상관리

- 버전 관리, 변경 이력 추적, 요구사항 베이스라인 설정, 요구사항 변경 승인 프로세스

👉🏻 요구사항 이력추적

- 추적 매트리스 작성, 변경 이력 기록, 요구사항 검증, 이해관계자 보고

🤔 요구사항 추적 매트릭스 (RTM, Requirement Traceability Matrix)
소프트웨어 개발 생애 주기 동안 요구사항의 추적성을 보장하기 위해 사용되는 도구이다.
이 매트릭스는 각 요구사항이 설계, 개발, 테스트 등의 단계에서 어떻게 반영되었는지를 추적하고, 요구사항이 제대로 구현되고 있는지 확인하는 데 도움을 준다.
- 구성 요소: 요구사항 ID, 요구사항 설명, 설계 문서, 개발 문서, 테스트 케이스, 테스트 결과, 상

 

 

2. 시스템 설계

 

  • 아키텍처 설계

👉🏻 설계 과정

- 요구사항 분석, 아키텍처 초안 작성, 세부 설계, 검토 및 개선

 

👉🏻 설계 원리

1. SOLID 원칙

2. 모듈화

3. 느슨한 결합

4. 고응집도

5. 확장성

6. 보안

→ 프로젝트 요구사항과 개발 환경을 고려하여 최적의 아키텍처 스타일로 설계안을 결정한다.

 

👉🏻 아키텍처 모델

1. MVC (Model-View-Controller)

  - '관심사 분리'를 통해 유지보수성과 확장성을 극대화한다.

  - 사용자가 많은 웹 애플리케이션에 적합하다.

  - Flask, Django, Spring, React-Redux 등 다양한 프레임워크에서 사용 가능하다.

 

2. Microservices Architecture

  - 기능별로 독립적인 서비스로 분리한 아키텍처이다.

  - 독립적으로 배포할 수 있는 서비스 기반 아키텍처 필요 시 사용할 수 있다.

  - 확장성이 중요한 경우 적합하다.

 

3. Layered Architecture

  - 대표적인 모듈화 설계 방식으로 계층별 역할 분리(데이터 계층, 비즈니스 로직 계층, 프레젠테이션 계층)가 명확하게 구분된다.

 

4. 클라이언트-서버 모델

  - 네트워크에서 클라이언트와 서버 간에 역할을 분리하여 통신하는 구조

  - 클라이언트와 서버를 독립적으로 관리할 수 있어 확장성, 유지보수성, 보안성이 뛰어남

  - 클라이언트-서버 모델은 웹, 모바일, 클라우드 기반 서비스에서 가장 널리 사용되는 아키텍처

 

5. 이벤트 기반 모델

  - 이벤트를 기반으로 시스템을 구성하는 비동기 메시징 아키텍처 패턴

 

6. 데이터 중심 모델

  - 데이터베이스가 중심이 되어 여러 서비스가 데이터를 공유하는 방식

  - 데이터를 시스템의 핵심 요소로 두고 설계하는 아키텍처 패턴

 

👉🏻 MLOps 자동화 파이프라인

MLOps (Machine Learning Operations)는 머신러닝 모델의 개발, 운영, 배포 자동화를 목표로 하는 프로세스이다.

CI/CD와 유사하지만, 모델 학습, 데이터 버전 관리, 모델 모니터링 등의 기능을 포함하고 있다.

Kubeflow, MLflow, Airflow, GitHub Actions, Docker, Kubernetes 등의 도구를 활용하여 자동화할 수 있다.

 

  • 설계 문서화

👉🏻 패키지 다이어그램

  - 시스템의 논리적 그룹화와 모듈 간의 관계를 나타내는 다이어그램으로, 객체 지향 설계에서 클래스를 패키지 단위로 묶어 관리하는 방식을 시각화한다.

  - 소프트웨어의 상위 구조(Architecture)를 구성하는 모듈 간의 의존 관계를 표현하므로 대규모 시스템, 멀티 레이어 구조, 마이크로서비스 시스템의 모듈 관계 이해에 효과적이다.

  - 주요 활용: 대규모 소프트웨어 시스템,. 모듈 단위 설계

 

👉🏻 배치 다이어그램

  - 시스템의 하드웨어 및 소프트웨어 구성 요소 배포를 나타내며, 서버, 네트워크, 데이터베이스 등의 물리적 배치를 표현한다.

  - 주요 활용: 클라우드 환경, 컨테이너 기반 배포 모델 (Kubernetes, Docker, Serverless, Edge AI)

 

👉🏻 아키텍처 문서화

  - 설계 결정 기록, 다이어그램 활용, 기능 및 비기능 요구사항 문서화, API 명세서

 

 

3. 객체 설계

 

  • 객체 설계 기초

👉🏻 클래스 다이어그램

객체 지향 시스템에서 클래스와 클래스 간의 관계를 시각적으로 표현하는 UML 다이어그램 중 하나이다.

 

👉🏻 클래스 가시성

public (+): 어디서든 접근 가능 (외부 클래스도 접근 가능)

private (-): 클래스 내부에서만 접근 가능 (외부에서 접근 불가)

protected (#): 클래스와 그 하위 클래스에서만 접근 가능

package (default, ~): 같은 패키지 내에서만 접근 가능

→ Python에서는 완전한 접근 제한이 불가능하며, private도 접근이 가능하므로 철저한 보호가 필요한 경우 별도 보안 설정이 필요하다.

 

👉🏻 연관 관계

연관 관계, 집합 관계, 합성 관계, 일반화 관계, 실체화 관계, 의존 관계

 

👉🏻 일반화 관계와 전체/부분 관계

1. 일반화 (Generation, 상속): 부모-자식 관계

2. 전체/부분 관계: 한 객체가 다른 객체를 포함하는 관계

3. 실체화 (Realization): 인터페이스가 구현되는 관계

 

👉🏻 LLM API와 객체 설계

주요 요소

1. Prompt Template 설계: 다양한 입력을 처리하는 객체 설계

2. Vector DB 연동 클래스 설계: 벡터 기반 검색을 활용한 데이터 관리

3. API 요청 및 응답 모델링 (Python에서는 requests, FastAPI, Pydantic 활용 가능)

 

 

  • 디자인 패턴

👉🏻 기본 패턴

디자인 패턴은 소프트웨어 설계에서 반복적으로 발생하는 문제를 해결하기 위한 일반적인 설계 방식이다.

디자인 패턴을 활용하면 코드의 재사용성을 높이고 유지보수성을 향상시킬 수 있다.

 

👉🏻 생성 패턴

객체의 생성과 초기화를 담당하는 패턴으로, 인스턴스 생성 방법을 효율적으로 관리한다.

1. 싱글턴 패턴: 애플리케이션에서 하나의 인스턴스만 존재하도록 보장

2. 팩토리 패턴: 객체 생성 로직을 캡슐화하여 유연한 객체 생성을 지원

3. 빌더 패턴: 복잡한 객체 생성을 단계별로 진행하여 가독성을 높임

4. 추상 팩토리 패턴: 관련 객체 그룹을 생성하는 패턴

5. 프로토타입 패턴: 기존 객체를 복사하여 새로운 객체를 생성

 

👉🏻 구조 패턴

객체 간의 관계를 조직화하고 효율적으로 관리하는 패턴이다.

1. 어댑터 패턴: 인터페이스가 다른 클래스 간의 호환성을 제공

2. 브리지 패턴: 구현과 인터페이스를 분리하여 독립적인 확장을 지원

3. 데코레이터 패턴: 기존 객체에 동적으로 기능을 추가하는 패턴

4. 컴포지트: 트리 구조처럼 객체를 계층적으로 구성 (ex. 폴더/파일)

5. 퍼사드: 복잡한 서브시스템을 단순화한 인터페이스 제공

6. 플라이웨이트: 공유 가능한 객체를 캐싱하여 메모리 절약

7. 프록시: 다른 객체에 대한 대리자 역할 (접근 제어, 로깅 등)

 

👉🏻 행위 패턴

객체 간의 상호작용 및 책임 분배를 정의하는 패턴이다.

1. 전략 패턴: 동적으로 알고리즘을 변경할 수 있도록 하는 패턴

2. 옵저버 패턴: 상태 변화에 따라 여러 객체에 알림을 전달하는 패턴

3. 커맨드 패턴: 실행 요청을 객체로 캡슐화하여 실행 로직을 분리

4. 상태 패턴: 상태에 따라 객체의 동작이 바뀌도록 구현

5. 템플릿 메서드 패턴: 알고리즘의 골격 정의, 일부 단계를 서브클래스에 위임

 

 

4. 테스트

 

  • 테스트 개요

소프트웨어 개발에서 테스트는 개발된 시스템이 올바르게 동작하는지 검증하는 과정이다. 테스트는 버그를 발견하고 품질을 보장하는 데 중요한 역할을 한다. 테스트 기법에는 여러 가지 방법이 있으며, AI 모델 성능 평가와 자동화 도구를 활용한 테스트도 포함된다.

 

👉🏻 테스트 목적

- 결함 발견, 소프트웨어 품질 보장, 개발 비용 절감, 유지보수성 향상

 

  • 블랙박스 테스트

내부 코드 구조를 고려하지 않고 입력과 출력만을 테스트하는 기법이다.

 

👉🏻 블랙박스 테스트 주요 기법

1. 동등 분할 테스트: 입력값을 여러 개의 그룹으로 나누어 대표값을 테스트

2. 경계값 분석: 입력값의 경계 영역을 집중적으로 테스트

3. 원인-결과 그래프: 입력 조건(원인)과 출력 동작(결과) 간의 관계를 그래프로 표현해 테스트 케이스 도출

4. 결정 테이블 테스트: 다양한 입력 조합에 대한 출력을 테스트하는 기법

5. 상태 전이 테스트: 시스템의 상태 변화에 따른 동작을 검증

6. 유스 케이스 테스트: 실제 사용자 시나리오나 업무 흐름을 기반으로 기능 테스트

 

  • 화이트박스 테스트

코드의 내부 구조, 로직, 흐름을 분석하여 테스트 케이스를 설계하는 기법으로, 주로 코드 커버리지 확보와 논리적 오류 탐지에 사용된다.

 

👉🏻 화이트박스 테스트 주요 기법

1. 문장(구문) 커버리지

2. 분기(결정) 커버리지

3. 조건 커버리지

4. 다중 조건(복합 조건) 커버리지

5. 루프 테스트

6. 기본 경로 테스트

 

  • 객체지향 테스트

객체 간의 상호 작용을 고려하여 테스트하는 기법이다.

 

👉🏻 객체지향 테스트 주요 기법

1. 클래스 테스트

2. 통합 테스트

3. 스레드 기반 테스트

4. 사용 기반 테스트

5. 확인 테스트

6. 시스템 테스트

 

  • 통합 및 시스템 테스트

👉🏻 통합 테스트

둘 이상의 클래스(또는 모듈)를 결하바여 객체 간 상호작용과 메시지 전달이 정상적으로 작동하는지를 테스트한다.

클래스 간 의존성, 인터페이스, 호출 순서, 데이터 전달 등을 검증하고 통합 시 발생할 수 있는 오류를 조기에 발견할 목적으로 테스트를 진행한다.

 

- 장점

  - 협력 객체 간 인터페이스 검증 가능

  - 단위 테스트로는 찾기 어려운 연동 오류/예외 흐름 탐지

  - 시스템 구조 안정성 확보

- 단점

  - 통합 범위가 커질수록 테스트 시나리오 복잡도 증가

  - 외부 시스템 연동 시, 테스트 환경 구성 부담 존재

 

👉🏻 시스템 테스트

개발된 모든 구성 요소(클래스, 모듈 등)를 하나로 통합한 후, 시스템 전체가 정상적으로 작동하는지 검증하는 최종 테스트 단계이다.

 

- 장점

  - 배포 전 전체 품질 보증 단계

  - 실사용 환경과 가장 유사한 테스트 시나리오

  - 기능 간 상호작용, 흐름상의 문제 파악 가능

- 단점

  - 테스트 대상이 크고 복잡해 설계/데이터 준비 부담 큼

  - 에러 발생 시, 단위/통합 수준까지 원인 추적 필요

 

  • 테스트 관리

👉🏻 테스트 관리의 목표

  - 테스트 계획 수립, 테스트 케이스 설계 및 추적, 결함 관리, 리스크 기반 테스트, 성과 측정, 테스트 리포팅

👉🏻 테스트 문서 종류

  - 테스트 계획서, 테스트 케이스, 테스트 시나리오, 결함 보고서, 테스트 요약 보고서

👉🏻 테스트 관리 도구

  - TestLink, Jira+Zephyr, qTest, PractiTest, Xray(Jira Plugin)

👉🏻 테스트 지표와 품질 측정

  - 테스트 커버리지, 결함 밀도, 테스트 성공률, 결함 누락률, 테스트 자동화율

 

  • 테스트 자동화 도구

👉🏻 테스트 자동화 도구 비교

JUnit (Java): 단위 테스트, 자동화 테스트 지원

Jest (JavaScript): 프론트엔드 및 백엔드 테스트 지원

PyTest (Python): 단순한 API부터 복잡한 시스템 테스트까지 지원

Selenium (다양한 언어): 웹 애플리케이션 UI 자동화 테스트

 

👉🏻 Python 테스트 자동화 도구: PyTest

간결한 문법 + 강력한 기능 + 다양한 플러그인을 갖춘 Python 테스트 프레임워크로, 단위 테스트, 통합 테스트, UI 테스트 (Selenium과 함께) 등 다양한 영역에서 사용된다.