자격증/정보처리기사 📌 애플리케이션 테스트 관리 - 성능 분석/복잡도/성능 개선
  • 728x90
    반응형

     

    목차

       

      애플리케이션 성능

      📌 애플리케이션 성능이란 사용자가 요구한 기능을 최소한의 자원을 사용하여 최대한 많은 기능을 신속하게 처리하는 정도를 나타낸다.

       

      • 애플리케이션 성능 측정 지표
      처리량(Thoughput) 일정 시간 내에 애플리케이션이 처리하는 일의 양
      응답 시간 Response Time) 애플리케이션에 요청을 전달한 시간부터 응답이 도착할 때까지 걸린 시간
      경과 시간(Turn Around Time) 애플리케이션에 작업을 의뢰한 시간부터 처리가 완료될 때까지 걸린 시간
      자원 사용률(Resource Usage) 애플리케이션이 의뢰한 작업을 처리하는 동안의 CPU 사용량, 메모리 사용량, 네트워크 사용량 등 자원 사용률

       

      • 애플리케이션의 성능 분석 도구는 애플리케이션의 성능을 테스트 하는 도구와 시스템 모니터링 하는 도구로 분류된다.

       

      성능 테스트 도구

      📌 성능 테스트 도구는 애플리케이션의 성능을 테스트하기 위해 애플리케이션에 부하나 스트레스를 가하면서 애플리케이션의 성능 측정 지표를 점검하는 도구이다.

       

      • 종류
      도구명 도구 설명 지원 환경
      JMeter HTTP, FTP 등 다양한 프로토콜을 지원하는 부하 테스트 도구 Cross-Platform
      LoadUI - 서버 모니터링, Drag&Drop 등 사용자의 편리성이 강화된 부하 테스트 도구
      - HTTP, JDBC(Java Database Connectivity)등 다양한 프로토콜 지원
      Cross-Platform
      OpenSTA HTTP, HTTPS 프로토콜에 대한 부하 테스트 및 생산품 모니터링 도구 Windows

       

      💡 부하(Load) 테스트 : 애플리케이션에 일정 시간 동안 부하를 가하면서 반응을 측정하는 테스트
      💡 스트레스(Stress) 테스트 : 부하 테스트를 확장한 테스트로 애플리케이션이 과부하 상태에서 어떻게 작동하는지 테스트 함
      💡 Cross-Platform : 크로스 플랫폼(Cross Platform)은 "교차"를 뜻하는 "Cross"와 "Platform"의 합성어로, "다양한 플랫폼에서 사용할 수 있는"이라는 뜻을 가지고 있다.
      💡 HTTP(Hyper Text Transfer Protocol) : 인터넷에서 데이터를 주고받을 수 있는 프로토콜
      💡 HTTPS(Hyper Text Transfer Protocol Secure Socket) : 기본 골격이나 사용 목적 등은 HTTP와 거의 동일하지만, 데티터를 주고 받는 과정에 '보안'요소가 추가되었다는 것이 가장 큰 차이점이다. HTTPS를 사용하면 서버와 클라이언트 사이의 모든 통신 내용이 암호화 된다.

       

       

      시스템 모니터링(Monitoring) 도구

      📌 시스템 모니터링 도구는 애플리케이션이 실행되었을 때 시스템 자원의 사용량을 확인하고 분석하는 도구이다.

       

      • 시스템 모니터링 도구는 성능 저하의 원인 분석, 시스템 부하량 분석, 사용자 분석 등 시스템을 안정적으로 운영할 수 있는 기능을 제공한다.
      • 종류
      도구명 도구 설명 지원 환경
      Scouter - 단일 뷰 통합/실시간 모니터링, 튜닝에 최적화된 인프라 통합 모니터링 도구
      - 애플리케이션의 성능을 모니터링/통제하는 도구
      Cross-Platform
      Zabbix 웹 기반 서버, 서비스, 애플리케이션 등의 모니터링 도구 Cross-Platform

       

       

      애플리케이션 성능 저하 원인 분석

      📌 애플리케이션의 성능 저하 현상은 애플리케이션을 DB에 연결하기 위해 Connection 객체를 생성하거나 쿼리를 실행하는 애플리케이션 로직에서 많이 발생한다.

       

      • 다음은 애플리케이션의 성능 저하 현상을 발생시키는 주요 요인이다.
        • DB에 필요 이상의 많은 데이터를 요청한 경우
        • 데이터베이스의 락(DB Lock)이 해제되기를 기다리면서 애플리케이션이 대기하거나 타임 아웃된 경우
        • 커넥션 풀(Connection Pool)의 크기를 너무 작거나 크게 설정한 경우
        • JDBC나 ODBC같은 미들웨어를 사용한 후 종료하지 않아 연결 누수(Connection Leak)가 발생한 경우
        • 트랜잭션이 확정(Commit)되지 않고 커넥션 풀에 반환되거나, 잘못 작성된 코드로 인해 불필요한 Commit이 자주 발생하는경우
        • 인터넷 접속 불량으로 인해 서버 소켓(Server Socket)에 쓰기는 지속되나, 클라이언트에서 정상적인 읽기가 수행되지 않은 경우
        • 대량의 파일을 업로드 하거나 다운로드 하여 처리 시간이 길어진 경우
        • 트랜잭션 처리 중 외부 호출이 장시간 수행되거나 타임 아웃된 경우
        • 네트워크 관련 장비 간 데이터 전송이 실패하거나 전송 지연으로 인해 데이터 손실이 발생한 경우

       


       

      🎯 복잡도

       

      복잡도의 개요

      📌 복잡도(Complexity)는 시스템이나 시스템 구성 요소 또는 소프트웨어의 복잡한 정도를 나타내는 말로, 시스템 또는 소프트웨어를 어느 정도의 수준까지 테스트해야 하는지 또는 개발하는데 어느 정도의 자원이 소요되는지 예측하는데 사용된다.

       

      • 시스템의 복잡도가 높으면 장애가 발생할 수 있으므로 정밀한 테스트를 통해 미리 오류를 제거할 필요가 있다.
      • 주요 복잡도 측정 방법에는 LOC(Line Of Code), 순환 복잡도(Cyclomatic Complexity) 등이 있다.

       

      💡 LOC(Line Of Code) : 소프트웨어의 개발적인 기능에 대해 원시 코드 라인 수의 비관치, 낙관치, 기대치를 측정하여 예측치를 구하고 이를 이용하여 비용을 산정하는 기법이다.
      💡 순환 복잡도(Cyclomaitic Complexity) : 한 프로그램의 논리적인 복잡도를 측정하기 위한 소프트웨어의 척도로, 맥케이브 순환도(McCabe's Cyclomatic) 또는 맥케이브 복잡도 메트릭(McCabe's Complexity Metrics)라고도 하며, 제어 흘름도 이론에 기초를 두는 기법이다.

       

       

      시간 복잡도

      📌 시간 복잡도는 알고리즘의 실행시간, 즉 알고리즘을 수행하기 위해 프로세스가 수행하는 연산 횟수를 수치화한 것을 의미한다.

       

      • 시간 복잡도가 낮을수록 알고리즘의 실행시간이 짧고, 높을수록 실행시간이 길어진다.
      • 시간 복잡도는 알고리즘의 실행시간이 하드웨어적 성능이나 프로그래밍 언어의 종류에 따라 달라지기 때문에 시간이 아닌 명령어의 실행 횟수르 표기하는데, 이러한 표기법을 점근 표기법이라고 한다.
      • 점근 표기법의 종류
      빅오 표기법
      (Big-O Notation)
      - 알고리즘의 실행시간이 최악일 때를 표기하는 방법이다.
      - 입력 값에 대해 알고리즘을 수행했을 때 명령어의 실행 횟수는 어떠한 경우에도 표기 수치보다 많을 수 없다.
      세타 표기법
      (Big-𝜽 Notation)
      - 알고리즘의 실행시간이 평균일 때를 표기하는 방법이다.
      - 입력 값에 대해 알고리즘을 수행했을 때 명령어의 실행 횟수의 평균적인 수치를 표기한다.
      오메가 표기법
      (Big-𝝎 Notation)
      - 알고리즘의 실행시간이 최상일 때를 표기하는 방법이다.
      - 입력 값에 대해 알고리즘을 수행했을 때 명령어의 실행 횟수는 어떠한 경우에도 표기 수치보다 적을 수 없다.

       

       

      빅오 표기법 (Big-O Notation)

      📌 빅오 표기법은 알고리즘의 실행시간이 최악일 때를 표기하는 방법으로, 신뢰성이 떨어지는 오메가 표기법이나 평가하기 까다로운 세타 표기법에 비해 성능을 예측하기 용이하여 주로 사용된다.

       

      • 일반적인 알고리즘에 대한 최악의 시간 복잡도를 빅오 표기법으로 표현하면 다음과 같다.
      O(1) 입력 값(N)이 증가해도 실행시간은 동일한 알고리즘, index로 접근하여 바로 처리할 수 있는 연산 과정의 시간 복잡도 → 기본 연산 수라고 생각하면 편함
      예) 스택의 삽입(Push), 삭제(Pop)
      O(log n) 연산이 한 번 실행될 때 마다 데이터의 크기가 절반 감소하는 알고리즘(log의 지수는 항상 2)
      예) 이진 트리(Binary Tred), 이진 검색(Binary Seach)
      O(n) 문제 해결에 필요한 단계가 입력 값(n)과 1:1의 관계를 가진다. 입력 값(n)이 증가함에 따라 실행시간도 선형적으로 증가하는 알고리즘
      예) 1중 for문
      O(n log n) 문제 해결에 필요한 단계가 O(nlog2n)번만큼 수행된다.
      예) 힙 정렬(Heap Sort), 2-Way 합병(병합) 정렬(Merge Sort)
      O(n2승) 문제 해결에 필요한 단계가 입력 값(n)의 제곱만큼 수행된다.
      예) 삽입 정렬(Insertion sort), 쉘 정렬(Shell Sort), 선택 정렬(Selection Sort), 버블 정렬(Bubble Sort) 퀵 정렬(Quick Sort), 이중 for문
      O(2n승) 문제 해결에 필요한 단계가 2의 이벽 값(n) 제곱만큼 수행된다.
      예) 피보나치 수열(Fibonacci Sequence)

       

      • 왼쪽에서 오른쪽으로 갈수럭 효율성이 떨어진다.

       

       

      순환 복잡도

      📌 순환 복잡도(Cyclomatic Complexity)는 한 프로그램의 논리적인 복잡도를 측정하기 위한 소프트웨어의 척도로, 맥케이브 순환도(McCabe's Cyclomatic) 또는 맥케이브 복잡도 메트릭(McCabe's Complexity Metrics)라고도 하며, 제어 흐름도 이론에 기초를 둔다.

       

      • 순환 복잡도를 이용하여 계산된 값은 프로그램의 독립적인 경로의 수를 정의하고, 모든 경로가 한 번 이상 수행되었음을 보장하기 위해 행해지는 테스트 횟수의 상한선을 제공한다.
      • 제어 흐름도 G에서 순환 복잡도 V(G)는 다음과 같은 방법으로 계산할 수 있다.
        • 방법 1) 순환 복잡도는 제어 흐름도의 영역 수와 일치하므로 영역 수를 계산한다.
        • 방법 2) V(G) = E - N + 2 : E는 화살표 수, N은 노드의 수

       

      🔔 예제) 제어 흐름도가 다음과 같을 때 순환 복잡도(Cyclomatic Complexity)를 계산하시오.

       

      방법 1) 제어 흐름도에서 화살표로 구분되는 각 영역의 개수를 구하면 4이다.

       

       

      방법 2) 순환 복잡도 = 화살표의 수 - 노드의 수 + 2 이므로 11 - 9 + 2 = 4 

       


       

      🎯 애플리케이션 성능 개선

       

      소스코드 최적화

      📌 소스 코드 최적화는 나쁜 코드(Bad Code)를 배제하고, 클린 코드(Clean Code)로 작성하는 것이다.

       

      • 클린 코드(Clean Code) : 누구나 쉽게 이해하고 수정 및 추가할 수 있는 단순 명효한 코드, 즉 잘 작성된 코드를 의미한다.
      • 나쁜 코드(Bad Code) 
        • 프로그램의 로직(Logic)이 복잡하고 이해하기 어려운 코드로, 스파게티 코드와 외계안 코드가 여기에 해당한다.
        • 스파게티 코드(Spaghetti Code) : 코드의 로직이 서로 복잡하게 얽혀 있는 코드
        • 외계인 코드(Alien Code) : 아주 오래되거나 참고문서 또는 개발자가 없어 유지보수 작업이 어려운 코드
      • 클린 코드 작성 원칙
      가독성 - 누구든지 코드를 쉽게 읽을 수 있도록 작성한다.
      - 코드 작성 시 이해하기 쉬운 용어를 사용하거나 들여쓰기 기능 등을 사용한다.
      단순성 - 코드를 간단하게 작성한다.
      - 한 번에 한 가지를 처리하도록 코드를 작성하고 클래스/메소드/함수 등을 최소 단위로 분리 한다.
      의존성 배제 - 코드가 다른 모듈에 미치는 영향을 최소화한다.
      - 코드 변경 시 다른 부분에 영향이 없도록 작성한다.
      중복성 최소화 - 코드의 중복을 최소화한다.
      - 중복된 코드는 삭제하고 공통된 코드를 사용한다.
      추상화 상위 클래스/메소드/함수에서는 간략하게 애플리케이션의 특성을 나타내고, 상세 내용은 하위 클래스/메소드/함수 에서 구현한다.

       

       

      소스 코드 최적화 유형

      • 클래스 분할 배치 : 하나의 클래스는 하나의 역할만 수행하도록 응집도를 높이고, 크기를 작게 작성한다.
      • 느슨한 결합(Loosely Coupled) : 인터페이스 클래스를 이용하여 추상화된 자료 구조와 메소드를 구현함으로써 클래스 간의 의존성을 최소화 한다.
      • 코딩 형식 준수 : 코드 작성 시 다음의 형식을 준수한다.
        • 줄 바꿈 사용
        • 개념적 유사성이 높은 종속 함수 사용
        • 호출하는 함수는 선배치, 호출되는 함수는 후배치
        • 지역 변수는 각 함수의 맨 처음에 선언
      • 좋은 이름 사용 : 변수나 함수 등의 이름은 기억하기 좋은 이름, 발음이 쉬운 용어, 접두어 사용 등 기본적인 이름 명명 규칙(Naming Rule)을 정의하고 규칙에 맞는 이름을 사용한다.
      • 적절한 주석문 사용 : 소스 코드 작성 시 앞으로 해야 할 일을 기록하거나 중요한 코드를 강조할 때 주석문을 사용한다.

       

      💡 응집도 : 명령어나 호출문 등 모듈의 내부 요소들이 서로 관련되어 있는 정도, 즉 모듈이 독립적인 기능으로 정의되어 있는 정도를 의미한다.
      💡 인터페이스 클래스 : 클래스나 객체의 사용 방법을 정의한 것으로 개발 코드와 클래스 사이에서 통신 역할을 한다. 개발 코드가 클래스의 메소드를 직접 호출하지 않고 중간 매체인 인터페이스 클래스를 사용하는 이유는 개발 코드를 수정하지 않고 실행 내용이나 리턴 값을 다양하게 변경할 수 있기 때문이다. 이럴 경우 클래스를 직접 사용하지 않으므로 클래스 간 의존성이 줄어든다.
      💡 추상화는 불필요한 부분을 생략하고 객체의 속성 중 가장 중요한 것에만 중점을 두어 개략화하는 것, 즉 모델화 하는 것이다.

       

       

      소스 코드 품질 분석 도구

      📌 소스 코드 품질 분석 도구는 소스 코드의 코딩 스타일, 코드에 설정된 코딩 표준, 코드의 복잡도, 코드에 존재하는 메모리 누수 현상, 스레드 결함 등을 발견하기 위해 사용하는 분석 도구로, 크게 정적 분석 도구와 동적 분석 도구로 나뉜다.

       

      • 정적 분석 도구
        • 작성한 소스 코드를 실행하지 않고 코딩 표준이나 코딩 스타일, 결함 등을 확인하는 코드 분석 도구이다.
        • 비교적 애플리케이션 개발 초기의 결함을 잧는데 사용되고, 개발 완료 시점에서는 개발된 소스 코드의 품질을 검증하는 차원에서 사용된다.
        • 자료 흐름이나 논리 흐름을 분석하여 비정상적인 패턴을 찾을 수 있다.
        • 동적 분석 도구로는 발견하기 어려운 결함을 찾아내고, 소스 코드에서 코딩의 복잡도, 모델 의존성, 불일치성 등을 분석할 수 있다.
        • 종류 : pmd, cppcheck, SonarQube, checkstyle, ccm, cobertura 등
      • 동적 분석 도구
        • 작성한 소스 코드를 실행하여 코드에 존재하는 메모리 누수, 스레드 결함 등을 분석하는 도구이다.
        • 종류 : Avalanche, Valgrind 등

       

      💡 스레드 ?  프로세스 내에서의 작업 단위로서 시스템의 여러 자원을 할당 받아 실행하는 프로그램의 단위를 의미한다.

       

       

      소스 코드 품질 분석 도구의 종류

      도구 설명 지원 환경
      pmd 통상적으로 자바 소스 코드에 대한 미사용 변수, 최적화 되지 않은 코드 등 결함을 유발할 수 있는 코드를 검사한다. Linux, Windows
      cppcheck C/C++ 코드에 대한 메모리 누수, 오버플로우 등 분석 Windows
      SonarQube 중복 코드, 복잡도, 코딩 설계, 개발된 코드의 지속적인 인스팩션을 통해 품질 목표를 달성 등을 분석하는 소스 분석 통합 플랫폼 Cross-Platform
      checkstyle - 자바 코드에 대해 소스 코드 표준을 따르고 있는지 검사하낟.
      - 다양한 개발 도구에 통합하여 사용 가능하다.
      Cross-Platform
      ccm 다양한 언어의 코드 복잡도를 분석한다. Cross-Platform
      cobertura 자바 언어의 소스 코드 복잡도 분석 및 테스트 커버리지를 측정한다. Cross-Platform
      Avalanche - Valgrind 프레임 워크 및 STP 기반으로 구현된다.
      - 프로그램에 대한 결함 및 취약점 등을 분석한다.
      Linux, Android
      Valgrind 프로그램 내에 존재하는 메모리 누수 및 스레드 결함 등을 분석한다. Cross-Platform

       

       

       

      728x90
      반응형
    상단으로