하이브리드 전략

enum과 공통 코드 테이블 두 곳 모두에 데이터를 중복으로 유지하고, 각자 역할을 나누어 분담하는 전략이다. 즉 데이터를 중복시키고 둘의 역할을 분리한다.

핵심 아이디어는 다음과 같다. 각각 아래의 역할만 담당한다.

구현 예시는 다음과 같다. enum을 굉장히 단순하게 정의한다. 오직 코드 값만 정의함.

public enum OrderStatus {
	ORDER,
	PAID,
	SHIPPING,
	DELIVERD,
	CANCEL;	
	
	//표시 이름, 속성등은 여기서 정의 하지 않고, DB테이블에서 조회한다.
}

그리고 공통 코드 테이블도 정의한다.

-- 표시 이름과 속성은 공통 코드 테이블에서 관리
INSERT INTO common_code_detail (group_code, code, name, name_en, sort_order) VALUES
('ORDER_STATUS', 'ORDER', '주문접수', 'Order Received', 1),
('ORDER_STATUS', 'PAID', '결제완료', 'Payment Complete', 2),
('ORDER_STATUS', 'SHIPPING', '배송중', 'Shipping', 3),
('ORDER_STATUS', 'DELIVERED', '배송완료', 'Delivered', 4),
('ORDER_STATUS', 'CANCEL', '주문취소', 'Cancelled', 5);

보면 code가 enum과 테이블 양쪽에서 중복으로 사용되고 있다.

이제 비즈니스 로직에서는 ENUM을 사용한다.

boolean canCancel(Order order) {
	return order.status == OrderStatus.ORDER ||
				 order.status == OrderStatus.PAID;
}

void startShipping(Order order) {
	if (order.status != OrderStatus.PAID) {
			throw new Exception("결제완료 상태에서만 배송을 시작할 수 있습니다.");
	}
	order.status = OrderStatus.SHIPPING;
}

그리고 표시 이름은 DB나 캐싱된 공통 코드에서 조회한다.

String getStatusDisplayName(OrderStatus status) { 
		return CommonCodeCache.getName("ORDER_STATUS", status.name());
}