발생한 문제
Spring Validation을 사용하는 도중 @NotBlank 어노테이션의 message 필드 값을 지정하면 'Attribute value must be constant' 에러를 내면서 컴파일이 되지 않는 문제를 맞닥뜨렸다.

분명 위 사진처럼 Enum을 사용하지 않고 String 리터럴 값을 넣으면 문제 없이 컴파일이 된다.
원인
어노테이션은 JDK 1.8 기준 JVM 실행 시 클래스 로더에 의해 클래스 로딩 시점에 Metaspace 영역에 저장된다.
이 때 어노테이션의 속성 값에 저장되는 message(위 사진)는 Metaspace 영역의 어노테이션 메타 데이터 구조 내에 포함된다.
Metaspace 영역 안에 있는 데이터들은 한번 메모리에 올라가면 불변 성격을 갖는다.
따라서 어노테이션에 사용되는 값들은 런타임 시점에 수정이 되면 안된다. 이러한 것을 컴파일 타임 상수라 부른다.
위 사진에서와 같이 'Attribute value must be constant' 에러 발생 원인은 getMessage() 메서드를 호출하는 시점이 런타임 시점이기 때문이다. 이는 메서드 호출 리턴 값에 따라 어노테이션 속성 값이 바뀔 수 있다는 의미이므로 컴파일 에러가 발생한다.
해결 방법
String 리터럴을 사용한다.
만약 여러 개의 필드가 중복되는 String 리터럴(ex. "나이는 1 이상이어야 합니다.")이 보기 싫을 수 있다.
이런 경우 메시지를 모아놓는 클래스를 하나 만들고 public static final String 변수 = "나이는 1 이상이어야 합니다.";로 설정 후 가져와서 사용하면 된다.