Code Review Coding New Products News Releases

Qodana 2023.1: 유연한 프로파일 구성, Kotlin/JS IR 컴파일러 마이그레이션 지원, Go 라이선스 호환성 검사, 플러그인 통합 및 30개 이상의 신규 검사

Read this post in other languages:

현재 테스트 버전 상태인 Qodana는 JetBrains의 스마트한 코드 품질 플랫폼입니다. 강력한 정적 분석 엔진으로서 JetBrains IDE의 검사를 어느 CI 파이프라인으로든 가져올 수 있으며, 리소스를 많이 사용하는 검사는 CI 서버에서 실행하여 시간과 컴퓨팅 리소스를 절감해 줍니다. 또한 60개 이상의 기술과 무제한의 코드 줄 분석을 지원합니다.

신규 Qodana 릴리스에는 코드 품질을 최상으로 유지해주는 주요 개선 사항이 포함됩니다. 버전 2023.1에서는 더욱 유연하게 CI 파이프라인에서 정적 분석 단계를 진행할 수 있습니다. 프로젝트 검사 확인을 구성하기 위한 스마트한 방법이 추가되었으며, Qodana 정적 분석 엔진에 플러그인을 추가하는 손쉬운 방법도 구현되었습니다. 

계속 읽으면서 주요 업데이트의 전체 목록을 확인하거나 linter 관련 개선 사항으로 바로 이동하세요. 

Qodana 무료로 사용해보기

주요 업데이트 

신규 YAML 양식으로 유연하게 프로파일 구성

검사 프로파일은 Qodana 구성의 매우 중요한 부분입니다. 프로파일은 Qodana가 분석 중에 코드에 적용할 검사 세트를 정의합니다.

Qodana 2023.1 버전부터 유연한 프로파일 구성이 사람이 읽기 편한 YAML 서식으로 제공되어, 훨씬 더 간편하게 검사 프로파일을 사용자 지정하고 프로젝트 진행에 따라 조정할 수 있습니다. 다음은 분석을 세밀하게 설정할 수 있는 옵션입니다.

  • [신규] 검사를 그룹화하고 그룹을 관리. 
  • [신규] 기존 프로파일을 포함하고 새로운 프로파일 구성. 
  • 검사 활성화 및 비활성화.
  • 검사 매개변수 설정. 
  • 검사 범위 구성. 

예를 들어 Qodana for PHP linter에서 PhpDeprecationInspection 검사를 제외하고 PHP/일반 검사 카테고리를 사용하여 코드를 검사할 수 있습니다.

name: "PHP/General without PhpDeprecationInspection"
inspections:
  - group: "category:PHP/General"
    enabled: true # Enable the 'PHP/General' category
  - inspection: PhpDeprecationInspection
    enabled: false # Disable the PhpDeprecationInspection inspection

사용자 지정 프로파일에 관한 자세한 정보는 문서를 참조하세요. 

디폴트 프로파일의 주요 리팩터링

Qodana에는 두 종류의 디폴트 프로파일이 제공됩니다. qodana.starter는 중요한 검사에만 사용되며 프로젝트를 처음으로 검사할 때 적합합니다. qodana.recommended는 사전에 선택되고 대부분의 프로젝트에 적합한 검사 모음을 활성화합니다.

이 두 프로파일은 IDE에서 제공되는 디폴트 프로파일에 맞춰 모두 재작성되었습니다. 이러한 변경은 투명성을 향상하여, Qodana와 IDE에서 실행되는 검사를 거의 동일하게 유지하고 코드 품질을 더 일관되게 관리할 수 있습니다. 

업데이트된 qodana.recommended 프로파일은 GitHub에서 찾을 수 있습니다. 이 프로파일은 다음 몇 가지 예외를 제외하고 디폴트 IDE 프로파일과 일치합니다.

  • 가벼운 분석 시에는 시간이 많이 걸리는 전역 검사가 비활성됩니다.  
  • 빌드 디렉터리 및 테스트 소스와 같은 일부 프로젝트 디렉터리가 분석에서 기본적으로 제외됩니다.

업데이트된 qodana.starter 프로파일은 GitHub에서 찾을 수 있습니다. 이 프로파일은 qodana.recommended 프로파일에서 파생되었으며 중요한 검사만 실행합니다. 다음은 주요 변경 내용입니다.

  • 코드 스타일코드 규칙 의미 관련 검사가 비활성화되었습니다. 
  • 코드베이스의 실행할 수 없는 부분(예: Javadoc)에 대해 검사가 비활성화되었습니다.

