Java MVC 패턴을 이용한 간단한 미니 쿠팡 만들기

Model

DTO

ProductDto class

package dto;

//상품 정보
public  class ProductDto {
	private String name;
	private int price;
	
	public ProductDto(String name, int price) {
		this.name = name;
		this.price = price;
	}
	
	public String getName() {
		return name;
	}
	
	public int getPrice() {
		return price;
	}
	
	@Override
	public String toString() {
		return "상품명: " + name + ", 가격: " + price;
	}
}

 

PurchasedProduct class

package dto;

import java.util.Date;

//구매한 상품 = 상품 + 구매시간
public class PurchasedProduct extends ProductDto{
	public Date purchasedAt;

	public PurchasedProduct(String name, int price) {
		super(name, price);
		purchasedAt = new Date();
	}
	
	@Override
	public String toString() {
		return "상품명: " + super.getName() + ", 가격: " + super.getPrice() + 
				", 구매시간: " + purchasedAt;
	}
}

 

UserDto class

package dto;

//유저 정보, 디폴트로 10만원을 가지고 시작 
public class UserDto {
	private String id;
	private String pw;
	private String name;
	private int money;
	
	public UserDto(){
		
	}
	
	public UserDto(String id, String pw, String name){
		this.id = id;
		this.pw = pw;
		this.name = name;
		this.money = 100000;
	}
	
	public String getId() {
		return id;
	}
	public String getPw() {
		return pw;
	}
	public String getName() {
		return name;
	}
	
	public int getMoney() {
		return money;
	}
	
	public void setId(String id) {
		this.id = id;
	}
	public void setPw(String pw) {
		this.pw = pw;
	}
	public void setName(String name) {
		this.name = name;
	}
	
	public void setMoney(int money) {
		this.money = money;
	}
	
	@Override
	public String toString() {
		return "회원정보[ ID: " + id + ", PW: " + pw + ", Name: " + name + ", money" + money + "]";
	}
}

 

 

Virtual DB

package model;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import dto.ProductDto;
import dto.PurchasedProduct;
import dto.UserDto;
import exception.NotExistException;

//데이터베이스를 사용하지 않는 예제이므로 메모리를 사용한 
//가상 데이터베이스 사용 
public class VirtualDB {
	private static VirtualDB instance = new VirtualDB();
	private ArrayList<ProductDto> productList;	//전체 상품 목록
	private ArrayList<UserDto> userList;		//전체 유저 목록
	private String currentUserId;				//현재 접속한 유저 아이디
	private Map<String, ArrayList<PurchasedProduct>> purchaseLog;	//유저 별 구매 목록
	
	public static VirtualDB getInstance() {
		return instance;
	}
	
	public VirtualDB(){
		productList = new ArrayList<>();
		productList.add(new ProductDto("물", 3000));
		productList.add(new ProductDto("과자", 1500));
		productList.add(new ProductDto("소고기", 30000));
		productList.add(new ProductDto("닭가슴살", 12000));
		productList.add(new ProductDto("돼지고기", 18000));
		productList.add(new ProductDto("볼펜", 5000));
		productList.add(new ProductDto("공책", 1000));
		productList.add(new ProductDto("휴대폰 케이스", 45000));
		productList.add(new ProductDto("마우스", 46000));
		productList.add(new ProductDto("로션", 23000));
		
		userList = new ArrayList<>();
		purchaseLog = new HashMap<String, ArrayList<PurchasedProduct>>();
		currentUserId = "";
		
	}
	
	//전체 상품 조회
	public ArrayList<ProductDto> getProductList(){
		return productList;
	}
	
	
	//상품 단건 조회
	public ProductDto getProduct(String productName) throws NotExistException{
		for(ProductDto product : productList) {		
			if(product.getName().equals(productName))
				return product;
		}
		throw new NotExistException("입력하신 상품은 없는 상품입니다.");
	}
	
	//유저 별 구매 목록 조회
	public Map<String, ArrayList<PurchasedProduct>> getPurchaseLog(){
		return purchaseLog;
	}
	
	//현재 유저의 구매목록 조회
	public ArrayList<PurchasedProduct> getPurchasedList(){
		return purchaseLog.get(currentUserId);
	}
	
	//현재 로그인한 유저 아이디 지정
	public void setCurrentUserId(String currentUserId) {
		this.currentUserId = currentUserId;
	}
	
	//현재 로그인한 유저 아이디 조회
	public String getCurrentUserId() {
		return currentUserId;
	}
	
	//유저 추가
	public void insertUser(UserDto user) {
		userList.add(user);
	}
	
	//전체 유저 조회
	public ArrayList<UserDto> getAllUser(){
		return userList;
	}
	
	//단일 유저 조회
	public UserDto getUser(String currentUserId) {
		for(UserDto user : userList) {
			if(user.getId().equals(currentUserId))
				return user;
		}
		return null;	
	}
}

 

Constant class

package constant;

