소스 코드의 품질을 분석하고 관리하여 Clean Code 상태를 유지하도록 도와주는 오픈 소스 정적 코드 분석 플랫폼이다.
[!정적분석 도구란?]
Static Code Analysis Tools로 다음과 같은 기능을 한다.
- 컴파일 단계에서 수행하며 SW 코드의 정적 특성을 분석하여 버그, 보안 취약점, 성능 문제 등 발견
- 소스 코드의 구조, 흐름, 변수 등을 분석하여 잠재적 문제 식별
- SW 코드의 안정성, 신뢰성, 효율성을 향상하는데 효과적으로 동작
SonarQube에서 이야기하는 Clean Code는 다음과 같이 일관성, 의도성, 적응성, 책임감이라는 속성을 지니고 있다.
SonarQube에서는 Clean Code 상태를 유지하기 위해 어떤 방식으로 소스 코드를 분석하는지 알아보자.
SonarQube의 주요 기능은 다음과 같다.
SonarQube는 Clean Code를 방해하는 코드의 문제를 식별하는 것을 목표로 코드를 분석한다.
위 그림은 다음과 항목들을 기반으로 소프트웨어 품질 향상에 기여하는 것을 목표로 분석한다.
분석 과정의 주요 단계는 다음과 같다.
SonarScanner
시작SonarScanner
가 로컬 저장소를 스캔하여 분석할 파일을 결정SonarScanner
가 식별하여 해당 언어 분석기
에 분석 요청언어 분석기
는 분석할 파일을 검색하여 사전 구성된 품질 프로필
에 따라 분석SonarScanner
로 전송하고, SonarScanner
는 이를 보고서 형태로 SonarQube
서버로 전달SonarQube
서버는 비동기적으로 분석 결과를 계산하여 최종 결과 출력제품 플랜에 따라 지원하는 언어의 종류가 다양하며, 아래와 같은 언어들이 모두 지원된다.
주로 사용하는 언어인 Java
와 Typescript
에 대한 속성에 대해서 알아보자.
분석 조건
컴파일된 .class
파일이 두 개 이상 존재하는 프로젝트에서 동작할 수 있다. 이런 조건이 성립하지 않을 경우 아래와 같은 에러가 발생한다.
Your project contains .java files, please provide compiled classes with sonar.java.binaries property, or exclude them from the analysis with sonar.exclusions property.
빌드 도구
Maven
또는 Gradle
을 사용하지 않는 경우 바이트코드를 수동으로 제공해야한다. 수동으로 제공하는 경우 아래 표를 참고하여 설정을 진행한다.
key | value |
---|---|
sonar.java.binaries (required) | 컴파일된 바이트코드 파일이 들어 있는 디렉토리에 대한 쉼표로 구분된 경로 |
sonar.java.libraries | 타사 라이브러리가 있는 파일에 대한 쉼표로 구분된 경로로 와일드 카드 사용이 가능sonar.java.libraries=path/to/Library.jar,directory/**/*.jar |
sonar.java.test.binary | 테스트 파일에 해당하는 경로로 위와 동일 |
sonar.java.test.libraries | 테스트에서 사용하는 타사 라이브러리 경로로 위와 동일 |
특정 JDK 설정
Java 17
버전으로 분석을 실행하는데 빌드가 Java 11
버전으로 된 경우 등에서 다음과 같이 설정하여 JDK를 수동으로 지정한다.
# Here maven uses the default version of Java on the system but we specify that we want to analyze a Java 11 project.
mvn sonar:sonar \
# other analysis parameters
-Dsonar.java.jdkHome=/usr/lib/jvm/jdk11/
# other analysis parameters
소스 버전 처리
특정 Java 버전에 반응하도록 설정하여, 해당 버전보다 상위 버전을 대상으로 하는 경우 규칙을 비활성화하여 관련없는 규칙에서 거짓 결과가 생성되지 않도록 방지할 수 있다.
# sonar-project.properties
...생략
# 특정 버전 설정
sonar.java.source=11
메모리 조건
분석에 필요한 최소 메모리느 4GB 이상을 권장한다.
분석 환경
기본적으로 Node.js
런타임 환경을 사용하여 분석을 수행하지만 다음 아키텍처에서는 설치가 필요하지 않다.
파일 인코딩
스캐너는 분석 시 호스트 파일의 인코팅을 기본값으로 사용한다. 하지만 Javascript
와 Typescript
는 UTF-8
파일 인코딩을 사용해야하며, 지정되지 않은 경우에는 sonar.sourceEncoding=UTF-8
로 설정하여 사용한다.
Typescript 구성
기본적으로 tsconfig.json
파일을 읽어와서 사용하지만 다음과 같은 사항을 고려할 수 있다.
sonar.typescript.tsconfigPaths
속성에 따른 TSconfig 파일만 고려더 많은 메모리 할당
프로젝트의 규모가 큰 경우에는 메모리를 더 많이 할당해야하는 경우가 생길 수 있으며, 다음과 같은 로그가 나타날 수 있다.
ERROR: Failed to get response while analyzing [file].ts
java.io.InterruptedIOException: timeout
이런 경우 sonar.javascript.node.maxspace=4096
와 같이 메모리 설정을 변경하면된다.
프로젝트를 배포하기 전 정적 분석 도구를 통해 코드의 품질 검사를 수행하는 것이 체계적으로 이루어진다면 다음과 같은 장점이 있을 것 같다.
팀 내 코드 품질을 지속적으로 모니터링하여 개선점을 식별하고, 팀원 간의 의견을 나누면서 공통된 목표로 코드 작성을 수행할 수 있다.
또한, 자동화된 코드 리뷰 시스템을 구성하여 코드의 품질 문제를 자동으로 감지하고, 분석된 결과를 개발자들이 확인하며 시간을 단축 시킬 수 있다.
마지막으로 다양한 DevOps 환경과 통합하여 워크플로우에 맞게 적용하는 등의 효과를 얻을 수 있다.
스타트업 및 사수가 부족한 환경의 경우 SonarQube를 통해 지속적으로 Clean Code를 숙지하고, Clean Code에 가까운 방향으로 코드를 개선해 나간다면 나와 팀 간의 코드 작성 규칙에 대한 공감대가 형성되기도하고, 내 코드도 돌아볼 수 있는 좋은 습관이 생길 것 같다.