[TIL #21] 키오스크 과제 설계 및 중간 리팩토링

2024. 11. 21. 22:45·개발/내일배움캠프 TIL

새로운 키오스크 과제가 주어져 바로 설계에 들어갔다.

확실히 스프링을 공부하면 지속적으로 회원관리나 상품 리스트를 보여주는 것과 같은 걸 Controller, Service, Repository 개념으로 나누어 몇번씩이나 설계하고 다이어그램을 아침부터 저녁까지 질리도록 봐서 그런지 처음에는 조금 고민했지만 막상 시작하니 생각보다 쉽게 느껴졌다. 무엇보다 스프링 강의중에 스프링을 왜 써야하는 지 몸소 느끼기 위해 순수 자바로만 회원/주문 관리 시스템을 구현해보고 그걸 스프링으로 리펙토링 해보는 경험해봤는데 이게 이번 과제에서 아주 크게 도움이 됐다.

 

먼저 시스템 설계를 위해 다이어그램을 피그마로 그려보았다.

 

초기 설계는 이렇게 했는데 개발하다보니 몇몇 부분 수정이 되긴 했지만 90%는 설계대로 구현을 완료하였다.

 

https://github.com/DeaHyun0911/Kiosk

 

GitHub - DeaHyun0911/Kiosk

Contribute to DeaHyun0911/Kiosk development by creating an account on GitHub.

github.com

 

그럼 이제 설계하면서 어려웠던(?) 이라기보단 고민되었던 부분이랑 초기 설계와 변경된 부분에 대해서 회고해보도록 하겠다.

 

메뉴 저장소(데이터베이스) 설계

과제의 최종 완성본 예시를 보면 데이터구조는 당연하게도 아래처럼 그려졌다.

ID Category name price description
1 Burgers ShackBurger 6.9 토마토, 양상추, 쉑소소 어쩌고 저쩌고...
2 Burgers SmokeShack 8.9 베이컨, 체리 페퍼 어쩌고 ㅈ...
3 Burgers Cheeseburger 6.9 포테이토 어쩌고...
4 Drinks 콜라 1.0 캬~
5 Drinks 사이다 1.0 키야~

 

근데 예시를 보면 콘솔 기반의 과제라 사용자한테 받는 정보는 단순한 숫자밖에 없었다. 위 그림에서 예를 들면 ShackBurger를 선택한다면 입력받는게 1, 1 뿐인 것이다. 이러한 상황에서 구현하기 위해 생각난 몇가지가 있었다.

 

1.  카테고리별 데이터베이스 나누기

카테고리별로 데이터를 나누면 ID값도 카테고리별로 1부터 차례대로 시작하여 구현하기는 쉬운데 일단 위에 구조처럼 딱 카테고리 필드로 나눠져서 메뉴 데이터베이스 하나로 모여있는게 보기 좋고 만약 나중에 카테고리가 추가된다면? 그럼 또 데이터베이스를 만들고 그래야 하는데 확장성에도 안 좋은 것 같아 패스했다.

 

2. 데이터베이스에 서브ID 추가하기

데이터베이스에 카테고리별로 서브ID값을 줘서 해당 값으로 필터링한다. 개발 당시에는 이 방법이 제일 베스트같아서 그렇게 진행하였다.

그렇게 만든 메뉴아이템 Entity로 사용자가 숫자를 입력하면 그대로 Repository의 메서드로 전달해 값을 반환하도록 구현했다.

// 카테고리, 카테고리별 id값으로 선택한 메뉴 필터링
public MenuItem findByMenu(Category category, int selectId) {
        return menu.stream()
                .filter(item -> item.getCategory() == category && item.getSelectId() == selectId)
                .findFirst().orElseThrow();
    }

 

3. 구현 객체에서 카테고리별 리스트를 생성한 뒤 인덱스값으로 필터링

이건 TIL을 작성하다보니 생각이 나서 적는다. 어차피 카테고리별 메뉴를 출력하는 기능을 위해 구현 객체에서 필터링된 새로운 List를 만들건데 그럼 그냥 입력받은 값과 카테고리별 List 의 인덱스값이 일치하는 데이터를 반환하면 되는거 아닌가? 생각해보니 이 방법이 더 깔끔한 것 같아 추후 리펙토링해봐야겠다.

 

그래서 이렇게 데이터베이스 구조를 설계하고 카테고리를 Enum 타입 상수로 정의해 사용할 수 있게 개발했다.

public enum Category {
    BURGERS,
    DRINKS,
    SIDES
}

 

다음 단계, 이전 단계 구현

처음에는 이전에 계산기를 구현한 것처럼 STEP 클래스를 만들고 단계에 따라 원하는 STEP으로 이동하는 방식으로 구현을 생각했다.

그런데 이번 과제는 메뉴 선택 과정에 2단계밖에 없어 if문으로 간단하게 가능해서 그렇게 코드를 구현했다.

        // 메뉴 반복 시작
        while(kiosk.getOnOff()) {

            // 카테고리 선택 시작
            kiosk.categoryMenu();

            // 카테고리 번호 선택
            int categoryNumber = scanner.nextInt();
            if (categoryNumber == 0) {
                // 0 선택 시 종료
                kiosk.exit();
                break;
            } else {
                // 선택한 메뉴 출력
                kiosk.itemMenu(categoryNumber);
            }
            // 세부 메뉴 선택
            int menuNumber = scanner.nextInt();
            if (menuNumber== 0) {
                // 0 선택 시 이전으로 돌아가기
                continue;
            } else {
                // 선택한 메뉴 출력
                kiosk.selectMenu(categoryNumber, menuNumber);
            }
        }

 

카테고리를 선택하고 세부 메뉴로 넘어갔을 때 0을 입력해 이전으로 돌아가기를 선택한다면 continue 에 걸려 처음부터 실행된다.

일단 이렇게 완성은 했는데 만약에 단계가 추가된다면? 예를 들어 처음에 매장/포장 단계가 추가되거나 주문기능이 추가되어 클라이언트가 메뉴를 담았다가 취소했다가 하는 등 주문단계를 앞뒤로 한단계씩 이동해야하는 상황이라 가정하면 이 코드는 항상 처음으로 돌아가기 때문에 확장성이 좋지 않은 것 같다. 이것도 지속적으로 개선할 수 있도록 시도하기로!

 

저번 계산기 과제는 그냥 의식의 흐름대로 막 만들어서 그런지 코드들이 다 실타레마냥 엉켜있어서 뭐 하나 건들기가 무서웠는데 이번에는 초반부터 머릿속에 어떻게 구현할 것인지 구체적으로 나름 꼼꼼히 설계를 해서 진행했고 과제자체도 데이터만 잘 입출력하면 되는 구조라 비교적 쉽게 개발하였다. ( 아직 예외처리가 안 되어서 이 부분만 개발하면 필수 요구사항은 다 충족될 것이다. )

 

이제 나머지는 실제 키오스크를 생각해보고 필요한 기능들을 정리해보았다.

  • 주문 기능
    • 주문 데이터를 저장
    • 매장/포장 선택 가능
    • 메뉴 다중 선택
    • 주문 데이터를 출력

더 복잡하게 만들어본다면 이런 것도 가능할 것 같다.

  • 대기순번 / 예상대기시간 기능
    • 주문 데이터에서 진행상태 필드를 추가해 대기순번 파악
    • 메뉴별로 조리시간이 있어 사용자가 담은 메뉴들의 조리시간을 합해 예상대기시간 구현
    • 주문한 시간으로부터 예상대기시간이 지나면 자동으로 진행상태 완료로 변경

지금 수준으로는 구현하기에 많이 복잡해보이는데 그래도 아예 불가능해보이지는 않고 어떻게 해야될지 어느정도 감은 오는 것 같다.

시간 되는대로 하나씩 도전해보도록 하자😎

'개발 > 내일배움캠프 TIL' 카테고리의 다른 글

[TIL #23] 싱글톤 패턴에 대하여  (0) 2024.11.23
[TIL #22] 키오스크 DIP, OCP 원칙 지키기  (0) 2024.11.22
[TIL #20] 의존관계 주입 DI 와 제어의 역전 IoC  (0) 2024.11.21
[TIL #19] 좋은 객체 지향 설계의 5가지 원칙 (SOLID)  (0) 2024.11.19
[TIL #18] Spring Boot 어노테이션 정리, Lombok 사용법  (0) 2024.11.18
'개발/내일배움캠프 TIL' 카테고리의 다른 글
  • [TIL #23] 싱글톤 패턴에 대하여
  • [TIL #22] 키오스크 DIP, OCP 원칙 지키기
  • [TIL #20] 의존관계 주입 DI 와 제어의 역전 IoC
  • [TIL #19] 좋은 객체 지향 설계의 5가지 원칙 (SOLID)
BigChoi93
BigChoi93
이곳은 저의 성장과정과 개인적인 생각을 담기 위한 공간입니다.
  • BigChoi93
    Donologue
    BigChoi93
  • 전체
    오늘
    어제
    • 분류 전체보기 (61)
      • 개발 (53)
        • Javascript (2)
        • 내일배움캠프 TIL (41)
        • 개발일기 (4)
        • Java (2)
        • Spring (1)
        • Sql (1)
      • 일상 (0)
      • 사진 (1)
        • 포토샵 (1)
  • hELLO· Designed By정상우.v4.10.1
BigChoi93
[TIL #21] 키오스크 과제 설계 및 중간 리팩토링
상단으로

티스토리툴바