-
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