애플리케이션 성능 개선

2022. 9. 12. 22:08정처기(실기)/애플리케이션 테스트 관리

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

 

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

  • 처리량(Throuput) : 애플리케이션이 주어진 시간에 처리할 수 있는 트랜잭션의 수,    웹 애플리케이션의 경우 시간당 페이지 수로 표현
  • 응답 시간 : 사용자 입력이 끝난 후, 애플리케이션의 응답 출력이 개시될 때까지의 시간, 애플리케이션의 경우 메뉴 클릭 시 해당 메뉴가 나타나기까지 걸리는 시간
  • 경과 시간 : 애플리케이션에 사용자가 요구를 입력한 시점부터 트랜잭션을 처리 후 그 결과의 출력이 완료될 때까지 걸리는 시간
  • 자원 사용률 : 애플리케이션이 트랜잭션을 처리하는 동안 사용하는 CPU 처리량, 메모리 사용량, 네트워크 사용량

 

2. 유형별 성능 분석 도구

- 성능 분석 도구는 애플리케이션의 성능을 점검하는 도구와 시스템 자원 사용량을 모니터링 하는 도구로 분류할 수 있다.

 

3. 성능 분석 도구 유형

도구 설명 지원환경
JMeter HTTP, FTP, LDAP 등 다양한 프로토콜을 지원하는 안전성, 확장성, 부하, 기능 테스트 도구 크로스 플랫폼
LoadUI UI를 통해 HTTP, JDBC 등 주로 웹 서비스를 대상으로 서버 모니터링을 지원하는 부하 테스트 도구 크로스 플랫폼
OpenSTA HTTP, HTTPS 지원하는 부하 테스트 및 생산품 모니터링 도구 윈도즈

 

▼시스템 모니터링 도구

도구 설명  
Scouter 단일 뷰 통합/실시간 모니터링, 튜닝에 최적화된 인프라 통합 모니터링 도구 크로스 플랫폼
Zabbix 웹기반 서버, 서비스, 애플리케이션 모니터링 도구 크로스 플랫폼

 

 

(2) 애플리케이션 성능 저하 원인

- 애플리케이션의 성능이 저하되는 원인은 크게 DB연결 및 쿼리 실행, 내부적인 요인과 외부적인 요인, 기타 환경 설정이나, 네트워크 등의 문제로 구분할 수 있다.

 

1. 데이터베이스 관련 성능 저하 원인

- 일반적으로 DB에 연결하기 위해 Connection 객체를 생성하거나 쿼리를 실행하는 애플리케이션 로직에서 성능 저하 또는 장애가 빈번하게 발견된다.

 

▼데이터베이스 관련 성능 저하 원인

구분 설명
데이터베이스 락 대량의 데이터 조회, 과도한 업데이트, 인덱스 생성 시 발생하는 현상
요청한 작업은 Lock의 해제 시까지 대기하거나 타임 아웃됨
불필요한 데이터베이스 패치 실제 필요한 데이터보다 많은 대량의 데이터 요청이 들어올 경우 응답시간 저하 현상 발생
결과 세트에서 마지막 위치로 커서를 옮기는 작업이 빈번한 경우 응답시간 저하 현상 발생
연결 누수 DB 연결과 관련한 JDBC 객체를 사용 후 종료하지 않을 경우 발생
부적절한 커넥션 풀 크기 너무 작거나 크게 설정한 경우 성능 저하 현상이 발생할 가능성 존재
확정 관련 트랜잭션이 확정되지 않고 커넥션 풀에 반환될 때 성능 저하 가능성 존재
잘못 작성된 코드로 인해 불필요한 확정이 자주 발생하는 경우 성능 저하 가능성 존재

 

2. 내부 로직으로 인한 성능 저하 원인

