Naver Financial 코드 품질 관리 — Part 3

Yeonjun Kim
NAVER Pay Dev Blog
Published in
7 min readDec 21, 2022

안녕하세요. Naver Financial 에서 간편 결제 플랫폼 개발 업무를 담당하고 있는 김연준입니다.

SonarQube System Architecture와 Naver Financial의 SonarQube 시스템 구성 및 운영사례를 공유합니다.

연재

SonarQube System Architecture

SonarQube System Architecture

SonarQube는 3개의 컴포넌트로 구성되어 있습니다.

SonarQube server

  • Web Server : 사용자에게 정적 분석 결과를 제공하며, SonarQube 관련 설정을 변경할 수 있습니다.
  • Compute Engine : SonarQube Scanner가 분석한 Analysis Report를 생성하고, 이를 SonarQube Database에 저장하는 역할을 수행합니다. 그 외에도, Pull Request Decoration, Sending Webhooks, Sending Notifications 등의 기능을 수행합니다.
  • Search Server : ElasticSearch를 활용하여 사용자에게 검색 기능을 제공합니다.

SonarQube Scanner

정적 분석을 수행하는 툴로, Analysis Report를 SonarQube 서버로 전송하는 어플리케이션이며, SonarQube에서 지원하는 대부분의 프로그래밍 언어를 분석할 수 있습니다. Gradle, Maven 등 빌드 통합을 지원하고 Jenkins, Github Actions등 다양한 CI Tools와의 통합을 지원합니다.

SonarQube Database

Analysis Report, SonarQube 인스턴스 설정, 코드 품질 및 보안에 대한 매트릭 등을 저장합니다.

Naver Financial의 SonarQube 시스템 구성

Naver Financial의 SonarQube는 사내 Kubernetes 환경에 배포되어 있으며, SonarQube v.9.2 + PostgreSQL v.12.5로 구성되어 있습니다.

Naver Financial의 서비스들은 전금법망내에서 개발이 필요합니다. 따라서, SonarQube와 PostgreSQL 공식 이미지를 커스터마이징 없이 전금법망내 Docker Registry에 업로드하여 사용하고 있습니다.

시스템 구성

SonarQube 시스템 구성

SonarQube는 9000 Port를 기본으로 사용합니다. https 기반으로 서비스를 제공하기 위해, SonarQube앞단에 reverse-proxy로 nginx를 구성했습니다.

소나큐브 공식문서에서 SonarQube의 80 Port 사용은 reverse-proxy의 구성을 권장하고 있습니다.

Quality Practice

사내에서는 소프트웨어 품질을 향상시키기 위한 활동을 ‘품질 혁신 활동(Quality Practice, QP)’이라고 부르면서, 많은 이들이 ‘QP 활동’을 위해 노력하고 있습니다.

이 활동은 ‘동작하는 코드’가 아닌 ‘동작하는 클린 코드’를 만드는 문화를 각 팀에 내재화하는 것을 목표로 하고 있습니다. 다시 말해, 개발 과정에서 코드 품질을 높이도록 개발 조직의 문화와 습관을 바꾸어 결과물의 품질을 개선하는 것을 말합니다.

즉, QP란 ‘소프트웨어 품질 향상을 위한 일련의 활동’을 말합니다.

QP는 일련의 활동으로 개발 프로세스도 포함합니다. Naver Financial에서는 QP의 여러 활동들 중 일부를 SonarQube를 통해 수행하고 있습니다. Naver Financial 결제형페이개발팀은 Github Actions를 활용하여 CI 파이프라인에 QP를 포함하도록 구성했습니다.

Pull Request CI

Pull Request CI flow
  • Step 1. 개발자는 작업 후 github에 Pull Request를 요청합니다.
  • Step 2. Github Actions을 통해 구성한 Workflow가 pull request 트리거를 통해 실행됩니다.
  • Step 3. 빌드 도구(Maven or Gradle)을 사용하여 프로젝트를 build하고 Unit Test를 실행합니다.
  • Step 4. SonarQube로 정적 분석을 요청합니다.
  • Step 5. 요청한 Pull Request에 대해 정적 분석 결과 리포트를 코멘트로 남깁니다.
  • Step 6. 개발자는 작업 내용에 대한 이슈를 보다 쉽고 빠르게 파악할 수 있습니다.

SonarQube 운영

Naver Financial의 SonarQube를 운영하면서 겪었던 Trouble Shooting을 공유합니다.

버전 이슈

SonarQube를 운영하면서 다음과 같은 상황에 버전 업데이트가 필요했습니다.

  • SonarQube LTS 버전 변경 (v.8.7 -> v.8.9)
  • Sonar Scanner에 Java 11+ 버전 지원 필요 (v.9.0)
  • JDK 17 지원 필요 (v.9.2)

Plugin 충돌

Naver Financial의 SonarQube는 다양한 Plugin을 설치하여 사용중입니다. 버전 업그레이드 전에, Sonarqube 버전과 Plugin 버전 호환성 확인이 필요합니다.

호환성을 미처 확인하지 못하고 SonarQube Pod를 실행하면 Fail to load plugin 에러와 함께 Pod가 실행되지 못합니다.

findbugs plugin 버전 충돌

이슈에 대한 대응 순서는 다음과 같습니다.

  1. SonarQube Pod 재실행 후, Pod 내부 접속
  2. plugin을 백업 파일로 변경(.bak)
  3. SonarQube Pod 정상 구동 후, SonarQube 버전과 plugin 버전 호환성 작업 진행

Memory 이슈

소나큐브 공식문서에서 Memory 설정에 대한 방법을 가이드하고 있습니다.

Naver Financial에서는 SonarQube를 연동하는 팀이 점점 증가하고 있습니다.

  • 22.8월 기준 약 2M line of code
  • 22.12월 기준 약 5M line of code

사용량이 증가함에 따라, SonarQube의 Memory가 중요한 운영포인트가 되었습니다.

과거 SonarQube의 Web 컴포넌트와 Compute Engine 컴포넌트의 Heap Memory에서 Out Of Memory가 발생하여, 일시적으로 SonarQube에 장애가 발생했었습니다.

이러한 경우 Memory 값 증가가 필요하고, Kubernetes 환경의 SonarQube는 다음과 같이 대응 가능합니다.

  1. Kubectl edit 명령어를 사용하여 리소스 편집기 진입
  2. 아래와 같이 SonarQube Container의 env에 Heap Memory 관련 환경변수 추가
SonarQube Container 환경 변수 설정

3. SonarQube Restart

이러한 상황을 미리 대비하는 것이 필요한데요. SonarQube에서는 Administration 메뉴를 통해서 각 컴포넌트에 대한 시스템 정보를 확인할 수 있습니다.

SonarQube Administration 화면

Reference

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

마치며

이상으로 Naver Financial의 코드 품질 관리에 대한 고민과 SonarQube에 대해 공유해 드렸습니다. SonarQube 에 관심이 있으시거나 도입을 고민하고 계시는 분들께 도움이 되었으면 좋겠습니다.

읽어주셔서 감사합니다.

--

--