소프트웨어 품질보증

**소프트웨어 품질 보증**(영어: Software Quality Assurance, SQA)은 소프트웨어 개발의 전 과정에 걸쳐 소프트웨어가 미리 정해진 요구사항과 표준을 만족하는지를 보장하기 위한 체계적인 활동의 총체이다. 이는 단순히 개발 완료 후의 테스트에 국한되지 않으며, 요구사항 분석부터 설계, 코딩, 테스트, 배포 및 유지보수에 이르는 소프트웨어 개발 생명 주기의 모든 단계에 관여하여 오류를 예방하고 제품의 신뢰성을 높이는 것을 목표로 한다.

## 개요
소프트웨어 품질 보증은 최종 제품의 품질을 검증하는 **품질 관리**와는 다른 개념이다. QC가 주로 테스트를 통해 제품의 결함을 찾아내는 활동에 집중한다면, SQA는 결함이 발생하지 않도록 개발 프로세스 자체를 개선하고 관리하는 데 중점을 둔다. 즉, SQA는 "올바른 제품을 올바르게 만들고 있는가"를 지속적으로 확인하는 프로세스 중심의 접근 방식이라 할 수 있다.

SQA의 주요 목표는 다음과 같다.

* 소프트웨어 개발 프로세스의 계획, 실행, 감독 및 개선
* 정의된 표준, 절차, 방법론의 준수 여부 확인
* 소프트웨어 제품 및 관련 산출물이 설정된 요구사항을 충족하는지 검증
* 품질 관련 데이터를 수집, 분석하여 경영진과 개발팀에 피드백 제공

## 역사
소프트웨어 품질 보증의 개념은 20세기 중반 제조업의 품질 관리 원칙에서 유래했다. 특히 W. 에드워즈 데밍과 조지프 M. 주란이 정립한 통계적 공정 관리와 같은 원칙이 초기 SQA 사상의 기반이 되었다.

# **1950-60년대:** 소프트웨어는 주로 하드웨어의 부속품으로 취급되었고, 품질 보증은 디버깅이나 기초적인 테스트 수준에 머물렀다.
# **1970년대:** 소프트웨어 위기가 대두되면서, 소프트웨어 공학의 중요성이 부각되었다. 이 시기에 배리 보임은 그의 저서 소프트웨어 공학 경제학에서 개발 초기 단계에 결함을 발견하고 수정하는 것이 후반 단계보다 비용이 기하급수적으로 적게 든다는 것을 데이터로 증명하여, 예방적 품질 활동의 경제적 중요성을 확립했다.
# **1980년대:** 카네기 멜런 대학교의 소프트웨어 공학 연구소에서 개발한 **[[CMMI|역량 성숙도 모델]]**이 발표되었다. 이는 조직의 소프트웨어 개발 프로세스 성숙도를 평가하고 개선하기 위한 프레임워크를 제공하여, SQA를 프로세스 중심으로 전환하는 계기가 되었다.
# **1990-2000년대:** ISO 9000과 같은 국제 표준이 소프트웨어 산업에도 적용되기 시작했으며, 테스트 자동화 도구가 보급되면서 SQA의 효율성이 증대되었다. 애자일 방법론의 등장으로 SQA는 특정 단계에 국한되지 않고 개발 주기 전반에 걸쳐 지속적으로 통합되는 형태로 발전했다.
# **2010년대 이후:** 데브옵스 문화가 확산되면서 개발(Dev), 운영(Ops), 그리고 품질 보증이 긴밀하게 통합되는 **DevTestOps** 또는 **QAOps** 개념이 등장했다. 인공지능과 기계 학습 기술이 테스트 케이스 생성, 결함 예측, 테스트 결과 분석 등에 활용되며 SQA의 지능화가 이루어지고 있다.

## 주요 개념과 원칙

### 품질 표준
소프트웨어 품질을 평가하는 대표적인 국제 표준은 ISO/IEC 25010이다. 이 표준은 소프트웨어 품질을 '제품 품질'과 '사용 중 품질' 두 가지 관점에서 정의한다.

### 확인과 검증
SQA에서 가장 핵심적인 두 가지 활동은 확인(Verification)과 검증(Validation)이며, 종종 V-모델로 시각화된다.

* **확인:** "Are we building the product right?" (우리가 제품을 올바르게 만들고 있는가?) - 개발 과정이 표준과 명세를 잘 따르고 있는지를 확인하는 활동이다. 주로 코드 검토, 설계 검토, 정적 분석 등이 포함된다.
* **검증:** "Are we building the right product?" (우리가 올바른 제품을 만들고 있는가?) - 완성된 제품이 사용자의 실제 요구사항과 기대를 충족하는지를 확인하는 활동이다. 주로 기능 테스트, 사용자 인수 테스트 등이 포함된다.

