제휴사 연동서비스를 개발하던 중 퇴사자분이 만들어놓은 코드를 만났는데 대략 비슷하게 구현을 해보면 이렇다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 public String getStatusType (String type, String code) { String result = "" ; switch (type){ case "Booking" : if ("BK04" .equals(code)){ result = "OK" ; } else if (List.of("BK03" ,"BK05" ).contains(code)){ result = "CANCEL" ; } else if (List.of("BK01" ,"BK02" ).contains(code)){ result = "HOLD" ; } break ; case "Payment" : if ("BK04" .equals(code)){ result = "OK" ; } else if (List.of("BK03" ,"BK05" ,"BK06" ,"BK07" ).contains(code)){ result = "CANCEL" ; } else if (List.of("BK01" ,"BK02" ,"BK09" ).contains(code)){ result = "HOLD" ; } break ; } return result;}
1 2 3 String bookingType = getStatusType("Booking" , vo.getCode());String paymentType = getStatusType("Payment" , vo.getCode());String otherType ...
이 코드는 Booking과 Payment 같은 타입과 기존 아이템의 상태코드 값을 받아서 매칭되는 상태값을 반환하는 메서드였다. 코드는 처음에 보면 별 생각이 없었지만, 타입 유형이 늘어나고 코드가 많아지면 switch문이 복잡해지고 유지보수가 어려워지는 문제가 생길 수 있다고 생각이 들었다.
검색을 하던 도중 시간이 좀 지난 글이지만 우아한형제들 기술블로그 - Java Enum 활용기 라는 글에서 3. 데이터 그룹관리 세션의 내용을 적용할 수 있겠다고 판단되었다. Enum을 활용하여 데이터를 그룹화 하고 각 타입은 본인이 수행해야할 기능만 책임지도록 하는게 중요해 보였다.
개선된 Enum 클래스는 대략 아래와 같다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 public enum BookingType { OK("완료" , List.of(ItemStatus.OK), CANCEL("취소" , List.of(ItemStatus.CANCEL, ItemStatus.REFUND), HOLD("대기" , List.of(ItemStatus.PENDING, ItemStatus.UNAVAILABLE), EMPTY("없음" , Collections.emptyList()); private String title; private List<ItemStatus> codeList; public static BookingType findByItemStatus (ItemStatus code) { return Arrays.stream(NaverBookingType.values()) .filter(itemCode -> itemCode.hasStatusCode(code)) .findAny() .orElse(EMPTY); } public boolean hasStatusCode (ItemStatus code) { return typeList.stream() .anyMatch(statusCode == code); } }
1 2 3 4 ItemStatus code = ItemStatus.findByCode(vo.getCode());BookingType bookingType = BookingType.findByItemStatus(code);PaymentType paymentType = PaymentType.findByItemStatus(code);OtherType otherType = ...
이제는 직관적으로 각 유형에 대한 상태코드를 볼 수 있다. BookingType의 OK가 가진 상태코드를 직관적으로 볼수 있어서 가독성이 좋아졌다.
데이터들의 그룹화를 통해서 상태매핑 관계를 파악하기 더 수월해지고 입출력도 Enum을 사용해서 별도의 검증없이도 예측이 가능하고 실수로 다른 문자열이 들어올 일이 없어서 타입 안정성이 보장된다.
추후 기능 확장 시에도 Enum 클래스만 수정하면 되서 side-effect가 적을 것으로 기대된다.