Java Enum을 활용해보기

제휴사 연동서비스를 개발하던 중 퇴사자분이 만들어놓은 코드를 만났는데 대략 비슷하게 구현을 해보면 이렇다.

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가 적을 것으로 기대된다.