리뷰 1. 도서관 도메인에서 클래스 찾기

아래의 요구사항을 보고 서로 관련된 데이타와 기능을 encapsulation하여 Entity 클래스를 도출하시오.

요구사항

도서관 시스템 요구사항

OO 대학교 도서관 시스템은 학생들이 도서관 자원을 효과적으로 이용하기 위해 시스템을 이용하는 사용자 정보도서관에서 소장하는 도서정보기본정보로 관리하고, 이를 기반으로 도서 검색, 대출, 반납, 연체 관리 기능을 제공한다. 각 기능의 상세 설명은 아래와 같다.

도서관에서 소장하는 도서 정보는 시스템에서 사용하는 도서의 고유 식별자를 포함하여 제목, 저자, ISBN, 출판사, 출판연도, 장르, 대출 가능 여부 등의 정보를 관리해야 한다. 새로운 도서는 시스템에 등록하고, 등록된 도서는 수정, 삭제와 같은 기능을 지원한다. 또한 등록된 도서는 키워드, 제목, 저자Q, 장르를 조건으로 검색할 수 있으며, 검색된 도서는 제목, 저자, 출판사, 출판연도, 장르 정보를 보여준다.

도서관 시스템을 사용하는 학생은 학생 기본정보를 시스템에서 관리하는데, 학번, 이름, 이메일, 전화번호, 비밀번호, 전공, 선호장르를 저장한다. 학생 정보는 신규입력, 수정, 삭제(탈퇴)가 가능하며 비밀번호 재설정은 현재 비밀번호를 확인후 수정이 가능하다.

도서를 대출하기 위해, 사서는 사용자로부터 사용자 ID와 대출하려는 도서 정보를 전달받아 시스템에 사용자 ID와 도서 ID입력하면, 시스템은 누가(사용자ID), 어떤 도서를(도서ID), 언제 대출했는지를 저장한다. 대출 기한은 기본 2(14) 이며, 최대 5권 대출이 가능하다. 연체중인 사용자는 대출을 할 수 없으며, 연체중인 도서 반납한 후 대출이 가능하다. 

도서관 시스템은 매일 아침 연체중인 사용자들에게 연체상태 메일을 보낸다.  사용자가 대출한 도서를 사서에게 반납하면, 사서는 도서 바코드를 찍어 해당 사용자의 대출 상태를 반납완료 상태로 변경한다.

 

객체 찾기

[Hint]

  • 도서관 시스템에서 관리해야 할 정보의 단위는 무엇일까?
  • 정보의 단위는 도서명, 학생명, 전화번호 수준의 최소 데이타 단위인가? -> 최소단위의 묶음으로
  • 정보의 단위가 시스템, 도서관리, 대출 관리 등 사용자 인터페이스와 업무 로직등이 묶여있는 단위인가? ->  저장할 데이터 단위로 분할
더보기
더보기

 

클래스명 Book Student BookLoan
속성 id
title
author
publisher
publishedYear
genre
ISBN
loanStatus
id
name
phone
email
password
major
preferredGenre
id
book
user
loan_date
due_date
return_date
status
메소드 add()
modify()
delete()
search ()
add()
modify()
changePassword()
deleteAccount()
borrowBook()
returnBook ()
extendLoan()
checkStatus()

 

객체 모델링 하기(클래스 다이어그램)

