[내일배움캠프 Spring_3기] CH2 커머스 과제 Step3

jiiim_ni·2026년 1월 22일

생각해보기

Step3 요구사항을 읽으며 느낀 점은 이제 단순한 상품 출력이 아니라, 상품을 어떤 기준으로 묶고 관리할 것인가에 대한 설계가 중요해졌다는 것이다.

Step2까지는 CommerceSystem이 직접 Product 리스트를 관리했지만, 카테고리 개념이 등장하면서 이 구조를 그대로 유지하는 것은 적절하지 않다고 판단했다.


설계

Step3에서는

Category 클래스

  • 하나의 카테고리(전자제품, 의류, 식품)를 표현
  • 해당 카테고리에 속한 Product 리스트 관리

CommerceSystem 클래스

  • 여러 카테고리를 관리
  • 카테고리 선택과 상품 선택 흐름 제어

Product 클래스

  • Step1부터 공통으로 사용되는 도메인 객체

Customer 클래스

  • 고객 정보를 표현하는 객체

Category 클래스

category는 카테고리 이름과 해당 카테고리에 속한 상품 목록을 함께 관리하는 클래스이다.
CommerceSystem은 더 이상 Product를 직접 관리하지 않고, Category를 통해서만 상품에 접근하도록 구조를 변경했다.

Category.java 전체 코드

public class Category {
    private final String name;
    private final List<Product> products;

    public Category(String name, List<Product> products) {
        this.name = name;
        this.products = products;
    }

    public String getName() {
        return name;
    }

    public List<Product> getProducts() {
        return products;
    }
}

CommerceSystem 클래스

CommerceSystem은 이제 List<product> 대신 List<Category>를 관리한다.

프로그램 실행 시
1. 메인 메뉴에서 카테고리를 선택하고
2. 선택한 카테고리에서 상품을 선택하는
구조로 구현했다.

private final List<Category> categories;

CommerceSystem.java 전체 코드

package kr.spartaclub.com.example.commerce.step3;

import kr.spartaclub.com.example.commerce.Product;

import java.util.List;
import java.util.Scanner;

public class CommerceSystem {

    private final List<Category> categories;
    private final Scanner sc = new Scanner(System.in);

    public CommerceSystem(List<Category> categories) {
        this.categories = categories;
    }

    public void start() {
        while (true) {
            printMainMenu();
            int input = sc.nextInt();

            if (input == 0) {
                System.out.println("커머스 플랫폼을 종료합니다.");
                break;
            }

            if (input >= 1 && input <= categories.size()) {
                Category selectedCategory = categories.get(input - 1);
                showCategoryMenu(selectedCategory);
            } else {
                System.out.println("잘못된 입력입니다. 다시 선택해주세요.\n");
            }
        }
    }

    private void printMainMenu() {
        System.out.println("[ 실시간 커머스 플랫폼 메인 ]");

        for (int i = 0; i < categories.size(); i++) {
            System.out.printf("%d. %s%n", i + 1, categories.get(i).getName());
        }

        System.out.println("0. 종료      | 프로그램 종료");
        System.out.print("> ");
    }

    private void showCategoryMenu(Category category) {
        while (true) {
            System.out.println();
            System.out.printf("[ %s 카테고리 ]%n", category.getName());

            List<Product> products = category.getProducts();
            for (int i = 0; i < products.size(); i++) {
                Product p = products.get(i);
                System.out.printf("%d. %-12s | %,d원 | %s%n",
                        i + 1, p.getName(), p.getPrice(), p.getDescription());
            }

            System.out.println("0. 뒤로가기");
            System.out.print("> ");
            int input = sc.nextInt();

            if (input == 0) {
                System.out.println();
                return; // 메인으로 복귀
            }

            if (input >= 1 && input <= products.size()) {
                Product selected = products.get(input - 1);
                System.out.printf("선택한 상품: %s | %,d원 | %s | 재고: %d개%n%n",
                        selected.getName(),
                        selected.getPrice(),
                        selected.getDescription(),
                        selected.getStock());
            } else {
                System.out.println("잘못된 입력입니다. 다시 선택해주세요.\n");
            }
        }
    }
}

Customer 클래스

Customer 클래스는 고객명, 이메일, 등급, 누적 주문 금액 필드를 가지도록 구현했다.

Customer.java 전체 코드

package kr.spartaclub.com.example.commerce.step3;

public class Customer {
    private final String name;
    private final String email;
    private String grade;           // Step3에서는 일단 String으로, 추후에 Enum으로 확장 가능
    private int totalOrderAmount;   // 누적 주문 금액

    public Customer(String name, String email) {
        this.name = name;
        this.email = email;
        this.grade = "BRONZE";
        this.totalOrderAmount = 0;
    }

    public String getName() { return name; }
    public String getEmail() { return email; }
    public String getGrade() { return grade; }
    public int getTotalOrderAmount() { return totalOrderAmount; }
}

Main 클래스

Step3 Main 클래스는 카테고리별 상품 데이터를 생성하고, 이를 카테고리 객체로 묶어 CommerceSystem에 전달하는 역할만 담당한다.

Main.java 전체 코드

package kr.spartaclub.com.example.commerce.step3;

import kr.spartaclub.com.example.commerce.Product;

import java.util.ArrayList;
import java.util.List;

public class Main {
    public static void main(String[] args) {

        // 전자제품
        List<Product> electronics = new ArrayList<>();
        electronics.add(new Product("Galaxy S24", 1200000, "최신 안드로이드 스마트폰", 50));
        electronics.add(new Product("iPhone 15", 1350000, "Apple의 최신 스마트폰", 30));
        electronics.add(new Product("MacBook Pro", 2400000, "M3 칩셋이 탑재된 노트북", 15));
        electronics.add(new Product("AirPods Pro", 350000, "노이즈 캔슬링 무선 이어폰", 50));

        // 의류
        List<Product> clothes = new ArrayList<>();
        clothes.add(new Product("후드티", 59000, "기본 후드티", 100));
        clothes.add(new Product("청바지", 79000, "슬림핏 청바지", 80));

        // 식품
        List<Product> foods = new ArrayList<>();
        foods.add(new Product("사과", 12000, "당도 높은 사과 1kg", 40));
        foods.add(new Product("라면", 4500, "매운맛 라면 5개입", 60));

        List<Category> categories = new ArrayList<>();
        categories.add(new Category("전자제품", electronics));
        categories.add(new Category("의류", clothes));
        categories.add(new Category("식품", foods));

        CommerceSystem system = new CommerceSystem(categories);
        system.start();
    }
}

결과

메인 화면에서 카테고리를 선택하고, 선택한 카테고리 내에서 상품을 조회할 수 있음을 확인했다.
카테고리 개념이 도입되면서 커머스 플랫폼 구조가 실제 서비스와 더 유사해졌다고 느꼈다.

0개의 댓글