클라이언트 서버 데이터베이스테이블

 

1. SignUp -> (ID/PW/NAME) + SignupData

2. ID DuplicationCheck 1


OJDBC 라이브러리 프로젝트로 가져오기 잊지말자!

 


데이터베이스에 Member 테이블 생성

--SQL (오라클 : 접속 사용자 kh, 비밀번호 kh)

create table member(
    sid varchar(128) primary key,
    spw varchar(128) not null,
    sname varchar(128),
    sdate date
);

Member class 생성

더보기
import java.util.Scanner;

public class Member {
	
	private String sid;
	private String spw;

	private String sname;
	private String sdate;
	
	public Member(String sid) {
		
		super();
		this.sid = sid;
		
	}
	
	public Member(String sid,String spw,String sname,String sdate) {
		
		super();
		this.sid = sid;
		this.spw = spw;
		this.sname = sname;
		this.sdate = sdate;
		
	}
	
	
	public String getSid() {
		return sid;
	}
	public void setSid(String sid) {
		this.sid = sid;
	}
	public String getSpw() {
		return spw;
	}
	public void setSpw(String spw) {
		this.spw = spw;
	}
	public String getSname() {
		return sname;
	}
	public void setSname(String sname) {
		this.sname = sname;
	}
	public String getSdate() {
		return sdate;
	}
	public void setSdate(String sdate) {
		this.sdate = sdate;
	}
	
}

각종 기능 모음 - 매니저

 

	//DB접속 - 오라클드라이버 - 로컬경로 
	public Connection getConnection() throws Exception {
		Class.forName("Oracle.jdbc.driver.OracleDriver");
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String user = "kh";
		String password = "kh";
		Connection con = DriverManager.getConnection(url, user, password);
		return con;
	}
	// 중복체크 : 이 ID 존재하니?
    public boolean isIdExist(String id) throws Exception{
		String sql = "select id 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();
			}
		}
	}
	// 회원가입 - DB에 insert	
    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;
		}
	}​
	// 로그인
    // 받은 아이디,비밀번호에 해당하는 데이터 ResultSet rs에 담기
    // rs의 컬럼들을 멤버리스트 sdt에 넣어서 반환

    	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;
			}
		}
	}
	// SHA-512 암호화
    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;
	}

 

매니저 전체 코드

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

public class SignUPManager {

