4 분 소요

1. 소프트웨어의 품질이란?

소프트웨어 품질이란 명시된 요구사항 및 내재된 요구사항(반드시 명시하지 않아도 당연히 그럴 것이라고 가정하는 것들을 의미한다. 예를 들면, 동작 속도는 빨라야 한다.) 을 얼마나 잘 충족하는가를 나타내는 소프트웨어 특성의 총체이다. 소프트웨어 및 시스템 개발 과정에서 오류를 줄이고 소프트웨어의 품질을 향상하는 것이 중요하다. ISO 25010(소프트웨어 품질 모델을 정의하는 국제 표준)에서는 소프트웨어 품질 특성을 아래와 같이 정의하고 있다.

1. 기능성 (Functional Suitability): 요구 사항에 맞는 기능이 구현되었는지 확인
2. 신뢰성 (Reliability): 소프트웨어가 안정적으로 동작하고, 오류 없이 지속적인 성능을 제공하는 능력
3. 사용성 (Usability): 소프트웨어의 사용자가 인터페이스를 쉽게 이해하고 사용할 수 있는 정도
4. 효율성 (Performance Efficiency): 자원을 적절히 활용하면서 성능을 최적화하는 능력
5. 유지보수성 (Maintainability): 소프트웨어가 향후 수정, 업데이트, 기능 확장 등을 쉽게 할 수 있는 능력
6. 이식성 (Portability): 소프트웨어가 다양한 환경에서 실행될 수 있는 능력
7. 상호운영성 (Compatibility): 다른 시스템과의 상호적으로 연동하는 능력
8. 보안성 (Security): 소프트웨어가 외부의 위협으로부터 보호되고, 데이터 유출 방지 및 권한 관리가 철저히 이루어지는 정도

각각의 주특성에 대한 부특성과 설명은 Table 1.과 같다.

Table 1. 접기/펼치기
주특성 부특성 설명
기능성 기능 성숙도 (Functional Completeness) 명시된 요구사항의 구현 정도
기능 정확도 (Functional Correctness) 정의된 정밀도에 따라 정확하게 결과를 제공하는 정도
기능 타당성 (Functional Appropriateness) 사용자의 목적 달성에 소프트웨어가 도움을 주는 정도
효율성 시간 반응성 (Time-behavior) 기능 수행 시 응답 처리시간과 처리율이 요구사항을 충족시키는 정도
요소 활용 (Resource Utilization) 기능 수행 시 사용되는 자원의 유형 및 양이 요구사항을 만족시키는 정도
기억 용량 (Capacity) 제품 혹은 시스템 파라미터(최근 사용자 수, 통신 대역폭 등)의 최대 한계가 요구사항을 만족시키는 정도
호환성 공존성 (Co-existence) 다른 소프트웨어에 해로운 영향을 주지 않고 환경 및 자원을 공유하면서 요구된 기능을 효과적으로 수행하는 정도
상호 운용성 (Interoperability) 둘 혹은 그 이상의 시스템, 제품 혹은 구성요소가 정보를 교환하거나 교환된 정보를 이상 없이 사용할 수 있는 정도
사용성 타당성 식별력 (Appropriateness recognisability) 사용자의 요구에 적절한 기능인지 식별할 수 있는 정도
학습성 (Learnability) 사용자가 소프트웨어의 사용법을 배워 명시된 목적을 달성할 수 있는 정도
운용성 (Operability) 제품 혹은 시스템의 작동 및 제어를 쉽게 할 수 있는 정도
사용자 오류 보호 (User error protection) 소프트웨어가 발생한 오류로부터 사용자를 보호하는 정도 (버튼 비활성화, 알림 창 등)
사용자 인터페이스 미학 (User interface aesthetics) 사용자 인터페이스가 사용자에게 만족스러운 정도
접근성 (Accessibility) 연령과 장애에 관계없이 사용할 수 있는 정도
신뢰성 성숙성 (Maturity) 소프트웨어 구성요소가 표준적 환경에서 신뢰도 요구를 충족시키는 정도
가용성 (Availability) 사용자가 원하는 시간에 사용 및 접근이 가능한 정도
결점 완화 (Fault tolerance) 하드웨어 혹은 소프트웨어에 결함이 존재하더라도 시스템, 이를 극복하고 의도한 대로 동작하는 정도
회복 가능성 (Recoverability) 중단 및 실패 발생 시 제품 혹은 시스템이 데이터를 복구할 수 있는 정도
보안성 기밀성 (Confidentiality) 제품 혹은 시스템이 반드시 권한이 있는 데이터에만 접근 가능하도록 하는 정도
무결성 (Integrity) 시스템, 제품 혹은 구성요소가 컴퓨터 프로그램 혹은 데이터에 대해 무단으로 접근 혹은 변경되는 것을 방지하는 정도
부인 방지 (Non-repudiation) 사건 및 행위 후에 부인하지 못하도록 행동 및 사건에 대해 입증되는 정도
책임성 (Accountability) 시스템 내의 각 개인을 유일하게 식별하여 언제 어떠한 행동을 하였는지 기록하여 그 행위자를 추적할 수 있는 정도
진본성 (Authenticity) 사건 및 행동에 대해 행위자임을 증명할 수 있는 정도
유지보수성 모듈성 (Modularity) 최소의 영향을 가진 개별 구성요소로 구성된 정도
재사용성 (Reusability) 자산이 하나 이상의 시스템에서 사용될 수 있거나, 다른 자산을 구축하는 데 사용될 수 있는 정도
분석성 (Analyzability) 시스템 변화에 대해 어떠한 영향을 받는지 효과적이고 효율적으로 평가할 수 있는 정도
수정 가능성 (Modifiability) 제품 혹은 시스템이 장애 없이 효과적이고 효율적으로 수정될 수 있는 정도
시험 가능성 (Testability) 제품 혹은 시스템에 대해 테스트 기준을 효과적이고 효율적으로 수립할 수 있는 정도 또는 이들 기준을 만족하는지 효과적으로 테스트할 수 있는 정도
이식성 적용성 (Adaptability) 제품 혹은 시스템이 다른 하드웨어, 소프트웨어 혹은 기타 사용 환경에 효과적이고 효율적으로 적용될 수 있는 정도
설치성 (Installability) 제품 또는 시스템이 성공적으로 설치 및 제거될 수 있는 정도
대치성 (Replaceability) 제품이 동일한 환경에서 동일한 목적을 위해 다른 지정 소프트웨어 제품으로 대치될 수 있는 정도

