클라이언트 서버 데이터베이스테이블
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 - 로그인 기능
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 잘 알아두기
오류 코드 수정하기
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();
}
}
}
'디지털 컨버전스 > JDBC' 카테고리의 다른 글
[JDBC] DBCP - DataBase Connection Pool , Singleton Pattern , Thread 동기화 (0) | 2020.03.30 |
---|---|
[JDBC] 네트워크 회원가입 & 재고 관리 예제 (0) | 2020.03.27 |
[JDBC] Encryption (0) | 2020.03.26 |
[JDBC] 학생관리프로그램, PreparedStatement (0) | 2020.03.25 |
[JDBC] OJDBC, forName, Connection, Statement, executeUpdate, executeQuery (0) | 2020.03.24 |