본문 바로가기
정보처리/소프트웨어개발

애플리케이션 테스트 관리 성능 개선

by 피갓자 2025. 5. 4.

애플리케이션 테스트 관리 성능 개선

애플리케이션 성능 분석

애플리케이션 성능 점검 개요

애플리케이션 성능 측정 지표

리량(Throughput)

  • 애플리케이션이 주어진 시간에 처리할 수 있는 트랜잭션의 수
  • 웹 애플리케이션의 경우 시간당 페이지 수로 표현

답 시간(Response Time)

  • 사용자 입력이 끝난 후, 애플리케이션의 응답 출력이 개시될 때까지의 시간
  • 애플리케이션의 경우 메뉴 클릭 시 해당 메뉴가 나타나기까지 걸리는 시간

과 시간(Turnaround Time)

  • 애플리케이션에 사용자가 요구를 입력한 시점부터 트랜잭션을 처리 후 그 결과의 출력이 완료할 때까지 걸리는 시간

원 사용률(Resource Usage)

  • 애플리케이션이 트랜잭션을 처리하는 동안 사용하는 CPU 사용량, 메모리 사용량, 네트워크 사용량

유형별 성능 분석 도구

성능/부하/스트레스(Performance/Load/Stress) 점검 동구

  • 애플리케이션의 성능 점검을 위해 가상의 사용자를 점검 도구 상에서 인위적으로 생성한 뒤, 시스템의 부하나 스트레스를 통해 성능 측정 지표인 처리량, 응답 시간, 경과 시간 등을 점검하기 위한 도구

모니터링(Monitoring) 도구

  • 애플리케이션 실행 시 자원 사용량을 확인하고 분석할 수 있는 도구
  • 성능 모니터링, 성능 저하 원인 분석, 시스템 부하량 분석, 장애 진단, 사용자 분석, 용량 산정 등의 기능을 제공하여, 시스템의 안정적 운영을 지원하는 도구

애플리케이션 성능 개선

소스 코드 최적화의 이해

  • 읽기 쉽고 변경 및 추가가 쉬운 클린 코드를 작성하는 것으로, 소스 코드 품질을 위해 기본적으로 준수해야 할 원칙과 기준을 정의

배드 코드(Bad Code)

배드 코드 개념

  • 다른 개발자가 로직(Logic)을 이해하기 어렵게 작성된 코드
  • 처리 로직의 제어가 정제되지 않고 서로 얽혀 있는 스파게티 코드, 변수나 메서드에 대한 이름 정의를 알 수 없는 코드, 동일한 처리 로직이 중복되게 작성된 코드 등이 있음

배드 코드 사례

외계인 코드(Alien Code)

  • 아주 오래되거나 참고 문서 또는 개발자가 없어 유지보수 작업이 아주 어려운 코드

스파게티 코드(Spaghetti Code)

  • 컴퓨터 프로그램의 소스 코드가 복잡하게 얽힌 모습을 스파게티의 면발에 비유한 표현
  • 작동은 정상적으로 하지만, 사람이 코드를 읽으면서 그 코드의 작동을 파악하기는 어려운 코드

알 수 없는 변수명

  • 변수나 메서드에 대한 이름 정의를 알 수 없는 코드

로직 중복

  • 동일한 처리 로직이 중복되게 작성된 코드

배드 코드 유형

  • 오염 : 비즈니스 기능을 수행하지 못하는 많은 컴포넌트가 존재
  • 문서 부족 : 현재 코드와 문서가 일치하지 않고 수정과 변경을 위한 도메인 지식은 많이 증가하지만, 개발자의 지식부 족 초래
  • 의미 없는 이름 : 함수, 클래스(Class), 컴포넌트(Component) 이름들이 명확한 의미가 없거나 실제 작동과 불일치
  • 높은 결합도 : 클래스와 컴포넌트 간에 데이터와 컨트롤 흐름이 네트워크로 복잡하게 연결
  • 아키텍처 침식 : 아키텍처가 더 이상 구별되지 않고 여러 솔루션으로 이루어져 아키텍처상 변형들로 인해 시스템 품질이 떨어짐

