본문 바로가기

프로그래밍 언어/Java

enum과 활용사례

enum이란?

  • Enum이란 Enumeration의 앞 글자로 열거라는 의미를 갖는다. 관련이 있는 상수들의 집합 
  • 어떤 클래스가 상수만으로 작성되어 있으면 반드시 class로 선언할 필요는 없습니다. 이럴 때 class로 선언된 부분에 enum이라고 선언하면 이 객체는 상수의 집합이다. 라는 것을 명시적으로 나타냄

활용사례 1

CODE용 테이블 대체

개발을 진행하다 보면 코드용으로 테이블을 만들어야 하는 경우가 생깁니다.

예를 들면, 입금 여부를 나타낼때 1번은 입금, 2번은 출금이라고 할때 해당 내용을 저장할 테이블이 필요합니다.

내가 누구게?

위와 같은 테이블이 필요하다는 이야기이고, 실제로 위와 같은 코드성 테이블을 만들고 코드를 관리할 경우 다음과 같은 문제에 마주칩니다. 

문제점 1

  • 다른 테이블에는 코드인 1 아니면 2가 저장될텐데, 해당 코드명을 가져오기 위해서 항상 Join 작업을 수행해야 합니다.
  • 해당 code 테이블의 값을 기준으로 비지니스 로직을 구현하고, 컬럼 값을 할당하는 여러 테이블이 존재할 경우 그 테이블들을 조회할때마다 항상 code 테이블도 같이 조회해야하는 경우가 발생합니다.

문제점 2

  • Mybatis나 Jpa를 사용할시, xml안에 쿼리를 작성하거나 Jpa의 경우 @Query annotation을 활용하는 경우가 존재하는데 그럴 경우 Compile 단계에서 에러를 잡기가 힘듭니다.

문제점 3

  • 코드 레벨에서 확인할수 있는 부분이 적습니다.
  • 첫번째, 이 Type일 경우 어떤 코드가 필요한지 확인하는 작업이 필요합니다.
  • 두번째, 만약 코드성 테이블이 여러개일 경우 작성된 쿼리를 통해 하나 하나 찾아가서 해당 코드명을 찾아야 합니다.

그렇다면 어떻게 하면 좋을까 ? 위에서 설명한 입출금 코드 테이블을 기준으로 설명하겠습니다.

public Enum deposittCode {
    D("deposit", "입금"),
    W("withdraw", "출금");
}

 

입출금과 관련된 데이터들은 DB에 관리되겠지만, 입출금에 필요한 code 정보들은 enum으로 분리하여 관리하면 위에서 제시한 문제들을 해결할 수 있습니다.

주의점

위의 코드성 테이블의 경우, 바뀔수 있는 경우가 존재합니다. 예를 들어서,  위의 코드1이 적립이 될수가 있는것처럼 말입니다.그래서 되도록이면 코드가 아닌 코드명인 String을 저장하는것을 추천합니다.

Entity 클래스에 선언한 @Enumerated(javax.persistence.EnumType.STRING)을 entity의 필드에 선언하시면, 해당 enum 타입의 name이 DB에 저장됩니다.

결론

이렇게 enum으로 풀게되면 Affiliate.Code을 여러 Entity 클래스에서 join select 없이 사용할 수 있으며, 어떤 입출금일때 어떤 code가 사용될지 바로 알 수가 있습니다.
단, 대전제는 enum으로 관리되는 데이터가 빈번하게 변경(추가/제거) 되지 않아야하는 것과 이 code enum을 다른 테이블에서도 빈번하게 사용해야 한다는 것입니다.
이럴 경우 enum을 고려해보심을 추천드립니다.

'프로그래밍 언어 > Java' 카테고리의 다른 글

jvm, jre, jdk 확실하게 구별하자  (0) 2022.07.28
Java Volatile은 무엇이고 왜 필요할까?  (0) 2022.07.26
접근제어자  (0) 2022.07.13
Hash Map과 Hash Collision 문제  (0) 2022.07.10
GC(Garbage Collector)  (0) 2022.07.10