늦은 프로그래밍 이야기
230120 TIL (팀프로젝트) 본문
팀프로젝트
주문 수락 기능 구현
고객이 요청한 주문을 판매자가 수락하면 배송상태가 바뀌는 기능을 구현을 해보았다. 배송상태는 Enum을 사용하여 네가지의 상태로 작성하였다.
public enum ShippingStatusEnum {
DEFAULT(0, "주문 수락 대기"),
ACCEPTED(1, "배송 준비중"),
SHIPPING(2, "배송중"),
COMPLETED(3, "배송 완료");
int statusCode;
String message;
ShippingStatusEnum(int statusCode, String message) {
this.statusCode = statusCode;
this.message = message;
}
}
상태코드를 0부터 3까지 숫자로 작성하였고, 원하던 방식은 주문 수락을 하게 되면 상태코드를 +1 하여 다음 상태로 전환하는 방식으로 구현하려고 생각했었는데, 생각대로 되지 않았다.
처음에는 그저 Order의 배송상태를 변경하려고 생각하였는데 하나의 Order 안에 여러 판매자의 상품이 존재할 수 있으므로 OrderItem에도 배송상태를 넣어 놓고 판매자가 자신의 상품인 OrderItem의 배송상태를 변경하는 것으로 방식을 바꾸었다.
OrderItem CLASS
public void acceptOrder(ShippingStatusEnum shippingStatus, String sellerId) {
if (this.getSellerId().equals(sellerId)) {
if (shippingStatus.equals(ShippingStatusEnum.DEFAULT))
this.shippingStatus = ShippingStatusEnum.ACCEPTED;
else if (shippingStatus.equals(ShippingStatusEnum.ACCEPTED))
this.shippingStatus = ShippingStatusEnum.SHIPPING;
else if (shippingStatus.equals(ShippingStatusEnum.SHIPPING))
this.shippingStatus = ShippingStatusEnum.COMPLETED;
}
}
현재 Enum의 int 값에 +1을 해서 다음 Enum 값으로 변경해 주고 싶었는데 하는 방법을 모르고, 시도하다가 많은 시간을 소비할 것 같아서 일단 현재 Enum을 다음 Enum으로 일일히 바꿔주는 조건문을 작성하여 구현을 하였다. 프로젝트가 끝나고 시간이 있을 때 한번 원래 구현하려는 방식으로 리팩토링을 해봐야 할 것이다.
Order의 배송상태는 하나의 Order 안에 여러 판매자의 OrderItem이 존재하므로 판매자 마다 주문 수락의 시점이 다를 수 있어서 가장 진행이 되지 않은 OrderItem의 배송상태를 받아와서 Order의 배송상태에 반영하고 싶었다.
Order가 가지고 있는 OrderItem의 리스트를 반복문으로 OrderItem을 하나하나 가져와서 가장 진행이 되지 않은 OrderItem의 배송상태를 가져와야 하는데 배송상태들의 상하관계를 Enum의 String 값으로 표현하기 어려웠다. Enum의 값을 숫자로도 표현할 수 있다는 얘기를 듣고, 인터넷으로 검색을 해보았더니, Enum에도 @Getter 어노테이션을 사용할 수 있다는 것을 알게 되었고, ordinal() 메소드를 사용하면 Enum의 순서대로 int 값을 가져올 수 있다는 것도 알게 되었다.
둘 중 ordinal 메소드를 사용하여 Enum의 순서대로 int 값을 min 변수와 비교하여 작은 수를 min 변수에 담아 가장 진행이 되지 않은 배송상태를 숫자로 표현하여 해당 Enum을 Order의 배송상태로 설정하는 코드를 작성하였다.
Order CLASS
public void updateShippingStatus(Order order) {
int min = 3;
for (int i = 0; i < order.getOrderItemList().size(); i++) {
if (order.getOrderItemList().get(i).getShippingStatus().ordinal() < min)
min = order.getOrderItemList().get(i).getShippingStatus().ordinal();
}
if (min == 0) return;
if (min == 1) this.shippingStatus = ShippingStatusEnum.ACCEPTED;
if (min == 2) this.shippingStatus = ShippingStatusEnum.SHIPPING;
if (min == 3) this.shippingStatus = ShippingStatusEnum.COMPLETED;
}
Enum을 숫자로 표현하기 위해 많은 시도를 하고, 혼자 해결해 보고 싶었지만 잘 되지 않아서 결국에는 구글링의 도움을 받은 것이 아쉽다. 하지만 이번 기회에 Enum을 조금 더 잘 활용할 수 있게 되었고, 다음에도 잘 활용해 보아야 할 것이다.
'내일배움캠프 > TIL, WIL' 카테고리의 다른 글
| 230124 TIL (Refresh Token, Redis) (0) | 2023.01.25 |
|---|---|
| 12주차 WIL (0) | 2023.01.23 |
| 230119 TIL (팀프로젝트) (0) | 2023.01.19 |
| 230118 TIL (팀프로젝트) (0) | 2023.01.19 |
| 230117 TIL (팀프로젝트) (0) | 2023.01.18 |