애플리케이션 성능 분석
애플리케이션 성능 점검 개요
애플리케이션 성능 측정 지표
처리량(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)의 개념
- 유지보수 생산성 향상을 목적으로 기능을 변경하지 않고, 복잡한 소스 코드를 수정, 보완하여 가용성 및 가독성을 높이는 기법
- 소프트웨어 모듈의 외부적 기능은 수정하지 않고 내부적으로 구조, 관계 등을 단순화하여 소프트웨어의 유지보수성을 향상하는 기법
리팩토링의 목적
- 유지보수성 향상 : 복잡한 코드의 단순화, 소스의 가독성 향상
- 유연한 시스템 : 소프트웨어 요구사항 변경에 유연한 대응
- 생산성 향상 : 정제 및 최적화된 소스의 재사용
- 품질향상 : 소프트웨어 오류 발견이 용이하여 품질향상
'정보처리 > 소프트웨어개발' 카테고리의 다른 글
인터페이스 구현 기능 구현 1/2 (1) | 2025.05.06 |
---|---|
인터페이스 구현 설계 확인 (1) | 2025.05.05 |
애플리케이션 테스트 관리 통합 테스트 2/2 (0) | 2025.05.03 |
애플리케이션 테스트 관리 통합 테스트 1/2 (0) | 2025.05.02 |
애플리케이션 테스트 관리 테스트 케이스 설계 4/4 (0) | 2025.05.01 |