**재고관리 시스템

 

1. 상품 등록

    - 상품 고유번호 / 상품명 / 상품 설명 / 등록 날짜

2. 상품 조회

    고유번호          상품명          상품설명            등록 날짜

    10001              키보드      기계식키보드       2020/03/26

    10002    키보드 케이스        가죽 케이스       2020/03/26

    10003              마우스           볼마우스       2020/03/26

3. 상품 삭제 - 목록을 보여준 후, 고유번호로 삭제

4. 상품 검색 - 상품명으로 검색 -> ex) 키보드 검색하면 키보드와 키보드 에이스 둘다

5. 종료


DBCP - DataBase Connection Pool 고려

 

SQL 테이블

더보기

Member (아이디, 비밀번호, 이름, 가입일)

Product (고유번호, 상품명, 상품설명, 등록 날짜)

 

Product 코드

더보기
public class Product {

	private String pid;
	private String pname;
	private String ptext;
	private String pdate;
	public Product() {
		super();
	}
	public Product(String pid, String pname, String ptext, String pdate) {
		super();
		this.pid = pid;
		this.pname = pname;
		this.ptext = ptext;
		this.pdate = pdate;
	}
	public String getPid() {
		return pid;
	}
	public void setPid(String pid) {
		this.pid = pid;
	}
	public String getPname() {
		return pname;
	}
	public void setPname(String pname) {
		this.pname = pname;
	}
	public String getPtext() {
		return ptext;
	}
	public void setPtext(String ptext) {
		this.ptext = ptext;
	}
	public String getPdate() {
		return pdate;
	}
	public void setPdate(String pdate) {
		this.pdate = pdate;
	}



}

 

Manager 코드

더보기
import java.math.BigInteger;
import java.security.MessageDigest;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.commons.dbcp2.BasicDataSource;

public class Manager {

	private BasicDataSource bds = new BasicDataSource();
	private static Manager instance = null;

	public static Manager getInstance() {
		if(instance == null) {
			instance = new Manager(); //class내부 private영향 안받음
		}
		return instance;
	}// 인스턴스를 한번만 만들기

	private Manager() {
		bds.setDriverClassName("oracle.jdbc.driver.OracleDriver");
		bds.setUsername("kh");
		bds.setPassword("kh");
		bds.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
		bds.setInitialSize(30);
	}

	public Connection makeConnection() throws Exception {
		return bds.getConnection();
	}

	//id만 중복체크
	public boolean isIdExist(String id) throws Exception{

		String sql = "select sid from member where sid = ?";
		try(
				Connection con = makeConnection();
				PreparedStatement pstat = con.prepareStatement(sql);
				){
			pstat.setString(1, id);
			try(ResultSet rs = pstat.executeQuery();){
				return rs.next();
			}
		}
	}
	//DAO
	public int insert(String sid, String spw, String sname) throws Exception {
		String sql = "insert into member values(?,?,?,sysdate)";
		try(
				Connection con = makeConnection();
				PreparedStatement pstat = con.prepareStatement(sql);
				) {
			pstat.setString(1, sid);
			pstat.setString(2, spw);
			pstat.setString(3, sname);
			int result = pstat.executeUpdate();
			con.commit();
			return result;
		}
	}

	public List<Product> selectProduct() throws Exception {

		String sql = "select * from product";
		try(
				Connection con = makeConnection();
				PreparedStatement pstat = con.prepareStatement(sql);
				) {
			ResultSet rs = pstat.executeQuery();
			List<Product> plist = new ArrayList<>();
			while(rs.next()) {
				String id = rs.getString("pid");
				String name = rs.getString("pname");
				String text = rs.getString("ptxt");
				String date = rs.getString("pdate");
				plist.add(new Product(id,name,text,date));
			}
			return plist;
		}
	}


	public int insertProduct(String pid, String pname, String ptxt, String pdate) throws Exception {
		String sql = "insert into product values(?,?,?,?)";
		try(
				Connection con = makeConnection();
				PreparedStatement pstat = con.prepareStatement(sql);
				) {
			pstat.setString(1, pid);
			pstat.setString(2, pname);
			pstat.setString(3, ptxt);
			pstat.setString(4, pdate);
			int result = pstat.executeUpdate();
			con.commit();
			return result;
		}
	}

	public int deleteProduct(String pid) throws Exception {

		String sql = "delete from product where pid=?";
		try(
				Connection con = makeConnection();
				PreparedStatement pstat = con.prepareStatement(sql);
				) {
			pstat.setString(1, pid);
			int result = pstat.executeUpdate();
			con.commit();

			return result;
		}
	}