//로그인 상태 코드 정의
public final class StatusCode {
	public final static int ALREADY_LOGIN = 1;
	public final static int NOT_EXIST_ID = 2;
	public final static int MISMATCH_PW = 3;
	public final static int SUCCESS = 4;
}

 

VIEW

package view;


import java.util.InputMismatchException;
import java.util.Scanner;
import controller.CupangController;


public class StartView {
	public static void main(String[] args) {
		CupangController controller = CupangController.getInstance();
		Scanner sc = new Scanner(System.in);
		
		System.out.println("미니 쿠팡에 오신 걸 환영합니다.");
		System.out.println("======================");
		
		while(true) {
			System.out.println("\n원하시는 기능을 선택하세요.");
			System.out.println("1.회원가입");
			System.out.println("2.로그인");
			System.out.println("3.로그아웃");
			System.out.println("4.상품 조회");
			System.out.println("5.상품 구매");
			System.out.println("6.구매내역 조회");
			System.out.println("7.환불");
			System.out.println("8.유저정보 조회");
			System.out.println("9.종료");
			

			//select function
			int n = sc.nextInt();
			
			switch(n) {
				case 1:
					System.out.println("======회원가입=====");
					controller.join();
					break;
				case 2:
					System.out.println("=======로그인======");
					controller.login();
					break;
				case 3:
					System.out.println("======로그아웃======");
					controller.logout();
					break;
				case 4:	
					System.out.println("====상품 목록 조회====");
					controller.findAllProductList();
					break;
				case 5:
					System.out.println("======상품 구매======");
					controller.purchaseProduct();
					break;
				case 6:					
					System.out.println("=====구매 내역 조회====");
					controller.findPurchasedList();
					break;
				case 7:
					System.out.println("========환불========");
					controller.refund();
					break;
				case 8:
					System.out.println("=====유저 정보 조회====");
					controller.findUserInfo();
					break;
				case 9:
					System.out.print("종료되었습니다.");
					System.exit(1);
				default:
					System.out.println("1~9 사이의 숫자만 입력해 주십시오.");
					break;
			}			
		}
	}
}

 

 

 

Controller

 

package controller;

import java.util.Scanner;

import constant.StatusCode;
import dto.ProductDto;
import dto.UserDto;
import exception.NotExistException;
import service.ProductService;
import service.UserService;

public class CupangController {
	private static CupangController instance = new CupangController();
	private UserService userService = UserService.getInstance();
	private ProductService productService = ProductService.getInstance();
	private Scanner sc = new Scanner(System.in);
	
	
	public static CupangController getInstance() {
		return instance;
	}

	//회원가입
	public void join() {
		System.out.println("ID를 입력하세요.");		
		String id = sc.nextLine();
		System.out.println("PW를 입력하세요.");
		String pw = sc.nextLine();
		System.out.println("NAME을 입력하세요.");
		String name = sc.nextLine();
		
		UserDto user = new UserDto(id,pw,name);
		
		if(userService.join(user) == null) {
			System.out.println("중복된 아이디 값 입니다.");
		}
		else {
			System.out.println("회원가입 성공");
		}
	}
	
	//로그인
	public void login() {
		System.out.println("ID를 입력하세요.");
		String id = sc.nextLine();
		System.out.println("PW를 입력하세요.");
		String pw = sc.nextLine();
		
		int status_code;
		try {
			status_code = userService.login(id, pw);
			if(status_code == StatusCode.ALREADY_LOGIN)
				System.out.println("이미 로그인 된 상태입니다.");		
			else if(status_code == StatusCode.NOT_EXIST_ID)
				System.out.println("없는 아이디 입니다.");		
			else if(status_code == StatusCode.MISMATCH_PW)
				System.out.println("비밀번호가 틀렸습니다.");
			else if(status_code == StatusCode.SUCCESS)
				System.out.println("로그인 성공");
		} catch (NotExistException e) {
			e.printStackTrace();
		}
	}
	
	//로그아웃
	public void logout() {
		if(userService.logout()) 	
			System.out.println("로그아웃 되셨습니다.");
		else
			System.out.println("현재 로그인 상태가 아닙니다.");
	}
	

	//전체 상품 목록 조회
	public void findAllProductList(){
		productService.findAllProduct();
	}

	//상품 구매
	public void purchaseProduct() {
		try {
			if(userService.isLogin()) {
				System.out.println("구매하실 상품명을 입력해주십시오");
				String productName = sc.nextLine();
				ProductDto product = productService.findByName(productName);
				
				if(userService.purchaseItem(product)) 
					System.out.println("구매가 완료되었습니다.");
				else
					System.out.println("잔액이 부족합니다.");
			}
			else 
				System.out.println("로그인 후 이용하실 수 있습니다.");
		} catch (NotExistException e) {
			System.out.println("입력하신 상품은 없는 상품입니다.");
		}
	}
	
