음식 메뉴를 본격적으로 관리해보자

2025. 7. 22. 16:30·백엔드 부트캠프/Kiosk

필수 기능 구현 마지막 요구사항이다.

 

MenuItem 을 관리하는 Menu 클래스를 생성하라는 문제이다.

 

0을 입력했을 때 하위 카테고리는 "뒤로가기" 상위 카테고리에선 "종료" 로 구분하는 부분이 추가되었다.

 

현재 콘솔 기반 프로그램이고 DB가 존재하지 않아 관리-프로그램까진 고려하지 않았고 그냥 메뉴 데이터를 하드코딩으로 박아 넣는 느낌이다.

 

그래도 Lv3 에서 for 문을 통해 메뉴 리스트를 출력하는걸 좀 더 보완해보고자 한다.

 

Lv 4. 객체 지향 설계를 적용해 음식 메뉴와 주문 내역을 클래스 기반으로 관리하기

  • [ ] Menu 클래스 생성하기
    • [ ] 설명 : MenuItem 클래스를 관리하는 클래스입니다. 예를 들어, 버거 메뉴, 음료 메뉴 등 각 카테고리 내에 여러 MenuItem을 포함합니다.
    • [ ] List<MenuItem> 은 Kiosk 클래스가 관리하기에 적절하지 않으므로 Menu 클래스가 관리하도록 변경합니다.
    • [ ] 여러 버거들을 포함하는 상위 개념 ‘버거’ 같은 카테고리 이름 필드를 갖습니다.
    • [ ] 메뉴 카테고리 이름을 반환하는 메서드가 구현되어야 합니다.
[ MAIN MENU ]
1. Burgers
2. Drinks
3. Desserts
0. 종료      | 종료
1 <- // 1을 입력

[ BURGERS MENU ]
1. ShackBurger   | W 6.9 | 토마토, 양상추, 쉑소스가 토핑된 치즈버거
2. SmokeShack    | W 8.9 | 베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거
3. Cheeseburger  | W 6.9 | 포테이토 번과 비프패티, 치즈가 토핑된 치즈버거
4. Hamburger     | W 5.4 | 비프패티를 기반으로 야채가 들어간 기본버거
0. 뒤로가기
2 <- // 2를 입력
선택한 메뉴: SmokeShack | W 8.9 | 베이컨, 체리 페퍼에 쉑소스가 토핑된 치즈버거

[ MAIN MENU ]
1. Burgers
2. Drinks
3. Desserts
0. 종료      | 종료
0 <- // 0을 입력
프로그램을 종료합니다.

Lv 5. 캡슐화 적용하기

  • [ ] MenuItem, Menu 그리고 Kiosk 클래스의 필드에 직접 접근하지 못하도록 설정합니다.
  • [ ] Getter와 Setter 메서드를 사용해 데이터를 관리합니다.
com.example.lv4
├── domain                 // 핵심 비즈니스 도메인 객체
       ├── Menu.java
       └──  MenuItem.java
├──  enums             // Enum 타입들
       ├── Category.java
       └── KioskStatus.java
├── input                  // 입력 관련 인터페이스 및 구현체
       ├── InputProvider.java
       └── ConsoleInputProvider.java
├── output                 // 출력 관련 인터페이스 및 구현체
       ├── OutputWriter.java
       └── ConsoleOutputWriter.java
├── repository             // 데이터 저장소 관련
       ├── MenuRepository.java     // 인터페이스

       └── MemoryMenuRepository.java  // 메모리 구현체
├── service                // 비즈니스 로직 처리 서비스 계층
       └── MenuService.java
├── utils                  // 유틸리티 클래스 (파싱, 공통 함수 등)
       └── Parser.java
├── Kiosk.java
└── Main.java

 

뭐가 많이 생기긴 했지만 데이터 저장 과정을 위해 repository와 service를 추가했다.

 

또 다른 이유로는 요구 사항에선 Menu 에서 List<MenuItem> 을 관리하도록 제안했지만 Menu 라는 도메인 자체가 Kiosk 에 주입되어 콘솔 로직과 같이 동작하는게 맘에 안들어서 추가했다.

 

MemoryMenuRepository.java

package com.example.lv4.repository;

public class MemoryMenuRepository implements MenuRepository {

    private static final Map<Long, Menu> store = new HashMap<>();

    @Override
    public void save(Menu menu) {
        store.put(menu.getId(), menu);
    }

    @Override
    public List<Menu> findAll() {
        return store.entrySet().stream()
                .sorted(Map.Entry.comparingByKey())
                .map(Map.Entry::getValue)
                .toList();
    }

