[DevOps]SonarQube - 기초

Inung_92·2025년 1월 8일
1

DevOps

목록 보기
1/5

SonarQube란?

소스 코드의 품질을 분석하고 관리하여 Clean Code 상태를 유지하도록 도와주는 오픈 소스 정적 코드 분석 플랫폼이다.

[!정적분석 도구란?]
Static Code Analysis Tools로 다음과 같은 기능을 한다.

  • 컴파일 단계에서 수행하며 SW 코드의 정적 특성을 분석하여 버그, 보안 취약점, 성능 문제 등 발견
  • 소스 코드의 구조, 흐름, 변수 등을 분석하여 잠재적 문제 식별
  • SW 코드의 안정성, 신뢰성, 효율성을 향상하는데 효과적으로 동작

SonarQube에서 이야기하는 Clean Code는 다음과 같이 일관성, 의도성, 적응성, 책임감이라는 속성을 지니고 있다.

SonarQube에서는 Clean Code 상태를 유지하기 위해 어떤 방식으로 소스 코드를 분석하는지 알아보자.

주요 기능

SonarQube의 주요 기능은 다음과 같다.

  • 코드 품질 분석
    - 코드 복잡도, 중복, 코딩 규칙 준수 여부 등을 분석
    - 유지보수성 향상을 위한 리팩토링 권장 사항 제공
  • 코드에 내재된 잠재적 버그와 보안 취약점 식별
  • 코드 커버리지
    - 테스트 커버리지를 분석
    - 코드가 테스트에서 얼마나 검증되는지 확인
  • CI/CD 파이프라인과 통합된 지속적인 코드 분석
  • 다중 언어 지원
  • 품질 게이트
    - 프로젝트의 품질 상태를 통과/실패로 평가하는 기준 설정 가능
    - 코드가 배포 전 정의된 품질 기준을 만족하는지 확인

소스 코드 분석

SonarQube는 Clean Code를 방해하는 코드의 문제를 식별하는 것을 목표로 코드를 분석한다.

Clean Code 기반 분석 원칙

위 그림은 다음과 항목들을 기반으로 소프트웨어 품질 향상에 기여하는 것을 목표로 분석한다.

  • 코딩 규칙에 대한 여러가지를 검사
  • 코딩 규칙을 지키면서 Clean Code 속성과 관련된 특성을 평가
  • 코드 이슈와 관련된 여러가지를 평가

세부 분석 과정

분석 과정의 주요 단계는 다음과 같다.

  • 빌드 또는 CI 파이프라인을 통해 SonarScanner 시작
  • SonarScanner가 로컬 저장소를 스캔하여 분석할 파일을 결정
  • 파일의 언어를 SonarScanner가 식별하여 해당 언어 분석기에 분석 요청
  • 언어 분석기는 분석할 파일을 검색하여 사전 구성된 품질 프로필에 따라 분석
  • 분석 결과를 SonarScanner로 전송하고, SonarScanner는 이를 보고서 형태로 SonarQube서버로 전달
  • SonarQube서버는 비동기적으로 분석 결과를 계산하여 최종 결과 출력


언어별 속성

제품 플랜에 따라 지원하는 언어의 종류가 다양하며, 아래와 같은 언어들이 모두 지원된다.

주로 사용하는 언어인 JavaTypescript에 대한 속성에 대해서 알아보자.

Java

분석 조건
컴파일된 .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을 사용하지 않는 경우 바이트코드를 수동으로 제공해야한다. 수동으로 제공하는 경우 아래 표를 참고하여 설정을 진행한다.

keyvalue
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

Javascript/Typescript

메모리 조건
분석에 필요한 최소 메모리느 4GB 이상을 권장한다.

분석 환경
기본적으로 Node.js 런타임 환경을 사용하여 분석을 수행하지만 다음 아키텍처에서는 설치가 필요하지 않다.

  • Linux x64
  • Windows x64
  • Apple ARM64

파일 인코딩
스캐너는 분석 시 호스트 파일의 인코팅을 기본값으로 사용한다. 하지만 JavascriptTypescriptUTF-8 파일 인코딩을 사용해야하며, 지정되지 않은 경우에는 sonar.sourceEncoding=UTF-8로 설정하여 사용한다.

Typescript 구성
기본적으로 tsconfig.json 파일을 읽어와서 사용하지만 다음과 같은 사항을 고려할 수 있다.

  • 스캐너 sonar.typescript.tsconfigPaths 속성에 따른 TSconfig 파일만 고려
  • 지정하지 않은 경우 프로젝트 루트의 기존 TSconfig 파일을 모두 수집
  • 아무것도 발견되지 않은 경우 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에 가까운 방향으로 코드를 개선해 나간다면 나와 팀 간의 코드 작성 규칙에 대한 공감대가 형성되기도하고, 내 코드도 돌아볼 수 있는 좋은 습관이 생길 것 같다.

profile
서핑하는 개발자🏄🏽

0개의 댓글