도출한 클래스(속성/메소드를 포함)를 ppt나 도구 (https://app.diagrams.net/) 를 이용하여 각각 작성하시오. 

 

클래스 다이어그램 보고 클래스 코드 만들기

UML 클래스 다이어그램으로 모델링한 클래스를 파이썬 클래스로 구현하시오. 

 

더보기
더보기
class Book:
    def __init__(self, id, title, author, publisher, published_year, genre, isbn):
        self.id = id
        self.title = title
        self.author = author
        self.publisher = publisher
        self.published_year = published_year
        self.genre = genre
        self.isbn = isbn
        self.loan_status = "AVAILABLE"

    def add(self):
        print(f"도서 '{self.title}' 추가 완료")

    def modify(self, new_title):
        self.title = new_title
        print("도서 정보 수정 완료")

    def delete(self):
        print("도서 삭제 완료")

    def search(self):
        print(f"도서 검색 결과: {self.title}, {self.author}")

 

class Student:
    def __init__(self, id, name, phone, email, password, major, preferred_genre):
        self.id = id
        self.name = name
        self.phone = phone
        self.email = email
        self.password = password
        self.major = major
        self.preferred_genre = preferred_genre

    def add(self):
        print(f"학생 '{self.name}' 등록 완료")

    def modify(self, new_phone):
        self.phone = new_phone
        print("학생 정보 수정 완료")

    def change_password(self, new_password):
        self.password = new_password
        print("비밀번호 변경 완료")

    def delete_account(self):
        print("계정 삭제 완료")

 

from datetime import date, timedelta

class BookLoan:
    def __init__(self, id, book, user):
        self.id = id
        self.book = book
        self.user = user
        self.loan_date = None
        self.due_date = None
        self.return_date = None
        self.status = "NONE"

    def borrow_book(self):
        if self.book.loan_status == "AVAILABLE":
            self.loan_date = date.today()
            self.due_date = self.loan_date + timedelta(days=14)
            self.status = "BORROWED"
            self.book.loan_status = "BORROWED"
            print(f"{self.user.name}님이 '{self.book.title}' 대출 완료")
        else:
            print("이미 대출 중인 도서입니다.")

    def return_book(self):
        if self.status == "BORROWED":
            self.return_date = date.today()
            self.status = "RETURNED"
            self.book.loan_status = "AVAILABLE"
            print(f"{self.book.title} 반납 완료")
        else:
            print("대출 상태가 아닙니다.")

    def extend_loan(self):
        if self.status == "BORROWED":
            self.due_date += timedelta(days=7)
            print("대출 기간 연장 완료")
        else:
            print("연장 불가 상태입니다.")

    def check_status(self):
        print(f"현재 상태: {self.status}")

 

실습 1. 키오스크 도메인에서 클래스 찾기

요구사항

OO 카페 키오스크 시스템은 고객이 카페 메뉴를 빠르고 편리하게 주문할 수 있도록 지원하는 시스템이다. 이 시스템은 카페에서 판매하는 메뉴 정보를 기본 데이터로 관리하며, 이를 기반으로 메뉴 조회 및 검색, 메뉴 선택, 장바구니 관리, 주문 생성과 주문 내역 저장 기능을 제공한다.

시스템은 각 메뉴에 대해 고유 식별자(Menu ID)를 포함하여 메뉴명, 카테고리(커피, , 음료, 디저트 등), 가격, 메뉴 설명, 판매 상태(판매중, 품절) 등의 정보를 관리해야 한다. 사용자는 키오스크 화면에서 카테고리별로 메뉴 목록을 조회할 수 있으며, 각 메뉴에 대해 메뉴명, 가격, 판매 상태가 표시되어야 한다. 품절 상태의 메뉴는 화면에 표시되더라도 선택이 불가능해야 한다. 또한 사용자는 키워드나 메뉴명, 카테고리 조건을 이용하여 메뉴를 검색할 수 있어야 하며, 검색 결과로는 메뉴명, 가격, 카테고리 정보가 제공되어야 한다.

사용자가 주문을 진행하기 위해 메뉴를 선택하면
, 시스템은 해당 메뉴의 상세 정보를 보여주고 사용자는 수량을 선택할 수 있어야 한다. 선택한 메뉴는 장바구니에 담을 수 있으며, 사용자는 여러 개의 메뉴를 장바구니에 담아 한 번에 주문할 수 있어야 한다. 장바구니에서는 각 항목의 수량을 변경하거나 특정 항목을 삭제할 수 있어야 한다.

사용자가 장바구니 내역을 확인한 뒤 주문을 확정하면, 시스템은 주문을 생성하고 관련 정보를 저장해야 한다. 저장해야 할 정보에는 주문번호(고유 식별자), 주문 항목 목록(메뉴 ID, 메뉴명, 수량, 항목별 금액), 총 주문 금액, 주문 생성 시간(주문 시각), 주문 상태(: 주문접수)가 포함된다.

주문이 정상적으로 생성되면 키오스크는 사용자에게 주문번호와 함께 주문 내역(메뉴명, 수량, 총액)을 화면에 표시해야 한다.

 

1.1 객체 찾기

요구사항을 읽고 객체와 객체의 속성(=data, attributes)과 기능(=operation, method, 함수)을 찾아 적으시오. 

 

1.2 객체 그리기(클래스 다이어그램)

1.1에서 찾은 객체를 https://app.diagrams.net/ (또는 UML 클래스 형태의 손그림, or ppt)로 클래스 다이어그램을 작성하시오. 

 

1.3 클래스 다이어그램 보고 클래스 코드 만들기

1.2에서 작성한 클래스 다이어그램을 기반으로 파이썬 코드를 작성하고, 인스턴스를 하나 생성하여 기능하나를 실행하는 코드를 추가하시오. 

+ Recent posts