트러블슈팅

[트러블슈팅] Kotlin에서 An annotation argument must be a compile-time constant이 발생하는 문제

2023. 1. 6. 18:57
목차
  1. 개요
  2. 해결

개요

Bean Validation을 이용해 정규표현식으로 검증을 하다보니 동일한 정규표현식이 여러 객체에 사용되는 케이스가 많았다. 기존엔 정규표현식을 String의 형태로 넣어줬었지만 이 방식은 유지보수하기가 까다로웠다. 프로젝트의 규모가 점점 커지면서 검증 로직을 수정해달라는 요청이 종종 들어오는데, 해당 검증 로직을 사용하는 객체를 매번 찾아다녀야 했기 때문이다. 그래서 아래와 같이 이넘을 이용해 정규표현식을 상수화시켜서 관리하고자 했다.

 

AS-IS

@field:Pattern(
    regexp = "^\\d{5}\$",
    message = "우편번호는 5자리입니다."
)
val zoneCode: String,

TO-BE - 이넘 클래스를 활용한 상수화

enum class RegexConst(
    val regexp: String,
    val message: String?,
) {
    ZONE_CODE(
        regexp = "^\\d{5}\$",
        message = "우편번호는 5자리입니다.",
    )
}
@field:Pattern(
    regexp = RegexConst.ZONE_CODE.regexp,
    message = RegexConst.ZONE_CODE.message,
)
val zoneCode: String,

 

그러나 이내 곧 다음과 같은 에러를 만나게 되었다..

An annotation argument must be a compile-time constant

 

 

해결

@Pattern 애너테이션의 인자로 전달되는 값은 컴파일 타임에 할당된 값이어야 하는데, 위 코드엔 런타임에 할당된 값(val)이 전달되었기 때문이다. 따라서 상수를 const val에 담아 컴파일 타임에 할당되도록 만들면 된다. companion object를 써도 되고, object를 써도 되는데 여기선 object를 사용했다.

object RegexConst {
    const val zoneCodeRegexp = "^\\d{5}\$"
    const val zoneCodeMessage = "우편번호는 5자리입니다."
}
@field:Pattern(
    regexp = RegexConst.zoneCodeRegexp,
    message = RegexConst.zoneCodeMessage
)
val zoneCode: String,

 

kotlin으로 작성된 클래스를 자바 코드로 디컴파일해보면 다음과 같이 static 변수에 값이 할당된 것을 확인할 수 있다.

저작자표시 비영리 (새창열림)

'트러블슈팅' 카테고리의 다른 글

[트러블슈팅] gradle 빌드시 java.lang.IllegalAccessError: class org.gradle.internal.compiler.java.ClassNameCollector 발생  (0) 2023.03.28
[트러블슈팅] org.springframework.web.bind.MissingServletRequestParameterException 에러  (0) 2023.01.09
[트러블슈팅] inteilliJ에서 Syntax highlighting has been temporarily because of an internal error 발생  (1) 2022.11.24
[트러블슈팅] org.springframework.dao.InvalidDataAccessApiUsageException: javax.persistence.Query.executeUpdate requires active transaction  (0) 2022.11.23
[트러블 슈팅] IO 오류: Socket read interrupted (SQL Error: 17002, SQLState: 08006)  (1) 2022.11.01
  1. 개요
  2. 해결
'트러블슈팅' 카테고리의 다른 글
  • [트러블슈팅] gradle 빌드시 java.lang.IllegalAccessError: class org.gradle.internal.compiler.java.ClassNameCollector 발생
  • [트러블슈팅] org.springframework.web.bind.MissingServletRequestParameterException 에러
  • [트러블슈팅] inteilliJ에서 Syntax highlighting has been temporarily because of an internal error 발생
  • [트러블슈팅] org.springframework.dao.InvalidDataAccessApiUsageException: javax.persistence.Query.executeUpdate requires active transaction
코택
코택
코택
TaxFree
코택
전체
오늘
어제
  • 분류 전체보기 (369)
    • Spring (29)
      • Spring (18)
      • 스프링 핵심 원리 - 고급편 (11)
    • Spring Batch (4)
    • JPA (4)
    • CS (89)
      • 자료구조 (2)
      • 네트워크 (5)
      • 운영체제 (1)
      • 데이터베이스 (4)
      • SQL (7)
      • 알고리즘 이론 (4)
      • 알고리즘 문제 풀이 (66)
    • 웹 (28)
      • React.js (4)
      • Next.js (1)
      • Node.js (14)
      • FastAPI (4)
      • Django (5)
    • 프로그래밍 언어 (45)
      • Python (5)
      • Java + Kotlin (29)
      • JavaScript + TypeScript (11)
    • 테스트코드 (26)
      • ATDD, 클린 코드 with Spring (4)
      • 이규원의 현실 세상의 TDD: 안정감을 주는 코드.. (20)
    • 인프라 (6)
      • AWS (2)
      • Kubernetes (4)
    • 트러블슈팅 (25)
    • 책 (89)
      • Effective Java (54)
      • Effective Kotlin (14)
      • 도메인 주도 개발 시작하기: DDD 핵심 개념 정.. (11)
      • 웹 프로그래머를 위한 데이터베이스를 지탱하는 기술 (6)
      • 도메인 주도 설계 첫걸음 (4)
    • Git (10)
    • 회고 (5)
    • etc (8)

블로그 메뉴

  • 홈
  • 방명록
  • 관리
  • GitHub
  • LinkedIn

공지사항

  • 스킨 관련

인기 글

태그

  • 그래프 탐색
  • Shortest Path
  • dp
  • fastapi
  • 깊이 우선 탐색
  • 브루트포스
  • 장고
  • 파이썬
  • BOJ
  • 백준
  • Git
  • atdd
  • 그래프
  • http
  • mysql

최근 댓글

최근 글

hELLO · Designed By 정상우.
코택
[트러블슈팅] Kotlin에서 An annotation argument must be a compile-time constant이 발생하는 문제
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.