클린 코드(Clean Code)

클린 코드 개념

  • 잘 작성되어 가독성이 높고, 단순하며, 의존성을 줄이고, 중복을 최소화하여 깔끔하게 잘 정리된 코드

클린 코드 특징

  • 중복 코드 제거로 애플리케이션의 설계가 개선됨
  • 가독성이 높으므로 애플리케이션의 기능에 대해 쉽게 이해할 수 있음
  • 버그를 찾기 쉬워지며, 프로그래밍 속도가 빨라짐

클린 코드 작성 원칙

  • 독성 : 이해하기 쉬운 용어를 사용, 코드 작성 시 들여쓰기 기능을 사용
  • 순성 : 한 번에 한 가지 처리만 수행, 클래스/메서드/함수를 최소 단위로 분리
  • 존성 최소 : 영향도를 최소화, 코드의 변경이 다른 부분에 영향이 없게 작성
  • 복성 제거 : 중복된 코드를 제거, 공통된 코드를 사용
  • 상화 : 클래스/메서드/함수에 대해 동일한 수준의 추상화 구현, 상세 내용은 하위 클래스/메서드/함수에서 구현

소스 코드 최적화 기법의 유형(클린 코드의 유형)

의미 있는 이름

  • 변수나 클래스, 메서드 명을 의도가 분명한 이름(사용 용도, 작업명)으로 사용
  • 클래스는 행위의 주체로 명시나 명사구로 표현하고 함수 이름은 클래스가 행하는 행위로 동사 또는 동사구 사용

간결하고 명확한 주석

  • 주석이 필요한 경우 최대한 간결하고 명확하게 작성
  • 코드 안에 변경이력이나 저자 등의 기록은 형상 관리 도구를 사용
  • 코드를 처음 접하는 사람이 궁금한 점에 대해 주석 작성

보기 좋은 배치

  • 읽는 사람이 편하게 읽을 수 있도록 구성
  • 반복되는 구문은 새로운 함수로 정리하고 배열을 정리하여 읽기 쉽게 리팩토링

작은 함수

  • 함수는 가급적으로 작게 만들고 If문이나 While문 안의 내용은 한 줄로 처리 되도록 작성
  • 함수 하나당 하는 일은 하나만 하도록 선언하고 중복이 없도록 작성

읽기 쉬운 제어 흐름

  • 조건, 루프, 흐름을 통제하는 선언문이 코드에 있으면 코드가 읽기 어려움
  • If/Else 조건문에서 인수의 순서는 긍정적이고 간단한 내용을 앞쪽에 배치

오류 처리

  • 오류 코드의 반환보다 예외 처리를 활용
  • 메서드는 널(Null)을 전달하거나 반환하지 말고, 널(Null) 체크 코드 작성

클래스 분할 배치

  • 클래스는 하나의 역할, 책임만 수행할 수 있도록 응집도를 높이고, 크기를 작게 작성

느슨한 결합(Loosely Coupled) 기법 적용

  • 클래스의 자료 구조, 메서드를 추상화할 수 있는 인터페이스 클래스를 이용하여, 클래스 간의 결합도(의존성) 최소화

코딩 형식 기법 적용

  • 줄 바꿈으로 개념을 구분, 종속(개념적 유사성 높음) 함수를 사용, 호출하는 함수를 먼저 배치하고 호출되는 함수는 나중에 배치
  • 변수 선언 위치를 지역 변수는 각 함수 맨 처음에 선언할 때 사용하는 등의 형식 적용

소스 코드 품질분석

소스 코드 품질분석 개념

  • 소스 코드에 대한 코딩 스타일, 설정된 코딩 표준, 코드의 복잡도, 코드 내에 존재하는 메모리 누수 현황, 스레드의 결함 등을 발견하기 위한 활동

