.NET Tools
Essential productivity kit for .NET and game developers
Qodana를 사용한 C# 코드 품질 개선: 완벽을 향한 여정
JetBrains IDE는 언제나 다양한 언어를 지원하는 강력한 정적 코드 분석 기능으로 잘 알려져 있습니다. Qodana 출시를 통해 모든 개발 프로세스의 핵심인 중앙 코드 품질 플랫폼, 즉 사용자의 CI/CD 도구에 지식을 통합합니다.
Qodana는 커밋 또는 풀 리퀘스트로 트리거되며, 발견된 모든 코드 품질 및 보안 이슈에 대한 종합 분석 보고서(SARIF)를 생성할 수 있습니다. 개발 팀이나 QA 엔지니어뿐 아니라 보안 관리자와 법무/규정 준수 부서도 Qodana에서 보고서를 간편하게 확인할 수 있습니다.

Qodana는 최근 .NET 도구를 지원하기 시작했으며 우수한 Rider 통합 기능도 제공합니다. 분석 기능은 기존 InspectCode를 기반으로 합니다. InspectCode는 Establishing a zero-warning policy with ReSharper’s solution-wide analysis 또는 ReSharper Command-Line Tools – Cross-Platform and Global Tool와 같은 블로그 게시물에서 소개된 바 있습니다. InspectCode는 코드 이슈를 발견하는 Rider 및 ReSharper의 분석 기능을 동일하게 실행합니다. CI/CD 에이전트를 사용하면 솔루션 전체 분석을 로컬 시스템에서 실행할 필요가 없으므로 개발 환경, 반응 속도 및 배터리 수명 향상 등 상당한 이점이 있습니다.

Qodana 보고서의 작동 방식을 직접 확인하려면 FluentAssertions 또는 NUKE의 공개 보고서를 참조하세요. 프로젝트에서 Qodana를 사용해보고, 다양한 CI/CD 환경 및 Rider에서 제공되는 전문적 기능을 자세히 알아보려면 다음 섹션을 읽어주세요!
.NET 프로젝트용 Qodana 설정
Qodana는 Docker 컨테이너에서 실행되므로 Docker가 로컬 및 CI/CD 환경에 설치되어 있어야 합니다. 로컬에서 사용하려면 Qodana CLI를 설치하는 것이 좋습니다(Docker 직접 호출도 가능).
- Windows에서 WinGet 사용:
winget install -e --id JetBrains.QodanaCLI
- Windows에서 Chocolatey 사용:
choco install qodana
- macOS:
brew install jetbrains/utils/qodana
- Linux:
curl -fsSL https://jb.gg/qodana-cli/install | bash
다음 단계에서 qodana init
을 호출해 설정 마법사를 트리거할 수 있습니다.

적절한 Linter와 솔루션 파일을 선택하면 Qodana에서 다음과 유사한 qodana.yml
구성 파일을 생성합니다.
version: "1.0" linter: jetbrains/qodana-dotnet:latest dotnet: solution: MySolution.sln
.NET 관련 설정에 대한 자세한 내용은 .NET용 Qodana 문서를 참조하세요.
이제 qodana scan --show-report
호출해 로컬에서 Qodana 검사를 실행할 준비가 된 것입니다. 검사를 완료하면 Qodana는 브라우저에서 http://localhost:8080
의 HTML 보고서를 엽니다.

일반적인 사용자 인터페이스 개요뿐 아니라, 태그 드롭다운을 활용해 대상 프레임워크별 .NET 프로젝트를 필터링할 수 있다는 점이 돋보입니다. 또한 멋진 선버스트 차트를 사용해 결과를 필터링하는 방법도 확인해 보시죠!

정말 훌륭한 기능입니다! 😎
조사할 이슈를 찾으면 해당 이슈를 확장해 일반적 이슈 텍스트/카테고리/유형 외의 세부 정보를 표시할 수 있습니다. 세부 정보 패널에서 실제 코드 스니펫과 파일 경로 및 대상 프레임워크를 확인할 수 있습니다. 특히 IDE에서 바로 파일을 여는 Open file in Rider(Rider에서 파일 열기) 버튼과 Why is ReSharper suggesting this?(ReSharper에서 이 항목을 제안하는 이유) 지식 베이스로 연결되는 푸터 노트에 주목하세요.

CI/CD 환경에서 Qodana 검사
Qodana는 CI/CD 환경에 통합될 때 최고의 잠재력을 발휘합니다. 모든 빌드에서 새로운 분석 보고서가 생성되며, 보고서를 Qodana Cloud에 업로드하거나 Rider에서 다운로드 및 검사할 수 있습니다. 또한 Establishing a zero-warning policy with ReSharper’s solution-wide analysis 블로그 게시물에 설명된 접근 방식과 유사하게 빌드 파이프라인에 품질 게이트를 설정할 수도 있습니다. 커밋 또는 풀 리퀘스트에서 코드 이슈가 발생할 때마다 Qodana는 빌드 실패를 통해 사용자에게 해당 이슈를 알립니다.
간단한 3단계를 거쳐 코드 품질 게이트를 활성화할 수 있습니다. 처음부터 시작하는 프로젝트가 아니라면, 기존의 모든 이슈를 베이스라인(백로그와 유사)으로 옮겨 장애 발생 가능성을 낮추는 것이 좋습니다.