	public Connection makeConnection() throws Exception {
		Class.forName("oracle.jdbc.driver.OracleDriver");
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String loginId = "kh";
		String loginPw = "kh";
		Connection con = DriverManager.getConnection(url, loginId, loginPw);
		return con;
	}
	
	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;
		}
	}
	
	//id만 중복체크하는 형태로 변경???
	public List<Member> checkID(String sid) throws Exception {
		String sql = "select * from member where sid = ?";
		try(
				Connection con = this.makeConnection();
				PreparedStatement pstat = con.prepareStatement(sql);

				){
			pstat.setString(1, sid);
			try(ResultSet rs = pstat.executeQuery();){
				List<Member> sdt = new ArrayList<>();
				while(rs.next()) {

					String cid =rs.getString("sid");
					
					sdt.add(new Member(cid));	
				}
				
				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;
	}
	
}

다중접속을 위한 SocketThread

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;

public class SocketThread extends Thread{

	private Socket sock;
	
	public SocketThread(Socket sock) {
		this.sock = sock;
	}
	
	public void run() {
		try {
		DataInputStream dis = 
				new DataInputStream(sock.getInputStream());
		DataOutputStream dos = 
				new DataOutputStream(sock.getOutputStream());
		
		Manager manager = new Manager();
		
		while(true) {
        
			//첫 메뉴창에서 입력 받기
			String menu = dis.readUTF();
			
			if(menu.contentEquals("1")) {
				
                //1번 선택시 회원 가입
				
			}else if(menu.contentEquals("2")){
				
                 //2번 선택시 로그인

			}
			
		}
		
		}catch(Exception e) {
			e.printStackTrace();
		}
		
	}
}
	//1번 선택시 회원 가입
    
			if(menu.contentEquals("1")) {
			
				//1-1. 아이디 받기
				String id = dis.readUTF();
				
				//1-2. 아이디 중복 체크
				if(manager.isIdExist(id) == true) {
					dos.writeBoolean(true);
					dos.flush();
				}else {
					dos.writeBoolean(false);
					dos.flush();
					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();
				
			}
	//2번 선택시 로그인
	else if(menu.contentEquals("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); //성공
				}else {
					dos.writeBoolean(false); //실패
				}
				dos.flush(); //보내기
				
				
			}
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

public class Server {

	public static void main(String[] args) {

		SignUPManager manager = new SignUPManager();

		String msg = null;

		try {
			ServerSocket server = new ServerSocket(20000);

			System.out.println("서버를 가동했습니다.");
			Socket sock = server.accept();
			System.out.println(sock.getInetAddress() + " 에서 연결");


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

			//아이디 비번 이름 받기
			//			dos.writeUTF(getStrInput("아이디를 입력하세요"));
			//			dos.writeUTF(JOptionPane.showInputDialog("비밀번호를 입력하세요"));
			boolean dupliCheck = true;

			String sid = "";

			while(dupliCheck) {
				dos.writeUTF("아이디를 입력하세요");
				dos.flush();
				sid =dis.readUTF();
				//sid의 Duplication Check 필요

				List<Member> users = manager.checkID(sid);
				//경로 설정 import java.util.ArrayList;

				if(users.size() == 0)
					dupliCheck = false;


				if(dupliCheck == false) break;

			}

			dos.writeUTF("비밀번호를 입력하세요");
			dos.flush();
			String spw =manager.getSHA512(dis.readUTF());

			dos.writeUTF("이름을 입력하세요");
			dos.flush();
			String sname =dis.readUTF();


			//가입
			try {
				int result = manager.insert(sid, spw, sname);
				if(result>0) {
					dos.writeUTF("성공적으로 가입되었습니다.");
					dos.flush();
				}else {
					dos.writeUTF("알 수 없는 이유로 입력에 실패했습니다.");
					dos.flush();
				}
			}catch(Exception e) {
				e.printStackTrace();
				dos.writeUTF("알 수 없는 이유로 입력에 실패했습니다.");
				dos.flush();
			}




		}catch(Exception e) {
			e.printStackTrace();
			System.out.println("서버측에러");

		}
	}

}

 

 


서버측 코드

import java.net.ServerSocket;
import java.net.Socket;

public class Server {

	public static void main(String[] args) {
		
		try {
			ServerSocket server = new ServerSocket(20000);
			while(true) {
				Socket sock = server.accept();
				new SocketThread(sock).start();
			}
		} catch(Exception e) {
			e.printStackTrace();
		}	
		
	}
	
}

클라이언트 코드

 

 

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

import javax.swing.JOptionPane;

public class Client {
	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		try {
			//192.168.60.13
			//127.0.0.1//혼자 연습			

			Socket sock  = new Socket("127.0.0.1", 20000);

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

			while(true) {
				//dos.writeUTF(sc.nextLine());
				
				//아이디
				dos.writeUTF(JOptionPane.showInputDialog(dis.readUTF()));
				dos.flush();
				//비번
				dos.writeUTF(JOptionPane.showInputDialog(dis.readUTF()));
				dos.flush();
				//이름
				dos.writeUTF(JOptionPane.showInputDialog(dis.readUTF()));
				dos.flush();


				System.out.println(dis.readUTF());
				break;
			}

		}catch(Exception e) {
			e.printStackTrace();
			System.out.println("클라이언트 에러");

		}
	}
}

 


중복체크 - if문 필요 없음

	public boolean isIdExist(String id) throws Exception{

		String sql = "select id from member where id = ?";
		try(
				Connection con = makeConnection();
				PreparedStatement pstat = con.prepareStatement(sql);
				){
			pstat.setString(1, id);
			try(ResultSet rs = pstat.executeQuery();){
				return rs.next();
			}
		}
	}

boolean은 의문문으로 명명하기


SQL 쿼리문 전송시 주의 할 점 - 검색기능을 사용하고 싶을 경우 % 사용법

		String sql = "select id from member where sid = %?%";
        // 문제 발생
	// 올바른 % 사용
    public boolean isIdExist(String id) throws Exception{

		String sql = "select id 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();
			}
		}
	}

Thread - 로그인 기능

Day_JDBC_03_Thread.zip
0.01MB


https://codevang.tistory.com/category/JAVA/-%20%EA%B8%B0%EB%B3%B8%20%EB%AC%B8%EB%B2%95?page=2

 

 

'JAVA/- 기본 문법' 카테고리의 글 목록 (2 Page)

 

codevang.tistory.com


char 와 varchar 차이

데이터베이스 개념

(서브쿼리 빼고)3일간 배운 것들

result set

sql 삽입 등등

오라클 자료형

 

문제해결 시나리오 : 코드 안에서 ArrayList + map

지저분한 문제?

rs.getInt() 1부터 시작

MAP 잘 알아두기


Client.java
0.00MB
Manager.java
0.00MB
Member.java
0.00MB
Server.java
0.00MB
SocketThread.java
0.00MB

오류 코드 수정하기


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.List;

import org.apache.commons.dbcp2.BasicDataSource;

public class Manager {
	
	public Connection makeConnection() throws Exception {
		Class.forName("oracle.jdbc.driver.OracleDriver");
		String url = "jdbc:oracle:thin:@localhost:1521:xe";
		String loginId = "kh";
		String loginPw = "kh";
		Connection con = DriverManager.getConnection(url, loginId, loginPw);
		return con;
	}
	
	//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 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;
			}
		}
	}
}

 

SocketThread 코드

더보기
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 = new Manager();

			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); //성공
					}else {
						dos.writeBoolean(false); //실패
					}
					dos.flush(); //보내기


				}


			}


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

	}

}

 

Server 코드

더보기
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();
		}
		
	}
	
}

 

Client 코드

더보기
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.net.Socket;
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("로그인이 실패하였습니다.");
					}
				}
			}
		}catch(Exception e) {
			e.printStackTrace();
		}
	}

}

 

+ Recent posts