	//구매 내역 조회
	public void findPurchasedList() {
		if(userService.findUser() != null) {
			userService.getPurchasedLog();
		}
		else
			System.out.println("로그인 후 이용하실 수 있습니다.");
	}
	
	//환불
	public void refund() {
		try {
			if(userService.isLogin()) {
				String productName = sc.nextLine();
				ProductDto product;
				product = productService.findByName(productName);
			
				if(userService.refund(product))
					System.out.println("환불이 완료되었습니다");
				else
					System.out.println("구매 기록에 없는 상품입니다.");
			}
			else 
				System.out.println("로그인 후 이용하실 수 있습니다.");
			
		} catch (NotExistException e) {
			System.out.println("입력하신 상품은 구매목록에 없는 상품입니다.");
		}
	}
	
	//유저정보 조회
	public void findUserInfo() {
		UserDto user = userService.findUser();
		System.out.println("Name: " + user.getName() + ", Money: " + user.getMoney());
	}
}

 

Service

 

ProductService class

package service;

import dto.ProductDto;
import exception.NotExistException;
import model.VirtualDB;


public class ProductService {	
	private static ProductService instance = new ProductService();
	private VirtualDB db = VirtualDB.getInstance();
	
	public static ProductService getInstance() {
		return instance;
	}
	
	//전체 상품 조회
	public void findAllProduct() {
		for(ProductDto product : db.getProductList()) {			
			System.out.println(product);
		}
	}
	
	//상품 단건 조회
	public ProductDto findByName(String productName) throws NotExistException{
		ProductDto product = db.getProduct(productName);
		if(product != null)
			return product;
		else
			return null;
	}

}

 

UserService class

package service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import constant.StatusCode;
import dto.ProductDto;
import dto.PurchasedProduct;
import dto.UserDto;
import exception.NotExistException;
import model.VirtualDB;
public class UserService {
	private static UserService instance = new UserService();
	VirtualDB db = VirtualDB.getInstance();
	
	public static UserService getInstance() {
		return instance;
	}
	
	//회원가입
	public UserDto join(UserDto user) {
		if(db.getUser(user.getId()) == null) {
			db.insertUser(user);
			return db.getUser(user.getId());
		}
		return null;
	}
	
	
	//로그인
	public int login(String id, String pw) throws NotExistException{
		UserDto user = db.getUser(id);
		
		if(!db.getCurrentUserId().isEmpty()) 
			return StatusCode.ALREADY_LOGIN;
		else if(user == null)
			return StatusCode.NOT_EXIST_ID;
		else {
			if(!user.getPw().equals(pw))
				return StatusCode.MISMATCH_PW;
			else {
				db.insertUser(user);
				db.setCurrentUserId(id);
				return StatusCode.SUCCESS;
			}
		}
	}	
	
	
	//로그아웃
	public boolean logout() {
		if(db.getCurrentUserId().isEmpty())
			return false;
		else {
			db.setCurrentUserId("");
			return true;
		}
	}

	//유저 로그인 체크
	public boolean isLogin() {
		if(db.getCurrentUserId().isEmpty())
			return false;
		else
			return true;
	}
	
	//현재 유저 정보 반환
	public UserDto findUser() {
		if(!db.getCurrentUserId().isEmpty())
			return db.getUser(db.getCurrentUserId());
		return null;
	}
	
	
	//상품 구매
	public boolean purchaseItem(ProductDto product) {
		int money = findUser().getMoney() - product.getPrice();
		
		if(money < 0)
			return false;
		
		else {
			if(db.getPurchasedList() == null)
				db.getPurchaseLog().put(db.getCurrentUserId(), new ArrayList<>());
			
			db.getPurchasedList().add(
					new PurchasedProduct(product.getName(), product.getPrice()));
			
			findUser().setMoney(money);
			
			return true;
		}
	}
	
	//구매 내역 조회
	public void getPurchasedLog() {
		ArrayList<PurchasedProduct> purchasedItemlist = db.getPurchasedList();
		
		for(PurchasedProduct p : purchasedItemlist) 
			System.out.println(p);
	}
	
	//환불
	public boolean refund(ProductDto product) {
		ArrayList<PurchasedProduct> purchasedItemlist = db.getPurchasedList();
		
		for(PurchasedProduct p : purchasedItemlist) {
			if(p.getName().equals(product.getName())) {
				purchasedItemlist.remove(p);
				int money = findUser().getMoney() + product.getPrice();
				findUser().setMoney(money); 
				return true;
 			}
		}
		return false;
	}
}

 

Exception class

package exception;

public class NotExistException extends Exception {
	public NotExistException(String message){
		super(message);
	}
}

 

'개발 > Spring' 카테고리의 다른 글

[JSP] Cookie와 Session  (0) 2023.04.18
REST Docs와 Swagger ui  (0) 2023.04.11
DAO, DTO, VO  (0) 2023.03.16
Spring WebFlux로 Chatting service 만들기  (0) 2023.02.27
Eureka Server & Spring Cloud Gateway  (0) 2023.02.26