- 프로젝트 개요
- 프로젝트 요구 명세서
- 개발 인원
- 개발 기간
- 개발 언어
- 개발 환경
- 개발 시 주요 고민
- 고민에 대한 해결
- 요구사항 이외의 추가 기능 추가 사항
- 느낀 점
- GitHub URL
1. 프로젝트 개요
- 스파르타 코딩클럽 내일 배움 캠프 Spring_3기 자바 개인 과제
- Kiosk 서비스를 구상하여 주문, 취소, 명세서등을 출력할 수 있다.
- CLI로 Service 구현
2. 프로젝트 요구 명세서
- 1. 메뉴판을 보고 주문할 수 있는 Java 프로그램
- 2. 화면은 System.out.println() 메서드를 사용해서 심플하게 출력한다.
- 3. 메뉴 클래스와 주문 클래스를 사용하여 Java의 핵심 기능인 상속을 최대한 사용
- 4. 내가 좋아하는 메뉴들로 다양하게 구성해 보세요.
Java 클래스 설계 시 필수 요구사항!
- 메뉴 클래스는 이름, 설명 필드를 가지는 클래스로 만들어주세요.
- 상품 클래스는 이름, 가격, 설명 필드를 가지는 클래스로 만들어주세요.
- 상품 클래스의 이름, 설명 필드는 메뉴 클래스를 상속받아 사용하는 구조로 개발해 주세요.
- 주문 클래스도 만들어서 상품 객체를 담을 수 있도록 해주세요.
- 메인 메뉴판 화면
- 메인 메뉴판이 출력되며 메뉴판에는 상품 메뉴가 출력됩니다.
- 상품 메뉴는 간단한 설명과 함께 출력 되며 최소 3개 이상 출력 됩니다.
- 상품 메뉴 아래에는 Order(주문)와 Cancel(주문 취소) 옵션을 출력해줍니다.
"SHAKESHACK BURGER 에 오신걸 환영합니다."
아래 메뉴판을 보시고 메뉴를 골라 입력해주세요.
[ SHAKESHACK MENU ]
1. Burgers | 앵거스 비프 통살을 다져만든 버거
2. Forzen Custard | 매장에서 신선하게 만드는 아이스크림
3. Drinks | 매장에서 직접 만드는 음료
4. Beer | 뉴욕 브루클린 브루어리에서 양조한 맥주
[ ORDER MENU ]
5. Order | 장바구니를 확인 후 주문합니다.
6. Cancel | 진행중인 주문을 취소합니다.
2. 상품 메뉴판 화면
- 상품 메뉴 선택 시 해당 카테고리의 메뉴판이 출력됩니다.
- 메뉴판에는 각 메뉴의 이름과 가격과 간단한 설명이 표시됩니다.
"SHAKESHACK BURGER 에 오신걸 환영합니다."
아래 상품메뉴판을 보시고 상품을 골라 입력해주세요.
[ Burgers MENU ]
1. ShackBurger | W 6.9 | 토마토, 양상추, 쉑소스가 토핑된 치즈버거
2. SmokeShack | W 8.9 | 베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거
3. Shroom Burger | W 9.4 | 몬스터 치즈와 체다 치즈로 속을 채운 베지테리안 버거
3. Cheeseburger | W 6.9 | 포테이토 번과 비프패티, 치즈가 토핑된 치즈버거
4. Hamburger | W 5.4 | 비프패티를 기반으로 야채가 들어간 기본버거
3. 구매 화면
- 상품 선택 시 해당 상품을 장바구니에 추가할지 확인하는 문구가 출력 됩니다.
- 1. 확인 입력 시 장바구니에 추가되었다는 안내 문구와 함께 메인 메뉴로 다시 출력됩니다.
"Hamburger | W 5.4 | 비프패티를 기반으로 야채가 들어간 기본버거"
위 메뉴를 장바구니에 추가하시겠습니까?
1. 확인 2. 취소
Hamburger 가 장바구니에 추가되었습니다.
"SHAKESHACK BURGER 에 오신걸 환영합니다."
아래 메뉴판을 보시고 메뉴를 골라 입력해주세요.
[ SHAKESHACK MENU ]
1. Burgers | 앵거스 비프 통살을 다져만든 버거
2. Forzen Custard | 매장에서 신선하게 만드는 아이스크림
3. Drinks | 매장에서 직접 만드는 음료
4. Beer | 뉴욕 브루클린 브루어리에서 양조한 맥주
[ ORDER MENU ]
5. Order | 장바구니를 확인 후 주문합니다.
6. Cancel | 진행중인 주문을 취소합니다.
4. 주문 화면
- 5.Order 입력 시 장바구니 목록을 출력해 줍니다.
- 장바구니에서는 추가된 메뉴들과 총가격의 합을 출력해 줍니다.
- 1. 주문 입력 시 주문완료 화면으로 넘어가고, 2.메뉴판 입력 시 다시 메인 메뉴로 돌아옵니다.
아래와 같이 주문 하시겠습니까?
[ Orders ]
ShackBurger | W 6.9 | 토마토, 양상추, 쉑소스가 토핑된 치즈버거
SmokeShack | W 8.9 | 베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거
[ Total ]
W 15.8
1. 주문 2. 메뉴판
5. 주문완료 화면
- 1.주문 입력 시 대기번호를 발급해 줍니다.
- 장바구니는 초기화되고 3초 후에 메인 메뉴판으로 돌아갑니다.
주문이 완료되었습니다!
대기번호는 [ 1 ] 번 입니다.
(3초후 메뉴판으로 돌아갑니다.)
"SHAKESHACK BURGER 에 오신걸 환영합니다."
아래 메뉴판을 보시고 메뉴를 골라 입력해주세요.
[ SHAKESHACK MENU ]
1. Burgers | 앵거스 비프 통살을 다져만든 버거
2. Forzen Custard | 매장에서 신선하게 만드는 아이스크림
3. Drinks | 매장에서 직접 만드는 음료
4. Beer | 뉴욕 브루클린 브루어리에서 양조한 맥주
[ ORDER MENU ]
5. Order | 장바구니를 확인 후 주문합니다.
6. Cancel | 진행중인 주문을 취소합니다.
6. 주문 취소 화면
- 메뉴판에서 6.Cancel 입력 시 주문을 취소할지 확인을 요청하는 문구가 출력됩니다.
- 1. 확인을 입력하면 장바구니는 초기화되고 취소 완료 문구와 함께 메뉴판이 출력됩니다.
진행하던 주문을 취소하시겠습니까?
1. 확인 2. 취소
진행하던 주문이 취소되었습니다.
"SHAKESHACK BURGER 에 오신걸 환영합니다."
아래 메뉴판을 보시고 메뉴를 골라 입력해주세요.
[ SHAKESHACK MENU ]
1. Burgers | 앵거스 비프 통살을 다져만든 버거
2. Forzen Custard | 매장에서 신선하게 만드는 아이스크림
3. Drinks | 매장에서 직접 만드는 음료
4. Beer | 뉴욕 브루클린 브루어리에서 양조한 맥주
[ ORDER MENU ]
5. Order | 장바구니를 확인 후 주문합니다.
6. Cancel | 진행중인 주문을 취소합니다.
선택 요구사항
- 주문 개수 기능 추가
- 장바구니에 똑같은 상품이 담기면 주문 화면에서 상품 개수가 출력되도록 합니다.
아래와 같이 주문 하시겠습니까?
[ Orders ]
ShackBurger | W 6.9 | 2개 | 토마토, 양상추, 쉑소스가 토핑된 치즈버거
SmokeShack | W 8.9 | 1개 | 베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거
[ Total ]
W 15.8
1. 주문 2. 메뉴판
2. 상품 옵션 기능 추가
- 상품에 옵션을 선택 후 장바구니에 추가할 수 있게 세분화합니다.
"Hamburger | W 5.4 | 비프패티를 기반으로 야채가 들어간 기본버거"
위 메뉴의 어떤 옵션으로 추가하시겠습니까?
1. Single(W 5.4) 2. Double(W 9.0)
"Hamburger(Double) | W 9.0 | 비프패티를 기반으로 야채가 들어간 기본버거"
위 메뉴를 장바구니에 추가하시겠습니까?
1. 확인 2. 취소
3. 총판매금액 조회 기능 추가
- 구매가 완료될 때마다 총 판매 금액을 누적해 줍니다.
- 숨겨진 기능으로 0번 입력 시 총판매금액을 출력합니다.
[ 총 판매금액 현황 ]
현재까지 총 판매된 금액은 [ W 102.4 ] 입니다.
1. 돌아가기
4. 총판매상품 목록 조회 기능 추가
- 구매가 완료될 때마다 판매 상품 목록을 저장해 줍니다.
- 숨겨진 기능으로 0번 입력 시 총판매 상품 목록을 출력합니다.
[ 총 판매상품 목록 현황 ]
현재까지 총 판매된 상품 목록은 아래와 같습니다.
- ShackBurger | W 6.9
- Float | W 2.9
- SmokeShack | W 8.9
- Shroom Burger | W 9.4
- Fountain Sodar | W 2.7
- Cheeseburger | W 6.9
- SmokeShack | W 8.9
- Shroom Burger | W 9.4
- Cheeseburger | W 6.9
1. 돌아가기
3. 개발인원
- 1명
4. 개발 기간
- 개발 시작 일자 : 2023년 10월 18일
- 개발 완료 일자 : 2023년 10월 23일
- 개발 리팩터링 일자 : 2023 10월 30일
- 코드 제출 후 컨펌을 받고 리팩터링
5. 개발 언어
- Java
- OpenJDK version 17.0.8.1
6. 개발 환경
- IntelliJ IDEA Ultimate
7. 개발 시 주요 고민
프로젝트를 진행하면서 제일 많은 부분을 차지한 고민은 주로 클래스 구조를 만드는 것이었다. 제시 조건에서 상품클래스를 메뉴클래스에 상속을 받으라고 돼 있었기 때문에 이 부분에 대해서 생각이 많았다. 그때 당시에는 정해진 조건 내에서 해결해야겠다는 마음으로 코드를 작성하다 보니 Menu클래스에서 Goods클래스로 데이터를 넘겨줘야 하는데 상속관계에 있다 보니 데이터를 못 넘겨주는 딜레마에 빠졌다.
또 다른 고민으로는 키오스크 데이터를 어떤 식으로 받아야 되는지에 대해서 고민을 많이 했다. Collection 클래스중 효율적으로 데이터를 입력하면서 동시에 사용하기 편리한 구조의 Collection을 설정해야 하는 부분에서 고민을 많이 했다.
8. 고민에 대한 해결
클래스 구조에 대해서 고민을 많이 한 결과 Menu와 Goods, Order주로 3가지의 클래스로 kiosk의 화면을 구성했으며, FoodData, SellOrders 클래스로 kiosk의 전반적인 데이터를 보관했다. Menu와 Goods는 서로 상속 관계이지만 코드 실행 초기 화면을 Menu 클래스가 담당하고 Menu 클래스에서 Goods클래스로 데이터를 넘겨줘야 할 때 상속 관계 때문에 안되기 때문에 시작 메서드를 Goods에서 실행하는 말도 안 되는 구성을 만들어버렸다. 이후 컨펌을 받고 리팩터링 할 때는 MenuContext 클래스를 새로 생성하여 MenuContext 클래스에서 시작하여 종료까지 MenuContext가 할 수 있게끔 구조를 변경하였다.
kiosk 데이터를 받을 때 어떤 부분에서 유지보수가 유리한가에 대해 생각했을 때 처음에는 HashMap을 생각하면서 작성했다. 하지만 HashMap은 순서가 보장이 안되기 때문에 나중에 데이터를 접근할 때 key값을 사용하기에 어려움이 많을 것 같아 순서가 있으면서 공간의 제한이 없는 ArrayList형태로 데이터를 변경하기로 했다. ArrayList 형태에 객체를 순서대로 생성하여 장바구니를 구성할 때 어려움이 없게끔 구성했다.
url : https://developer-backend.tistory.com/18
위의 블로그는 ArrayList객체에 객체를 넣는 방법을 해결하고 나서 적은 블로그이다.
초기에는 요구사항대로 리스트에 클래스 객체를 넣어 데이터를 저장했지만, 나중 가서는 추가 요구사항에서 선택한 메뉴의 Single, Double 구조를 만드는 과정에서 어떤 방식으로 접근할지 몰라 고생을 많이 했다. 이를 해결하기 위해 FoodDate 클래스에서 생성자의 파라미터에 따라 생성자를 분류하는 다형성을 적용하여 해결함과 동시에 배열을 사용하여 Single, Double문제를 해결했다.
이후 리팩터링 기간에서 배열이 아닌 클래스에 대한 피드백을 받고 ChosePrice 클래스를 생성하여 기존에 있던 배열 말고 객체를 추가하여 다른 사람이 내 코드를 봤을 때에 대한 가독성을 높였다.
9. 요구사항 이외의 추가 기능 추가 사항
필수 요구사항과 추가요구사항을 기한 내에 빠르게 끝내서 추가적으로 이 프로젝트에 이런 기능이 있었으면 좋을 것 같은 기능을 추가했다.
추가한 기능은 취소 부분에서 전체 취소가 있다 보니 부분 취소에 대한 기능을 추가하고 싶었다. 처음 추가할 때는 몰랐으나 부분취소기능을 추가하는데 하루가 걸렸다.
초기 부분취소의 구상은 유저가 장바구니를 중복으로 담으면 중복개수에 대한 전체 취소가 아닌 부분으로 취소하여 남기고 싶었다. 따라서 유저의 취소목록의 객체순번 인덱스를 리스트에 담아 저장하고 유저가 중복으로 처리할 데이터는 HashMap을 사용하여 key 값으로 유저가 처리할 중복 물품의 이름 value값으로 몇 개를 취소할지 저장하여 처리했다.
이후 취소기능에서 리스트의 remove기능을 사용하여 해당 인덱스 물품의 요소를 제거하는 방식으로 부분 취소를 했으며 중복취소는 FoodData의 foodcount의 인스턴스 개수를 조정하여 구성했다.
추가적으로 remove기능을 사용하면서 for문으로 삭제정보를 담은 리스트를 순회하면서 순차적으로 삭제하다 보니 리스트의 장바구니의 사이즈가 작아져지면서 오류가 났다. 이를 해결하기 위해 count 필드를 추가하여 remove메서드가 한번 호출될 때마다 count를 더하여 삭제하려는 장바구니의 인덱스 위치를 조정하는 방식으로 해결했다.
10. 느낀 점
프로젝트를 진행하면서 구조에 대한 구상을 어떠한 방식으로 진행하는 게 제일 유지보수에 유리한 구조인지 객체라는 것을 통해 다시금 생각해 봤고, 클래스 간의 상속에 따른 제한조건 및 Collection의 선택 기능에 대한 제한사항의 고려등 여러 가지 부분에서 고려하고 해결하는데 힘썼던 프로젝트가 아닐까 싶다. 이번 프로젝트를 진행하면서 Java를 사용하는 게 너무 익숙해졌고, 특히 클래스 부분에서 정말 많은 성장을 이뤄내서 개인적으로는 너무 뿌듯한 프로젝트가 아닐까 싶다.
11. GitHub URL
url : https://github.com/jshstar/Java_Project_Kiosk
'프로젝트' 카테고리의 다른 글
Spring ToDo project (0) | 2023.11.21 |
---|---|
Spring Board project (0) | 2023.11.06 |
Java Team Project Hotel KPT회고 (0) | 2023.10.31 |
Java Team Project Hotel (0) | 2023.10.31 |
8toZ 미니프로젝트 KPT회고 (1) | 2023.10.12 |