소스 코드 품질분석 도구 유형

  • 정적 분석 도구 : 작성된 소스 코드를 실행시키지 않고, 코드 자체만으로 코딩 표준 준수 여부, 코딩 스타일 적정 여부, 잔존 결함 발견 여부를 확인하는 코드 분석 도구
  • 동적 분석 도구 : 애플리케이션을 실행하여 코드에 존재하는 메모리 누수 현황을 발견하고, 발생한 스레드의 결함 등을 분석하기 위한 도구

소스 코드 품질분석 도구

정적 분석 도구

  • pmd : 자바 및 타 언어 소스 코드에 대한 버그, 데드코드 분석
  • cppcheck : C/C++ 코드에 대한 메모리 누수, 오버플로 등 문제 분석
  • SonarQube : 소스 코드 품질 통합 플랫폼, 플러그인 확장가능
  • checkstyle : 자바 코드에 대한 코딩 표준검사 도구
  • ccm : 다양한 언어의 코드 복잡도 분석 도구, 리눅스, 맥 환경 CLI 형태 지원
  • cobertura : jcoverage 기반의 테스트 커버리지 측정 도구

동적 분석 도구

  • Avalanche : Valgrind 프레임워크 및 STP 기반 소프트웨어 에러 및 취약점 동적 분석 도구
  • Valgrind : 자동화된 메모리 및 스레드 결함 발견 분석 도구

애플리케이션 성능 개선 방안

소스 코드 최적화 기법 적용

  • 애플리케이션 개발 프레임워크의 코딩 표준을 설정하고, 인터페이스 클래스를 이용하여 느슨한 결합(Loosely Coupled) 코드를 구현
  • 인터페이스를 통해 추상화된 자료 구조를 구현하여 의존성을 최소화

아키텍처 조정을 통한 성능 개선

  • 객체의 생성과 사용을 분리함으로써 소프트웨어의 의존성을 최소화하기 위하여 팩토리 메서드(Factory Method) 패턴을 이용하여 성능 개선 방안을 수행

프로그램 호출 순서 조정 적용

  • 호출하는 함수를 먼저 코딩하고, 호출되는 함수는 나중에 배치하여 애플리케이션의 성능을 개선
  • 서로 연관된 내용은 세로로 가깝게 작성함으로써 밀집도를 높이고, 유사성이 높은 함수나 코드끼리 가깝게 배치

소스 코드 품질분석 도구 활용

메모리 사용 최소화 적용

  • String 클래스를 StringBuffer 또는 StringBuilder 클래스로 수정하여 코딩
  • 루프 내 불필요한 메서드의 호출이 반복되지 않도록 코딩

입출력 발생 최소화 적용

  • 문자 입력 스트림 또는 파일 정보를 읽어올 때 버퍼(Buffer)를 사용하거나, BufferedReader를 사용하여, 입출력 발생 최소화를 통해서 성능을 개선

System.out.println()을 사용 제외

  • 파일, 콘솔에 로그를 남기면 애플리케이션 대기 시간이 발생
  • 이에 대응하여 Log4j 로거를 사용함으로써 성능을 개선

리팩토링을 통한 성능 개선

리팩토링(Refactoring)의 개념

  • 유지보수 생산성 향상을 목적으로 기능을 변경하지 않고, 복잡한 소스 코드를 수정, 보완하여 가용성 및 가독성을 높이는 기법
  • 소프트웨어 모듈의 외부적 기능은 수정하지 않고 내부적으로 구조, 관계 등을 단순화하여 소프트웨어의 유지보수성을 향상하는 기법

리팩토링의 목적

  • 유지보수성 향상 : 복잡한 코드의 단순화, 소스의 가독성 향상
  • 유연한 시스템 : 소프트웨어 요구사항 변경에 유연한 대응
  • 생산성 향상 : 정제 및 최적화된 소스의 재사용
  • 품질향상 : 소프트웨어 오류 발견이 용이하여 품질향상