개발스토리지😃

[Java] 키오스크 만들기 도전과제1 트러블 슈팅 본문

언어/자바

[Java] 키오스크 만들기 도전과제1 트러블 슈팅

believekim 2025. 3. 14. 13:34

 

 

스파르타내일배움캠프에서 키오스크 만들기 도전과제1의 개발 과정을 담았다.
이전 계산기를 만들때 요구사항을 주의깊게 듣지 않아 완성도를 떠나 동떨어진 결과가 나왔다.
그래서 이번 과정에서는 요구사항에 시간을 더 투자할 것이다.

 

 

 

시스템 환경
IDE : Intelli J
language : Java 17

 

 

 

https://github.com/pleasebelieveme/sparta_nbcamp/tree/main/java-course/src/assignment/kiosk/level5

 

sparta_nbcamp/java-course/src/assignment/kiosk/level4 at main · pleasebelieveme/sparta_nbcamp

Contribute to pleasebelieveme/sparta_nbcamp development by creating an account on GitHub.

github.com

 


 

 

1. 요구사항

1. 장바구니 생성 및 관리 기능 추가
2. 장바구니 출력 및 금액 계산
3. 장바구니 담기 기능
4. 주문 기능

 

  • 클래스 역할 정의
클래스 역할
Main Kiosk 시작
Kiosk 키오스크 프로그램의 메뉴를 관리하고 사용자 입력을 처리하는 클래스
Menu MenuItem 클래스를 관리하는 클래스
MenuItem 개별 음식 항목을 관리하는 클래스(이름, 가격, 설명)
Cart 장바구니 항목을 관리하는 클래스(MenuItem, 수량)

 



2. 기능소개

  • 장바구니 담기, 장바구니 출력 및 금액 계산, 장바구니에 담긴 항목 주문
1. 카테고리 선택(예시: 1번(burger))

2. 메뉴 선택 후 장바구니 추가 선택(예시 1번(ShackBurger)선택 후 1번(추가))

3.  장바구니 보기 선택(예시 4번(Orders))

4. 주문하기 선택(예시 1번(주문))

5. 주문 완료 확인

 


 

3. Cart클래스 생성

  • 장바구니기능을 위해 Map으로 사용자가 선택한 메뉴아이템과 수량을 관리
public class Cart {
	// Integer 수량
	private Map<MenuItem, Integer> cartList;

	public Cart() {};
	public Cart(Map<MenuItem, Integer> cartList) {
		this.cartList = cartList;
	}
	// getter
    // setter
}

 


 

4. 트러블 슈팅

- Cart클래스 필드 설정
- TO-BE:
- Cart클래스의 필드를 MenuItem과 같은 방향으로 설정하였다.
public class Cart {
  private String name; // 메뉴명
  private int quantity; // 수량
  private double price; // 가격
}​


- 그리고 Kiosk클래스에서 List<Cart>를 사용해 활용하려고 했다.


- AS-IS 1:
- 문제점은 Cart클래스가 아닌 CartItem과 동일해졌다.
- 튜터님께 물어본 결과 MenuItem객체를 가져와 Map의 키로 사용하고 밸류는 Integer으로 수량을 계산하도록 설정하였다.

private Map<MenuItem, Integer> cartList;



- AS-IS 2:

- 요구사항을 진행하다가 문제점이 생겼다.

- 아래처럼 키오스트에서 리스트로 Cart를 받았더니 계속 Cart를 생성하게 되었다.

class Kiosk() {
  private List<Cart> cart;
}


- 그래서 코드가 길어짐과 동시에 한곳에 Cart를 쓰게 만들다보니 리스트로 받을 이유가 사라졌다.
- 아래처럼 Cart객체만 생성하도록 설정하였다.

class Kiosk() {
  private Cart cart = new Cart(new HashMap<>());
}


- 메서드 분리
- 요구사항에 메서드가 없기에 코드가 길어지더라도 메서드를 분리해서 관리하지 않았다.
- 하지만 사용자에 입력을 받을때마다 동일한 코드가 지속되어 아래처럼 메서드를 분리하였다.
// 사용자의 입력값이 정수가 아니면 false를 반환하는 메서드
private static boolean checkInteger(Scanner sc) {
  if (!sc.hasNextInt()) {
	System.out.println("잘못된 입력입니다. 숫자를 입력해주세요.\n");
	sc.next();
	return false;
  }
  return true;
  }​

 

 


 

4. 추후 리팩토링

- 마지막에 시간에 쫓겨 메인메뉴에서 장바구니가 추가될 때 생성되는 4번(Orders), 5번(Cancle) 기능을 하드코딩하였다.
...
} else if (categoryChoice==4) {
  ...
} else if (categoryChoice == 5) {
  ...
} else if (categoryChoice == 0) {
  flag = false;
  System.out.println("프로그램을 종료합니다.");
}
- 카테고리 메뉴가 추가되면 번호가 바뀔 것이기 때문에 래픽토링이 필요하다.



- 이전 과제에서 처음부터 패키지 분리, 메서드 분리를 생각하다보니 시간을 많이 뺐겼다. 그리고 정리가 되지 않으니 메서드의 위치나 이름을 변경하면서 필요없는 시간이 많이 발생하였다.
- 일단 절차지향언어처럼 개발을 하였는데 도전과제를 진행하면서 코드가 길어지고 반복되는 메서드들이 명확히 보이기 시작했다.

클래스 역할
Main Kiosk 시작
Kiosk 키오스크 프로그램의 메뉴와 장바구니를 관리
Menu MenuItem 클래스를 관리하는 클래스
MenuItem 개별 음식 항목을 관리하는 클래스(이름, 가격, 설명)
Cart 장바구니 항목을 관리하는 클래스(MenuItem, 수량)
추가될 클래스  
Input 사용자 입력을 처리하는 클래스
Output 사용자의 출력을 처리하는 클래스
MenuService 메뉴의 기능을 모아놓은 클래스
CartService 장바구니의 기능을 모아놓은 클래스
- 메서드를 분리시키고 공통점을 모아 클래스로 분리시키면 객체지향언어에 맞게 다가갈 수 있을 것 같다.