Qodana에 플러그인을 추가하는 손쉬운 방법

Qodana를 확장하고 JetBrains Marketplace의 검사 플러그인을 사용하려면, 먼저 플러그인 ID를 qodana.yaml 파일에 추가해야 합니다. 

최근에 Marketplace가 업데이트되어 플러그인의 ID를 페이지에서 직접 복사할 수 있습니다. 

플러그인에 필요한 타사 소프트웨어를 설치하는 방법은 두 가지가 있습니다.

  • bootstrap 옵션을 사용합니다.
  • FROM jetbrains/qodana...로 시작하는 사용자 지정 Dockerfile을 개발합니다. GitHub에 있는 Qodana Dockerfile 예시를 사용할 수 있습니다.

다음은 확인할 가치가 있는 인기 플러그인 중 일부입니다.

  • Grazie Professional: 고급 자연어 작성 지원, 철자 검사, 문법 수정, 자연어 완성 및 기타 텍스트 작성 및 편집에 유용한 도구를 제공합니다. 
  • CheckStyle: IntelliJ IDEA 내의 CheckStyle을 기반으로 Java 파일을 실시간 혹은 요청 시에 검사합니다.
  • Zero Width Characters Locator: 검사를 추가하여 소스 코드 및 리소스에서 너비가 0인 문자와 관련된 찾기 힘든 일부 버그를 방지합니다. 

JetBrains Marketplace에서 이 검색을 이용하면 더 많은 플러그인을 찾을 수 있습니다. 

Qodana는 현재 유료 플러그인은 지원하지 않으며, 현재 버전과 호환되지 않는 플러그인이 있을 수 있습니다. 올해 JetBrains Marketplace에 Qodana 플러그인의 호환성을 검사하는 기능을 추가하기 위해 작업 중입니다.

Linter 관련 업데이트

Qodana 내의 신규 JVM 검사 

Kotlin/JS IR 컴파일러용 검사

Kotlin 팀은 Kotlin 소스 코드를 JavaScript로 마이그레이션할 수 있도록 지원하는 새로운 IR 컴파일러를 도입했습니다. 마이그레이션 프로세스를 가속화하고 잠재적인 오류를 찾아내기 위해 Qodana에서 이제 다음의 검사가 지원됩니다.

NonExternalClassifierExtendingStateOrProps

React의 StateProps와 같이 순수 JS 클래스에서 파생된 Kotlin 인터페이스 및 클래스(데이터 클래스 포함)를 사용하면 ClassCastExceptions가 발생할 수 있습니다. 이러한 예외는 이러한 클래스의 인스턴스가 실제로는 JS임에도 불구하고 Kotlin 객체인 것처럼 컴파일러가 취급하려 하기 때문에 발생합니다.

이를 해결하는 방법은 순수 JS 클래스에서 파생되는 모든 클래스와 인터페이스를 외부 인터페이스로 변환하는 것입니다. Qodana는 외부 분류자가 아닌 State 혹은 Props의 확장 사용을 보고합니다. 

NonVarPropertyInExternalInterface

Kotlin/JS 코드에서 외부 인터페이스의 프로퍼티는 객체가 js() 혹은 jso()로 생성된 후에만 값이 대입될 수 있으므로 읽기 전용(val) 프로퍼티일 수 없습니다. 해결 방법은 외부 인터페이스의 모든 프로퍼티를 var로 변환하는 것입니다.

Qodana는 var가 아닌 프로퍼티를 변환할 수 있도록 모두 강조 표시합니다.

SpringTransactionalMethodCallsInspection

Spring 프레임워크로 코드 어노테이션을 활용하여 애플리케이션 트랜잭션을 관리할 수 있습니다. '@Transaction'으로 표시된 메서드의 외부 호출만 트랜잭션하에서 실행되고, 자기 호출은 새 트랜잭션을 시작하지 않습니다. 이로 인해 트랜잭션 관리 시 오류가 발생할 수 있으므로 Qodana는 이 새로운 검사를 사용하여 해당 경우를 강조 표시합니다.

JUnitMixedFramework

프로젝트 내에서 여러 버전의 JUnit을 사용하면 개발자가 하나의 테스트 케이스 내에서 여러 버전을 실수로 혼용하여 오류가 발생할 수 있습니다. 다음 코드를 예로 들어보겠습니다.

테스트는 JUnit4로 실행되므로 JUnit5의 BeforeEach 어노테이션은 처리되지 않으며 테스트가 NullPointerException을 일으키며 실패합니다. 

