1. 카페키오스크요구사항

OO 카페 키오스크 시스템은 고객이 카페 메뉴를 빠르고 편리하게 주문할 수 있도록 지원하는 시스템이다. 이 시스템은 카페에서 판매하는 메뉴 정보를 기본 데이터로 관리하며, 이를 기반으로 메뉴 조회, 메뉴 선택, 주문 생성, 결제 및 주문 내역 저장 기능을 제공한다.
카페에서 판매하는 메뉴는 공통적으로 시스템에서 사용하는 메뉴의 고유 식별자(Menu ID), 메뉴명, 가격, 메뉴 설명, 판매 상태(판매중, 품절) 정보를 관리해야 한다. 메뉴는 종류에 따라 커피류(CoffeeMenu)와 디저트류(DessertMenu)로 구분된다. 커피류 메뉴는 추가적으로 원두 종류(bean type), HOT 제공 가능 여부, ICE 제공 가능 여부 정보를 관리해야 한다. 디저트류 메뉴는 추가적으로 칼로리(calories)와 알레르기 정보(allergy information)를 관리해야 한다. 메뉴의 고유식별자(Menu ID)는 메뉴의 등록 순서번호를 사용하며 중간에 삭제가 되어도 다음에 등록된 번호는 최종 번호 +1로 생성한다.
고객은 키오스크 화면에서 메뉴 목록을 조회할 수 있어야 하며, 각 메뉴에 대해 메뉴명, 가격, 판매 상태가 표시되어야 한다. 품절 상태의 메뉴는 화면에 표시되더라도 선택이 불가능해야 한다.
고객이 주문을 진행하기 위해 메뉴를 선택하면, 시스템은 해당 메뉴의 상세 정보를 보여주고 사용자는 수량을 선택할 수 있어야 한다. 선택한 메뉴는 주문 항목으로 추가되며, 사용자는 여러 개의 메뉴를 하나의 주문에 포함시킬 수 있어야 한다. 고객이 주문을 확정하면 시스템은 주문을 생성하고 관련 정보를 저장해야 한다. 저장해야 할 정보에는 주문번호(고유 식별자), 주문 항목 목록(메뉴 ID, 메뉴명, 수량, 항목별 금액), 총 주문 금액, 주문 생성 시간(주문 시각), 주문 상태(: 주문접수)가 포함된다.
주문 생성 후 고객은 결제를 진행해야 한다. 결제는 공통적으로 결제번호, 결제금액, 결제시간, 결제상태(결제완료, 결제실패), 결제방식을 관리해야 한다. 결제 방식은 신용카드(CreditCardPayment)와 카카오페이(KakaoPayPayment)를 지원한다. 신용카드 결제는 카드사(card company)와 카드번호(card number)를 관리해야 하며, 카카오페이 결제는 카카오 계정 ID를 관리해야 한다. 하나의 주문은 하나의 결제와 연결되며, 결제가 완료되면 주문 상태는 “결제완료” 변경된다.
주문이 정상적으로 생성되고 결제가 완료되면 키오스크는 사용자에게 주문번호와 함께 주문 내역(메뉴명, 수량, 총액, 결제방식)을 화면에 표시해야 한다.

 

2. 카페키오스크 유스케이스 다이어그램

 

 

3. 메뉴 등록 유스케이스 명세서

Use case Diagarm Use case Description



 

Use case Description Brief Sequence Diagram

 

4. 메뉴관리 클래스 다이어그램

 

 

5. 메뉴등록 시퀀스 다이어그램

 

 

6. 클래스 다이어그램 정제

7. 메뉴등록 구현

class MenuItem:
    def __init__(self, menu_id, menu_type, name, price, description, status):
        self.__menu_id = menu_id
        self.__menu_type = menu_type
        self.__name = name
        self.__price = price
        self.__description = description
        self.__status = status

    # Getter (읽기 전용)
    @property
    def menu_id(self):
        return self.__menu_id

    @property
    def menu_type(self):
        return self.__menu_type

    @property
    def name(self):
        return self.__name

    @property
    def price(self):
        return self.__price

    @property
    def description(self):
        return self.__description

    @property
    def status(self):
        return self.__status