Table 1. ISO 25010 Software Quality Characteristics and Sub-characteristics

2. 소프트웨어의 품질 지표

소프트웨어의 품질을 판단하는데 도움이 되는 일반적인 지표는 아래와 같다.

2.1 규모 관련 지표

1. 라인수(LOC: line of code): 보통, 공백을 제외한 라인 수를 의미
2. 주석 제외 라인 수: // 등의 주석을 제외한 라인 수를 의미
3. 주석 비율: 전체 코드 중, 주석이 차지하는 비율
주석이 많다고 좋은 것은 아니다. 주석없이 이해할 수 있도록 작성된 코드가 좋은 코드이다.
4. 함수 라인 수: 함수 내 라인의 수
특히, 함수 라인수가 길면 소스코드를 이해하기 어렵고, 테스트 하기 어렵다. 함수 라인의 수를 줄이기 위해 리팩토링을 수행한다. 리팩토링이란, 함수의 입/출력은 고정한 채 내부 로직을 개선하는 방법이다.

2.2 복잡도 관련 지표

1. 순한 복잡도: 함수의 제어 흐름이 얼마나 복잡한지를 의미하며, 분기문이 많을수록 복잡도가 높아진다.

2.3 의존성 관련 지표

1. 함수 별 호출하는 건수: 각각의 함수가 다른 함수를 호출하는 수
2. 함수 별 호출되는 건수: 각각의 함수가 다른 함수로 부터 호출되는 수
3. 변경 영향 비율: 하나의 함수가 변경되면 얼마나 코드에 영향을 주는가 4. 상호참조: 서로가 서로를 참조하는 형태
무한루프에 빠질 수 있기 때문에 상호참조하지 않도록 해야한다.
open source인 Doxygen을 사용하면 각각의 의존성을 다이어그램으로 확인할 수 있다.

2.4 기타

1. 코드 중복: 단순히 copy-past 한 코드를 의미
코드 중복은 유지보수와 리팩토링을 어렵게하며, 무엇보다도 결함까지 함께 복사한다.

3. Verification & Validation

Verification은 요구사항 명세서에 맞게 올바른 제품이 만들어졌는지 검증하는 것이다. 반면, Validation은 고객이 의도한 환경이나 사용 목적에 맞게 올바르게 만들어졌는지 검증하는 것이다. SW를 테스팅한다는 것은, V&V을 수행한다는 것을 의미한다.