Qodana는 기본적으로 테스트 소스를 확인하지 않습니다. 따라서 이 검사를 포함하려면 다음의 구성을 qodana.yaml에 추가해야 합니다.

include:
  - name: JUnitMixedFramework
    paths:
    - <path-to-tests-directory>

MathRoundingWithIntArgument

이 검사는 MathStrictMathround(), ceil(), floor()rint() 메서드에 대한 호출을 보고합니다. 정수에서 이러한 메서드를 호출하는 것은 불필요하며 정수 나누기와 같은 실수가 발생했다는 의미일 수 있습니다.

Qodana for JVM 사용해보기

Go용 타사 라이선스 감사

오픈 소스 구성 요소에 의존하거나, 개발을 아웃소싱하거나, GitHub과 같은 서비스의 코드를 재사용하는 경우 적절한 라이선스를 사용해야 합니다. 그러나 실수로 라이선스 제한이 있는 라이브러리를 소프트웨어 코드베이스로 가져오거나 만료된 라이선스를 깜박하고 업데이트하지 않았을 수 있습니다. 이러한 경우 조직은 평판에 타격을 입거나 법적인 위험에 처할 수 있습니다. 

이러한 위험을 최소화하기 위해 작년에는 Java, Kotlin, PHP 및 JavaScript용 라이선스 감사 기능이 추가되었고, 이번 릴리스에서는 Go 지원이 추가되었습니다. 아래 예시처럼 Qodana는 분석된 저장소 내의 종속성 라이선스를 나열하며, 해당 라이선스가 프로젝트 라이선스와 호환성 문제가 있으면 경고합니다.

종속성 라이선스는 다음과 같이 표시됩니다.

Qodana for Go 사용해보기

.NET 업데이트

검사 프로파일이 이제 저장소 설정을 고려

이전에 .NET linter용 검사 프로파일의 검사 심각도 설정은 ReSharper에서 가져온 디폴트 값을 기반으로 하였습니다. 그러나 이렇게 하면 ReSharper, Rider 및 .editorconfig 파일(저장소에 있는 경우)의 솔루션 및 프로젝트 구성 레이어를 프로젝트에서 이미 사용 중인 경우 설정이 중복됩니다. 즉, 이러한 레이어 중 하나라도 변경되면, Qodana YAML 프로파일에도 같은 변경 사항을 적용해야 합니다. 

이제 검사 프로파일은 ReSharper 및 .editorconfig 파일(저장소에 있는 경우)의 설정을 자동으로 상속받으므로, 직접 작업할 필요가 더 이상 없습니다. 

Qodana YAML 구성 설정 섹션의 이름 변경

이전에는 qodana.yaml 구성 파일에 열 솔루션이나 프로젝트를 지정하고 구성 및 플랫폼 옵션도 설정할 수 있는dot-net 섹션이 있었습니다. 이 섹션의 이름이 dotnet으로 변경되었으며 dot-net 표기는 Qodana 2023.2 버전부터 더는 사용되지 않습니다.

Qodana for .NET 사용해 보기

Qodana 2023.1로 업그레이드하는 방법

latest Docker 태그로 Qodana를 실행하면 아무것도 변경하지 않아도 됩니다. 그렇지 않은 경우 Qodana가 사용되는 CI 워크플로에서 2023.1 버전으로 업데이트하세요. 이 문서에서 기존의 CI에 통합하는 방법에 관해 자세히 알아볼 수 있습니다.   

모든 검사가 자동으로 활성화되지는 않습니다. 분석 시 특정 검사를 포함하거나 제외하려는 경우 검사 프로파일을 사용자 지정해야 할 수 있습니다. 

이상으로 Qodana 2023.1 버전의 주요 내용 소개를 마무리하겠습니다. 자세한 정보는 릴리스 노트를 참조하세요. 이번 새 릴리스가 여러분의 마음에 들기를 바랍니다. 향후 블로그에 게시할 주제를 제안하거나 비즈니스에 Qodana를 활용할 방법을 알아보려면 이 게시물에 댓글을 남기거나, Twitter 또는 qodana-support@jetbrains.com으로 문의해 주세요.

코드를 깔끔하게 유지하면서, 즐겁게 개발하세요!

Qodana 팀 드림

자부심을 느낄 수 있는 코드를 작성하세요

게시물 원문 작성자

Jessie Cho

Valerie Kuzmina

image description

Discover more