java

실습) 재고 관리 시스템 만들기

dalc3154 2025. 3. 6. 13:58

Inventory Management System
다양한 상품을 관리하는 재고 관리 시스템
 
프로젝트 구조
Main 파일: 프로그램 실행의 진입점
entity 폴더(데이터 모델 정의): 데이터(상품)를 표현하는 클래스 정의 - 객체의 속성과 동작을 포함
service 폴더(비즈니스 로직 처리): 상품 추가, 조회, 수정, 삭제와 같은 비즈니스로직을 처리(직접적인 데이터 조작)
repository 폴더(데이터 저장소 역할): 데이터를 저장하고 검색하는 기능을 제공하는 클래스 정의
 
요구사항
기능: 상품 추가, 수정, 삭제, 카테고리 상품 검색, 가격 또는 이름 등으로 정렬
 
사용 컬렉션 프레임워크
Set: 상품관리(중복 상품 방지)
Map: 카테고리별 상품 분류(키: 카테고리명, 값: 상품 목록)
추상 클래스: Item >> 모든 상품의 공통 필드 포함
인터페이스: Discountale > 할인 로직 제공

 

1.추상 클래스로 틀 만들기

public abstract class Item {
	private String id;// 고유 식별자
	private String name;// 상품명
	private int price;// 상품 가격
	private int quantity;// 상품 재고 수량
	
	public Item(String id, String name, int price, int quantity) {
		this.id = id;
		this.name = name;
		this.price = price;
		this.quantity = quantity;
	}
	
	public String getId() { return id;}
	public String getName() { return name;}
	public int getPrice() { return price;}
	public int getQuantity() { return quantity;}
	
	
	public void setPrice(int price) {
		this.price = price;
	}
	public void setQuantity(int quantity) {
		this.price = quantity;
	}
	
	public abstract String getCategory();
	
	@Override
	public String toString() {
		return "ID: " + id + ", Name: " + name + ", Price:" + price + ", Quantity: " + quantity;
	}

}

 

2.추상 클래스를 구현하는 상품 두개 만들기

public class Electronics extends Item{
	private String brand;// 브랜드
	private int warranty;// 보증기간(개월)

	public Electronics(String id, String name, int price, int quantity, String brand, int warranty) {
		super(id, name, price, quantity);
		this.brand = brand;
		this.warranty = warranty;
	}

	public String getBrand() {
		return brand;
	}
	public int getWarranty() {
		return warranty;
	}
	
	@Override
	public String getCategory() {
		return "Electronics";
	}
	@Override
	public String toString() {
		// super: 부모 클래스의 인스턴스를 의미
		return super.toString() + " // Brand: " + brand + ", Warranty: " + warranty + " months";
	}
}
public class Furniture extends Item{
	private String material; // 재질
	private String size; // 크기
	
	public Furniture(String id, String name, int price, int quantity, String material, String size) {
		super(id, name, price, quantity);
		this.material = material;
		this.size = size;
	}
	
	public String getMaterial() {return material;}
	public String getSize() {return size;}
	
	@Override
	public String getCategory() {
		return "Furniture";
	}
	
	@Override
	public String toString() {
		return super.toString() + " // Material: " + material + ", Size: " + size;
	}
}

3.인터페이스로 저장소 설정하기

import java.util.Set;

import chapter10.practice02.entity.Item;

public interface ItemRepository {
	
	//Ctrl + shift + o: 자동 임포트
	void addItem(Item item);
	void removeItem(String itemId);
	Item findById(String itemId);
	Set<Item> findAll();
}

4. 인터페이스를 구현하여 저장소 활용하기

import java.util.HashSet;
import java.util.Set;

import chapter10.practice02.entity.Item;

// 데이터 처리에 대한 메소드: DB를 대신하는 저장소 역할 
public class InMemoryItemRepository implements ItemRepository {
	private Set<Item> items = new HashSet<Item>();
	
	@Override
	public void addItem(Item item) {
		items.add(item);
	}

	@Override
	public void removeItem(String itemId) {
		Item target = null;
		for(Item item: items) {
			if (item.getId().equals(itemId)) {
				target = item;// 제거하고자 하는 요소를 저장
				break;
			}
		}
		if(target != null) {
			items.remove(target);
		}	
	}

	@Override
	public Item findById(String itemId) {
		for(Item item: items) {
			if (item.getId().equals(itemId)) {
				return item;
			}
		}
		return null;
	}

	@Override
	public Set<Item> findAll() {
		return items;
	}

}

5. 인터페이스를 활용하여 서비스 설정하기

import java.util.List;

import chapter10.practice02.entity.Item;

public interface InventoryService {
	void addItem(Item item);
	void updateItemPrice(String itemId, int newPrice);
	void deleteItem(String itemId);
	List<Item> getItemsByCategory(String catrgory);
}

6.인터페이스를 구현하여 서비스 활용하기

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

import chapter10.practice02.entity.Item;
import chapter10.practice02.repository.ItemRepository;

public class InventoryServiceImpl implements InventoryService {
	private final ItemRepository repository;
	
	public InventoryServiceImpl(ItemRepository repository) {
		this.repository = repository;
	}

	@Override
	public void addItem(Item item) {
		repository.addItem(item);
	}

	@Override
	public void updateItemPrice(String itemId, int newPrice) {
		// 수정할 Item이 저장소에 존재하는지 확인
		Item item = repository.findById(itemId);
		
		if (item != null) {
			item.setPrice(newPrice);
		}
	}

