[정적 코드 분석] Understand를 사용하여 Java 코드 정적 분석 하기

  • Creator
    Discussion
  • #970

    admin
    Keymaster

    단순히 실행 가능하고 동작하는 프로그램은 누구나 만들 수 있다. 하지만 기능이 모두 정상적으로 동작한다고 해서 과연 완벽한 코드라고 말할 수 있을까?

    코드가 작성된 뒤에는 반드시 규칙에 맞는 올바른 코드가 작성되어 있는지 점검하고 수정해야 한다. 동적 분석 과정을 통해 개발자는 높은 품질의 코드를 작성할 수 있고, 견고한 어플리케이션을 만들 수 있다. 하지만 동적 테스트만으로는 코드의 모든 문제를 발견할 수 없다. 물론 이런 문제들은 개발자가 조금 더 꼼꼼하게 테스트 코드를 작성하면 어느정도 해결할 수 있겠지만, 분명히 더 개선될 여지가 있다.

    높은 코드 품질을 위한 더 좋은 방법은 바로 정적 분석(static analysis)을 사용하는 것이다. 소스 코드의 실행 없이 정적으로 프로그램의 문제를 찾고, 코드 스멜(code smell)이라고 불리는 문제들과 보안 취약점 등의 문제를 발견하는 것이다. 비 런타임 환경에서 동작하기 때문에 코드가 완성되지 않았다고 하더라도 분석이 가능하고, 문제를 동적 분석보다 이른 시점에 잡아낼 수 있다.

    이 글에서는 정적 코드 분석이 필요한 이유에 대해 설명하고, Java 예제 프로젝트 분석 및 그래프 구성 방법에 대해 소개한다.

    1. 정적 소스코드 분석이 필요한 이유

    현업에서 요구사항과 각종 규정에 맞게 비즈니스 로직을 작성하다 보면 몇 만 줄은 쉽게 넘어 가고, 그러면 당연하게도 컴파일에 걸리는 시간이 길어져서 코드 변경을 실시간으로 테스트하기에 어려워지고, 놓치는 부분이 생기게 된다. 또 테스트를 하다 보면 어디에서 병목 현상이 일어나는지 한 눈에 알기 어렵기 때문에, 많은 코드를 한 눈에 이해하기 위해 필요하다고 할 수 있겠다.

    또한 함수가 길어지면, 어떻게 흐르는지 코드를 보면서 하나하나 이해하기 어렵다. 특히 자신이 작성한 코드가 아니라면 더더욱 그렇다. 코드의 흐름을 하나의 통일된 양식으로 사용되는 것은 순서도인데, 이 순서도를 이용하여 코드의 흐름을 그림으로 볼 수 있다면 보다 쉽게 이해할 수 있게 된다. 코드 분석을 통해 순서도로 볼 수 있게 된다면 ② 코드가 어떻게 흐르는지 파악이 보다 쉬워질것이다.

    마지막으로 리팩토링 등의 개선 작업을 진행할 때, 어떤 클래스가 다른 클래스 또는 메소드 등을 호출하고 있는지 등 의존성에 대해서 파악해야 할 때가 있다. 이를 파악해야 삭제 또는 이동 등의 조치를 취할 수 있기 때문이다. 이의 사용처를 하나하나 눌러보면서 파악하기에는 현실적으로 어렵지만, 패키지 단위 또는 클래스 단위로 ③ 의존성을 한 눈에 시각적으로 파악할 수 있다면 작업이 수월할 것이다.

    2. Understand 제품 소개

    Understand는 위의 내용을 모두 충족하며 코드를 컴파일 없이 파악하는 솔루션으로 코드의 종속성, 흐름, 함수 호출 등을 시각화하여 프로젝트의 코드가 어떻게 구성되어 있고 어느 부분을 수정하는 것이 좋을지 판단의 기준이 된다. 이 뿐만이 아니라 코드를 쉽게 검색할 수 있고, 수정도 쉽게 할 수 있다.

    3. Understand에서 Java를 분석하기 위해서 선행해야할 일

    Java 언어로 구성되는 프로젝트의 경우 대부분 Maven, Gradle 등 Build Tool을 사용하는데, Understand를 처음 사용하는 경우 원활히 분석하기 위해 해야할 작업을 아래와 같이 나열한다.

    Understand에서 Java를 분석하기 위해서는 총 3가지 구성을 진행해야 한다.

    첫번째, Project에 Maven이나 Gradle 등 Build Tool을 구성하면 편리하게 진행할 수 있다.

    두번째, Understand에서 어떤 라이브러리의 코드를 의존하는지 분석할 수 있도록 의존 라이브러리를 다운로드해야 한다. 첫번째 과정에서 Build Tool을 구성하였다면, 각 Build Tool에 맞는 명령어를 사용하여 사용한 라이브러리를 쉽게 다운로드할 수 있다.

    세번째, Class Path를 추출해야 한다. Class Path는 각 라이브러리가 어디에 다운로드 되어 있는지 알려주는 문자열로 이 경로들을 Understand에 알려주면, 코드 분석을 원활하게 진행할 수 있게 된다.

    4. 예제 프로젝트 분석해보기

    예시 환경은 Maven으로, Maven 환경의 프로젝트의 경우 pom.xml이 있는 프로젝트 루트에서 사진에 있는 명령어를 입력한다. 만일 의존 라이브러리가 다운로드 되지 않은 상태라면 콘솔에는 표시 되지 않지만, 다운로드 후에 Class Path를 읽어오게 된다.

    즉, 시간이 조금 더 소요된다는 것이다.

    명령이 수행이 되면 프로젝트 루트에 classpaths.txt 파일이 생성되는데, 해당 파일을 열어보면 아래 사진과 같이 명령 수행 결과가 표출된다. 이 명령 수행 결과에서 ‘Dependenies classapth:’ 아래의 경로들만 남기고 모두 삭제하고 저장하면 Class Path 추출은 모두 끝나게 된다.

    이후, 올바른 코드 분석을 위해서는 Understand에 Class Path를 알려줘야 하는데, Understand Project를 구성한 뒤에 상단 메뉴에서 ‘Project > Configure Project’ 순서로 진입한 후에 나오는 팝업 화면에서 왼쪽 메뉴의 ‘Java > Class Path’ 순서로 진입, 오른쪽의 ‘Import’를 눌러 아까 추출된 txt 파일을 선택하면 완료된다.

    경로를 유심히 보면 로컬 파일의 위치들이 노출되게 되는데 즉, 다른 PC에서 분석을 할 때에는 이 과정을 다시 거쳐줘야한다.

    5. 데모 진행

    관련하여 진행한 웨비나 영상은 아래 링크의 SLEXN 유튜브 채널에서 확인할 수 있다.

    • This discussion was modified 1 year, 2 months ago by  admin.
    • This discussion was modified 1 year, 2 months ago by  admin.

Original Post
0 of 0 posts June 2018
Now