JavaBookStudy / JavaBook

책읽기 스터디
https://javabookstudy.github.io/
Apache License 2.0
19 stars 2 forks source link

[토비의 스프링] 5.1.1_DB에 정수형 상수 값으로 저장하지 않아도 enum이 필요할까요? #93

Closed kjsu0209 closed 3 years ago

kjsu0209 commented 3 years ago

예제 코드에서는 정수형 상수 값으로 사용자 레벨을 db에 저장하기 때문에 enum을 사용했습니다.

그런데 정수형 상수 값이 아닌 문자열로 db에 저장할 경우, enum이 정수값을 명시적이게 나타내준다는 장점이 없어지는데 이럴 때도 enum이 필요할까요?

daebalprime commented 3 years ago

네 저는 필요하다고 생각합니다. 단순히 정수값을 상태 표기에 썼을 때 생기는 문제를 보완해줄 뿐 아니라 개발자가 코드 작성중 하는 실수를 컴파일러단에서 잡을 수 있을 뿐 아니라 Enum의 강력한 기능 덕에 책에서 언급되었던 승급 검사를 Enum에 abstract 메서드를 이용한 선언으로 모아 관심사를 집중시킬 수 있는 등의 기능을 구현할 수 있습니다.

아래는 제가 필기하면서 Enum으로 더 깔끔하게 쓰는 방법을 고안해봤는데, 참고해보시면 좋겠습니다.

public enum Level {
    BASIC(1){ 
            public boolean isPossibleUpgrade(User user) { // 각 Enum 인스턴스에 업그레이드 조건 작성
                return (user.getLogin() >= 50);
            }
    }, 
    SILVER(2){
        public boolean isPossibleUpgrade(User user) {
                return (user.getRecommend() >= 30);
            }
    }, 
    GOLD(3){
        public boolean isPossibleUpgrade(User user) {
                return false; // 마지막 등급의 업그레이드는 불가능하기 때문에 항상 false
            }
    }; 

    private final int value;
        public abstract boolean isPossibleUpgrade(User user);
    Level(int value) {
        this.value = value;
    }
        // Level.BASIC의 경우 value 필드가 1로 설정이 된다.

    public int intValue() {
        return value;
    }
        // 각 등급 Enum 인스턴스의 정수 값 반환

    public static Level valueOf(int value) {
        switch (value) {
            case 1: return BASIC;
            case 2: return SILVER;
            case 3: return GOLD;
            default: throw new AssertionError("Unknown value" + value);
        }
    }
        // 각 등급의 매핑된 정수를 입력하면 Enum 인스턴스 반환
}