☕Java practice: Store app 만들기

yoondgu·2022년 3월 19일
1

Java practice

목록 보기
3/8
post-thumbnail

목표

자바를 이용하여 가입(사용자정보 저장), 상품 조회, 장바구니 담기, 구매하기(구매목록 저장), 구매내역 조회 를 할 수 있는 어플리케이션을 만든다.


역할에 따른 클래스 구성

  1. Store 클래스: 키보드 입력을 통해 사용자로부터 정보를 받아 다른 클래스에 제공, 데이터베이스로부터 정보를 받아 화면에 출력
  • 계속해서 메뉴번호 선택을 위한 키보드 입력을 요청하기 위하여 while문 내에서 작동한다.
  • 상호작용을 위해 키보드입력 및 Repository 클래스들의 인스턴스를 생성한다.
  1. User, Product, CartItem, OrderItem 클래스: 각 데이터에 필요한 속성들(필드)을 정의한다. 예를 들어 Product의 필드로는 상품명, 가격 등이 있다.
  2. ...Repository 클래스는 b에 나열한 각 타입의 객체들을 데이터베이스로서 저장하고, 그와 관련된 메소드를 통해 기능을 지원하도록 한다.

기능에 따른 클래스 상호작용

  1. 가입하기
    -Store클래스에서 사용자명을 입력받는다.
    -Stor클래스에서 사용자명을 필드 name에 저장하는 User 객체를 생성한다.
    -생성된 사용자의 포인트 초기값은 10점이다.
    -생성된 User정보를 UserRepository에 전달하여 db에 저장한다. 이 때 UserRepository의 saveUser 메소드를 이용한다.

  2. 상품조회
    -해당 애플리케이션에서 상품정보의 모음(데이터베이스)은 ProductRepository에서 정의한 Product 객체의 배열이다.
    -ProductRepository 객체가 생성될 때 데이터베이스 내 상품목록이 자동으로 저장되도록, 생성자메소드를 작성한다.
    -ProductRepository에 db를 반환하는 메소드를 정의한다.
    -Store 클래스에서 db를 받아서 이를 for문으로 모두 출력한다.

  3. 장바구니 담기
    -Store클래스에서 사용자명을 입력받는다.
    -Store클래스에서 상품명을 입력받는다.
    -Product db에서 동일한 상품명의 Product 객체를 찾는다. 이는 ProductRepository의 메소드를 호출하여 product객체로 반환하는 방식이다.
    -입력받은 사용자명, 찾은 product의 상품명, 상품가격을 인자값으로 하는 cartrItem 객체를 생성한다.
    -속성들이 저장된 CartItem 객체를 CartItem db에 저장시킨다.

  4. 구매하기(구매목록 저장)
    -Store클래스에서 사용자명을 입력받는다.
    -Product db에서 동일한 상품명의 Product 객체를 찾는다. 이는 ProductRepository의 메소드를 호출하여 product객체로 반환하는 방식이다.
    -Store클래스에서 수량을 입력받는다.
    -입력받은 사용자명, 찾은 product의 상품명, 상품가격, 주문량을 인자값으로 하는 OrderItem 객체를 생성한다.
    -생성된 OrderItem 객체를 OrderItem db에 저장시킨다.
    -User db에 동명의 사용자가 있을 경우 해당 user 객체에 포인트를 적립시킨다. 등록된 사용자가 없을 경우 안내메시지를 띄운다.

  5. 장바구니 조회
    -Store클래스에서 조회할 사용자명을 입력받는다.
    -Store클래스에서 CartItemRepository에 있는, CartItem db에서 동일한 사용자명의 구매정보를 반환하는 메소드를 호출한다.
    -이때, 해당 메소드는 찾는 구매정보가 여러 개 있을 경우 모두 반환할 수 있도록 한다. 즉 검색 결과 또한 배열 객체로 반환된다.
    -Store클래스에서 검색결과를 for문으로 모두 출력한다.

  6. 구매내역 조회
    5번과 같은 방식으로, OrderItemRepository를 이용한다.


소스코드

Store 클래스

package app1;

public class Store {
	
