221128 TIL 사용자 등급을 위한 enum클래스

오늘 5번째 스프린트 회고를 끝냄으로써 남은 기간은 디자인 주를 한 주를 제외하면 일주일밖에 남지 않았다.

남은 일주일간 관리자 페이지를 만들어야 하기 때문에 오늘 관리자 등급을 어떻게 구현할 것인지에 대해 알아봤다.

우선 내 프로젝트의 경우 관리자 or 일반 사용자 등급이 두 가지로 나뉘는 게 아니라 사용자의 여러 가지 등급이 존재하도록 초반에 기획했었다. 각 사용자의 등급에 따라 접근할 수 있는 콘텐츠가 다르게 하기 위함이었다.

그래서 프로젝트 초반에 설계했던 객체 다이어그램을 보면 User Entity와 Grade Entity가 존재하고 Grade Entity는 User를 List로 갖는 형식으로 설계를 했었던 기록이 있다.

 

하지만 최근에 객체의 구조가 바뀌면서 Grade가 Entity일 필요가 없다고 판단을 해 일단은 값 객체(Value Object)로 바꾼 상태로 진행했었다. 아직까지 회원의 등급으로 뭔가 한 게 없어서 그대로인 상태인데 오늘 관리자를 어떻게 만들지에 대해 생각을 해보니 이제는 사용자의 등급을 어떻게 구현할지 알아야 한다는 생각이 들었다.

 

Enum

사용자의 등급을 나누기 위한 첫 번째 방법으로 Enum class를 활용하는 것이다.

enum은 enumeration의 약자로 열거라는 뜻을 갖고 있으며 서로 연관된 상수들을 편리하게 사용하기 위해 상수들을 열거한 클래스이다.

서로 관련 있는 상수들을 집합해 해당 상수들을 대표할 수 있는 이름으로 타입을 정하는 것인데 연관된 상수들을 열거해놨다는 점에서 회원 등급으로 사용하기에 적절하다고 판단을 했다.

예를 들어 회원 등급이 브론즈, 실버, 골드, 플래티넘, 다이아, vip, 매니저가 있으면 해당 등급들은 값이 변하지 않는 상수로 "등급"이라는 상위 개념 아래 모여있기 때문에 "등급"이라는 이름으로 해당 상수들을 대표할 수 있다.

 

위의 예를 enum 클래스를 이용해 코드로 나타내 보면 아래와 같다.

public enum Grade {
    Bronze, 
    Silver,
    Gold, 
    Platinum, 
    Diamond, 
    Vip, 
    Manager
}

enum 클래스를 이용해 사용자에게 등급을 부여해 서비스 단에서 해당 사용자 등급보다 낮으면 접근하지 못하게 막는 것이다.

Role

두 번째 방법으로는 Spring Security에서 Role을 사용하는 것이다.

spring security에서 부여된 authorities와 roles은 인증된 사용자에 대한 권한을 표현하는 형식이다.

 

controller에서 권한 별 접근을 설정해줄 수 있는 어노테이션이 존재하는데 바로 @PreAuthorize 어노테이션이다.

접근 권한을 설정하고 싶은 controller에 @PreAuthorize("hasRole("ROLE_ADMIN")) 이렇게 어노테이션을 추가해주면 ADMIN ROLE을 갖고 있는 사용자만 접근이 가능하다.

  • hasRole( ) : 로그인한 사용자 중 해당 ROLE을 가진 사용자만 접근을 허용한다.

Role은 enum 클래스를 이용해 만들어준다.

여기서 주의할 점은 ROLE의 네이밍은 ROLE_ADMIN처럼 "ROLE_"으로 시작해야 한다는 것이다.

 

우선 enum클래스 이용해 사용자의 등급을 구현해보자