[TIL] java에서의 Design by Contract 위한 도구

Soeng_dev·2024년 12월 13일

assertThat의 컴파일 및 배포 시점 동작

  • 배포 시점assertThat을 "제거"하는 방법은 빌드 도구와 설정을 통해 가능.
  • assertThat라이브러리 메서드이므로, 컴파일 플래그로 직접적으로 배포 코드에서 제거하는 기능은 제공되지 않음.
  • 배포 코드에서 assertThat을 제외하려면assertThat 호출을 테스트 코드로 한정하고, 프로덕션 빌드에서 제외되도록 설정하는 방법이 필요.

assertThat 을 소스 코드에서 제거하는 방법

  • 빌드 도구를 통한 소스 코드 수정:
    • Gradle이나 Maven을 사용해 배포 코드에서 assertThat 호출을 제거할 수 있음.
    • 예시:
      tasks.withType(JavaCompile) {
          doFirst {
              fileTree('src/main/java').matching {
                  include '**/*.java'
              }.each { file ->
                  def content = file.text.replaceAll(/assertThat\(.*\);/, '')
                  file.text = content
              }
          }
      }

AOP나 바이트코드 조작:

  • AspectJ와 같은 도구를 사용해 assertThat 호출을 배포 시점에서 제거할 수 있음.

소스 코드 리팩터링 도구:

  • sed와 같은 명령어로 소스 코드 내 assertThat 호출을 일괄적으로 제거할 수 있음.
  • 예시:
    find ./src/main/java -type f -name "*.java" -exec sed -i '/assertThat/d' {} +

조건부 assertThat 호출:

  • 특정 조건에 따라 assertThat을 호출하고, 빌드 시 이 조건을 환경 변수플래그로 제어할 수 있음.
  • 예시:
    if (System.getenv("ENABLE_ASSERT") != null) {
        assertThat(value).isNotNull();
    }

assert vs assertThat

assert:

  • Java의 표준 문법으로 조건이 거짓일 때 AssertionError를 발생시킴.
  • JVM 옵션 (-ea)을 통해 활성화하거나 비활성화 가능.
  • 배포 시 자동으로 비활성화되므로 성능에 영향을 미치지 않음.

assertThat:

  • JUnit/AssertJ 등의 라이브러리에서 제공하는 메서드로, 테스트 코드에서만 사용됨.
  • 배포 코드에는 포함되지 않도록 빌드 도구에서 처리 가능.

assert 외에 Java에서 조건 검증을 위한 방법들

  • 예외 처리 (ifthrow):

    • 조건을 확인하고, 필요 시 예외를 던짐. 항상 활성화됨.
    • 예시:
      if (b == 0) {
          throw new IllegalArgumentException("Divider must not be zero");
      }
  • Objects.requireNonNull:

    • 객체가 null인 경우 예외를 던짐.
    • 예시:
      this.name = Objects.requireNonNull(name, "Name cannot be null");
  • Preconditions (Guava):

    • 조건을 체크하고, 위반 시 예외를 던짐.
    • 예시:
      Preconditions.checkArgument(age > 0, "Age must be positive");
  • Bean Validation:

    • 객체의 필드나 메서드에 @NotNull, @Min 등의 애노테이션을 사용해 조건을 검증.
    • 예시:
      public class User {
          @NotNull private String name;
          @Min(18) private int age;
      }
  • assertThat (JUnit/AssertJ):

    • 주로 테스트 코드에서 사용되며, 조건을 검증하고 실패 시 예외를 던짐.
    • 예시:
      assertThat(value).isNotNull();

profile
Software Engineer

0개의 댓글