sggnology
하늘속에서IT
sggnology
전체 방문자
오늘
어제
  • 분류 전체보기 (83)
    • Algorithm (31)
      • Programmers (27)
      • Baekjoon (4)
    • WIKI (4)
      • VirtualBox (1)
      • Power Toys (1)
    • NodeJS (4)
      • nvm (1)
      • React (1)
      • Vue (1)
    • Dev Language (3)
      • Java (2)
      • Kotlin (1)
    • Spring Boot (17)
      • Gradle (1)
      • JPA (3)
    • DB (4)
      • MariaDB (3)
      • Redis (0)
    • Android (6)
      • Debug (3)
    • Nginx (3)
      • Debug (1)
    • Intellij (0)
    • Network (1)
    • Git (2)
      • GitHub (2)
    • Chrome Extension (0)
    • ETC (5)
      • Monitoring (2)
    • Linux (1)
      • WSL (1)
    • Visual Studio (1)
    • Side Project (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Android Studio
  • java
  • spring boot
  • mariadb
  • docker
  • 고득점KIT
  • DB
  • 티스토리챌린지
  • nginx
  • 레벨3
  • 알고리즘
  • 레벨2
  • 오블완
  • JPA
  • kotlin
  • 안드로이드 스튜디오
  • 연습문제
  • 프로그래머스
  • 고득점 Kit
  • 백준

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
sggnology

하늘속에서IT

Spring Boot

[Spring Boot] Assert 가 동작하지 않는다?(feat. Kotlin)

2024. 11. 22. 12:18
728x90

발단

assert 를 통한 로직 검증에서 조건이 틀렸음에도 검증되지 않고 Pass-Through 한 경우가 있어 정리합니다.

 

Assert 란 무엇인가?

var a = 1
var b = 2

assert(1 < a+b) // _Assertions object 를 통해 참조된 assert 를 사용
assert(a+b < 1) { "msg" }
  • 영단어로써 의미는 `주장하다` 라는 뜻을 가지고 있습니다.
  • 코드에서는 assert 로 묶은 조건이 옳음을 주장하다 정도로 볼 수 있을 거 같습니다.

 

_Assertions object 

@file:kotlin.jvm.JvmMultifileClass
@file:kotlin.jvm.JvmName("PreconditionsKt")
package kotlin

@PublishedApi
internal object _Assertions {
    @JvmField
    @PublishedApi
    internal val ENABLED: Boolean = javaClass.desiredAssertionStatus()
}

/**
 * Throws an [AssertionError] if the [value] is false
 * and runtime assertions have been enabled on the JVM using the *-ea* JVM option.
 */
@kotlin.internal.InlineOnly
public inline fun assert(value: Boolean) {
    assert(value) { "Assertion failed" }
}

/**
 * Throws an [AssertionError] calculated by [lazyMessage] if the [value] is false
 * and runtime assertions have been enabled on the JVM using the *-ea* JVM option.
 */
@kotlin.internal.InlineOnly
public inline fun assert(value: Boolean, lazyMessage: () -> Any) {
    if (_Assertions.ENABLED) {
        if (!value) {
            val message = lazyMessage()
            throw AssertionError(message)
        }
    }
}
  • 위에서 알 수 있듯 assert 는 함수로 오버로딩을 통해 두가지 사용방식을 제공합니다.

 

왜 assert 가 동작하지 않았던 걸까?

assert 는 _Assertions.ENABLED 라는 bool 값에 따라 동작 여부가 결정되고, JVM 은 기본적으로 실행할 때 assert 옵션을 사용한다 명시하지 않기에 동작하지 않았던 것 입니다.

 

어떻게 assert 옵션을 사용할 수 있을까?(JVM 실행 변수)

// -ea(ENABLE ASSERTION) 를 작성하면 ENABLED 옵션이 세팅됩니다.
java -ea -jar YourApplication.jar

// 특정 클래스에 적용
java -ea:com.example.MyClass -jar YourApplication.jar

// 특정 패키지에 적용(`...`를 붙여야 합니다.)
java -ea:com.example... -jar YourApplication.jar

 

옵션과 무관한 처리(Kotlin)

inline fun customAssert(value: Boolean, lazyMessage: () -> String) {
    if (!value) {
        throw AssertionError(lazyMessage())
    }
}
728x90

'Spring Boot' 카테고리의 다른 글

[Spring] Spring Security + MockMvc 로 테스트시 주의할 점(feat. kotlin)  (0) 2024.06.28
[Spring Boot] Spring Security 설정 과정에서 `please use permitAll via HttpSecurity#authorizeHttpRequests instead` 문구 발생(feat. ignoring)  (1) 2024.05.28
[Spring] Custom Enum Value 를 Swagger 문서에 노출시키고 싶으면 어떻게 해야할까?  (0) 2024.05.21
[Spring Boot] Access denied for user 'root'@'localhost'(using password: yes)  (1) 2024.04.24
[Spring Boot] @ModelAttribute 로 맵핑하려는 대상의 depth 가 2 이상일 때 요청하였는데 오류가 난다면?(feat. kotlin)  (0) 2023.10.16
    'Spring Boot' 카테고리의 다른 글
    • [Spring] Spring Security + MockMvc 로 테스트시 주의할 점(feat. kotlin)
    • [Spring Boot] Spring Security 설정 과정에서 `please use permitAll via HttpSecurity#authorizeHttpRequests instead` 문구 발생(feat. ignoring)
    • [Spring] Custom Enum Value 를 Swagger 문서에 노출시키고 싶으면 어떻게 해야할까?
    • [Spring Boot] Access denied for user 'root'@'localhost'(using password: yes)
    sggnology
    sggnology
    하늘은 파란색이니까 내 삶도 파란색이길 ㅎㅎ

    티스토리툴바