배송 상태 확인(1)
22 실전 프로젝트 - 고루틴으로 배송하기
배송 상태 확인(1)

이전 강의까지 해서 마일리지 상점의 주요 기능은 거의 완성했습니다. 이제 마지막 큰 기능인 '배송'이 남았습니다. 이 프로그램의 컨셉은 인터넷 쇼핑이어서 물품 판매는 모두 배송으로 처리합니다. 이 기능은 상품이 주문접수가 된 시점에서 "주문접수", "배송중", "배송완료" 상태를 보여줍니다. 이는 각 주문 건수마다 독립적으로 진행되는 시간이므로 고루틴과 채널을 활용하기에 아주 좋은 기능입니다.

배송을 할 수 있는 건수는 총 5개입니다. 5개의 주문이 동시에 처리될 수 있고 배송이 완료되면 또 주문할 수 있는 그런 시스템입니다. 감이 오시나요? 만약 5개를 연속으로 바로 주문하면 5개의 물품이 배송이 시작됩니다. 이 물품이 하나라도 끝나야 추가주문을 할 수 있는 것입니다. 이는 장바구니 물품 주문도 동일합니다. 장바구니에 담긴 모든 품목들을 한번에 주문합니다. 여기서 주의해야 할 것은 주문하는 물품의 종류가 배송할 수 있는 건수가 아니라 한 개의 주문이 배송 건수입니다. 예를 들어, 장바구니에 롱패딩 5개, 빼빼로2개를 담고 주문하면 두개의 물품이 한 배송으로 처리되는 것입니다. 이는 현재 운영되고 있는 시스템을 그대로 따랐습니다. 


이를 아주 쉽게 알 수 있도록 예를 들겠습니다. 마일리지 상점은 5대의 트럭을 운영해서 사용자가 주문한 물품을 배송합니다. 각 트럭은 번호가 있어서 구별됩니다. 5대의 트럭은 주문이 들어오기를 기다리고 주문이 들어오면 빠른 번호의 트럭부터 물품을 싣고 배송을 시작합니다. 이 트럭이 이동함에따라 사용자가 주문한 건수에 대한 상태가 "주문접수", "배송중", "배송완료"로 바뀝니다. 배송이 완료되면 다시 돌아와 주문이 들어오길 기다리는 것을 반복합니다. 따라서 동시에 배송을 할 수 있는 건수는 5개이고 5대의 트럭은 각자 비동기적으로 일을 처리합니다. 여기서 무언가 떠오른 분도 계실겁니다. 바로 각 배송마다 비동기적으로 프로세스를 진행하기 때문에 고루틴을 사용하고 배송 시작과 완료를 송/수신하기 위해 채널을 사용합니다.

앞으로 진행할 내용은 배송 구조체, 기능을 구현하는 것입니다. 하나씩 알아보겠습니다.


우선 주문 건수를 제한하는 변수를 만들어 주문 건수를 5개로 한정합니다. 주문처리가 되면 배송 건수를 1증가하고 5가 초과되면 주문하지 못하도록 합니다. main() 함수에 int형 변수를 하나 추가해 모든 주문이 완료되면 1 증가시킵니다. 그리고 if문을 써서 5개 이상은 주문하지 못하도록 주문 기능을 고칩니다.

실행 언어: go

주문 기능은 

  • buying() 함수로 바로 주문할 경우
  • bucketBuying() 함수로 장바구니 물품을 주문할 경우

가 있습니다. 다른 함수들에서 한 변수의 숫자를 증가시키므로 포인터 변수로 매개변수를 추가합니다. 함수의 매개변수로 num *int을 추가했습니다. 전달인자는 아래와 같습니다.

실행 언어: go

주문을 하는 곳에 numbuy가 5이하일 경우만 주문할 수 있도록 합니다. 주문하면 배송 횟수를 1 증가시킵니다.  5를 초과한 경우 "배송 한도를 초과했습니다. 배송이 완료되면 주문하세요."를 출력하고 주문하지 않도록 합니다.

아래 buy() 함수의 예시를 보겠습니다.

실행 언어: go

아래 bucketBuying() 함수의 예시를 보겠습니다.

실행 언어: go

이렇게하면 주문할 때마다 numbuy가 1씩 증가만 하고 줄어들지 않습니다. 왜냐하면 아직 저희는 배송 상태를 구현하지 않았기 때문입니다. 다음 강의에서 배송을 담당하는 구조체를 구현해보겠습니다.

질문하기
추가 자료
no files uploaded

추가 자료가 없습니다

여기서 새로운 학습 자료를 확인하세요!
선생님이 추가한 자료들을 바로 확인할 수 있어요.