구분 설명
웹 애플리케이션의 인터넷 접속 불량 웹 애플리케이션의 실행 시 인터넷 접속 불량으로 서버 소켓 쓰기는 지속되나, 클라이언트에서 정상적 읽기가 수행되지 않을 경우 성능 저하 가능성 존재
특정 파일의 업로드,
다운로드로 인한 성능 저하
대량의 파일을 업로드하거나 다운로드할 경우 처리시간이 길어져서 애플리케이션의 성능 저하 가능성 존재
정상적으로 처리되지 않은 오류 처리로 인한 성능 저하 오류 처리 로직과 실제 처리 로직 부분을 분리하지 않고 코딩하거나 예외가 발생할 경우에 제대로 처리되지 않아 행이 걸리는 상황이 발생하여 성능 저하 가능성 존재

 

 

3. 외부 호출로 인한 성능 저하 원인

- 임의의 트랜잭션이 수행되는 동안 트랜잭션이 장시간 수행되거나, 타임아웃이 일어나는 경우 성능 저하 현상이 발생할 수 있다.

 

 

4. 잘못된 환경 설정이나 네트워크 문제로 인한 성능 저하 원인

  • 환경 설정으로 인한 성능 저하 : 스레드 풀, 힙 메모리의 크기를 너무 작게 설정하면 Heap Memory Full 현상 발생으로 성능 저하 가능성 존재
  • 네트워크 장비로 인한 성능 저하 : 라우터, L4 스위치 등 네트워크 관련 장비 간 데이터 전송 실패 또는 전송 지연에 따른 데이터 손실 발생 시 애플리케이션의 성능 저하 또는 장애 발생 가능성 존재

 

(3) 애플리케이션 성능 테스트 프로세스

테스트 목표 및 목표값을 설정하여 작성 -> 측정 항목을 기술하여 작성 -> 테스트 시나리오 작성 -> 사전 확인 사항 작성

 

1. 애플리케이션 성능 테스트 수행 절차

성능 테스트 도구 설치 -> 테스트 환경 설정 -> 시나리오 생성 -> 성능 테스트 실행 및 모니터링 

 

 

(4) 소스 코드 최적화

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

 

1. 배드 코드

- 다른 개발자가 로직을 이해하기 어렵게 작성된 코드이다.

- 처리 로직의 제어가 정제되지 않고 서로 얽혀 있는 스파게티 코드, 변수나 메소드에 대한 이름 정의를 알 수 없는 코드, 동일한 처리 로직이 중복되게 작성된 코드 등이 있다.

 

▼배드 코드 사례

사례 설명
외계인 코드 아주 오래되거나 참고문서 또는 개발자가 없어 유지보수 작업이 아주 어려운 코드
스파게티 코드 컴퓨터 프로그램의 소스 코드가 복잡하게 얽힌 모습을 스파게티의 면발에 비유한 표현
스파게티 코드는 작동은 정상적으로 하지만, 사람이 코드를 읽으면서 그 코드의 작동을 파악하기는 어려운 코드임
알 수 없는 변수명 변수나 메소드에 대한 이름 정의를 알 수 없는 코드
로직 중복 동일한 처리 로직이 중복되게 작성된 코드

 

▼배드 코드 유형

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

2. 클린 코드

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

- 중복 코드 제거로 애플리케이션의 설계가 개선된다.

- 가독성이 높으므로 애플리케이션의 기능에 대해 쉽게 이해할 수 있다.

- 버그를 찾기 쉬워지며, 프로그래밍 속도가 빨라진다.

 

▼ 클린 코드의 작성 원칙

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

 

(5) 소스 코드 품질분석

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

- 정적 분석 도구와 동적 분석 도구가 있다.

 

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

 

▼소스 코드 품질분석 도구

정적분석 도구

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

동적분석 도구

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

 

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

- 애플리케이션 개발 프레임워크의 코딩 표준을 설정하고, 인터페이스 클래스를 이용하여 느슨한 결합 코드를 구현한다.

- 인터페이스를 통해 추상화된 자료 구조를 구현하여 의존성을 최소화한다.