Step3 요구사항을 읽으며 느낀 점은 이제 단순한 상품 출력이 아니라, 상품을 어떤 기준으로 묶고 관리할 것인가에 대한 설계가 중요해졌다는 것이다.
Step2까지는 CommerceSystem이 직접 Product 리스트를 관리했지만, 카테고리 개념이 등장하면서 이 구조를 그대로 유지하는 것은 적절하지 않다고 판단했다.
Step3에서는
Category 클래스
CommerceSystem 클래스
Product 클래스
Customer 클래스
category는 카테고리 이름과 해당 카테고리에 속한 상품 목록을 함께 관리하는 클래스이다.
CommerceSystem은 더 이상 Product를 직접 관리하지 않고, Category를 통해서만 상품에 접근하도록 구조를 변경했다.
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은 이제 List<product> 대신 List<Category>를 관리한다.
프로그램 실행 시
1. 메인 메뉴에서 카테고리를 선택하고
2. 선택한 카테고리에서 상품을 선택하는
구조로 구현했다.
private final List<Category> categories;
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 클래스는 고객명, 이메일, 등급, 누적 주문 금액 필드를 가지도록 구현했다.
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; }
}
Step3 Main 클래스는 카테고리별 상품 데이터를 생성하고, 이를 카테고리 객체로 묶어 CommerceSystem에 전달하는 역할만 담당한다.
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();
}
}


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