.NET Tools Code Review Customer Stories Tools

게임 개발 시 Qodana 및 Unity를 사용하여 코드 품질을 향상하는 방법

Read this post in other languages:

JetBrains Qodana는 정적 분석을 CI/CD 시스템의 팀 검토까지 확장해주는 코드 품질 플랫폼입니다.

특히 코드 검토 표준 및 품질 게이트를 설정할 때 팀이 더욱 효과적으로 협업할 수 있다는 것이 이 플랫폼의 장점 중 하나입니다. 또한 이 프로세스를 통해 팀의 모든 구성원이 해당 표준을 더욱 엄격하게 준수할 수 있습니다.

VR Unity 팀은 매출을 산 모양으로 시각화하는 가상 현실 앱인 Archipelago라는 내부 Unity 프로젝트에 Qodana를 활용하기로 했습니다. Qodana는 전체 팀이 코드를 검토할 수 있도록 Rider의 모든 Unity 검사를 CI 분석에 도입합니다. 이 접근 방식이 저희의 주요 관심 대상이었습니다. Qodana가 초보자가 사용하기에도 좋은지 여부를 판단하기 위해 초보 개발자가 분석을 도왔습니다.

저희는 Qodana가 초보 개발자에게 좋은 학습 경험이 되고, 이들이 코드 품질을 향상시키는 데 도움이 되는 도구가 되기를 바랐습니다. 초보 개발자가 초보 이상 수준의 코드를 제공하는 데 도움이 되었기 때문에 성과는 기대 이상이었습니다. 팀이 분석을 실행하기 위해 취한 단계 및 그 과정에서 경험한 내용은 아래에 자세히 나와 있습니다.

전제 조건: 파이프라인 설정

Qodana를 사용하기 전에 이미 TeamCity에 빌드 파이프라인이 구성되어 있었습니다. 이 파이프라인에서 Unity Editor의 Docker화된 버전이 포함된 Linux Docker 이미지의 도움을 받아 Unity 프로젝트를 구축했습니다. 이를 통해 메인 브랜치에서 풀 리퀘스트를 생성할 때마다 프로젝트의 APK가 구축되었습니다.

Qodana 분석 보고서를 얻기 위해 다음 단계를 수행했습니다.

1. Qodana Cloud에서 프로젝트를 생성합니다.

2. 솔루션을 생성하고 필요한 모든 패키지를 설치합니다.

Unity 프로젝트에는 일반적으로 C# 솔루션과 프로젝트 파일이 포함되지 않으며, Qodana가 이를 처리하려면 이러한 파일을 생성해야 합니다. 빌드 환경에 해당 .NET SDK를 설치하고 각 빌드에서 다음 스크립트를 실행했습니다.

#!/usr/bin/env bash

${UNITY_EXECUTABLE:-xvfb-run --auto-servernum --server-args='-screen 0 640x480x24' unity-editor} 

 -batchmode -quit -projectPath $UNITY_DIR -executeMethod Packages.Rider.Editor.RiderScriptEditor.SyncSolution

3. 프로젝트의 저장소 루트에 qodana.yaml 파일을 추가합니다.

ide: QDNET

version: "1.0"

baseProfile: "qodana.recommended"

4. Qodana에 액세스할 수 있도록 파이프라인 구성에서 QODANA_TOKEN이라는 환경 변수를 설정합니다. 토큰은 Qodana Cloud의 프로젝트 페이지에서 가져와야 합니다.

5. Qodana 분석을 시작합니다.

맞춤형 빌드 파이프라인을 사용하고 있었기 때문에 Qodana를 호스팅하기 위해 컨테이너를 시작하는 대신 Qodana CLI를 사용하여 네이티브 모드(빌드 시스템에서)로 Qodana를 시작하기로 결정했습니다. Linux 시스템에서 그렇게 하려면 Qodana CLI를 다운로드해야 했습니다. GitHub, GitLab 또는 Azure DevOps 파이프라인에서는 이것이 필요하지 않습니다. Qodana와 다양한 CI 시스템의 통합에 관해서는 여기에서 자세히 알아볼 수 있습니다.

분석을 올바르게 실행하기 위해서는 프로젝트가 위치한 폴더에서 아래 명령어를 실행해야 했습니다. 그러면 출력 및 보고서가 /report 폴더에 생성됩니다. 편의를 위해 빌드 아티팩트로 보고서에 액세스할 수 있도록 빌드 파이프라인 구성을 수정했습니다.

curl -fsSL https://jb.gg/qodana-cli/install | bash

qodana scan -i $(pwd) -o /report

결과적으로, 메인 브랜치가 변경될 때마다 APK 파일뿐만 아니라 브라우저에서 보거나 Rider에서 열 수 있는 Qodana Cloud의 보고서도 얻을 수 있었습니다.

Qodana 보고서 설정

처음 받았던 보고서에는 거의 33,000개나 되는 문제점이 있었습니다. 관련이 없는 것들도 있으니 너무 놀라지 마세요! 기본 프로파일로 분석을 시작했을 때 Asset Store의 모든 Unity 라이브러리와 애셋에서 실수로 문제가 발생했습니다.

초기 Qodana 분석
첫 보고서입니다.

UI 내에서 Scripts 폴더를 선택했을 때 약 400개의 문제가 있었습니다. 여전히 많아 보였지만 조금 더 자세히 살펴보기로 했습니다.

폴더 필터가 적용된 첫 번째 보고서입니다.

이 보고서로 작업할 수 있었지만 IDE에서 열려고 하면 여전히 32,856개의 문제가 있는 전체 보고서가 제공되므로 별 도움이 되지 못했습니다. 전체 프로젝트가 아닌 코드 베이스에 대해서만 분석을 수행하기 위해 사용자 지정 프로파일을 추가했습니다. 그런 다음, 프로파일에 대한 링크만 포함하도록 qodana.yaml 파일을 업데이트하여 작업하기가 훨씬 쉽게 만들었습니다.