	public List<Product> searchByName(String pname) throws Exception {

		String sql = "select * from product where pname like ?";
		try(
				Connection con = makeConnection();
				PreparedStatement pstat = con.prepareStatement(sql);
				) {
			pstat.setString(1, "%"+pname+"%");
			ResultSet rs = pstat.executeQuery();
			List<Product> sdt = new ArrayList<>();

			while(rs.next()) {
				String id = rs.getString("pid");
				String name = rs.getString("pname");
				String text = rs.getString("ptxt");
				String date = rs.getString("pdate");

				sdt.add(new Product(id,name,text,date));
			}

			return sdt;
		}
	}



	public static String getSHA512(String input){

		String toReturn = null;
		try {
			MessageDigest digest = MessageDigest.getInstance("SHA-512");
			digest.reset();
			digest.update(input.getBytes("utf8"));
			toReturn = String.format("%0128x", new BigInteger(1, digest.digest()));
		} catch (Exception e) {
			e.printStackTrace();
		}

		return toReturn;
	}

	public List<Member> login(String id, String pw) throws Exception {
		String sql = "select * from member where sid = ? and spw = ?";
		try(
				Connection con = this.makeConnection();
				PreparedStatement pstat = con.prepareStatement(sql);
				){
			pstat.setString(1, id);
			pstat.setString(2, pw);
			try(
					ResultSet rs = pstat.executeQuery();
					){
				List<Member> sdt = new ArrayList<>();
				while(rs.next()) {
					String login_id =rs.getString("sid");
					String login_pw =rs.getString("spw");
					String login_name =rs.getString("sname");
					String login_date =rs.getString("sdate");
					sdt.add(new Member(login_id,login_pw,login_name,login_date ));	
				}
				return sdt;
			}
		}
	}
}

 

ScoketThread 코드

더보기
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import java.util.List;

public class SocketThread extends Thread{

	private Socket sock;

	public SocketThread(Socket sock) {
		this.sock = sock;
	}

	public void run() {
		System.out.println(sock.getInetAddress() + " 에서 연결하였습니다.");
		try {
			DataInputStream dis = 
					new DataInputStream(sock.getInputStream());
			DataOutputStream dos = 
					new DataOutputStream(sock.getOutputStream());

			Manager manager = Manager.getInstance();

			while(true) {
				//첫 메뉴창에서 입력 받기
				String menu = dis.readUTF();

				if(menu.contentEquals("1")) {
					//1번 선택시 회원 가입
					boolean idCheck = true;
					String id = "";
					while(idCheck) {
						//1-1. 아이디 받기
						id = dis.readUTF();

						//1-2. 아이디 중복 체크
						idCheck = manager.isIdExist(id);
						System.out.println(idCheck); //test
						dos.writeBoolean(idCheck);
						dos.flush();

						if(idCheck == false) {						
							break;
						}
					}
					//1-3. 비밀번호 받기
					String pw = dis.readUTF();

					//1-4. 이름 받기
					String name = dis.readUTF();

					//1-5. 받은 정보 DB에 삽입 & 결과 반환 받기
					int result = manager.insert(id, pw, name);
					if(result > 0) {
						dos.writeBoolean(true); //성공
					}else {
						dos.writeBoolean(false); //실패
					}
					dos.flush();

				}else if(menu.contentEquals("2")){
					//2번 선택시 로그인

					//2-1 아이디 받기
					String id = dis.readUTF();

					//2-2 비밀번호 받기
					String pw = dis.readUTF();

					//2-3 로그인하여 결과 Member List 에 저장
					List<Member> members = manager.login(id, pw);
					if(members.size() == 1) {
						dos.writeBoolean(true); //성공
						dos.flush(); //보내기
					}else {
						dos.writeBoolean(false); //실패
						dos.flush(); //보내기
						continue;
					}


					while(true) {
						String menu2 = dis.readUTF();
						if(menu2.contentEquals("1")) {
							//1. 상품 등록 - 상품 고유번호 / 상품명 / 상품 설명 / 등록 날짜
							String pid = dis.readUTF();
							String pname = dis.readUTF();
							String ptext = dis.readUTF();
							String pdate = dis.readUTF();

							int result = manager.insertProduct(pid, pname, ptext,pdate);
							if(result > 0) {
								dos.writeBoolean(true); //성공
							}else {
								dos.writeBoolean(false); //실패
							}
							dos.flush();

						}else if(menu2.contentEquals("2")) {
							//2. 상품 조회					

							List<Product> plist = manager.selectProduct();
							dos.writeInt(plist.size()); //목록사이즈 전송
							dos.flush();
							for(Product tmp : plist) {
								dos.writeUTF(tmp.getPid());
								dos.writeUTF(tmp.getPname());
								dos.writeUTF(tmp.getPtext());
								dos.writeUTF(tmp.getPdate());
								dos.flush();
							}

						}else if(menu2.contentEquals("3")) {
							//3. 상품 삭제 - 목록을 보여준 후, 고유번호로 삭제	
							List<Product> plist = manager.selectProduct();
							dos.writeInt(plist.size()); //목록사이즈 전송
							dos.flush();
							for(Product tmp : plist) {
								dos.writeUTF(tmp.getPid());
								dos.writeUTF(tmp.getPname());
								dos.writeUTF(tmp.getPtext());
								dos.writeUTF(tmp.getPdate());
								dos.flush();
							}

							String deleteid =  dis.readUTF();;
							int result = manager.deleteProduct(deleteid);
							if(result > 0) {
								dos.writeBoolean(true); //성공
							}else {
								dos.writeBoolean(false); //실패
							}
							dos.flush();


						}else if(menu2.contentEquals("4")) {
							//4. 상품 검색 - 상품명으로 검색 -> ex) 키보드 검색하면 키보드와 키보드 에이스 둘다


							String sname = dis.readUTF();
							List<Product> slist = manager.searchByName(sname);
							dos.writeInt(slist.size()); //목록사이즈 전송
							dos.flush();
							for(Product tmp : slist) {
								dos.writeUTF(tmp.getPid());
								dos.writeUTF(tmp.getPname());
								dos.writeUTF(tmp.getPtext());
								dos.writeUTF(tmp.getPdate());
								dos.flush();
							}

						}else if(menu2.contentEquals("5")) {
							//5. 종료	
							break;
						}

					}
				}

			}

		}catch(Exception e) {
			e.printStackTrace();
		}

	}

}

 