	public static void main(String[] args) {
		KeyboardReader reader = new KeyboardReader();
		ProductRepository productRepo = new ProductRepository();
		UserRepository userRepo = new UserRepository();
		CartItemRepository cartItemRepo = new CartItemRepository();
		OrderItemRepository orderItemRepo = new OrderItemRepository();
		
		while (true) {
			System.out.println("\n\n");
			System.out.println("--------------------------------------------------------------");
			System.out.println("1.사용자등록 2.상품조회 3.장바구니담기 4.구매하기 5.장바구니조회 6.구매내역조회 -1.종료");
			System.out.print("메뉴를 선택하세요: ");
			int menuNo = reader.readInt();
			
			if (menuNo == 1) {
				System.out.println("--------------------------------------------------------------");
				System.out.println("<<사용자등록>>");
				System.out.print("이름을 입력하세요: ");
				String username = reader.readString();
				
				User user = new User(username);
				userRepo.saveUser(user);
				
				System.out.println();
				System.out.println("["+ user.name + "]님 사용자등록되었습니다.");
				
			} else if (menuNo == 2) {
				System.out.println("--------------------------------------------------------------");
				System.out.println("<<상품조회>>");
				
				System.out.println();
				System.out.println("상품명\t제조사\t가격\t재고량\t판매여부\t");
				
				Product[] products = productRepo.getAllProducts();
				for(Product product: products) {
					System.out.print(product.name + "\t");
					System.out.print(product.maker + "\t");
					System.out.print(product.price + "\t");
					System.out.print(product.stock + "\t");
					System.out.println(product.onSell);
				}
				
			} else if (menuNo == 3) {
				System.out.println("--------------------------------------------------------------");
				System.out.println("<<장바구니 담기>>");
				
				System.out.println();
				System.out.print("사용자명을 입력하세요: ");
				String username = reader.readString();
				
				System.out.print("장바구니에 담을 상품명을 입력하세요: ");
				String productName = reader.readString();
				
				Product productForCart = productRepo.getProductByName(productName);
				if (productForCart == null) {
					System.out.println("잘못된 상품명입니다.");
					break;
				}
				
				CartItem item = new CartItem(username, productForCart.name, productForCart.price);
				cartItemRepo.saveCartItem(item);
				System.out.println("장바구니에 상품이 추가되었습니다.");
				
			} else if (menuNo == 4) {
				System.out.println("--------------------------------------------------------------");
				System.out.println("<<구매하기>>");
				
				System.out.println();
				System.out.print("사용자명을 입력하세요: ");
				String username = reader.readString();
				
				System.out.print("구매할 상품명을 입력하세요: ");
				String productName = reader.readString();
				
				Product productForOrder = productRepo.getProductByName(productName);
				if (productForOrder == null) {
					System.out.println("잘못된 상품명입니다.");
					break;
				}
				
				System.out.print("구매 수량을 입력하세요: ");
				int productQuantity = reader.readInt();

				OrderItem item = new OrderItem(username, productForOrder.name, productForOrder.price, productQuantity);
				orderItemRepo.saveOrderItem(item);
				System.out.println();
				System.out.println("상품 구매가 완료되었습니다.");
				
				User orderUser = userRepo.getUserByName(username);
				if (orderUser == null) {
					System.out.println("비회원 구매로 포인트가 적립되지 않았습니다.");
				} else {
					orderUser.point += (int)(item.orderPrice * 0.001); 
					System.out.println("현재 적립포인트는 [" + orderUser.point + "] 점입니다.");
				}
			
			} else if (menuNo == 5) {
				System.out.println("--------------------------------------------------------------");
				System.out.println("<<장바구니조회>>");
				
				System.out.println();
				System.out.print("사용자명을 입력하세요: ");
				String username = reader.readString();
				
				System.out.println();
				System.out.println("상품명\t가격");
				
				CartItem[] cartItems = cartItemRepo.getCartItemsByUsername(username);
				for (CartItem item : cartItems) {
					if (item == null) {
						break;
					}
					System.out.print(item.name + "\t");
					System.out.println(item.price);
				}
				if (cartItems[0] == null) {
					System.out.println("등록된 장바구니 내역이 상품이 없습니다.");
				}
				
			} else if (menuNo == 6) {
				System.out.println("--------------------------------------------------------------");
				System.out.println("<<주문내역조회>>");
				
				System.out.println();
				System.out.print("사용자명을 입력하세요: ");
				String username = reader.readString();
				
				System.out.println();
				System.out.println("상품명\t가격\t구매수량\t총구매금액");
				
				OrderItem[] orderItems = orderItemRepo.getOrderItemsByUsername(username);
				for (OrderItem item : orderItems) {
					if (item == null) {
						break;
					}
					System.out.print(item.name + "\t");
					System.out.print(item.price+ "\t");
					System.out.print(item.quantity+ "\t");
					System.out.println(item.orderPrice+ "\t");
				}
				if (orderItems[0] == null) {
					System.out.println("등록된 주문 내역이 없습니다.");
				}
			
			} else if (menuNo == -1) {
				System.out.println("[프로그램을 종료합니다.]");
				break;
			} else {
				System.out.print("[경고] 잘못된 번호입니다. 다시 입력하세요.");
			}
		}
	}

}

