Naver Financial 코드 품질 관리 — Part 1

SungKyu Eo
NAVER Pay Dev Blog
Published in
10 min readNov 16, 2022

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

Naver Financial 에서는 주문 / 결제 / 금융 서비스를 다양한 파트너사와 co-work 하여 사용자에게 제공하고 있습니다.

코드 품질 관리에 대한 고민과 SonarQube 활용 사례를 공유합니다.

연재

코드 품질과 SonarQube 활용

코드 품질은 왜 중요할까?

  • 비즈니스의 목표를 달성하기 위해 코드의 품질 / 개발 속도는 비즈니스에 직접적인 영향을 미치는 중요한 요소이며, 필요충분 조건이라고 할 수 있습니다.
  • 코드 품질이 뛰어나다고 비즈니스가 성공하는 것은 아니나, 코드 품질이 떨어지면 장애와 신뢰성 하락으로 비즈니스는 결국 성공하지 못하게 될 수 있습니다.

코드 품질 개선 및 유지를 위해서는?

  • 테스트 중심 개발과 CI/CD 파이프라인 도입을 통해 더 빠른 개발과 더 좋은 품질을 유지할 수 있습니다.
  • 전통적인 waterfall 방식은 장기적으로 비용이 비례하여 늘어나지만, 이를Linear 하게 유지할 수 있어 장기적으로 결국 이득이 됩니다.

결국 , TDD를 활용하고, CI/CD에 투자하면 코드 품질이 개선되며 이는 신규 개발, 유지보수 등 종합적으로 개발 비용을 감소시킬수 있고, 개발자에게도 더 나은 삶과 보다 중요한 비즈니스에 집중할 수 있도록 해줄 수 있다고 말할 수 있습니다.

핵심 키워드

  • TDD ( Test Driven Development )
  • 지속적 통합 ( Continuous integration, CI )
  • 지속적 제공 ( Continuous delivery, CD )

코드 품질 이슈 ( 파악 시점과 비용 )

  • TDD를 활용하고, CI/CD에 투자함으로써, 이슈 파악 시점을 더 빠르고, 효율적으로 앞당기고, 이는 개발자의 부담과 프로젝트의 비용을 줄여줄 수 있습니다.

코드 품질을 평가 항목은 아래와 같은 내용들이 있다.

  • Bug (버그, 신뢰성, Reliability domain)
  • Vulnerability (취약점, 보안성, Security domain)
  • Code Smell (부채, 유지 보수성, Maintainability domain)

코드 품질 이슈는 직/간접적인 비용이자 장기적인 부채이다.

다음은 품질 관리와 이슈에 대한 파악 시점에 따른 비용 차이를 표현한 그림입니다.

Phase/Stage of the S/W Deveopment in which the Defect is Found ( IBM Systems Sciences Institute )

나쁜 일이 일어난 후에 고치는 것보다 나쁜 일이 일어나지 않도록 노력하는 것이 더 낫습니다.

Defect 의 발견 시점에 따린 비용 발생 예

issue 가 어느 시점에 확인되는가에 따라 비용 차이는 천차만별이다.

이를 위해 CI/CD pipeline 을 구성에 투자하고, 개발자가 빠르게 인지할 수 있게 도와 주는 구조를 만들어 나가야합니다.

코드 품질 CI/CD pipeline 자동화 ( Automation ) 범주

Coding Convention

Static analysis

  • 소프트웨어를 실행하지 않고 도구를 이용해서 소스 코드나 바이너리를 분석해서 잠재적인 결함을 찾아내는 것
  • anti-pattern 에 대한 학습
  • 결함 ( defect ) 유발 요소 detection

Code Coverage

  • Unit Test ( short-running TC )
  • Integration Test ( long-running TC )

Complexity

  • Cyclomatic Complexity ( 순환 복잡도 )
  • Cognitive Complexity ( 인지 복잡도 )

Code Duplication Analysis

  • Duplicated blocks
  • Duplicated files
  • Duplicated lines

Secure Coding Analysis

코드 품질의 객관적 측정 및 시각화

  • 그렇다면, 우리 코드가 어느정도의 Test Code Coverage 를 가지고 있고, Code smell 과 버그가 없는, 안전한 (Secured) 코드인지 측정할 수 있을까?
  • 다양한 언어에 대한 분석을 지원하고, 코드 품질의 개선 상태와 추이를 시각적으로 표현할 수 있을까?
  • 코드 품질 분석을 자동화 ( CI/CD pipeline 에 포함 시키는 것 ) 하고, Code repository ( e.g. github / bitbucket 등 ) 에 유연하게 통합시킬 수 있을까?

점진적 도입의 필요성

  • 역사가 오래된 legacy 코드에 도입할 때, 한번에 모든 issue 에 대해 분석하게 되면, 너무 많은 문제와 부담을 개발자에게 주게 됩니다.
  • 실제로 이러한 경우는 개발자에게 극심한 부담감과 거부감을 주게 됩니다. 내가 작성한 코드가 아닌데… 이걸 다 고쳐야해?
  • 코드 품질 측정 시 새롭게 내가 작성한 코드 ( Focus on New Code ) 에 대해서 책임 ( Personal Responsibility ) 을 질 수 있게 해주는 것이 필요합니다.
