
1. 소나큐브(SonarQube)란?
소나큐브는 정적 코드 분석 플랫폼이다. 쉽게 말해 코드를 직접 실행하지 않고도 잠재적인 버그, 보안 취약점, 중복 코드를 찾아내어 기술 부채를 관리해준다. 요즘 인텔리제이같은 IDE에서도 잘 관리해주는 기능아니야? 라고 생각할 수 있지만 소나큐브는 사용자의 요구에 맞게 규칙을 커스터마이징하고 이를 팀원들과 공유해 협업 시 일관된 코드 품질을 유지하고, 품질이 기준 미달일 경우 배포를 막는데 강력한 역할을 한다.
정적 분석 결과를 볼 수 있는 분석 보고서를 생성(SonarScanner)하고 CI/CD와 통합되면 코드 변경사항을 자동으로 분석하고 기준에 따라 릴리즈를 진행/취소(Quality Gate)를 통해 클린코드를 지향한다. 바이브 코딩의 비율이 증가하여 기술부채가 늘어나는 요즘 특히 필요한 서비스라고 볼 수 있다.
2. 소나큐브 설치 및 초기 설정
services:
sonarqube:
image: sonarqube:latest
container_name: sonarqube
ports:
- "9000:9000"
environment:
- SONARQUBE_JDBC_USERNAME=${POSTGRES_USER}
- SONARQUBE_JDBC_PASSWORD=${POSTGRES_PASSWORD}
- SONARQUBE_JDBC_URL=jdbc:postgresql://db:5432/${POSTGRES_DB}
networks:
- sonarnet
volumes:
- ./sonar/conf:/opt/sonarqube/conf
- ./sonar/data:/opt/sonarqube/data
- ./sonar/logs:/opt/sonarqube/logs
- ./sonar/extensions:/opt/sonarqube/extensions
db:
image: postgres:14
container_name: sonarqube_db
environment:
- POSTGRES_USER=${POSTGRES_USER}
- POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
- POSTGRES_DB=${POSTGRES_DB}
networks:
- sonarnet
volumes:
- ./postgres/data:/var/lib/postgresql/data
networks:
sonarnet:
sonarqube의 정적 분석 데이터가 저장될 db를 함께 컨테이너에 띄워주고 9000번 포트를 호스트에 열어줬다.
도커로 띄운 Cloudflare Tunnel에서 내부 도커 네트워크 환경에 격리된 SonarQube 인스턴스를 연결할 때 url은 http://host.docker.internal:9000 이다.
서버에 소나큐브를 성공적으로 띄운 이후엔 GitHub와 연동해줘야 한다.
github에서 프로필 사진 → Settings → Developer Settings → Github Apps 에서 New Github App 클릭

App name에는 @{github ID}를 작성해준다.
Homepage URL에는 https://{소나큐브 도메인} 을 적어줬다. 말그대로 github app과 연결될 서비스의 홈페이지를 적어주면된다.

Callback URL에도 https://{소나큐브 도메인}을 적어준다.
Github OAuth 로그인 이후 리다이렉트할 주소다. 소나큐브는 기본 주소를 적어주면 리다이렉트된다.

github에서 push하거나 PR을 날렸을때 소나큐브가 전달받을 URL이다.
웹훅에는 https://{소나큐브 도메인}/api/alm_integrations/check_github_webhook을 적어준다.

- Repository permissions: Checks(Read and write), Metadata(기본 적용됨), Pull Requests(Read and write)
소나큐브를 이용하기 위한 권한을 부여해준다.
GitHub Settings에서 App을 만들고 생성된 Client ID, Client Secret, Private Key를 챙긴다.
GitHub App 생성 후 레포지토리나 조직에 'Install App' 과정을 거쳐야 소나큐브에서 프로젝트 목록이 보인다.
여기서 편의상 All Repository를 선택했다.
3. Jenkins와 SonarQube 연동 (인증)
젠킨스가 소나큐브 서버에 분석 결과를 보내주기 위해 플로그인을 설치한다.
- Jenkins 플러그인에서 SonarQube Scanner for Jenkins 설치
- Jenkins 관리 > System에서 소나큐브 서버 URL과 토큰 등록 (Name은 sonar-server 등으로 지정)

3. 서버 인증 토큰에서 +Add 버튼을 눌러 관리자 토큰(Secret Text)을 등록

여기에 들어갈 secret text는 sonarqube 페이지의 Administration → Security → Users → Tokens 에서 Generation Token을 눌러 나온 token secret을 적어주면 된다.

Jenkins 관리 > Tools에서 SonarQube Scanner Installations → Add SonarQube Scanner를 눌러 Install automatically 옵션 선택.

4. Gradle 프로젝트 최적화 (build.gradle)
build.gradle에 설정을 추가한다.
plugins {
id "org.sonarqube" version '7.2.2.6593'
}
sonar {
properties {
property "sonar.projectKey", "FunChat-Backend"
property "sonar.projectName", "FunChat-Backend"
}
}
5. Jenkinsfile 파이프라인 추가 작성
stage('2. SonarQube Analysis') {
steps {
dir('backend') {
// 젠킨스 시스템 설정에 등록한 이름을 사용하여 환경 주입
withSonarQubeEnv('sonar-server') {
sh "./gradlew sonar"
}
}
}
}
중요한 것은 젠킨스 System에서 지정해준 소나큐브 name과 withSonarQubeEnv 프로퍼티가 일치해야한다.

이제 git push 한번에 테스트부터 코드 분석, 빌드 및 배포까지 완료하는 CI/CD 파이프라인이 완성되었다.
이번 기회에 소나큐브에 대해서 한번 알아봤는데 개인 프로젝트 시에는 컴파일 시점에 코드를 실행하지 않고 버그, 코딩 표준 등을 체크해주는 기능과 테스트 커버리지 확인 등의 정적 코드 분석이 IDE 자체적으로 제공되어 필요해보이진 않는다. 하지만 협업 시에 정적 코드 분석을 통해 코드 품질을 유지하는데 굉장히 도움될 것 같다. 특히 코드 품질이 일정 수준 아래로 떨어졌을 때 빌드되지 않도록 방지하는 Quallity Gate는 코드에 기여하는 모든 팀원들에게 공통의 기준을 지키도록 요구한다. 이를 통해 만에 하나의 오류를 잡아낼 수 있고 안정적으로 개발할 수 있을 것 같다.
'Infra' 카테고리의 다른 글
| 배포 환경 변수 주입은 어떻게 풀어낼까? (0) | 2026.04.30 |
|---|---|
| 무중단 배포 & 로드밸런싱 전략 적용 (0) | 2026.04.28 |
| Jenkins와 Docker Compose를 이용한 Spring Boot CI/CD 구축기(feat. 홈서버) (0) | 2026.01.29 |
| N8N 홈서버 구축 회고(2) - 도커 설정 및 트러블 슈팅 (0) | 2026.01.27 |