	@Override
	public void deleteItem(String itemId) {
		Item item = repository.findById(itemId);
		
		if (item != null) {
			repository.removeItem(itemId);
		}
	}

	@Override
	public List<Item> getItemsByCategory(String category) {
		Set<Item> allItems = repository.findAll();
		List<Item> categoryItems = new ArrayList<Item>();
		
		for (Item item: allItems) {
			if (item.getCategory().equalsIgnoreCase(category)) {
				categoryItems.add(item);
			}
		}
		
		return categoryItems;		
	} 
}

7. 메인 함수를 만들어서 만들어둔 기능 활용

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

import chapter10.practice02.entity.Electronics;
import chapter10.practice02.entity.Furniture;
import chapter10.practice02.entity.Item;
import chapter10.practice02.repository.InMemoryItemRepository;
import chapter10.practice02.service.InventoryService;
import chapter10.practice02.service.InventoryServiceImpl;

public class Main {
	public static void main(String[] args) {
		//ItemRepository repository = new InMemoryItemRepository();
		//InventoryService inventoryService = new InventoryServiceImpl(repository);
		InventoryService inventoryService = new InventoryServiceImpl(new InMemoryItemRepository());
		Scanner sc = new Scanner(System.in);
		
		while(true) {
			System.out.println("");
			System.out.println("Inventory Management System");
			System.out.println("1. Add Item");
			System.out.println("2. Update Item Price");
			System.out.println("3. Delete Item");
			System.out.println("4. Veiw Items by Category");
			System.out.println("5. Veiw All Items");
			System.out.println("6. Exit");
			System.out.println("Choose an option: ");
			
			try {
				int choice = Integer.parseInt(sc.nextLine());
				
				switch (choice) {
				case 1: 
					addItem(inventoryService, sc);
					break;
				case 2:
					updateItemPrice(inventoryService, sc);
					break;
				case 3:
					deleteItem(inventoryService, sc);
					break;
				case 4:
					viewItemsByCategory(inventoryService, sc);
					break;
				case 5:
					viewAllItems(inventoryService);
					break;
				case 6:
					sc.close();
					return;
				default:
					System.out.println("Invalid choice, Please try again");
				}
				
			} catch (Exception e){
				System.out.println(e.getMessage());
			}
		}
	}
	
	private static void addItem(InventoryService inventoryService, Scanner sc) {
		System.out.println("Enter Item Id: ");
		String id = sc.nextLine();
		System.out.println("Enter Item Name");
		String name = sc.nextLine();
		System.out.println("Enter Item Price");
		int price = sc.nextInt();
		System.out.println("Enter Item Quantity");
		int quantity = sc.nextInt();
		sc.nextLine();// 버퍼 소비
		System.out.println("Enter Item Category(Electronics/Furnitur)");
		String category = sc.nextLine();
		
		if (category.equalsIgnoreCase("Electronics")) {
			System.out.println("Enter Brand: ");
			String brand = sc.nextLine();
			System.out.println("Enter Warranty(months): ");
			int warranty = sc.nextInt();
			sc.nextLine();
			Item electronics = new Electronics(id, name, price, quantity, brand, warranty);
			inventoryService.addItem(electronics);
		} else if (category.equalsIgnoreCase("Furnitur")) {
			System.out.println("Enter Material: ");
			String material = sc.nextLine();
			System.out.println("Enter Size: ");
			String size = sc.nextLine();
			Item furniture = new Furniture(id, name, price, quantity, material, size);
			inventoryService.addItem(furniture);
		} else {
			System.out.println("Invalid category, Item not added");
		}
	}
	
	private static void updateItemPrice(InventoryService inventoryService, Scanner sc) {
		System.out.println("Enter Item ID to update Price");
		String id = sc.nextLine();
		System.out.println("Enter Item new Price");
		int newPrice = sc.nextInt();
		sc.nextLine();
		inventoryService.updateItemPrice(id, newPrice);
		System.out.println("Item price updated successfully");
	}
	private static void deleteItem(InventoryService inventoryService, Scanner sc) {
		System.out.println("Enter Item ID to delete");
		String id = sc.nextLine();
		inventoryService.deleteItem(id);
		System.out.println("Item deleteed succesfully");
	}
	private static void viewItemsByCategory(InventoryService inventoryService, Scanner sc) {
		System.out.println("Enter Category to View (Electronics/Furnitur)");
		String category = sc.nextLine();
		List<Item> items = inventoryService.getItemsByCategory(category);
		
		if (items.isEmpty()) {
			System.out.println("No items found in this category");
		} else {
			System.out.println("Items in category: " + category + " >>> ");
			for (Item item: items) {
				System.out.println(item);
			}
		}
	}
	private static void viewAllItems(InventoryService inventoryService) {
		List<Item> allItems = new ArrayList<Item>(inventoryService.getItemsByCategory("Electronics"));

		// 컬렉션타입데이터A.addAll(컬렉션타입데이터B)
		// A의 구조에 B의 데이터를 각각 요소로 삽입
		
		// a = [1, 2, 3]
		// b = [4, 5, 6]
		// a.add(b): [1, 2, 3, [4, 5, 6]]
		// a.addAll(b): [1, 2, 3, 4, 5, 6]
		allItems.addAll(inventoryService.getItemsByCategory("Furniture"));
		
		if (allItems.isEmpty()) {
			System.out.println("No items available");
		} else {
			System.out.println("All Items");
			for (Item item: allItems) {
				System.out.println(item);
			}
		}
	}
}