**재고관리 시스템
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();
}
}
}
'디지털 컨버전스 > JDBC' 카테고리의 다른 글
[oracle] 오라클 삭제 방법 (0) | 2020.05.21 |
---|---|
[JDBC] DBCP - DataBase Connection Pool , Singleton Pattern , Thread 동기화 (0) | 2020.03.30 |
[JDBC] 네트워크 회원가입 (0) | 2020.03.26 |
[JDBC] Encryption (0) | 2020.03.26 |
[JDBC] 학생관리프로그램, PreparedStatement (0) | 2020.03.25 |