ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • enum 활용기
    개발/java 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에 묶여있다는 점에서 제약이 될수도 있다  

    '개발 > java' 카테고리의 다른 글

    DB 인터페이스 분리  (1) 2024.10.28
    jpa 흉내내기  (2) 2024.10.23
    CompletableFuture  (6) 2024.09.05
    java stream Util 만들기  (2) 2024.09.04
    mybatis로 jpa 흉내내기  (3) 2024.09.03

    댓글

Designed by Tistory.