Client 코드

더보기
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Client {

	public static void main(String[] args) {
		try {
			Socket sock = new Socket("127.0.0.1", 20000);
			//		Socket sock = new Socket("192.168.60.31", 25000);

			DataInputStream dis = 
					new DataInputStream(sock.getInputStream());
			DataOutputStream dos = 
					new DataOutputStream(sock.getOutputStream());

			Scanner sc = new Scanner(System.in);

			while(true) {

				//0. 메뉴 선택 보내기
				System.out.println("1. 회원가입");
				System.out.println("2. 로그인");
				System.out.print(">> ");
				String menu = sc.nextLine();
				dos.writeUTF(menu);
				dos.flush();

				//1. 회원가입
				if(menu.contentEquals("1")) {
					System.out.println("=== 회원가입 ===");

					boolean idCheck = true;
					//idCheck를 while문 밖에 놓고 idCheck로 반복

					while(idCheck) {
						//1-1. 아이디 보내기
						System.out.print("ID: ");
						String id = sc.nextLine();
						dos.writeUTF(id);
						dos.flush();

						//1-2. 아이디 중복 여부 확인
						idCheck = dis.readBoolean();
						if(idCheck == false) {
							System.out.println("가입가능한 아이디입니다.");
							break;
						}else {
							System.out.println("중복된 아이디입니다.");
						}
					}

					// 1-3. 비밀번호 보내기
					System.out.print("Password: ");
					String pw = sc.nextLine();
					dos.writeUTF(pw);
					dos.flush();

					// 1-4. 이름 보내기
					System.out.print("이름: ");
					String name = sc.nextLine();
					dos.writeUTF(name);
					dos.flush();

					// 1-5. 회원가입 성공 여부 알림
					boolean signupOk = dis.readBoolean();
					if(signupOk) {
						System.out.println("회원가입에 성공하셨습니다.");
					}else {
						System.out.println("회원가입에 문제가 발생하였습니다.");
					}

					//2. 로그인
				}else if(menu.contentEquals("2")) {
					System.out.println("=== 로그인 ===");

					//2-1. 아이디 보내기
					System.out.print("ID: ");
					String id = sc.nextLine();
					dos.writeUTF(id);
					dos.flush();

					//2-2. 비밀번호 보내기
					System.out.print("Password: ");
					String pw = sc.nextLine();
					dos.writeUTF(pw);
					dos.flush();

					//2-3. 로그인 성공 여부 알림
					boolean loginOk = dis.readBoolean();
					if(loginOk) {
						System.out.println("로그인에 성공하셨습니다.");
					}else {
						System.out.println("로그인이 실패하였습니다.");
						continue; //메뉴로 나가기, 그다음 이어지지 않음?
					}

					while(true) {
						//재고관리 시스템
						System.out.println("1. 상품 등록");
						System.out.println("2. 상품 조회");
						System.out.println("3. 상품 삭제");
						System.out.println("4. 상품 검색");
						System.out.println("5. 종료");
						System.out.print(">> ");
						String menu2 = sc.nextLine();
						dos.writeUTF(menu2);
						dos.flush();

						// 상품 등록(상품 고유번호 / 상품명 / 상품 설명 / 등록 날짜)
						if(menu2.contentEquals("1")) { 
							System.out.println("상품 고유번호를 입력하세요 : ");
							String pid = sc.nextLine();
							dos.writeUTF(pid);
							dos.flush();
							System.out.println("상품명를 입력하세요 : ");
							String pname = sc.nextLine();
							dos.writeUTF(pname);
							dos.flush();
							System.out.println("상품 설명을 입력하세요 : ");
							String ptext = sc.nextLine();
							dos.writeUTF(ptext);
							dos.flush();
							System.out.println("등록날짜를 입력하세요 : ");
							String pdate = sc.nextLine();
							dos.writeUTF(pdate);
							dos.flush();

							//상품 조회	
						}else if(menu2.contentEquals("2")) {
							System.out.println("\t====\t상품 목록\t====\t");
							System.out.println("고유번호\t상품명\t상품설명\t등록날짜");

							int productLength = dis.readInt(); //목록길이 받기
							//						List<Product> list = new ArrayList<>();
							for(int i=0; i<productLength; i++) {

								String productId = dis.readUTF();
								String productName = dis.readUTF();
								String productText = dis.readUTF();
								String productDate = dis.readUTF();

								System.out.println(
										productId+"\t"+
												productName + "\t"+
												productText + "\t"+
												productDate
										);
							}


							//상품 삭제 -목록을 보여준 후, 고유번호로 삭제	
						}else if(menu2.contentEquals("3")) {
							System.out.println("\t====\t상품 목록\t====\t");
							System.out.println("고유번호\t상품명\t상품설명\t등록날짜");	
							int productLength = dis.readInt();
							for(int i=0; i<productLength; i++) {
								String productId = dis.readUTF();
								String productName = dis.readUTF();
								String productText = dis.readUTF();
								String productDate = dis.readUTF();
								System.out.println(productId+"\t"+productName+ "\t"+productText + "\t"+productDate);
							}

							System.out.print("삭제할 상품 고유번호를 입력하세요 : ");
							String did = sc.nextLine();
							dos.writeUTF(did);
							dos.flush();
							boolean deleteOk = dis.readBoolean();
							if(deleteOk) {
								System.out.println("삭제에 성공하셨습니다.");
							}else {
								System.out.println("삭제에 문제가 발생하였습니다.");
							}



							//상품 검색 상품명으로 검색(검색어포함한것 모두)
						}else if(menu2.contentEquals("4")) {
							System.out.print("검색할 상품명을 입력하세요 : ");
							String sname = sc.nextLine();
							dos.writeUTF(sname);
							dos.flush();
							System.out.println("\t====\t상품 목록\t====\t");
							System.out.println("고유번호\t상품명\t상품설명\t등록날짜");	
							int productLength = dis.readInt();
							for(int i=0; i<productLength; i++) {
								String productId = dis.readUTF();
								String productName = dis.readUTF();
								String productText = dis.readUTF();
								String productDate = dis.readUTF();
								System.out.println(productId+"\t"+productName+ "\t"+productText + "\t"+productDate);
							}


							//종료
						}else if(menu2.contentEquals("5")) { 
							System.out.println("프로그램을 종료합니다.");
							System.exit(0);

						}

					}
				}
			}
		}catch(Exception e) {
			e.printStackTrace();
		}
	}

}

 

 

서버 코드

더보기
import java.net.ServerSocket;
import java.net.Socket;

public class Server {

	public static void main(String[] args) {

		try {
			ServerSocket server = new ServerSocket(20000);
			System.out.println("서버가 구동되었습니다.");

			while(true) {
				Socket sock = server.accept();
				new SocketThread(sock).start();
			}

		}catch(Exception e) {
			e.printStackTrace();
		}

	}

}

+ Recent posts