개발/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에 묶여있다는 점에서 제약이 될수도 있다