JAVA

자바 Enum 활용

자바 Enum의 장점

- 안정성 향상: 객체 범위 제한

- 소스 가독성 향상: 상수의 사용 목적 및 해석 용이

- IDE의 적극적인 지원: 자동완성, 오타검증, 텍스트 리팩토링

 

Enum을 어떻게 활용할 수 있을까요?

1. CODE 관리용 테이블 교체

학생 연구원 당시 아래보다 좀더 칼럼이 많은 형태의 관리용 테이블이 있었습니다. 

또한 아래 처럼 코드를 직접 넣어서 동적 쿼리에 적용 시켰습니다. 

aBox.setIfEmpty("hits", 0);
aBox.setIfEmpty("notiSt", "OS01");
aBox.setIfEmpty("noticetarget", "NT01");
aBox.setIfEmpty("notiType","N");
SELECT
	COUNT(NO.NOTICE_SEQ) AS TOTAL_COUNT
FROM
	TB_NOTICE NO
WHERE 
	NO.NOTICE_ST = #{notiSt}

위방식의 문제는 

1. 매번 공통 코드 관리용 테이블을 조인해야한다.

2. 코드를 직접 하드 코딩하기 때문에 만약 OS01을 잘못적어서 OS02라고 한다면 여지없이 잘못된 데이터를 가져오게 됩니다.

 

테이블을 Enum으로 대체하고 하드 코딩을 Enum을 통해서 처리한다면 위와 같은 문제를 해결할수 있습니다. 다만 enum으로 변경하여 효율을 보기 위해서는 enum으로 관리되는 데이터가 빈번하게 변경(추가/제거) 되지 않아야하는 것과 이 code enum을 다른 테이블에서도 빈번하게 사용해야 한다는 것입니다.

 

2. 다른 연산식 처리하기

Java8이 되면서 Function 인터페이스가 등장하게 되어 function을 값으로 사용할 수 있게 되었습니다.

분명 코드를 간결하게 하고 계산 공식이 변하는 것이 아니라면 매우 좋은 방식이라고 생각합니다.

전략 패턴으로 인터페이스, 구현체 대신 사용할 수 있을거 같습니다.

3. 각 타입을 그룹화 하기

결제방식에 따라 다른 수수료를 부가해야하는 과정이 필요하다고 가정하겠습니다.
아래와 같이 결제방식에 따른 수수료 그룹이 있는 것입니다.

각 결제방식이 어느 그룹에 포함되는지에 대한 분기로직이 필요

그룹별 로직이나 추가 메소드가 필요한 경우와 그룹을 select box로 표시해야하는 경우 등까지 고려하면 클래스나 데이터베이스로 해결하기엔 코드가 너무 분산

 

특정 PaymentOption이 있을때 이 값이 어느 그룹에 포함될지는 PaymentGroup에 직접 물어보면(findGroup) 됩니다.
각 그룹별로 추가 기능이 필요한 경우엔 PaymentGroup에 추가하면 됩니다.
또한 select box로 그룹 리스트를 출력해야하는 경우엔 PaymentGroup.values()을 사용하면 아주 쉽게 대응할 수 있습니다.

 

Reference

https://jojoldu.tistory.com/137

'JAVA' 카테고리의 다른 글

상속(Inheritance)과 위임(Delegation) 방식  (0) 2021.08.31
Java의 직렬화(Serialize)  (0) 2021.06.26
자바 final 키워드  (0) 2021.06.05
자바 예외 다루기 - 에러 처리 방식  (0) 2021.05.31
Error 와 Exception(Checked, Unchecked)  (0) 2021.05.31