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 |