강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

kim님의 프로필 이미지
kim

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

회원 기능 테스트

권한 코드테이블이 있을 때 equals 질문 드립니다.

해결된 질문

작성

·

575

1

CodeTable

Code / Role

  A     /   User

 B     /    ADMIN

이 있다고 했을 때

어떤 사람이 로그인 했을 때 그 사람이 일반 유저라면 권한이 A로 저장되어 있을 것입니다. 그럼 자바 코드에서 이 사람이 일반 유저인지 확인하기 위해 

user.getRole().equals("A") 로 써서 확인을 하나요?

아님 이것은 공용으로도 쓰이니 enum으로

USER("A")

ADMIN("B")

이런 식으로 만들어서 

user.getRole().equals(enum.USER) 이런식으로

테이블 코드와 Enum 코드 중복으로 관리하는 것이 맞나요?

위에 방식은 하드코딩이라 안좋은 것이라고 생각되는데

enum을 하면 관리하는 코드가 테이블쪽하고, 자바프로그램쪽 2개를 관리하게 되고... 2개로 관리해서 equals를 활용하는지 궁금합니다.

답변 7

4

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. kim님

여기서 USER, ADMIN 관련해서는 두가지 중 하나를 선택하는 것이 좋습니다.

1. CodeTable을 사용하고, Enum을 사용하지 않는다.

2. CodeTable을 사용하지 않고, Enum만 사용한다.

저도 SI 개발 시절에는 CodeTable을 정말 많이 사용했는데요.

최근 프로젝트들에서는 CodeTable을 거의 사용하지 않는 편입니다.

(최근 몇년간 진행한 프로젝트 들에서는 기존의 CodeTable을 대부분 제거했습니다.)

Enum 자체가 각 도메인에 맞는 CodeTable 역할을 해버리는 것이기 때문이지요.

잘 생각해보면, 공통의 코드를 정말 꼭 관리할 필요가 있는가? 라는 의문이 필요합니다.

과거 데이터베이스에서 모든 것을 해결해야 할 때는, 이런 방법이 잘 동작했는데, JPA 처럼 애플리케이션 중심으로 개발하면, Enum을 포함해서 여러가지 좋은 해결방안들이 있기 때문입니다.

아키텍처 관점에서 도메인을 잘 격리하는게 중요한데, CodeTable에 모두 두고 관리하면, 마치 전역변수처럼 시스템 전체에 코드가 퍼지는 단점도 있습니다.

관련해서 이동욱님의 Java Enum 활용기 글을 읽어보시면 도움이 될꺼에요^^

http://woowabros.github.io/tools/2017/07/10/java-enum-uses.html

감사합니다.

1

김영한님의 프로필 이미지
김영한
지식공유자

실제로는 좀 더 복잡한 권한이 있고, 그럴 경우에는 JPA로 해결해야 좋다고 답변을 주셔 가지고 현재 토이 프로젝트를 만들면서 JPA로 테이블로 만들어서 관리할려고 하였던 것입니다

-> 이 부분이 좀 오해가 있었던 것 같습니다. JPA로 해결한다고해서 CodeTable을 꼭 만들어야 할 필요가 있을까요? JPA로 해결해야 좋다고 답변을 드린 부분 중에서 Role 이라는 것이 명확하게 정해져 있다면, 예를 들어서 Role 엔티티 안에 RoleType 같은 것을 만들고, RoleType은 Enum으로 관리해도 됩니다. 단 Enum을 사용할 때는 어드민 같은 곳에서 동적으로 RoleType을 추가하면 안되고, 딱 정해져 있는 경우에만 가능합니다.

제가 질문의 의도를 정확하게 파악을 못한 것 같아요^^;; 그래도 답변을 드리자면

Role(USER, ADMIN)이 변하지 않는다면, ENUM으로 해결하셔도 되고, 그게 싫으면 "A" 대신에 상수를 관리 할 수 있는 공통 클래스를 만드는 것도 방법입니다.

class RoleConst {

  public static final String USER = "A";

  public static final String ADMIN = "B";

}

사용방법

user.getRole().equals(RoleConst.USER)

감사합니다.

0

kim님의 프로필 이미지
kim
질문자

답변 감사드립니다

0

김영한님의 프로필 이미지
김영한
지식공유자

네 맞습니다. 핵심을 잘 이해하셨네요^^

0

kim님의 프로필 이미지
kim
질문자

아 생각해보니 저런 변동성이 많은 것은 db로 관리하고 변동성이 거의 없는 것이거나 시스템적으로 관리가 필요한 코드(권한, 주문상태 등등)을 enum으로 관리하면 되겠군요

0

kim님의 프로필 이미지
kim
질문자

아 이해했습니다 JPA로 해결하라는 것이 db로 해결하라는 뜻으로 제가 오해한 것 같습니다ㅎㅎ

Db로 관리를 해도 코드같은 것은 enum으로 관리하고 매핑관계(한 사람이 어떤권한을 가지고 있는지)을 db로 관리하는 식으로 가겠습니다

그럼 만약에 배만을 예를 들면 음식메뉴가 코드로 관리되고 있다면 음식하는 사장님들이 새로운 메뉴가 만들어져서 새로운 메뉴코드를 추가하고 싶을 때도 있을것 같은데. Enum으로 관리되면 추가 삭제가 될 수없어서 불편할 것 같은데 이럴때는 어떨게 해결하세요?

0

kim님의 프로필 이미지
kim
질문자

예제가  USER, ADMIN으로 말한 것이고, 실제로는 좀 더 복잡한 권한이 있고, 그럴 경우에는 JPA로 해결해야 좋다고 답변을 주셔 가지고 현재 토이 프로젝트를 만들면서 JPA로 테이블로 만들어서 관리할려고 하였던 것입니다 ^^;;. 그래서 이렇게 테이블로 관리할 경우 위의 예시처럼 equals를 어떻게 처리할지 막막해서요 ~

kim님의 프로필 이미지
kim

작성한 질문수

질문하기