Back-end/Java

Enum 사용 중 Attribute value must be constant 발생

HOONY_612 2024. 2. 5. 20:25
반응형

 

개요

업무 중 Worker 구조를 Annotation 기반으로 변경하는 부분에서 아래와 같은 부분이 있었다.

@WorkerTask(value = "externaldb-task", threadCount = 10)

 

value의 String을 Enum의 속성으로 대체하려했다. 그러나 컴파일 에러가 발생했다.

public enum TaskDefinitionNames {
    EXTERNAL_DB_TASK("externaldb-task"),

...
    public String getNameValue() {
        return nameValue;
    }

}

 

메세지는 "Attribute value must be constant" 였다. 이유가 뭘까?

 

이유

TaskDefinitionNames.EXTERNAL_DB_TASK.getNameValue() 가 동작하지 않는다.

어노테이션은 컴파일 타임에 정해진다. 그러다보니 나중에 결정되는 런타임 시점의 값들은 들어가면 안된다.

getNameValue는 런타임에 호출된다는 것이다. TaskDefinitionNames.EXTERNAL_DB_TASK 는 괜찮아도 TaskDefinitionNames.EXTERNAL_DB_TASK.getNameValue()는 안된다는 것이다.

 

 

해결

1. Constants Class 이용하여 상수화

 

현재 Enum에서 작성한 요소는 Taskname:String 만 있다.

Enum의 Nested Class로 만드는 경우 아래와 같은 상황이 발생한다.

만약 static import로 사용해도 헷갈린다.

...
TaskDefinitionNames.TaskNameConstants.EXTERNAL_DB_TASK
...

 

그래서 굳이 Enum Class를 사용하지 않는게 좋다고 판단했다.

아래의 상수 클래스를 만들어 해결했다.

public class TaskNameConstants {

	public static final EXTERNAL_DB_QUERY_TASK = "externaldb-task";
    ...
}

 

만약 사용되는 변수들이 클래스 내부에서만 사용된다면 상수로 선언하고 클래스를 만들 필요는 없다.

 

반응형