### 결함 관리
결함 관리는 결함을 식별, 기록, 추적, 수정하고 보고하는 일련의 과정이다. 일반적인 결함 수명 주기는 다음과 같다.

* **신규:** 결함이 처음 보고된 상태.
* **할당:** 결함이 개발자에게 수정하도록 할당된 상태.
* **진행 중:** 개발자가 결함을 수정하고 있는 상태.
* **수정됨:** 개발자가 수정을 완료한 상태.
* **재테스트:** QA 엔지니어가 수정 사항을 검증하기 위해 대기하는 상태.
* **검증됨:** 수정이 올바르게 되었음을 확인한 상태.
* **종료:** 결함이 완전히 해결되어 종료된 상태.
* **보류** 또는 **거부**: 결함의 우선순위가 낮거나, 결함이 아니라고 판단될 경우.

## 방법론 및 기법
SQA 활동은 크게 정적 기법과 동적 기법으로 나뉜다.

### 정적 기법
소프트웨어를 실행하지 않고 품질을 검증하는 방법이다. 개발 초기에 결함을 발견할 수 있어 비용 효율적이다.

* **검토:**
** **코드 검토:** 동료 개발자들이 소스 코드를 검토하여 오류, 안티패턴, 표준 미준수 등을 찾아내는 활동이다. Gerrit이나 GitHub의 Pull Request 기능이 널리 사용된다.
** **워크스루:** 개발자가 주도하여 산출물을 설명하고, 동료들로부터 피드백을 받는 비공식적 검토 회의이다.
** **인스펙션:** 훈련된 중재자가 주도하는 매우 공식적이고 체계적인 검토 과정으로, 사전에 정의된 규칙과 체크리스트를 사용한다.
* **정적 분석:** 정적 분석 도구를 사용하여 소스 코드나 컴파일된 코드를 분석하고 코딩 표준 위반, 잠재적 보안 취약점, 메모리 누수 등의 문제를 자동으로 찾아내는 기법이다. 대표적인 도구로는 SonarQube, PMD, Checkstyle 등이 있다.

### 동적 기법
소프트웨어를 직접 실행하여 동작을 확인하고 결함을 찾아내는 방법이다.

### 프로세스 개선 모델

* **[[CMMI|역량 성숙도 모델 통합]]:** 조직의 개발 프로세스 품질과 성숙도를 5단계로 평가하고 개선 방향을 제시하는 모델이다.
* **테스트 성숙도 모델 통합:** CMMI를 기반으로 테스트 프로세스의 성숙도를 평가하고 개선하기 위한 모델이다.

## 산업 동향 및 최신 접근법

### 시프트 레프트 테스팅
전통적인 폭포수 모델에서는 테스트가 개발 주기의 후반부에 위치했지만, 시프트 레프트는 품질 보증 활동을 개발 주기의 초기 단계로 이동시키는 것을 의미한다. 요구사항 분석 및 설계 단계부터 테스트를 시작하고, 개발과 동시에 지속적인 테스트를 수행하여 결함을 조기에 발견하고 수정 비용을 절감하는 접근법이다. 이는 애자일 및 데브옵스 환경의 핵심 원칙 중 하나이다.

### 테스트 자동화
반복적인 테스트 케이스(예: 회귀 테스트)를 자동화하여 테스트의 속도, 정확성, 커버리지를 높이는 방식이다. Selenium, Cypress, UI 자동화, Postman, API 자동화 등의 도구가 널리 사용된다. 테스트 자동화는 지속적 통합과 지속적 배포 파이프라인의 필수 요소로 자리 잡았다.

### AI 및 머신러닝의 활용
인공지능과 머신러닝 기술이 SQA에 점차 도입되고 있다.

* **예측 분석:** 과거 결함 데이터를 학습하여 어떤 코드 영역에서 결함이 발생할 확률이 높은지 예측한다.
* **자동 테스트 케이스 생성:** 요구사항 명세나 사용자 행동 패턴을 분석하여 테스트 케이스를 자동으로 생성한다.
* **시각적 회귀 테스트:** AI를 사용하여 UI의 시각적 변화를 감지하고 의도치 않은 변경을 찾아낸다. Applitools와 같은 도구가 대표적이다.
* **로그 분석 및 이상 탐지:** 대규모 로그 데이터를 분석하여 시스템의 비정상적인 동작이나 잠재적 오류를 자동으로 탐지한다.

## 같이 보기

* 소프트웨어 공학
* 소프트웨어 테스트
* 데브옵스
* 애자일 소프트웨어 개발
* 지속적 통합
* CMMI

## 각주


분류:품질
분류:품질 보증
분류:소프트웨어 품질
분류:IEEE 표준