TypeScript

실습 : 별다방 프로젝트

자두두두 2023. 7. 30. 14:56

별다방프로젝트는 스타벅스 어플이다.

여기서 필요한 기능은

  • 음료 등록 : 어드민
  • 음료 삭제 : 어드민 
  • 음료 준비 완료 : 어드민 
  • 음료 조회 : 어드민, 고객
  • 음료 주문 : 고객
  • 음료 수령 : 고객

1. 프로젝트 세팅 

익숙해질 때까지는 프로젝트 세팅도 계속 써봐야 한다.

 

node.js 프로젝트 생성

 

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

script 항목 변경하기

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

src 디렉토리 생성 - index.ts

 

2. 인터페이스 & 데이터 정의

- 유저 인터페이스 정의 * 유저는 어드민 혹은 고객 이어야 함 !

interface User {
	id:number;
    name:string;
    role
}

- 음료 인터페이스 정의 : 이름, 가격이라는 속성을 가지고 있다.

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

- 주문 인터페이스 정의 : 주문id, 주문한 고객의id, 주문한 고객 이름, 음료 이름, 상태(주문, 제작완료, 수취 완료)

interface Order {
		orderId:number;
        customerId:number;
        customerNmae:string;
        beverageNmae: string;
        status: "placed" | "completed" | "picked-up"
}

- 데이터 정의 

* 어드민이 만든 음료의 목록을 관리할 수 있어야 함

* 고객이 주문한 내용에 대해서도 관리할 수 있어야 함

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

기능들을 실제로 수행하는 함수 구현하기 

1. 유저가 어드민인지 체크하는 함수, 고객인지 체크하는 함수

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

음료 목록에 음료를 새롭게 등록하는 addBeverage라는 함수 만들기 

function addBeverage(user: User, name:string, price: number ) : void {
	if(!isAdmin(user)) {
    	console.log("권한이 없습니다.");
        return;
    }
    
    const newBeverage: Beverage = { name,price }
    beverages.push(newBeverage)
}

음료를 삭제하는 removeBeverage함수

function removeBeverage(user: User, beverageName:string): void {
	if(!isAdmin(user)){
    	console.log("권한이 없습니다.");
        return;
    }
    
    beverages=beverages.filter((beverage) => beverage.name !== beverageName)
}

어드민 혹은 고객이면 음료 목록을 볼 수 있는 음료 조회 함수

function getBeverage(user:User): Beverage[]{
	if(!user){
    	return [];
    }
    return beverages
}

음료 찾기 함수

function findBeverage(beverageName: string)/; Beverage | undefinded {
	return beverages.find((beverage) => beverage.name === beverageName);
}

음료 주문 기능 : 고객만 호출할 수 있어야 함. 엉뚱한 커피 주문은 막기 , 주무ID를 리턴해야 한다.

function placeOrder(user: User, beverageNmae: 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;
}

고객이 주문한 음료가 준비가 완료되었다는 동작을 담당하는 completeOrder라는 함수

이 함수는 어드민만 부를 수 있음

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잔 나왔습니다~`
        )
    }
}

음료 수령 기능

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}]을 수령했습니다.`
    );
  }
}

main함수 생성

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();