이번 글에서는 프로젝트에 정적 코드 분석을 적용하기 위해 SonarCloud를 활용해 본다.
정적 코드 분석은 소스 코드를 실행하지 않고 분석하는 과정이다. 이 과정을 통해 소스 코드의 품질을 높이고 잠재적인 버그나 코딩 규칙 위반 등을 찾아낸다.
정적 코드 분석의 이점
SonarQube와 SonarCloud는 모두 코드 품질 관리 도구다.
개인 프로젝트에서는 SonarCloud가 더 적합하다.
SonarCloud 홈페이지에 접속하여 세팅이 필요하지만, 다른 게시글에서 충분히 자세하게 다루어 주고있어 해당 게시글에서는 SonarCloud 홈페이지에 접속하여 기본적인 세팅을 완료한 기준으로 작성하겠다.
plugins {
id 'java'
id 'org.springframework.boot' version '3.2.1'
id 'io.spring.dependency-management' version '1.1.4'
id 'jacoco' // jacoco
id "org.sonarqube" version "4.4.1.3373" // sonarqube
}
...
sonar {
properties {
property "sonar.projectKey", "Your projectKey"
property "sonar.organization", "Your organization"
property "sonar.host.url", "https://sonarcloud.io"
property "sonar.language", "java"
property "sonar.sourceEncoding", "UTF-8"
property "sonar.sources", "src/main/java"
property "sonar.tests", "src/test/java"
property 'sonar.coverage.jacoco.xmlReportPaths', 'build/jacocoReport/test/jacocoTestReport.xml'
property "sonar.java.binaries", "${buildDir}/classes"
property "sonar.test.inclusions", "**/*Test.java"
property "sonar.coverage.exclusions", "**/dto/**, **/event/**, **/*InitData*, **/*Application*, **/exception/**, **/service/alarm/**, **/aop/**, **/config/**, **/MemberRole*"
}
}
build.gradle 파일중 일부이다. 아래에서 자세히 설명하겠다.
plugins {
id 'java'
id 'org.springframework.boot' version '3.2.1'
id 'io.spring.dependency-management' version '1.1.4'
id 'jacoco' // Jacoco 플러그인
id "org.sonarqube" version "4.4.1.3373" // SonarQube 플러그인
}
- org.sonarqube: SonarQube와 SonarCloud 정적 코드 분석을 위한 플러그인.
sonar {
properties {
property "sonar.projectKey", "Your projectKey"
property "sonar.organization", "Your organization"
property "sonar.host.url", "https://sonarcloud.io"
property "sonar.language", "java"
property "sonar.sourceEncoding", "UTF-8"
property "sonar.sources", "src/main/java"
property "sonar.tests", "src/test/java"
property 'sonar.coverage.jacoco.xmlReportPaths', 'build/jacocoReport/test/jacocoTestReport.xml'
property "sonar.java.binaries", "${buildDir}/classes"
property "sonar.test.inclusions", "**/*Test.java"
property "sonar.coverage.exclusions", "**/dto/**, **/event/**, **/*InitData*, **/*Application*, **/exception/**, **/service/alarm/**, **/aop/**, **/config/**, **/MemberRole*"
}
}
- sonar.projectKey & sonar.organization: SonarCloud에서 프로젝트를 식별하는 데 사용되는 키와 조직명.
- sonar.host.url: SonarCloud 서비스의 URL.
- sonar.language: 프로젝트의 주 언어 설정.
- sonar.sourceEncoding: 소스 코드의 인코딩 설정.
- sonar.sources & sonar.tests: 소스 코드와 테스트 코드의 위치.
- sonar.coverage.jacoco.xmlReportPaths: Jacoco에 의해 생성된 코드 커버리지 보고서의 위치.
- sonar.java.binaries: 컴파일된 Java 바이너리 파일의 위치.
- sonar.test.inclusions: 분석에 포함될 테스트 파일의 패턴.
- sonar.coverage.exclusions: 코드 커버리지 분석에서 제외할 파일 패턴.
프로젝트 코드에 대한 분석 결과를 잘 제공한다.
코드에 대한 자세한 분석뿐만 아니라, PR에 대해서도 분석해준다.
분석 결과를 이용해 프로젝트를 적절히 개선할 수 있다.