코드의 Vulnerabilities 는 0 로 잘 유지되고 있으나, Reliability ( Bug ) 가 다소 증가했고, Maintainability 가 꾸준히 증가하고 있다. 문제를 개선 하기 위해서는 현재의 수준을 알아야 한다.

NF 에서는 위와 같은 요건들을 만족하고, CI / CD Pipeline 에 통합하기 위한 용도로 SonarQube 를 채택하여 활용하고 있습니다.

SonarQube 도입 및 활용

SonarQube 란 SonarSource사가 개발한 오픈소스 플랫폼으로 코드 정적 분석을 통해 버그와 코드 악취, 보안 취약점을 보여줌으로 지속적인 코드 품질 향상을 위한 도구로 기존에 존재하던 PMD, FindBugs, CheckStyle, Cobertura 등의 정적분석 툴을 플러그인으로 제공하고 있습니다.

또한, 분석 결과를 데이터베이스에 저장하고 대시보드를 통해 시각화 된 보고서를 참고하고 개선 추이를 확인 할 수 있습니다.

소나큐브 Edition 별 지원 기능 비교

Developer Edition ( Built for Developers By Developers )

DE 버전에서는“Branch 분석, PR 분석, 보안 취약점 검사 기능”을 활용할 수 있는데, 사용자(개발자)에게 최소한의 context switch 할 수 있도록 하기 위해 Developer Edition 을 채택하게 되었고, 주요 기능에 대해 설명합니다.

Branch Analysis

  • (feature) branch 별 분석이 가능합니다.

Pull Request decoration

  • Git 의 ALM ( Application Lifecycle Management ) 과의 통합이 가능하고, PR 내에서 분석 결과를 확인할 수 있습니다.
github ALM 통합
분석 결과의 PR decoration

Detect Security Vulnerabilities and Security Hotspots during code review

- ref : https://docs.sonarqube.org/latest/user-guide/security-hotspots/

OWASP, CWE, CVE 등 각종 보안 관련 프로젝트를 기반으로 분석하여 보안 리스크의 이유와 변경 best practice 를 설명해줍니다.

많은 회사들에서 보안 코딩 교육을 주기적으로 수행하고 있으나, 직접적으로 내가 작성한 코드에 대해 Security 이슈를 확인하고, Review 하는 것이 더 효율적입니다.

보안 코딩 교육과 더불어 이는 개발자의 Secured Coding 역량 향상에 큰 도움이 될 수 있습니다.

  • OWASP(The Open Web Application Security Project) 는 오픈소스 웹 애플리케이션 보안 프로젝트입니다. 주로 웹에 관한 정보노출, 악성 파일 및 스크립트, 보안 취약점 등을 연구하며, 10대 웹 애플리케이션의 취약점 (OWASP TOP 10)을 발표했습니다. 이 프로젝트의 원래 목표는 단순히 개발자와 관리자의 인식을 높이는 것이었지만, 사실상 애플리케이션 보안의 업계 표준이 되었습니다.
  • CVE(Common Vulnerabilities and Exposures) 는 취약점 리스트로, 발견된 보안 취약점들을 체계적으로 정리하여 보안 취약점 고유 번호로 나타냅니다.
  • CWE(Common Weakness Enumeration) 는 보안약점 리스트로, MITRE 프로젝트에서 관리하며 주요 취약점, 보안 문제를 정리한 프로젝트입니다.
Security Hotspot Review 화면

Multi-Languages

  • 서비스 개발 시 보다 서비스 특성에 맞게 보다 적합한 언어를 채택해 다양한 언어로 개발을 진행하게 되는데, 다음과 같이 다양한 언어에 대한 분석을 지원합니다.
  • CE : Java, JavaScript, C#, TypeScript, Kotlin, Ruby, Go, Scala, Flex, Python, PHP, HTML, CSS, XML and VB.NET
  • DE : ( CE에서 지원하는 언어 ) + ( C, C++, Obj-C, Swift, ABAP, T-SQL, PL/SQL )

SonarLint

  • IDE plugin 으로 SonarLint 를 제공합니다.
  • Eclipse, IntelliJ IDEA, Visual Studio, VS Code IDE 와 같은 대중적인 IDE 를 모두 지원한다.
  • Plugin설정을 통해 개인별 CodeStyle 등의 개별 설정 없이 SoanrQube 서버의 프로파일로부터 동기화된 설정을 통해 일관된 분석이 가능합니다.
SonarLint plugin 과 SonarQube server profile 동기화
SonarLint 를 통한 local 환경 분석 결과

다음 “SonarQube 소개”편에서는

SonarQube 연동과 NaverFinancial 에서 어떻게 SonarQube를 활용하고 있는지에 대해 소개할 예정입니다.

--

--

SungKyu Eo
NAVER Pay Dev Blog

네이버페이 간편결제 플랫폼을 개발하고 있으며, 꽃돼지들을 사랑하는 아빠 개발자입니다.