디버깅 도구로서의 코드 평가

이 기사에서 "코드 평가"는 IDEA의 디버그 모드에서 응용 프로그램을 일시 중지하고 "Evaluate Expression"기능을 사용할 때 발생하는 것과 같이 런타임에 코드 표현식을 실행하는 것을 의미합니다. Java 애플리케이션에서 "코드 평가"를 구현하는 방법을 고려한 다음 java-spring 애플리케이션에서 "코드 평가"를 사용하기 위해 구현된 솔루션을 살펴보겠습니다.

사용 사례 예



예를 들어 회사의 프로젝트에서 kubernetes를 사용합니다. 새 기능을 구현한 후에는 모든 파이프라인을 통과하여 다른 서비스와의 모든 통합이 있는 환경에서 어떻게 작동하는지 확인해야 합니다. 그리고 서비스를 배포한 후 몇 가지 사소한 일이 제대로 작동하지 않는 것을 볼 수 있습니다. 그리고 가설을 확인하기 위해 약간의 수정을 하고 싶습니다. 그러나 이를 확인하려면 코딩, 검토, 빌드, 배포 등을 포함한 모든 파이프라인을 통과해야 합니다.
프로젝트에 코드 평가기와 같은 도구가 있는 경우 모든 코드 또는 모든 변수의 값(클래스 메서드의 재정의 코드 포함)을 변경하고, 런타임에 변경 사항을 확인하고, 변경 사항을 확인한 후 코드를 수정하고 파이프라인 작업을 시작할 수 있습니다. .
이 도구는 비생산 환경에서만 존재해야 합니다.

구현



알려진 바와 같이 Groovy는 Java 프로그래밍 언어와 완벽하게 호환됩니다. Groovy에는 "코드 평가"구현에 사용할 동적 컴파일 기능이 있습니다. 우리는 "코드 평가"를 위해 Groovy를 사용할 것이지만 모든 Java 응용 프로그램에서 작동합니다. Java 프로젝트에 Groovy를 추가하는 방법은 쉽게 찾을 수 있습니다. 이제 "코드 평가"를 구현하는 방법을 살펴보겠습니다.

1) Groovy 클래스를 만들고 자리 표시자가 있는 클래스를 포함하는 문자열 변수를 정의해 봅시다.

def EXPRESSION_CLASS_TEMPLATE = """
package dev.toliyansky.eval.service
class ExpressionClass implements java.util.function.Supplier<Object> {
    def get() {
        %s
    }
}
"""


패키지는 이 코드가 호출할 동일한 패키지와 함께 있어야 합니다.

2) 첫 번째 문단부터 클래스를 컴파일하고 불러오자.
예를 들어 REST 컨트롤러에 아래 코드를 배치하면 요청 본문에서 평가 표현식에 대한 텍스트를 가져올 수 있습니다.

def finalClassCode = String.format(EXPRESSION_CLASS_TEMPLATE, code)
def supplier = groovyClassLoader.parseClass(finalClassCode)
                                .getDeclaredConstructor()
                                .newInstance() as Supplier<Object>
def result = supplier.get()


첫 번째 줄에서 %s를 동적으로 컴파일되고 런타임에 실행될 코드로 바꿉니다.

두 번째 줄에서는 첫 번째 단락의 클래스를 컴파일하고 인스턴스화합니다. 평가할 텍스트가 있는 메서드를 호출하는 기능을 위해 인스턴스화된 클래스가 Supplier로 캐스팅되었음을 확인하십시오. Supplier<Object>는 매개변수가 없고 return 문이 있기 때문에 이 목적에 이상적입니다.

구현된 솔루션



동적 컴파일을 구현하고 Groovy를 프로젝트에 연결하는 데 방해가 되지 않으려면 구현된 "코드 평가"기능이 있는 구현된 스프링 부트 스타터를 사용할 수 있습니다. evaluator-spring-boot-starter
이 스타터 종속성을 프로젝트에 추가한 후 UI를 사용하여 http://host:port/eval을 통해 코드를 평가할 수 있습니다.
HTTP 요청을 전송하여 모든 텍스트를 평가할 수 있습니다. 이 프로젝트에 관심이 있으시면 GitHub의 readme를 확인하십시오.

UI 스크린샷



런타임 시 메서드 코드를 동적으로 재정의하는 예. 컨트롤러나 서비스와 같은 애플리케이션의 모든 빈이 될 수 있습니다.

또한 보너스로 이 솔루션은 Bash, Cmd 또는 PowerShell 명령을 실행할 수 있는 가능성을 제공합니다. 애플리케이션뿐 아니라 애플리케이션이 시작된 일부 환경을 확인하거나 변경할 수도 있습니다.

좋은 웹페이지 즐겨찾기