노션🔗에 작성했던 글을 옮긴 포스팅입니다. 노션이 더 보기 편합니다
🤔 SonarQube가 뭐죠?
SonarQube는 정적 코드 분석을 통해 버그, 코드 스멜, 보안 취약점 등을 자동으로 탐지하고 관리할 수 있게 해주는 툴이다.
💡 정적 코드 분석(Static Code Analysis)이란?
- 프로그램의 실제 실행 없이 코드를 분석하는 것.
- 소스 코드 기반으로 진행되며, 미리 지정된 규칙(Rule) 셋을 통해 코드를 분석하기 때문에 빠르고 효율적이라는 장점이 있지만, 런타임이 실행되는 환경에서의 약점을 잡아내지 못한다는 단점이 존재한다.
주요 기능
- 버그 찾기: 잠재적 버그 찾기
- 코드 스멜 감지: 지금은 문제가 없지만 나중에 문제가 될 수 있는 코드를 코드 스멜이라 부르고 그것을 찾아 내는 것
- 보안 취약점 체크
- 코드 중복 체크: 불필요하게 반복되는 코드 찾기
- 코드 복잡도 분석
SonarQube Component
SonarQube는 3개의 컴포넌트로 구성된다.
- Scanner: CI 파이프라인과 통합되어 소스 코드를 분석하기 위한 구성 요소
- SonarQube Server: Web 인터페이스 제공을 위한 Web Server, 검색을 위한 ElasticSearch 기반 Search Server, 분석 코드 처리를 위한 Compute Engine으로 이루어진 구성 요소
- Database: SonarQube Server의 설정 및 코드 분석 결과를 DB에 저장하기 위한 구성 요소
이거 ESLint랑 비슷한거 아니에요?
ESLint와 SonarQube 둘 다 정적 코드 분석 도구는 맞다. 다만, 둘은 약간의 차이가 있다.
- 기능과 범위
- ESLint: Javascript 및 Typescript 린터 도구로, 코딩 표준을 지키고 버그를 찾아내어 코드 품질을 향상시키는 데 사용된다. 주로 코드 스타일과 모범 사례(best practices)에 초점을 맞춘다.
- SonarQube: 여러 프로그래밍 언어를 지원하는 종합적인 코드 품질 관리 플랫폼이다. 정적 코드 분석, 보안 취약점 탐지, 코드 커버리지 측정 등을 다양한 기능을 제공한다.
- 통합과 생태계
- ESLint: 가볍고 커스터마이징이 쉬우며, 많은 개발 도구와 잘 어울린다. 개발 워크플로우와 IDE에 원활하게 통합될 수 있다.
- SonarQube: 전용 서버 설치가 필요하고, 중앙 집중식 보고 및 기록 분석과 같은 고급 기능을 제공한다. 빌드 시스템, CI/CD 파이프라인 및 코드 레포지토리와도 통합될 수 있다.
- 코드 분석 능력
- ESLint: 코딩 표준 강제, 잠재적 오류 감지, 코드 일관성 체크에 집중한다. 사용자가 직접 룰을 설정하거나 플러그인을 사용할 수 있다.
- SonarQube: 정적 코드 분석을 수행하여 코드 스멜, 보안 취약점, 코드 중복을 찾아내고, 코드 품질 지표와 복잡도 분석에 대해 깊이 있는 인사이트를 제공한다.
- 보고서와 시각화
- ESLint: 코드 에디터 내에서 즉각적인 피드백과 수정 제안을 제공한다.
- SonarQube: 코드 품질을 한 눈에 볼 수 있는 종합적인 대시보드와 보고서를 제공한다. 진행 상황을 추적하고 코드 품질 개선의 우선 순위를 정하는데 도움이 되는 시각화, 지표, 추세 등을 보여준다.
- 커뮤니티와 지원
- ESLint: Javascript 개발자들의 큰 커뮤니티, 풍부한 문서, 활발한 Github 저장소를 갖고 있다.
- SonarQube: 마찬가지로 강력한 커뮤니티를 보유하고 있으며, 활발한 개발과 유지보수가 이루어지고 있다. 포괄적인 문서, 포럼, 커뮤니티 지원도 제공하고 있다.
정리하자면, ESLint는 Javascript와 Typescript의 코드 검사, 코딩 표준 준수, 잠재적 오류 발견에 중점을 두는 반면, SonarQube는 여러 프로그래밍 언어를 지원하고, 보안 취약점, 코드 중복 등 좀 더 폭넓은 분석 기능을 제공한다.
둘이 제공하는 분석 결과가 약간 다르므로 가능하다면 둘 다 사용하는 것도 코드의 품질 관리에 좋을 것 같다.
📥 SonarQube 설치하기
1️⃣ Java 설치
SonarQube는 Java 기반의 프로그램이기 때문에 자바를 설치해줘야 한다.
https://www.oracle.com/java/technologies/javase/jdk17-archive-downloads.html
공식 문서의 Requirement에 쓰여있는대로 Java 17을 설치했다.
- 설치 확인
java --version
// 설치한 jdk 버전 표시
2️⃣ PostgreSQL 설치
데이터베이스 설치가 필수는 아니다. 다만, 설치하지 않고 실행하면 SonarQube분석 결과는 로컬 H2에 저장이 되는데, 이런 경우는 추후 SonarQube 버전 변경 시 분석 결과가 다 사라진다.
공식 문서에 따르면 PostgreSQL, Microsoft SQL server, Oracle 중 하나가 설치되어 있으면 된다는데, 나는 PostgreSQL을 깔았다.
1. 다운받기
SonarQube 공식 문서에 따르면 PostgreSQL은 13에서 17 사이 버전을 깔면 되는 것 같다.
https://www.enterprisedb.com/downloads/postgres-postgresql-downloads
그냥 가장 최신 버전인 17.2를 다운 받았다.
2. 설치
다운받은 exe 파일 실행시켜주면 되는데, 중간에 superuser 비밀번호 설정 외에는 딱히 해줄 건 없었다.
3. 설치 확인
4. 유저, 데이터베이스 생성
PostgreSQL을 실행하기 위한 GUI 도구인 pgAdmin4를 실행한다.
- pgAdmin 4 실행 후 서버 접속
- Servers > PostgreSQL 클릭
- 비밀번호 입력 (PostgreSQL 설치할 때 설정했던 비밀번호)
- Login/Group Roles 생성 (사용자 생성)
- Servers > PostgreSQL > Login/Group Roles 우클릭
- Create > Login/Group Role 선택
- General 탭:
- Name: sonarqube
- Definition 탭:
- Password: 원하는 비밀번호 설정
- Privileges 탭:
- Can login? Yes
- Create databases? Yes
- Inherit rights from the parent roles? Yes
- Save 클릭
- Database 생성
- Servers > PostgreSQL > Databases 우클릭
- Create > Database
- Database: sonarqube
- Owner: sonarqube (방금 만든 사용자 선택)
- Save 클릭
3️⃣ SonarQube Community Build 설치
공식 문서를 차근차근 따라가면 된다!
1. SonarQube 홈페이지🔗에서 Community 버전을 다운받는다.
현재 버전은 10.8이다
2. 다운 받은 파일 압축 해제
3. <sonarqubeHome>/conf/sonar.properties 파일에 설정 추가
# PostgreSQL 설정
sonar.jdbc.username=sonarqube
sonar.jdbc.password=<설정한 비밀번호>
sonar.jdbc.url=jdbc:postgresql://localhost/sonarqube
# Elasticsearch 경로 설정 (윈도우 경로 형식)
sonar.path.data=C:/sonarqube/data
sonar.path.temp=C:/sonarqube/temp
4. ElasticSearch 데이터 저장용 디렉토리 생성
- C:\sonarqube 폴더 생성
- 그 안에 data와 temp 폴더 생성
5. SonarQube 실행하기
`\\bin\\windows-x86-64\\StartSonar.bat`를 실행하면 된다.
이렇게 cmd창이 뜨며 실행되고 http://localhost:9000로 접속하면 된다.
- 초기 로그인 정보:
- ID: admin
- Password: admin
최초 로그인 시 비밀번호 변경 요청이 나오니 바꾸면 된다.
4️⃣ Sonar Scanner 설치
sonar scanner는 코드를 분석해서 sonarqube로 보내는 도구이다. Github Actions를 통해 분석하면 액션으로 설치하도록 할 수 있어서 별도 설치가 필요없지만, 나는 로컬에서 분석할 예정이라 직접 설치했다.
1. CLI로 설치
https://www.npmjs.com/package/sonarqube-scanner
pnpm add -D sonarqube-scanner
2. package.json에 스크립트 추가
{
"scripts": {
"sonar": "sonar-scanner"
}
}
3. SonarQube 서버에 프로젝트 생성
이 블로그를 참고하여 프로젝트 생성했다. 이때 토큰 값은 꼭 어딘가에 저장해두자!
4. 프로젝트에 sonarqube-scanner 설정 파일 추가
`./sonar-project.properties`
sonar.projectKey={SonarQube 프로젝트 생성 시 입력한 프로젝트 이름}
sonar.sources=.
sonar.host.url=http://localhost:9000
루트 디렉토리에 해당 파일을 추가해줬다.
5. 분석 실행
분석이 완료되면 그 결과가 SonarQube 서버(localhost:9000)으로 전송되어 웹 인터페이스로 결과를 확인할 수 있다.
예시)
☹️ SonarQube 설치하기 싫어요!
SonarQube for IDE
그럴 때는 SonarQube for IDE(전 SonarLint)를 설치해서 사용하면 SonarQube가 제공하는 정적 코드 분석 기능을 사용할 수 있다. VSCode에서는 익스텐션으로 설치해서 사용할 수 있다.
이걸 사용하면 sonar-scanner로 분석하고, SonarQube 서버에서 확인하는 과정을 거치지 않고도 IDE 상에서 바로 sonarqube가 검출하는 이슈들을 확인할 수 있다.
다만, 이 익스텐션만을 사용하면 IDE상에서 개별 이슈만을 확인할 수 있으므로 전체적인 리포트를 보고 싶다면 sonar-scanner와 soanrqube server를 사용해야 한다.
사용 방법
익스텐션을 설치하고 나면 아래 사진과 같이 이슈가 있는 부분에 물결 같은 밑줄이 생기며 sonarqube 이슈가 보인다.
Connected Mode: SonarQube server와 연동하여 사용하기
만약 이미 SonarQube 서버의 설정 파일이 프로젝트에 있다면 아래와 같이 Connected Mode에 대한 알림창이 뜬다.
이 Connected Mode를 사용하면 sonar-project.properties에 정의된 SonarQube 서버 주소로 연결해서 서버에 정의된 커스텀 룰, Quality Gate 설정, 그리고 프로젝트별 특정 규칙들을 SonarQube for IDE에서 사용하게 된다. 이렇게 하면 다음과 같은 장점이 있다.
- SonarQube 서버를 원격으로 띄워서 사용하고 있다면 팀원 모두 이 Sonarqube 서버에 적용되어 있는 룰을 사용하여 동일한 규칙으로 코드를 검사할 수 있다.
- CI/CD에 SonarQube 분석 단계가 포함되어 있다면 이 단계에서 실패할 수 있는 코드 품질 이슈를 미리 IDE에서 발견하고 수정할 수 있다.
- 전체적인 개발 효율성이 높아진다.
🔗 참고 자료
- https://tech.kakaopay.com/post/devsecops_sonarqube/#devsecops가-뭔가요
- https://medium.com/@akkis1993/sonarqube-setup-for-javascript-typescript-applications-on-linux-and-windows-847cdad1eb86
- https://nangman14.tistory.com/104
- https://docs.sonarsource.com/sonarqube-community-build/setup-and-upgrade/install-the-server/introduction/
- https://stackshare.io/stackups/eslint-vs-sonarqube
- https://coding-is-fun.tistory.com/15
- `#Java`, `#Java설치`
- https://www.guru99.com/ko/download-install-postgresql.html
- `#PostgreSQL`, `#PostgreSQL설치`
'CS > 소프트웨어공학' 카테고리의 다른 글
코드 품질이란? (코드 품질 기준과 측정) (0) | 2025.01.07 |
---|---|
모듈의 결합도 & 응집도 (0) | 2024.07.03 |