ide: QDNET

version: 1.0

profile:

   path: profile.yaml

qodana.yaml

profile.yaml 파일에는 전체 분석을 위한 검사가 포함되었습니다. Scripts 폴더만 보려고 했으므로 이를 위해 범위를 사용했습니다.

baseProfile: "qodana.recommended"

inspections:

  - group: ALL

    ignore:

- "scope#!file:Assets/Scripts//*"

profile.yaml

보고서 작업

올바른 프로파일을 선택하고 올바른 보고서를 받은 후에 경고를 더 자세히 살펴보았습니다. Qodana 보고서를 Rider와 연결하는 방법에 관해서는 문서에서 자세히 알아볼 수 있습니다. 대부분의 경고는 Redundant using directive(불필요한 using 지시문) 또는 Namespace does not correspond to file location(네임스페이스가 파일 위치와 일치하지 않음)과 같은 군더더기 및 제약 조건 위반을 알려주는 것들이었습니다.
이러한 문제는 IDE의 Context Actions(컨텍스트 액션)을 사용하여 몇 번의 클릭만으로 해결할 수 있습니다.

“Using directive is not required by code and can be safely removed”(코드에 using 지시문이 필요하지 않으며 안전하게 제거할 수 있습니다)와 같은 문제 해결

군더더기 및 제약 조건 위반 외에 수많은 경고는 구문 오류 또는 일반적인 관행 위반에 관한 것이었습니다. 대부분의 경우 private으로 설정할 수 있는 private 제어자나 멤버가 누락되어 있었습니다.

다음으로, Unity 및 Unity 성능만 검사하는 별도의 카테고리를 선택했습니다. 이러한 문제는 Context Actions(컨텍스트 액션)을 사용하는 IDE의 빠른 수정을 통해 해결할 수 있으며 개선을 통해 코드 효율성과 가독성을 높일 수 있었습니다.

Unity 성능 문제.

Expensive method invocation(부하가 높은 메서드 호출)과 같은 문제의 경우, 일부 코드를 다시 작성해야 했습니다. 그 중 가장 일반적인 것은 여기에 설명된 대로 일반적으로 GetComponent 메서드를 성능이 중요한 컨텍스트에서 Awake 또는 Start 이벤트 함수로 이동하는 것과 관련이 있습니다.

베이스라인 작업

점점 해결하기 더 복잡한 문제에 직면하게 되었습니다. 예를 들어, BuildCommand.cs 클래스와 PerformBuild 메서드가 빌드를 생성하는 데 사용되었지만 Unity에서는 호출되지 않았습니다.

다음으로, 이 경우 DateContext.cs에 부하가 높은 것으로 표시된 메서드 호출이 있었습니다. 이러한 문제는 프로젝트 레이아웃에 문제가 되지 않는 것으로 간주되었기 때문에 이를 베이스라인에 넣기로 했습니다. 아래 그림은 수정하지 않기로 결정한 오류 목록입니다.

해결되지 않은/수정되지 않은 오류.
수정할 필요가 없는 기술적 부채나 문제를 베이스라인에 추가합니다.

프로젝트에 베이스라인을 추가하기 위해 Qodana Cloud에서 qodana.sarif.json 파일을 다운로드하여 루트 디렉터리로 옮겼습니다.

프로젝트에 베이스라인을 추가합니다.

그런 다음 빌드 단계에 베이스라인 매개변수를 추가했습니다.

curl -fsSL https://jb.gg/qodana-cli/install | bash

qodana scan -i $(pwd) -o /report --baseline ./qodana.sarif.json

Baseline parameter.

이때부터는 새로운 문제에 대한 보고만 받게 되었습니다. 하지만 당분간은 모두 문제가 없어 보였습니다.

새로운 결과.

결과를 자세히 살펴보면

이 실험 과정에서 우리는 TeamCity 파이프라인에 Qodana를 추가하고, 프로파일을 구성하고, 여러 분석 보고서를 받고, 프로젝트의 거의 모든 문제를 해결했습니다!

Qodana를 사용하면 프로젝트의 코드를 검토하고 이를 훨씬 더 깔끔하고 효과적으로 만드는 데 큰 도움이 됩니다.  Qodana의 진정한 힘은 팀 협업에서 비롯되지만 팀이 정적 코드 분석을 구현하는 데 도움을 주는 귀중한 도구이기도 합니다. 특히 JetBrains IDE(이 경우 Rider) 또는 VS Code(Qodana VS Code 확장 프로그램 포함)를 사용하는 경우에는 더욱 그렇습니다.

Qodana를 설치하고 이 지침에 따라 직접 사용해 보세요. 저희가 수행한 작업에 대해 더 알고 싶으면 언제든지 의견을 남겨주세요.

게스트 기고자: Ekaterina Trukhan, VR Unity 개발자

Qodana 팀의 메시지

Unity 및 Qodana를 시험해준 Ekaterina와 팀에게 감사드립니다. Qodana를 시작하는 방법이 궁금한 분들이 계시다면 아래 댓글을 통해 알려주시거나 Qodana의 YouTrack 프로젝트에 이슈를 올려주세요. 더 많은 업데이트를 보려면 LinkedIn 또는 X(이전 Twitter)에서 저희를 팔로우하세요.

60일 무료 평가판 사용해 보기

게시물 원문 작성자

Jessie Cho

Ekaterina Trukhan

Jessie Cho

Kerry Beetge

Qodana Advocate, Tech Journalist and IoT enthusiast.

image description

Discover more