상품 공급 시스템 - 회원 관련 기능

Enum collections

회원의 권한에 대한 정보를 담고 있는 role 테이블은 Role 클래스에 대응된다.

Role 클래스

Authority는 회원이 가질 수 있는 권한을 표현하는 Enum 클래스이다.
권한에 대해서는 순차적인 접근보다는 있는지 없는지 확인하는 연산이 더 많다. 권한은 순서는 상관이 없고 유무가 중요하기 때문이다. 즉, List보다는 Set에 저장하는 것이 합리적이다.
그런데 Enum 타입을 원소로 가지는 Set에 대해 알아보게 되었다.

HashSet 자료구조의 경우 hashCode() 메서드로 bucket을 결정하고 equals() 메서드를 호출하여 최종적으로 원소의 동치 유무를 판단하는데 Enum의 경우에도 동일한 매커니즘인지 궁금했다.

Enum 타입은 모두 유일하기 때문에 `==` 연산자로 참조를 비교하는 것만으로도 동치 여부를 판단할 수 있고 `equals()` 메서드는 `==` 연산자를 호출하는 것과 결과가 동일하다.

EnumSet

Class EnumSet<E extends Enum<E>>
// Enum<E>는 Enum 클래스인 E 자체를 의미한다.

EnumSet은 내부적으로 bit vector로 표현되기 때문에 용량이 매우 작고 효율적이다. 대부분의 collection 구현체들이 그렇듯 동기화되지 않은 자료구조이다. 여러 쓰레드가 접근하는 상황이라면 외부적인 동기화가 필요하다.

자세한 내용은 공식문서 참고

Authority 클래스

한 명의 회원이 가질 수 있는 권한을 나타내는 인스턴스이다.
여러 개의 값이 권한이라는 한의 개념에 포함되기 때문에 Enum 클래스로 정의하였다.

public enum Authority {

    READ(4) ,WRITE(2),

    NORMAL(10), VENDOR(11), ADMIN(12);

    private final int value;

    private Authority(int value) {
        this.value = value;
    }
}

Role 클래스

회원과 권한의 연관 관계를 표현하는 role 테이블에 대응되는 클래스이다.

public class Role {

    private Long roleId;
    private final Long memberId;
    private List<Authority> authorities;

    public Role(Builder builder) {
        this.memberId = builder.memberId;
        this.authorities = builder.authorities;
    }

    public static Builder builder() {
        return new Builder();
    }

    private static class Builder {
        private Long roleId;
        private Long memberId;
        private List<Authority> authorities;

        public Builder() { }

        public Builder roleId(Long roleId) {
            this.roleId = roleId;
            return this;
        }

        public Builder memberId(Long memberId) {
            this.memberId = memberId;
            return this;
        }

        public Builder authorities(List<Authority> authorities) {
            this.authorities = authorities;
            return this;
        }

        public Role build() { return new Role(this); }
    }
}


reference

Comments