프로젝트를 진행하다 보면 드는 생각들이 있다. '이거보다 좋은 코드가 있을까?', 혹은 '이런식으로 작성해도 문제가 되지 않을까?'와 같은 생각들 말이다. 작성하는 소스가 상용에서 쓰일 소스 코드라면 이러한 걱정은 더 중요해진다.
소스 코드를 얼마나 잘 관리하느냐에 따라 품질이 좋아지기 때문이다. 그리고 소스 코드의 품질 유지를 도와주는 오픈소스인 SonarQube에 대해 작성하려 한다.
SonarQube란?
- 소스 코드의 품질을 분석하고 관리하기 위한 오픈 소스 플랫폼
- 정적 분석 실행 👉 중복 코드, 코딩 표준, 유닛 테스트, 코드 커버리지, 코드 복잡도, 버그 및 취약점, 코드 스멜(품질이 낮은 코드)를 탐지하고 보고서를 제공
- 20개 이상의 언어에 대한 분석 가능
1. 정적 분석 도구(Static code analysis tools)
- 프로그램을 실행하지 않고 소스 코드나 '컴파일 단계'에서 수행하며, 소프트웨어 코드의 정적 특성을 분석하여 버그, 보안 취약점, 성능 문제 등을 발견하는 도구
- 소스 코드를 분석하고, 코드의 구조, 흐름, 변수 사용 등을 검사하여 잠재적인 문제를 식별
2. 동적 분석 도구(Dynamic code analysis tools)
- '런타임 단계'에서 수행하며, CPU 사용, 네트워크 트래픽 등 다양한 측면을 모니터링·분석
- 애플리케이션의 성능 문제, 메모리 누수, 보안 취약점 등을 탐지하고 해결할 수 있는 지표 제공
SonarQube 설치 및 설정
SonarQube 다운로드
https://www.sonarsource.com/products/sonarqube/downloads/
Download | SonarQube
Get the latest LTS and version of SonarQube the leading product for Code Quality and Security from the official download page.
www.sonarsource.com
커뮤니티 버전을 다운받아 프로젝트를 주로 관리하는 위치에 압축 파일을 푼다.
필자가 다운받은 버전은 sonarqube-10.5.1 버전이다.
프로젝트 환경
- sonarqube-10.5.1 (다운로드한 버전)
- JDK 17
- Spring boot 3.3.0
- Gradle 8.8
- IntelliJ 2023.1
주의사항
- SonarQube 9.9 버전 부터는 JDK 17 이상의 버전 필요
- JDK 11의 경우, 2026년 9월까지만 지원
환경 변수 설정
1. 윈도우 검색 : '시스템 환경 변수 편집' > 환경 변수 클릭
2. 시스템 변수 > 새로 만들기 > JAVA_HOME 변수 추가
- 변수 이름: JAVA_HOME
- 변수 값: (JDK 파일이 위치한 디렉토리의 주소)
3. 시스템 변수 > 새로 만들기 > CLASSPATH 변수 추가
- 변수 이름: CLASSPATH
- 변수 값: %JAVA_HOME%\lib
4. 시스템 변수 > Path 변수 더블 클릭 > 편집
- %JAVA_HOME%\bin
5. 모든 설정 완료 후 > 확인 > 시스템 재부팅
6. cmd 창에서 JAVA 환경변수가 정상적으로 설정되었는지 확인 👉 설정한 JDK 버전이 뜨면 ok
- java -version
- javac -version
SonarQube 실행
SonarQube 실행
bin 폴더로 들어가 사용자의 운영체제에 맞는 StartSonar.bat을 실행하면 된다.
실행 결과, 'Proccess is up', 'SonarQube is operational' 이 출력되면 SonarQube가 정상적으로 실행된 것이다.
SonarQube가 정상적으로 실행되었다면 http://localhost:9000/ 또는 http://127.0.0.1:9000/ 을 입력하면 SonarQube에 접속한다.
SonarQube와 프로젝트 연결
SonarQube에 접속하면 초기 로그인 정보는 admin / admin 으로 입력하면 접속 가능하다.(로그인 정보는 이후 수정 가능하다.)
현재 필자는 이미 프로젝트와 SonarQube를 연결한 후 포스팅을 작성하였기에 프로젝트가 하나 존재한다.
새롭게 프로젝트와 SonarQube를 연결하기 위해 Create Project 를 클릭한다.
다양한 방법으로 프로젝트를 분석할 수 있다.
해당 포스팅은 local 상태에서 프로젝트를 분석하려 하기 때문에 Create a local project 을 선택한다.
분석할 프로젝트에 대해서 작성한다. 이때, project key는 이후에 발급될 토큰과 함께 연결할 때 사용된다.
토큰의 유효 기간을 설정한 후 Generate 를 클릭하여 토큰을 생성한다.
토큰은 발행된 이후 프로젝트를 연결을 위해 다른 곳에 적어두는 것을 권장한다.
토큰이 생성된 이후 프로젝트에 관련 설정을 어떻게 적으면 되는지 예시 코드를 알려준다.
다만, 필자는 gradle 환경에 맞게 소스를 약간 변경하여 작성하였다.
plugins {
id "org.sonarqube" version "5.0.0.4638"
}
sonarqube {
properties {
property "sonar.projectKey", "project key"
property "sonar.host.url", "http://localhost:9000"
property "sonar.token", "token"
}
}
SonarQube에 대한 설정을 할 때, 지정한 project key와 발급받은 token 값을 property에 넣으면 된다.
설정이 완료되었다면 gradle을 build 해준다.
설정이 완료되었다면 console 창에 ./gradlew -Dsonar.login={token}
을 입력하여 SonarQube가 소스 코드를 분석할 수 있도록 한다.
또는 인텔리제이를 사용할 경우, 위의 이미지와 같이 Gradle > 프로젝트의 Tasks > verification > sonar 을 실행하면 된다. 분석이 정상적으로 이루어지면 BUILD SUCCESSFUL 이라는 메시지가 뜬다.
분석이 완료된 후 결과 보고서를 통해 소스 코드의 문제점과 취약점 등을 보고서 형태로 확인할 수 있다.
SonarQube는 어떤 소스 코드가 어떤 문제가 있는지를 알려주며, 추천하는 수정 코드를 알려주기도 한다.
수정 코드는 어디까지나 추천이기에 로직 등의 측면을 확인한 후, 수용하여 수정하면 된다.
⚡ 이슈 회고
StartSonar.bat이 실행되지 않은 이슈
- 원인 👉 환경변수 설정을 안해둠!
JAVA 환경변수 설정을 안해두고도 프로젝트를 진행하는 데는 별 이상이 없었지만, SonarQuve를 실행하면서는 문제의 원인이 되었다.
아마도 작년 말? 올해 초에 회사 노트북을 바꾸면서 환경설정을 새로해야 한다는 걸 까먹고 당연히 되어있을 거라 생각했던게 문제였다.
한글팩 plugin으로 인해 StartSonar.bat이 실행되지 않은 이슈
SonarQube는 기본적으로 영어를 지원한다. 때문에 좀더 편리하게 사용하고자 한국어를 지원해주는 plugin을 설치하였다.
Administration > Marketplace > plugins > 'korean pack' 입력 검색
korean pack 을 install 하면 Restart server라는 안내문구가 뜨는데 server를 재실행했더니 sonarQube가 다시 실행되지 않았다. (됐다, 안됐다가, 이마를 쳤다. 오늘도 내 맘대로 되는건 없구나.)
플러그인을 설치할 때 주의 문구로 호환에 따라 문제가 발생할 수 있다는 메시지가 떴는데 해당 버전에서 오류가 발생한 것이었다.
- 문제 해결 👉 설치한 플러그 인을 제거한다!
한국어 팩 플러그인을 설치한 후 이슈가 발생한 것이기에 해당 플러그인을 삭제하여 문제를 해결하였다.
위치: 압축을 푼 sonarqube 폴더 > extensions > plugins
현재는 플러그인을 삭제하였기에 README.txt 파일만 있지만, 해당 위치에서 플러그인을 삭제하니 정상적으로 실행되었다.
[ 참고 ]