두 번째 단계로, failThreshold
값을 사용해 qodana.yml
구성 파일을 확장해야 합니다. 이 프로퍼티는 베이스라인과 비교할 때 빌드 실패 없이 새롭게 발생하는 이슈 개수를 보여줍니다.
version: "1.0" linter: jetbrains/qodana-dotnet:latest failThreshold: 0 dotnet: solution: MySolution.sln
세 번째 단계로, 현재 코드 이슈 집합을 베이스라인과 비교하도록 빌드 파이프라인을 구성해야 합니다. --baseline qodana.sarif.json
을 Qodana Scan 호출에 전달하면 됩니다. CI/CD 환경에서 품질 게이트를 활성화하는 방법을 자세히 알아보려면 Qodana 문서를 참조하세요.
또한 Qodana Cloud를 활용하려면 환경 변수로 QODANA_TOKEN
을 추가하세요. 해당 환경 변수가 추가되면 Qodana가 보고서를 지속적으로 업로드하여 과거 기록을 확인할 수 있습니다. 그뿐 아니라 언제든 qodana show
명령어를 통해 다운로드한 보고서를 로컬에서 사용할 수도 있습니다.
다음 Qodana 검사를 실행하면 아래와 같이 모든 이슈가 Baseline(베이스라인) 탭으로 이동된 것을 확인할 수 있습니다.

다음 섹션에서는 가장 많이 사용되는 CI/CD 환경에 Qodana를 통합하는 방법을 살펴보겠습니다. 자세한 내용은 GitHub Actions, Azure Pipelines, TeamCity, GitLab, CircleCI, Space Automation 및 Jenkins 관련 문서를 참조하세요.
GitHub Actions의 Qodana
GitHub Actions에서 빌드된 모든 커밋 및 풀 리퀘스트의 상태 검사를 위해 Qodana를 사용할 수 있습니다.

특히 풀 리퀘스트의 경우 코드 검토자 및 커미터가 한눈에 이슈를 즉시 파악할 수 있도록 Qodana에서 코드 어노테이션을 추가합니다.

Azure Pipelines의 Qodana
Qodana는 업계 표준인 SARIF 파일로 보고서를 생성하므로 SARIF SAST Scans(SARIF SAST 검사) 탭을 통해 Azure Pipelines에 통합할 수 있습니다.

TeamCity의 Qodana
JetBrains의 강력한 CI/CD 도구인 TeamCity를 사용하면 Qodana 보고서가 빌드 세부 정보 뷰에서 별도의 탭으로 표시됩니다. 다른 빌드의 보고서와 비교해 변경 사항을 확인할 수도 있습니다.

프로 팁: TeamCity에 나만의 탭을 추가할 수 있습니다!
또한 코드 이슈를 실패한 테스트로 처리하는 것도 가능합니다. 따라서 기존의 Investigating and Muting Build Failures(빌드 실패 조사 및 끄기) 기능을 사용해 더 효과적인 팀 워크플로를 구성할 수 있습니다.

Rider의 Qodana 보고서
Qodana는 Rider 및 기타 IntelliJ IDEA 파생 제품과 완벽하게 통합됩니다. Problems(문제) 도구 창의 Qodana 탭을 사용하면 발견된 모든 이슈를 살펴보고, 별도의 패널에서 미리 보고, 해결할 수도 있습니다(이슈 억제 또는 심각도 변경도 가능).

대상 프레임워크별 필터링과 같이 도구 창에 더 많은 필터링 및 그룹 지정 기능을 추가할 계획입니다.
기본 설정에 따라 Qodana 보고서를 Qodana Cloud에서 자동으로 가져오거나 보고서 파일에서 수동으로 로드할 수 있습니다.
Qodana Cloud를 사용할 경우 설정 대화상자에서 바로 로그인할 수 있습니다. 로그인 후 Rider에서 현재 프로젝트를 Qodana Cloud 프로젝트에 연결할 수 있습니다.

Qodana Cloud 계정이 없거나 보고서를 수동으로 로드하려는 경우엔 Open Qodana Analysis Report(Qodana 분석 보고서 열기) 액션을 사용하면 됩니다.

향후 계획
Qodana는 빠르게 성장하고 있으며 최근 .NET 에코시스템을 위한 기능도 처음으로 선보였습니다. 이미 수년 동안 존재했던 구성 요소(InspectCode)를 기반으로 전체 분석 기능이 수행되므로, 엄청난 시너지를 낼 수 있습니다. 물론 Qodana 팀은 앞으로 더 많은 통합을 선보일 계획입니다!
Alt-Enter를 한 번 눌러보세요! 코드 이슈 및 스타일 위반에 대한 빠른 수정을 CI에서 자동으로 적용할 수 있다면 어떨까요? 이 목표는 시간이 소요되는 작업이나, 개발자가 상용구 키 입력 시간을 단축하고 프로젝트의 비즈니스 가치에 더 집중할 수 있으므로 큰 도움이 될 겁니다.
적극적으로 개발 중인 기능은 라이선스 감사 기능입니다. 이 검사는 프로젝트 라이선스가 종속성(예: NuGet 패키지) 및 모든 이행적 종속성 라이선스 준수 여부를 확인하는 데 도움이 됩니다.

결론
Qodana는 코드베이스에서 함께 코드 품질을 개선하는 훌륭한 도구로, 모든 JetBrains IDE 및 원하는 CI/CD 환경에 완벽히 통합됩니다.
Qodana CLI를 설치해 솔루션 중 하나에 사용해 보거나, Qodana Cloud를 구독해 코드 품질 개선을 손쉽게 지속적으로 추적할 수 있습니다.
이 글을 읽어주셔서 감사합니다. 의견이나 질문이 있을 경우 댓글란에 남겨주세요.
이미지 크레딧: Jesse Gardner
게시물 원문 작성자