본문 바로가기
📕 Spring Framework/Spring Project

스프링 부트 소나큐브(SonarQube) 적용 + PostgreSql

by GroovyArea 2022. 7. 5.
갈수록 쉽지 않다.
프로젝트를 만들어 가는 과정에서 코드를 작성하는 부분은 극히 일부 과정임을 깨달았다. 오히려 코드를 작성하는 시간이 더 그립다. 
리팩터링과 기술 적용 및 버전 맞춤 수정에 시간을 더 쏟는 요즘이다. 
클린 한 코드를 위해 손수 리팩터링을 할 수 있지만, 정적 코드 분석 도구란 것이 있다고 한다. 대표적으로 SonarQube를 많이 사용한다고 하는데 이를 적용해 보는 시간을 가졌다. 정말 오래 걸렸고, 정확하진 않을 수 있지만 나름대로 적용했던 과정을 정리해보겠다. (틀린 부분이 있으면 무한한 댓글 감사히 받겠습니다!)
이것이 완료된 후 AWS lightsales, ec2 적용 여부를 판단해보아야겠다.

정적 분석 도구

코드의 품질에 대해 고려할 때 필수적으로 사용하는 도구이다.

지속적인 코드의 품질을 높이고, 유지보수에 매우 용이한 애플리케이션을 사용할 수 있다.

 

한 마디로 프로그램을 실행하지 않은 상태에서 소스 코드나 컴파일된 코드를 분석하는 도구이다.

 

Sonarqube

대표적으로 소나큐블 애플리케이션을 사용한다.

코드 컨벤션부터 해서 코드 내에 잠재적인 위험 요소를 체크해주어 코드의 작성 습관과 품질의 향상에 큰 도움을 준다.

인텔리제이 같은 IDE를 사용할 때는 SonarLint 플러그인을 사용하면 Sonarqube 애플리케이션 없이 분석 도구를 이용할 수 있지만 서버와 연동해 지속적인 관리를 필요로 할 때 유용하다. 분석 정보를 DB에 저장할 수도 있다.

 

소나 큐브 동작 구조

개발 환경

프로젝트

  • Java 11
  • Spring boot 2.5.2
  • Gradle 7.1.1

인프라

  • SonarQube Server 9.5.0
  • SonarQube Scanner 4.7.0

SonarQube 설치 방법

1. 직접 프로그램을 설치하는 방법

2. Docker를 이용해 설치하는 방법

 

총 2가지의 방법이 있다. 나는 처음 시도했기 때문에 둘 다 해봤다.. 그래서 4일, 5일 걸렸다.

프로젝트를 진행한 과정 중 제일 많은 에러를 겪은 도입이었다.

블로그를 참조하며 깊이 공감한 말.. 사람들 생각은 다 같구나..ㅎㅎ

직접 설치

SonarQube 홈페이지에서 직접 설치 가능하다. 

각 버전에 맞는 java version을 필요로 하기 때문에 버전 별 명세를 잘 보고 다운로드 하자.

https://docs.sonarqube.org/latest/

 

SonarQube Documentation | SonarQube Docs

Welcome to the SonarQube documentation! SonarQube® is an automatic code review tool to detect bugs, vulnerabilities, and code smells in your code. It can integrate with your existing workflow to enable continuous code inspection across your project branch

docs.sonarqube.org

 

설치 후 압축 해제를 한 후, 

bin -> 사용 운영 체제 선택 -> Startsonar.bat 실행

 

Docker를 이용한 설치

도커를 이용할 경우는 공식 문서를 참조하며 진행했다.

먼저 sonarqube의 이미지를 설치했다.

docker pull sonarqube

(도커가 참 좋긴 좋다.)

 

그리고 실행하자.

docker run -d --name sonarqube -p 8080:9000 sonarqube

소나 큐브는 기본 9000 포트이므로, (로컬) 9000:9000으로 하는 것을 추천한다.

 

실행하면 localhost:9000 으로 접속 가능하다. 

프로젝트를 연동하지 않았기 때문에 비어있다.

 

일반적으로 연동하는 방법은 다양하다.

  • sonarqube 애플리케이션 상에서 프로젝트 생성 후 사용하는 라이브러리 관리 툴의 명령 실행 방법
  • 도커를 이용해 실행
  • 그레이들에 직접적인 정보 명시로 Gradle task를 실행

나는 세번째 방법을 택했다.

 

build.gradle

buildscript {
    ext {
        snippetDir = file('build/generated-snippets')
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.springframework.boot:spring-boot-gradle-plugin:2.5.2"
        classpath "io.spring.gradle:dependency-management-plugin:1.0.11.RELEASE"
        classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.0"
    }
}

subprojects {
/..../
    apply plugin: "org.sonarqube"
    
    sonarqube {
        properties {
            property "sonar.host.url", "http://localhost:9000"
            property "sonar.login", "{access token}" // 로그인 id 또는 인증토큰을 넣으세요
            property "sonar.source", "src"
            property "sonar.language", "java" // 분석을 Java로 제한
            property "sonar.projectVersion", "1.0"
            property "sonar.sourceEncoding", "UTF-8"
            property "sonar.test.inclusions", "**/*Test.java"
            property "sonar.profile", "Sonar way"
            property "sonar.jdbc.username", "{username}"
            property "sonar.jdbc.password", "{password}"
            property "sonar.jdbc.url", "jdbc:postgresql://localhost/sonarqube"
        }
    }
    /..../
}​

멀티 모듈을 사용 중인 예시이다. 단일 프로젝트는 sonarqube 블록을 root project로 빼면 된다.

로그인 토큰을 이용하면 비밀번호가 필요없고, 명세에 나온 대로 속성들을 정의 가능하다.

또, db와 연동할 것이기 때문에 jdbc 속성도 추가해줬다. 중괄호인 부분은 각자의 데이터에 맞게 이용하자.

 

에러 발생

루트 프로젝트에 빌드하기 위한 jar 파일의 정의가 되지 않았다는 뜻이다.

해결했다.

 

이렇게 작성하고 난 후 gradle task를 실행하면 된다.

Gradle 플러그인을 통해 쉽게 Task를 실행할 수 있다. 실행!

나는 두개의 모듈이므로 두 개를 실행했다.

 

실행 후 애플리케이션을 다시 접속하면 이런 식으로 분석 정보가 좌르륵 뜬다. 이걸 통해 수정하면 될 것 같다.

 

PostgreSql 연동

DB 연동하는데 시간을 좀 많이 뺏긴 것 같다. 

보통 Docker를 이용해 설치하고, 맥 유저이신 분들은 터미널을 통해 간단히 명령어를 실행하던데, 나는 윈도여서 터미널 명령어로는 어렵고, 직접 SQL을 작성했다.

 

일단 postgresql을 설치하고, psql을 실행한다. 이걸 실행해 dos 창에서 작성해도 좋고,

나처럼 PGAdmin을 이용해 툴의 도움을 받아도 된다.

SQL을 작성해 소나큐브와 연동하자.

 앞에 Build.gradle 에서 jdbc 정보를 지정했기 때문에 gradle task를 실행할 때 연동이 되었을 것이다.

 

데이터 베이스가 생성됬고, 해당 스키마에 테이블이 무려 77개나 생성되었다고? 잘못됐나.. (틀리면 알려주세요)

 

이렇게 스프링부트 + sonarqube + gradle + postgresql 연동 과정을 간단히 나열했다.

기술 도입은 정말 쉽지 않은 것 같다. 

반응형