    @Override
    public List<MenuItem> findByCategory(Category category) {
        Map<Category, List<MenuItem>> sortedMenuItemByCategory = store.values().stream()
                .flatMap(menu -> menu.getMenuItems().stream())
                .sorted(Comparator.comparing(MenuItem::getId))
                .collect(Collectors.groupingBy(
                        MenuItem::getCategory,
                        LinkedHashMap::new,
                        Collectors.toList()
                ));
        return sortedMenuItemByCategory.getOrDefault(category, Collections.emptyList());
    }

    @Override
    public Menu findById(Long id) {
        return store.get(id);
    }
}

 

MenuService.java

package com.example.lv4.service;

public class MenuService {

    private final MenuRepository menuRepository;

    public MenuService(MenuRepository menuRepository) {
        this.menuRepository = menuRepository;
    }

    public void save(Menu menu) {
        menuRepository.save(menu);
    }

    public Menu findById(Long id) {
        return menuRepository.findById(id);
    }

    public List<Menu> findAllMenu() {
        return menuRepository.findAll();
    }

    public List<MenuItem> findAllMenuItemByCategory(Category category) {
        return menuRepository.findByCategory(category);
    }

}

 

 

덩치가 커지긴 했지만 적절하게 "단일 책임 원칙" 에 입각하여 구조가 구성된거 같다.

 

또한 각각의 역할을 명확하게 구분했기 때문에 추후 변경 사항에도 유연하게 대처가 가능할 거 같다.

 

 

 

 

'백엔드 부트캠프/Kiosk' 카테고리의 다른 글
  • 도전 과제 - 장바구니 및 구매하기 기능 추가!!
  • Lv3. Kiosk 를 분리해보자
  • Lv2 객체 지향 설계를 해보자
  • 키오스크 개발 시작!! 요구 사항대로 차근차근...
s_y_130
s_y_130
  • s_y_130
    About SY
    s_y_130
  • 전체
    오늘
    어제
    • 분류 전체보기 (440)
      • JAVA (54)
        • 더 자바 8 (0)
        • JAVA (41)
        • JAVA (JVM) (13)
      • Computer Science (86)
        • CS Basic (7)
        • OOP (11)
        • Design Pattern (16)
        • Network (8)
        • HTTP (6)
        • WEB (22)
        • OS (16)
      • DataBase (29)
        • DB theory (15)
        • MySQL (14)
        • Redis (0)
      • Collection Framework (1)
        • 구현 (1)
      • Data Structure (14)
        • Linear (9)
        • Non-Linear (5)
      • Algorithm (19)
        • Basic (12)
        • 응용 (2)
        • 완전 탐색(Brute Force) (1)
        • 다익스트라 (1)
        • Algorithm Problem (3)
      • Spring (104)
        • 스프링 핵심 원리 - 기본편 (9)
        • 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 (7)
        • 스프링 MVC 2편 - 백엔드 웹 개발 핵심 기술 (11)
        • 스프링 DB 1편 - 데이터 접근 핵심 원리 (6)
        • 스프링 DB 2편 - 데이터 접근 활용 기술 (10)
        • 스프링 핵심 원리 - 고급편 (13)
        • 스프링 부트 - 핵심 원리와 활용 (9)
        • Spring Security 6.x (2)
        • Spring Batch (2)
        • Spring Cloud로 개발하는 MSA (1)
        • 재고시스템으로 알아보는 동시성이슈 해결방법 (4)
        • 개념 (27)
        • 테스트 (0)
        • Annotation (1)
        • Error Log (2)
      • TEST (0)
        • 부하 테스트 (0)
        • Practical Testing: 실용적인 테스트.. (0)
      • JPA (40)
        • 자바 ORM 표준 JPA 프로그래밍 (12)
        • 1편- 실전! 스프링 부트와 JPA 활용 (7)
        • 2편- 실전! 스프링 부트와 JPA 활용 (4)
        • 실전! 스프링 데이터 JPA (6)
        • 실전! Querydsl (6)
        • 개념 (5)
      • 백엔드 부트캠프[사전캠프] (35)
        • TIL (12)
        • 문제풀이 (23)
      • 백엔드 부트캠프 (9)
        • Calculator (3)
        • Kiosk (5)
        • Schedule (1)
        • Schedule-develop (0)
      • Open Source (0)
      • Book Study (1)
        • Morden Java in Action (1)
        • Real MySQL 8.0 Vol.1 (0)
        • TDD : By Example (0)
      • AWS (0)
        • EC2 (0)
      • git (2)
      • AI (22)
        • Machine Learning (17)
        • Deep Learning (0)
        • TensorFlow (1)
        • PyTorch (1)
        • YOLO (1)
        • Data Analysis (0)
        • Ai code Error (1)
        • Numpy (1)
      • MY (0)
      • WEB (15)
        • Django (3)
        • WEB 개념 (1)
        • React (1)
        • Maven (10)
      • Python (6)
      • 기초수학 (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
s_y_130
음식 메뉴를 본격적으로 관리해보자
상단으로

티스토리툴바