์ด์ง€๋ฏผ์˜ ๊ฐœ๋ฐœ ๋…ธํŠธ

๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์„ ๊ณต๋ถ€ํ•˜๋ฉฐ Java์™€ Spring์„ ์ค‘์‹ฌ์œผ๋กœ ํ•™์Šต ๊ธฐ๋ก์„ ์ •๋ฆฌํ•˜๋Š” ๊ณต๊ฐ„์ž…๋‹ˆ๋‹ค.

๐Ÿ”ฅ ๋‚ด์ผ๋ฐฐ์›€์บ ํ”„/๐Ÿ“Œ ๊ณผ์ œ

[๋‚ด์ผ๋ฐฐ์›€์บ ํ”„ Spring_3๊ธฐ] CH2 ์ปค๋จธ์Šค ๊ณผ์ œ Step3

jiiimni 2026. 1. 28. 11:52

์ƒ๊ฐํ•ด๋ณด๊ธฐ

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();
    }
}


๊ฒฐ๊ณผ

๋ฉ”์ธ ํ™”๋ฉด์—์„œ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์„ ํƒํ•˜๊ณ , ์„ ํƒํ•œ ์นดํ…Œ๊ณ ๋ฆฌ ๋‚ด์—์„œ ์ƒํ’ˆ์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Œ์„ ํ™•์ธํ–ˆ๋‹ค.
์นดํ…Œ๊ณ ๋ฆฌ ๊ฐœ๋…์ด ๋„์ž…๋˜๋ฉด์„œ ์ปค๋จธ์Šค ํ”Œ๋žซํผ ๊ตฌ์กฐ๊ฐ€ ์‹ค์ œ ์„œ๋น„์Šค์™€ ๋” ์œ ์‚ฌํ•ด์กŒ๋‹ค๊ณ  ๋А๊ผˆ๋‹ค.