java / / 2023. 4. 6. 13:20

archunit 사용법

Archunit은 패키지와 클래스 간의 의존관계가 올바르게 되었는지 확인하는 도구이다. 복잡한 의존관계를 구성하고 있는 경우 Archunit을 통해 테스트 케이스를 작성해 놓으면 잘못된 의존관계를 테스트케이스 실행을 통해 사전이 검출할 수 있다.

Archunit 홈페이지(https://www.archunit.org/) 설명을 좀 더 정리하면 아래와 같다.

Archunit은 무료이고 자바 단위 테스트를 사용하여 자바 코드의 아키텍처를 체크하는 확장 라이브러리다. 즉, ArchUnit은 패키지와 클래스간, 레이어와 슬라이스(slice)간, 순환 의존과 같은 의존성을 체크할 수 있다. 모든 클래스를 자바 코드구조로 임포팅하는 자바 바이트코드를 분석하는 방식으로 수행한다. ArchUnit ExamplesGitHub에서 현재 릴리스 버전의 예제를 확인할 수 있다.

Archunit 사용법

예제를 통해 archunit 사용법을 알아보자.

의존성 추가
<dependency>
    <groupId>com.tngtech.archunit</groupId>
    <artifactId>archunit</artifactId>
    <version>1.0.1</version>
    <scope>test</scope>
</dependency>
규칙
  1. controller 규칙: 모든 controller 클래스는 service 패키지의 클래스를 호출할 수 있다.
  2. service 규칙: service 내의 클래스는 controller를 호출해서는 안된다.
  3. layer 규칙: post는 user를 호출할 수 있고, user는 post를 호출할 수 없다.

테스트 케이스 작성

위의 규칙에 맞게 아래와 같이 테스트 케이스를 작성할 수 있다.

@RunWith(ArchUnitRunner.class)
@AnalyzeClasses(
    packages = {"com.example"},
    importOptions = ImportOption.DoNotIncludeTests.class // 테스트(tests) 코드는 제외한다.
)
public class LayerTest {

    @ArchTest
    public static final ArchRule controllerRuleTest =
        classes().that().resideInAnyPackage("..controller..")
            .should().accessClassesThat().resideInAnyPackage("..service.."); // controller의 모든 클래스는 service 패키지에 있는 클래스에 접근할 수 있다.

    @ArchTest
    public static final ArchRule serviceRuleTest =
        noClasses().that().resideInAnyPackage("..service..")
            .should().accessClassesThat().resideInAnyPackage("..controller.."); // service 패키지에 있는 어떤 클래스도 controller 패키지에 의존하면 안된다.

    @ArchTest
    public static final ArchRule layerTest = layeredArchitecture().consideringAllDependencies()
        .layer("post-layer").definedBy("com.example.post..")
        .layer("user-layer").definedBy("com.example.user..")

        // user-layer는 user-layer와 post-layer에서만 접근할 수 있다.
        .whereLayer("user-layer").mayOnlyBeAccessedByLayers("user-layer", "post-layer")
        // post-layer는 post-layer에서만 접근할 수 있다.
        .whereLayer("post-layer").mayOnlyBeAccessedByLayers("post-layer");
}
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유