개발/java

enum 활용기

캐리캐리 2024. 9. 11. 09:58

enum을 통해 단순 코드를 비교할뿐만 아니라 특정 코드에 따라 bean을 가져와 method를 동작할 수 있다

 

예를 들어 고객이 주문을 힐때 특정 조건에 따라 가격을 할인 받는 정책을 정하거나 그 이후 api에 동일한 데이터를 전송하는 경우와 같은 작업을 할때이다 

 

이때 주목할점이 유사한 데이터라는 점이고 이를  특정 조건에 따라 데이터의 일부만 변경하고 그걸통해 특정 기능을 수행하거나 특정 api , 특정 mq , kafka에 전송을 하면 된다는 점이다

이때 enum을 이용하면 if else와 같은 형태로 혹시 method 형태로가 아닌 특정 클래스 형태로 파일들을 관리 할 수 있다 

 

코드는 아래와 같은 형태가 될 것이다

할인과 관련된 부분을 interface를 통해 동일 메소드를 받게 하고 bean name에 enum에 있는 값과 일치한 값을 넣음으로써 생성자 주입 전 할인 관련된 부분들을 map 형태로 주입받아 이를 통해 각각의 기능을 처리하는 방식이다 

 

@RequiredArgsConstructor
public enum OrderType{
	10_DISCOUNT("10_DISCOUNT")
    20_DISCOUNT("20_DISCOUNT")
    30_DISCOUNT("30_DISCOUNT")
    
    @Getter
    private final String code
    
}
@Component
public class OrderProcess{
	
	private Map<String, OrderDiscount> orderDiscountService;
    
    @Autowired
    private ApplicationContext applicationContext;
    
    private boolean order10DiscountCouponInsert(OrderInfo orderInfo){
    	//enum 코드를 넣어서 해당 로직을 특정 클래스의 메소드에서 수행하게 되었다 
		OrderInfo orderInfo = orderDiscountService
        .get(OrderType.10_DISCOUNT.code())
        .orderDescountInfo(orderInfo);
        
        //이후 공통된 작업을 처리하면 된다 , 예를 들면 타 msa에 보내는 부분들 
        //해당 부분도 위와 비슷한 과정을 거치면 각각을 분리가 가능하다 
        OrderPayment.send(orderInfo); 
        productStockMinus.send(orderInfo);
        
        
    }	
    
    @PostStruct
    public void init(){
	orderDiscountService= applicationContext.getBeansOfType(OrderDiscount.class);

    }
    
}

interfase OrderDiscount{
	OrderInfo orderDiscountInfo(OrderInfo orderInfo);
}

Component("10_DISCOUNT")
class 10_disCount implement OrderDiscount{

	@Override
    private OrderInfo orderDescountInfo(OrderInfo orderInfo){
    	orderInfo.setPrice(기존상품가 *0.9);
    }

}
Component("20_DISCOUNT")
class 20_disCount implement OrderDiscount{

	@Override
    private OrderInfo orderDescountInfo(OrderInfo orderInfo){
    	orderInfo.setPrice(기존상품가 *0.8);
    }

}
Component("30_DISCOUNT")
class 30_disCount implement OrderDiscount{

	@Override
    private OrderInfo orderDescountInfo(OrderInfo orderInfo){
    	orderInfo.setPrice(기존상품가 *0.7);
    }

}

 

 

이러한 방식을 실 운영에서 사용하게 되면 아래와 같은 장점과 단점이 있는 것 같다

유지보수 측면에서 해당 방식을 이용하는게 좋을 것 같으나 할인의 경우 interface에 묶여있다는 점에서 제약이 될수도 있다