class MenuRepository:
    def __init__(self):
        self.__menu_list = []
        self.__next_menu_id = 1

    def generate_menu_item_id(self):
        menu_id = self.__next_menu_id
        self.__next_menu_id += 1
        return menu_id

    def add_menu_item(self, menu_item):
        self.__menu_list.append(menu_item)

    def find_all(self):
        return self.__menu_list


class MenuController:
    def __init__(self):
        self.__menu_repository = MenuRepository()

    def check_mandatory_field(self, name, price, status):
        return all([name, price, status])  # all() 안에 하나라도 비어있으면 False, 아니면 True

    def register_menu_item(self, menu_type, name, price, description, status):
        menu_id = self.__menu_repository.generate_menu_item_id()

        menu_item = MenuItem(
            menu_id,
            menu_type,
            name,
            int(price),
            description,
            status
        )

        self.__menu_repository.add_menu_item(menu_item)

    def retrieve_menu_list(self):
        menu_items = self.__menu_repository.find_all()

        result = []
        for item in menu_items:
            result.append({
                "menu_id": item.menu_id,
                "menu_type": item.menu_type,
                "name": item.name,
                "price": item.price,
                "description": item.description,
                "status": item.status
            })

        return result

class MainUI:
    def __init__(self):
        self.__menu_controller = MenuController()
        
    def run(self):
        while True:
            self.__print_main_menu()
            selected_menu = input("메뉴를 선택하세요: ")

            if selected_menu == "11":
                self.__select_register_menu()
            elif selected_menu == "12":
                self.__select_modify_menu()
            elif selected_menu == "13":
                self.__select_delete_menu()
            elif selected_menu == "14":
                self.__select_retrieve_menu()
            elif selected_menu == "21":
                self.__select_order()
            elif selected_menu == "0":
                print("프로그램 종료")
                break
            else:
                print("잘못된 입력")

    def __print_main_menu(self):
        print("\n============= 카페 키오스크 =============")
        print("메뉴관리(관리자)       주문관리(고객)")
        print("11. 메뉴 등록          21. 주문[TODO]")
        print("12. 메뉴 수정[TODO]")
        print("13. 메뉴 삭제[TODO]")
        print("14. 메뉴 조회")
        print("0. 종료")
        print("\n========================================")

    def __select_register_menu(self):
        print("\n[메뉴 등록]")
        print("1. Coffee")
        print("2. Dessert")

        menu_type_input = input("유형 선택: ")

        if menu_type_input == "1":
            menu_type = "Coffee"
        elif menu_type_input == "2":
            menu_type = "Dessert"
        else:
            print("잘못된 유형")
            return

        name = input("메뉴명: ")
        price = input("가격: ")
        description = input("설명: ")
        status = input("상태(1. 판매중, 2. 품절): ")

        if not self.__menu_controller.check_mandatory_field(name, price, status):
            print("누락된 정보를 입력하세요(필수정보:메뉴명, 가격, 상태)")
            return

        self.__menu_controller.register_menu_item(
            menu_type, name, price, description, status
        )

        print("등록 완료")

    def __select_retrieve_menu(self):
        print("\n[메뉴 조회]")

        menu_list = self.__menu_controller.retrieve_menu_list()

        if not menu_list:
            print("메뉴 없음")
            return

        print("=" * 60)
        print(f"{'ID':<5} {'유형':<10} {'이름':<10} {'가격':<8} {'상태':<8}")
        print("-" * 60)

        for m in menu_list:
            print(
                f"{m['menu_id']:<5} "
                f"{m['menu_type']:<10} "
                f"{m['name']:<10} "
                f"{m['price']:<8} "
                f"{m['status']:<8}"
            )

    def __select_modify_menu(self):
        print("[TODO] 메뉴정보 수정 선택")

    def __select_delete_menu(self):
        print("[TODO] 메뉴정보 삭제 선택")

    def __select_order(self):
        print("[TODO] 주문 선택")


if __name__ == "__main__":
    ui = MainUI()
    ui.run()

 

 

[참고] UML 다이어그램 draw.io 버전 

콘솔키오스크.drawio
0.12MB

+ Recent posts