OrderItemRepository 클래스 (나머지는 생략)

package app1;

public class OrderItemRepository {
	
	OrderItem[] db = new OrderItem[20];
	int savePosition = 0;
	
	// OrderItem객체를 전달받아서 저장하는 기능
	void saveOrderItem(OrderItem item) {
		db[savePosition] = item;
		savePosition ++;
	}
	
	// 사용자이름을 전달받아서 그 사용자가 등록한 OrderItem을 반환하는 기능
	OrderItem[] getOrderItemsByUsername(String nameforSearch) {
		OrderItem[] result = new OrderItem[10];
		int resultPosition = 0;
		for (OrderItem item : db) {
			if (item == null) {
				break;
			}
			if (item.username.equals(nameforSearch)) {
				result[resultPosition] = item;
				resultPosition++;
			}
		}
		return result;
	}
}

출력 내용



-----------------------------------------------------------------
1.사용자등록 2.상품조회 3.장바구니담기 4.구매하기 5.장바구니조회 6.구매내역조회 -1.종료
메뉴를 선택하세요: 2
-----------------------------------------------------------------
<<상품조회>>

상품명	제조사	가격	재고량	판매여부	
볼펜 흑	모나미	1000	10	true
볼펜 빨	모나미	1000	10	true
볼펜 파	모나미	1000	10	true
볼펜 초	모나미	1000	10	true
볼펜 노	모나미	1000	10	true
볼펜 3색	모나미	3000	10	true
컴퓨터펜	모나미	800		10	true
연필		모나미	4000	10	true
샤프		모나미	1500	10	true
지우개	모나미	500		10	true



-----------------------------------------------------------------
1.사용자등록 2.상품조회 3.장바구니담기 4.구매하기 5.장바구니조회 6.구매내역조회 -1.종료
메뉴를 선택하세요: 1
-----------------------------------------------------------------
<<사용자등록>>
이름을 입력하세요: 김철수

[김철수]님 사용자등록되었습니다.



-----------------------------------------------------------------
1.사용자등록 2.상품조회 3.장바구니담기 4.구매하기 5.장바구니조회 6.구매내역조회 -1.종료
메뉴를 선택하세요: 4
-----------------------------------------------------------------
<<구매하기>>

사용자명을 입력하세요: 김철수
구매할 상품명을 입력하세요: 연필
구매 수량을 입력하세요: 10

상품 구매가 완료되었습니다.
현재 적립포인트는 [50] 점입니다.



-----------------------------------------------------------------
1.사용자등록 2.상품조회 3.장바구니담기 4.구매하기 5.장바구니조회 6.구매내역조회 -1.종료
메뉴를 선택하세요: 4
-----------------------------------------------------------------
<<구매하기>>

사용자명을 입력하세요: 김철수
구매할 상품명을 입력하세요: 샤프
구매 수량을 입력하세요: 1

상품 구매가 완료되었습니다.
현재 적립포인트는 [51] 점입니다.



-----------------------------------------------------------------
1.사용자등록 2.상품조회 3.장바구니담기 4.구매하기 5.장바구니조회 6.구매내역조회 -1.종료
메뉴를 선택하세요: 6
-----------------------------------------------------------------
<<주문내역조회>>

사용자명을 입력하세요: 김철수

상품명	가격		구매수량	총구매금액
연필		4000	10		40000	
샤프		1500	1		1500	



-----------------------------------------------------------------
1.사용자등록 2.상품조회 3.장바구니담기 4.구매하기 5.장바구니조회 6.구매내역조회 -1.종료
메뉴를 선택하세요: -1
[프로그램을 종료합니다.]

추가할 것

  • 같은 사람(현 앱에서는 동명인)이 장바구니에 같은 상품을 여러 번 담을 수 없도록 하기
  • 장바구니에 담은 상품을 모두 주문한 뒤 장바구니에서 삭제하는 기능 추가
  • 향상된 for문을 사용하고 배열이 비어있을 경우에 대해 if문으로 처리해주는 지금의 방식이 괜찮은가?
    차라리 일반 for문을 쓰는 게 코드가 더 깔끔하지 않을까
  • 사용자명을 굳이 계속 다시 입력하지 않고 로그인,로그아웃할 수 있으면 좋겠지만 그 부분은 강의 진도가 더 나가면 제대로된 방법을 알게 될 것 같다.
  • 예외처리에 대해서도 알고 싶다.

0개의 댓글