둘셋 개발!

[Java] 애노테이션의 속성 값에 Enum타입 값을 넣으려면? 본문

카테고리 없음

[Java] 애노테이션의 속성 값에 Enum타입 값을 넣으려면?

23 2024. 1. 25. 18:02

Intro.

Controller에서 @RequestParam으로 이넘타입을 받았다.

그리고 defaultValue로 이넘타입의 필드를 넣으려고 했더니 컴파일 오류가 나왔다.

public enum SortingType {
    POPULAR("POPULAR"),                  // 인기순
    NEW_ARRIVAL("NEW_ARRIVAL"),              // 신간순
    SENTENCE_DESC("SENTENCE_DESC"),            // 문장순
    LATEST("LATEST");                   // 최신순

    private final String value;

    SortingType(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }
}

 

 

컴파일 오류 화면

 

Arrtibute value must be constant

상수가 오지 않아 오류가 발생한 것이다.

 

나는 여기서 의문이 생겼다.

final로 선언한 필드를 꺼냈는데 왜 상수가 아니라고 하는지.....


그래서 상수에 관해서 더 찾아보니, 상수는 컴파일 타임 상수와 런타임 상수로 나뉜다!

 

✔️ 컴파일 타임 상수

- 컴파일 이후에 변하지 않는 것이다.

- 기본타입 또는 String이면서 final로 선언되고 선언내에서 초기화가 되어야 한다.

 

✔️ 런타임 상수

- 프로그램이 실행될 때마다 변할 수 있다.

- 예를 들어 final String타입이지만 대입하는 값는 사용자가 입력한 값이라던가, 랜덤값이 들어가면 런타임 상수이다.


다시 돌아와서

그렇다면 @RequestParam의 defaultValue가 필요로 하는 상수는 무슨 상수이고

enum타입의 final로 선언한 필드의 상수는 뭘까??

 

애노테이션의 값들은 컴파일 시점에 정해져야 하기 때문에 컴파일 타임 상수이고

enum타입의 필드는 final로 선언했어도 대입하는 값이 선언과 동시에 초기화가 되는 것이 아니라

enum의 인스턴스가 생성되는 시점에 값이 정해지므로 런타임 상수이다.

 

그래서 오류 메세지로 상수가 아니라고 나온 것이다.


해결

컴파일 타임 상수가 필요하기 때문에

1) 직접 문자열을 넣든지 

2) 문자열의 값을 받는 static final String 타입을 따로 만들어야한다.

 

나는 유지보수에 더 유용한 2번째 방법을 선택했다.

 

public enum SortingType {
    POPULAR,                  // 인기순
    NEW_ARRIVAL,              // 신간순
    SENTENCE_DESC,            // 문장순
    LATEST;                   // 최신순
    
    public static class Const {
        public static final String POPULAR = "POPULAR";
        public static final String NEW_ARRIVAL = "NEW_ARRIVAL";
        public static final String SENTENCE_DESC = "SENTENCE_DESC";
        public static final String LATEST = "LATEST";
    }
}

 

 

 


정리

애노테이션의 값은 컴파일 시에 정해져야 한다. 

따라서 컴파일 타임 상수만 들어갈 수 있다.

enum 필드 값은 생성자를 통해 주입되기 때문에 런타임 상수이다.

따라서 컴파일 타임 상수를 따로 만들어, 관리하기 쉽도록 enum타입 안에 넣어서 사용한다.


ref

https://stir.tistory.com/321

 

어노테이션의 요소는 항상 상수여야 하는가?(컴파일 타임 상수)

어노테이션에 Enum 값 사용하기 어노테이션에 Enum을 통해 String 값을 넣으면 이런 에러를 마주친다. 하지만 value 요소에 직접 String을 넣는 두번째 코드는 에러가 나지 않는다. 왜 같은 String인데 Enum

stir.tistory.com

https://www.baeldung.com/java-compile-time-constants#1-compile-time-constants

https://stackoverflow.com/questions/13253624/how-to-supply-enum-value-to-an-annotation-from-a-constant-in-java