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