TypeScript : 카페 프로그램 구현

728x90
반응형

1.프로그램 세팅

(1) 터미널(cmd) 실행

: npm init -y

: tsc --init --rootDir ./src --outDir ./dist --esModuleInterop --module commonjs --strict true --allowJS true --checkJS true

 

(2) package.json 수정 : script 항목

"scripts": {
    "start": "tsc && node ./dist/index.js",
    "build": "tsc --build",
    "clean": "tsc --build --clean"
},

 

(3) src 폴더 생성 > index.ts파일 생성

 

2. 인터페이스  & 데이터  정의 (index.ts)

(1) 유저 인터페이스 

- 유저는 어드민 또는 고객

interface User {
    id: number;
    name: string;
    role: 'admin' | 'customer';
}

(2) 음료 인터페이스

interface Beverage {
    name: string;
    price: number;
}

(3) 주문 인터페이스

interface Order {
    orderId: number;
    customerId: number;
    customerName: string;
    beverageName: string;
    status: 'placed' | 'completed' | 'picked-up';
}

 

(4) 데이터 정의 

- 음료 목록 / 주문 목록

let beverages: Beverage[] = [];
let orders: Order[] = [];

 

3.  함수 구현

(1) 어드민 권한 체크 함수

function isAdmin(user: User): boolean {
    return user.role === 'admin';
}

 

(2) 고객 권한 체크 함수

function isCustomer(user: User): boolean {
    return user.role === 'customer';
}

 

(3) 음료 등록 기능 - 어드민만 가능

function addBeverage(user: User, name: string, price: number): void {
    if (!isAdmin(user)) {
        console.log('권한이 없습니다.');
        return;
    }

    const newBeverage: Beverage = { name, price };
    beverages.push(newBeverage);
}

 

 

(4) 음료 삭제 기능 - 어드민만 가능

function removeBeverage(user: User, beverageName: string): void {
    if (!isAdmin(user)) {
        console.log('권한이 없습니다.');
        return;
    }

    beverages = beverages.filter((beverage) => beverage.name !== beverageName);
}
 

 

(5) 음료 조회 기능 - 어드민 & 고객

function getBeverages(user: User): Beverage[] {
    if (!user) {
        return [];
    }
    return beverages;
}
 
(6) 음료 찾기  - 판매하지 않는 음료 구매 방지
 
function findBeverage(beverageName: string): Beverage | undefined {
    return beverages.find((beverage) => beverage.name === beverageName);
}

 

 

(7) 음료 주문 기능 - 고객

function placeOrder(user: User, beverageName: string): number {
    if (!isCustomer(user)) {
        console.log('권한이 없습니다.');
        return -1;
    }

    const beverage = findBeverage(beverageName);
    if (!beverage) {
        console.log('해당 음료를 찾을 수 없습니다.');
        return -1;
    }

    const newOrder: Order = {
        orderId: orders.length + 1,
        customerId: user.id,
        customerName: user.name,
        beverageName,
        status: 'placed',
    };
    orders.push(newOrder);
    return newOrder.orderId;
}

 

(8) 음료 준비 완료 기능 - 어드민

function completeOrder(user: User, orderId: number): void {
    if (!isAdmin(user)) {
        console.log('권한이 없습니다.');
        return;
    }

    const order = orders.find((order) => order.orderId === orderId);
    if (order) {
        order.status = 'completed'; // 단순히 주문의 상태만 바꾸고 끝!
        console.log(`[고객 메시지] ${order.customerName}님~ 주문하신 ${order.beverageName} 1잔 나왔습니다~`);
    }
}
 
 
(9) 음료 수령 기능 - 고객
function pickUpOrder(user: User, orderId: number): void {
    if (!isCustomer(user)) {
        console.log('권한이 없습니다.');
        return;
    }

    const order = orders.find((order) => order.orderId === orderId && order.customerId === user.id);
    if (order && order.status === 'completed') {
        order.status = 'picked-up';
        console.log(`[어드민 메시지] 고객 ID[${order.customerId}]님이 주문 ID[${orderId}]을 수령했습니다.`);
    }
}

 

4. 테스트 코드

function main() {
    const admin: User = {
        id: 1,
        name: '바리스타',
        role: 'admin',
    };

    // 유저 생성
    const member1: User = {
        id: 2,
        name: '르탄이',
        role: 'customer',
    };

    const member2: User = {
        id: 3,
        name: '꿈꾸는개발자',
        role: 'customer',
    };

    // 음료 등록
    addBeverage(admin, '아메리카노', 4000);
    addBeverage(admin, '카페라떼', 4500);
    addBeverage(admin, '에스프레소', 3000);

    // 음료 삭제
    removeBeverage(admin, '에스프레소');

    console.log(
        `안녕하세요~ ${member1.name} 고객님! 별다방에 오신 것을 환영합니다. 저희는 ${JSON.stringify(
            getBeverages(member1)
        )}를 판매하고 있습니다.`
    );
    // 음료 주문
    const orderId1 = placeOrder(member1, '아메리카노');
   
if (orderId1 > 0) {
        setTimeout(() => {
            // 음료 제작 완료
            completeOrder(admin, orderId1);
            // 음료 수령
            pickUpOrder(member1, orderId1);
        }, 1000);
    }

    console.log(
        `안녕하세요~ ${member2.name} 고객님! 별다방에 오신 것을 환영합니다. 저희는 ${JSON.stringify(
            getBeverages(member2)
        )}를 판매하고 있습니다.`
    );
 
 
    // 음료 주문
    const orderId2 = placeOrder(member2, '카페라떼');
    if (orderId2 > 0) {
        setTimeout(() => {
            // 음료 제작 완료
            completeOrder(admin, orderId2);
            // 음료 수령
            pickUpOrder(member2, orderId2);
        }, 3000);
    }
}

main();

 

 vscode 터미널(cmd) 

1) npm run build

2) npm run start

 

 

끝.

반응형