Dev/Java

[java] DB를 이용한 방명록 프로그램 구현

창문닦이 2019. 2. 3. 21:31

  회원만이 방명록에 글을 올릴수 있고 회원이 아니면 글을 볼수 없는 프로그램 만들기 

 

1. 기본 테이블 작성

① 기본정보(아이디,비밀번호,이름...)-basicdata 

create table basicdata

(id varchar2(10) primary key,

pwd varchar2(20) not null,

name varchar2(20) not null);

 

② 상세정보(전화,생일...)-detaildata       

create table detaildata       

(id varchar2(10) primary key,

tel varchar2(10) not null,

birth DATE not null,

gender varchar2(20) not null,

CONSTRAINT FK_DETAILDATA_ID FOREIGN KEY(ID)

REFERENCES BASICDATA(ID));         

                                                                                                                      

③ 방명록(번호,이름(조인),아이디,내용,날짜...)-bang

create table bang

(tableno number(5),

id varchar2(10),

text varchar2(100),

inputdate date not null,

CONSTRAINT FK_BANG_ID FOREIGN KEY(ID)

REFERENCES BASICDATA(ID)) ;

 

④ 방명록 번호로 사용할 시퀀스 생성 

CREATE SEQUENCE tableno

START WITH 1

INCREMENT BY 1

NOMAXVALUE

NOCYCLE

NOCACHE;

2. 방화벽 해제 방법

 

 

서버피시와의 연결을 위해 방화벽에서 인바운드규칙 1521번 포트 열어줌

제어판 방화벽-고급설정-인바운드규칙-새규칙-포트 1521

 

3. 방명록 프로그램 만들기

① DBConn : 서버 pc와의 연결을 위한 클래스  

package com.guestbook;
import java.sql.Connection;
import java.sql.DriverManager;
//db를 연결하는 소스코드. db여러개 연결 가능
public class DBConn {


private static Connection dbConn; //db연결자를 담을 수 있는 변수


public static Connection getConnection(){
//이미 메모리에 올라가있으므로 가져다 사용하면 됨


if(dbConn==null){//null일 경우 연결이 되지 않은 상태


try {


String url = "jdbc:oracle:thin:@192.168.16.16:1521:TestDB";
//jdbc방식으로 type4형식(thin:가장 직관적이고 가볍다), 해당 ip주소를 가진 1521포트의 TestDB로 연결하겠다.
//@192.168.16.16 -> @localhost 클라이언트pc로 접속시.
//EXPRESS로 설치하면 TestDB가 아니라 무조건 xe로 설정됨


String user = "SUZI";
String password = "A123";


Class.forName("oracle.jdbc.driver.OracleDriver");//다른클래스의 정보를 읽어올 때 사용
//oracle.jdbc.driver위치의 OracleDriver클래스를 읽어온다.
//오라클에 있는 드라이버가 있는지 확인하는 역할. 이 드라이버가 있어야 드라이버매니저를 실행할 수 있다
//동적으로 클래스를 로딩한다. 좀 더 빠른 접근이 가능.


dbConn = DriverManager.getConnection(url, user, password);
//DriverManager를 통해서 내가 지정한 url, user, password로 스트림을 생성해서 dbConn에 담는 것


} catch (Exception e) {
System.out.println(e.toString());
}
}
return dbConn;
}


public static void close(){


if(dbConn!=null){//null이 아니면 연결되어 있는 상태
try {


if(!dbConn.isClosed()){
dbConn.close();//반드시 close메소드를 호출해서 dbConn.close()가 사용되도록 처리해야한다.
}


} catch (Exception e) {
System.out.println(e.toString());
}
}
dbConn = null;
//파이프라인이 연결되어 있는 상태에서 연결을 끊게 되면 스트림안에 쓰레기값이 남게됨
//두번째 연결시 쓰레기값으로 인하여 adapter 오류 발생
//따라서 연결 종료시 항상 초기화를 진행해야한다.
}
}

 

② GB : 사용자의 입력값을 저장

package com.guestbook;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.Iterator;
import java.util.List;
import java.util.Scanner;
public class GB {
Scanner sc = new Scanner(System.in);
GBDAO dao = new GBDAO();
GBException ge = new GBException();
// 방명록조회
public void selectGB() {
List<GBDTO> lists = dao.selectbang();
Iterator<GBDTO> it = lists.iterator();
// lists 출력
while (it.hasNext()) {
GBDTO dto = it.next();
dto.print();
}
}
// 회원탈퇴
public void deleteMember() {
try {
String delid, delpwd;
System.out.println("삭제할 정보를 입력하세요.");
System.out.print("id: ");
delid = sc.next();
System.out.print("pwd: ");
delpwd = sc.next();
int result = dao.deletedata(delid, delpwd);
if (result==1) {
System.out.println("회원탈퇴가 성공적으로 진행되었습니다!");
} else {
System.out.println("회원탈퇴가 진행되지 못하였습니다! 회원정보를 확인해주세요.");
}
} catch (Exception e) {
// TODO: handle exception
}
}
public void insertGB(String id) {
try {
GBDTO dto = new GBDTO();
// 아이디
dto.setId(id);
System.out.print("방명록 내용:");
dto.setText(sc.next());
int result = dao.insertGB(dto);
if (result!=0) {
System.out.println("작성 완료!!");
} else {
System.out.println("작성 실패!!");
}
} catch (Exception e) {
System.out.println(e.toString());
}
}
public void deleteGB(String id) {
GBDTO dto = new GBDTO();
try {
System.out.println("삭제할 방명록 번호");
int dn = sc.nextInt();
int result = dao.deleteGB(dn, id);
if (result != 0)
System.out.println("삭제 성공!!");
else
System.out.println("삭제 실패!!");
} catch (Exception e) {
System.out.println(e.toString());
}
}
public void insert() throws Exception {
String pw2 = null;
String str = null;
boolean phone = true;
boolean id = true;
boolean pw = true;
boolean name = true;
boolean gender = true;
System.out.println("             회원가입");
System.out.println("-------------------------------------");
try {
GBDTO dto = new GBDTO();
do {
try {
System.out.print("아이디:");
str = (sc.next());
ge.idFormat(str);
id = false;
dto.setId(str);
} catch (Exception e) {
System.out.println(e.toString());
}
} while (id);
do {
try {
System.out.print("비밀번호:");
dto.setPwd(sc.next());
System.out.print("비밀번호 확인:");
pw2 = sc.next();
ge.pwCheck(dto.getPwd(), pw2);
pw = false;
} catch (Exception e) {
System.out.println(e.toString());
}
} while (pw);
do {
try {
System.out.print("이름:");
str = sc.next();
ge.nameCheck(str);
name = false;
dto.setName(str);
} catch (Exception e) {
System.out.println(e.toString());
}
} while (name);
System.out.print("성별[남/여]:");
str = sc.next();
dto.setGender(str);
System.out.print("생일[xxxx-xx-xx]:");
dto.setBirth(sc.next());
do {
try {
System.out.print("전화번호[xxx-xxxx-xxxx]:");
str = sc.next();
ge.phoneCheck(str);
phone = false;
dto.setTel(str);
} catch (Exception e) {
System.out.println(e.toString());
}
} while (phone);
int result = dao.insertMember(dto);
if (result != 0) {
System.out.println();
System.out.println("****성공적으로 가입이 되었습니다!****");
System.out.println();
System.out.println("-----------[회원가입 확인]-----------");
} else
System.out.println("회원가입에 실패했습니다");
} catch (Exception e) {
System.out.println(e.toString());
}
}
public String login() {
String id;
String pwd;
String checkid = null;
try {
GBDTO dto = new GBDTO();
System.out.print("아이디:");
id = sc.next();
System.out.print("비밀번호:");
pwd = sc.next();
checkid = dao.login(id, pwd);
} catch (Exception e) {
System.out.println(e.toString());
return checkid;
}
return checkid;
}
}

③ GBDAO : sql 작성

package com.guestbook;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
public class GBDAO {
// 방명록조회
public List<GBDTO> selectbang() {


List<GBDTO> lists = new ArrayList<GBDTO>();
Connection conn = DBConn.getConnection();
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql;
try {
sql = "select tableno, id, to_char(inputdate,'yyyy-mm-dd'), text ";
sql += "from bang order by tableno ";
pstmt = conn.prepareStatement(sql);
rs = pstmt.executeQuery();
while (rs.next()) {
// 레코드에 있는 내용을 dto에 입력
GBDTO dto = new GBDTO();
dto.setTableno(rs.getInt("tableno"));
dto.setId(rs.getString("id"));
dto.setInputdate(rs
.getString("to_char(inputdate,'yyyy-mm-dd')"));
dto.setText(rs.getString("text"));
// dto를 리스트에 추가
lists.add(dto);
}
rs.close();
pstmt.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return lists;
}
// 회원탈퇴
public int deletedata(String id, String pwd) {
int result1 = 0, result2 = 0;
Connection conn = DBConn.getConnection();
PreparedStatement pstmt = null;
String sql;
try {
sql = "delete detaildata where id=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
result2 = pstmt.executeUpdate();
pstmt.close();


sql = "delete basicdata where id=? and pwd =?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2, pwd);
result1 = pstmt.executeUpdate();
pstmt.close();


conn.commit();
} catch (Exception e) {
System.out.println(e.toString());
}
if (result1==1 && result2==1) {
return 1;
} else {
return 0;
}
}
// 1.inserMember
public int insertMember(GBDTO dto) {
int result = 0;
Connection conn = DBConn.getConnection();
PreparedStatement pstmt = null;
String sql;
try {
sql = "insert into basicdata (id,pwd,name) ";
sql += "values (?,?,?)";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, dto.getId());
pstmt.setString(2, dto.getPwd());
pstmt.setString(3, dto.getName());
pstmt.executeUpdate();
sql = "insert into detaildata (id,tel,birth,gender) ";
sql += "values (?,?,?,?)";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, dto.getId());
pstmt.setString(2, dto.getTel());
pstmt.setString(3, dto.getBirth());
pstmt.setString(4, dto.getGender());
result = pstmt.executeUpdate();
pstmt.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return result;
}
// 2.login
public String login(String id, String pwd) {
String login = null;
List<GBDTO> lists = new ArrayList<GBDTO>();
Connection conn = DBConn.getConnection();
PreparedStatement pstmt = null;
ResultSet rs = null;
String sql;
try {
sql = "select id,pwd from basicdata where id=? and pwd=?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2, pwd);
rs = pstmt.executeQuery();
if (rs.next())
login = id;
else
login = "";
pstmt.close();
rs.close();
} catch (Exception e) {
System.out.println(e.toString());
return login;
}
return login;
}
public int insertGB(GBDTO dto) {
int result = 0;
Connection conn = DBConn.getConnection();
PreparedStatement pstmt = null;
String sql;
try {
sql = "insert into bang (tableno,id,text,inputdate) ";
sql += "values (tableno.nextval,?,?,sysdate)";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, dto.getId());
pstmt.setString(2, dto.getText());
result = pstmt.executeUpdate();
pstmt.close();


} catch (Exception e) {
System.out.println(e.toString());
}
return result;
}
public int deleteGB(int dn, String id) {
int result = 0;
Connection conn = DBConn.getConnection();
PreparedStatement pstmt = null;
String sql;
try {
sql = "delete bang where id=? and tableno =?";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setInt(2, dn);
result = pstmt.executeUpdate();
pstmt.close();
} catch (Exception e) {
System.out.println(e.toString());
}
return result;
}
}

④ GBDTO : 데이터를 저장

package com.guestbook;
public class GBDTO {
private String id;
private String pwd;
private String name;
private String tel;
private String birth;
private String gender;
private int tableno;
private String text;
private String inputdate;


getter, setter 작성


public void print() {
System.out.printf("Table No.%d\t %s\t %s\n TEXT:%s\n\n", tableno, id, inputdate, text);


}


}

⑤ GBException : 예외처리 

package com.guestbook;
import java.util.regex.Pattern;
public class GBException {
//아이디 형식 확인
public void idFormat(String str) throws Exception {
if (str.length() < 5 || str.length() > 15) {
throw new Exception("3~10자 이내의 아이디만 가능합니다");
}
int cnt1 = 0;
int cnt2 = 0;
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
cnt1++;
else if (ch >= '0' && ch <= '9')
cnt2++;
}
if (cnt1 == 0 || cnt2 == 0)
throw new Exception("아이디는 영문자와 숫자를 혼용해서 만들어주세요");
}
//비밀번호 형식확인
public void pwCheck(String pw1, String pw2) throws Exception {
int cnt1 = 0;
int cnt2 = 0;
for (int i = 0; i < pw1.length(); i++) {
char ch = pw1.charAt(i);
if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z'))
cnt1++;
else if (ch >= '0' && ch <= '9')
cnt2++;
}
if (cnt1 == 0 || cnt2 == 0)
throw new Exception("아이디는 영문자와 숫자를 혼용해서 만들어주세요");
if (!pw1.equals(pw2))
throw new Exception("비밀번호가 다릅니다");
}
// 이름 확인
public void nameCheck(String name) throws Exception {
boolean check = Pattern.matches("^[ㄱ-ㅎ가-R]*$", name);
if (!check)
throw new Exception("※이름은 한글로 입력해주세요");
}
// 전화번호 확인
public void phoneCheck(String phone) throws Exception {
boolean check = Pattern.matches(
"(010|011|016|017|018?019)-(\\d{3,4})-(\\d{4})", phone);
if (!check)
throw new Exception("※전화번호 입력 형식은 [XXX-XXXX-XXXX]입니다");
}
//성별 확인
public void genCheck(String gender) throws Exception {
if (!gender.equals("남자") && !gender.equals("여자")) {
throw new Exception("※성별이 모호하군요!\n성별은 [남자/여자]로 적어주세요;)");
}
}
}

⑥ GBLogin : 로그인 성공시 메뉴

package com.guestbook;
import java.util.Scanner;
public class GBLogin {
public static void main(String[] args) throws Exception {


Scanner sc = new Scanner(System.in);


GB gb = new GB();


int ch;


while(true) {


String id = gb.login();


while(!id.equals("")){


do{
System.out.println("------------------------------------------------------------");
System.out.println("1.방명록 작성  2.방명록 조회 3.방명록 삭제   4.로그아웃");
System.out.println("------------------------------------------------------------");
System.out.print("▶");
ch = sc.nextInt();
}while(ch<1 || ch>4);


System.out.println();


switch (ch) {
case 1:
gb.insertGB(id);
break;
case 2:
gb.selectGB();
break;


case 3:
gb.deleteGB(id);         
break;


case 4:
GBMain.main(args);
break;
}
}


if(id.equals(""))
System.out.println("로그인에 실패하였습니다.");


GBMain.main(args);
}
}
}

⑦ GBMain : 메인문

package com.guestbook;
import java.util.Scanner;
public class GBMain {
public static void main(String[] args) {
// 회원가입 -> 방명록 작성, 방명록 조회, 방명록 삭제, 로그아웃
// 로그인
// 종료
Scanner sc = new Scanner(System.in);
int ch, ch2;
GB gb = new GB();


try {
while (true) {
do {
System.out.println("------------------------------------------------------------");
System.out.println("                         GUEST BOOK ");
System.out.println("1.회원가입    2.로그인 3.회원탈퇴     4.종료 ");
System.out.println("------------------------------------------------------------");
System.out.print("▶");
ch = sc.nextInt();
} while (ch < 1 || ch > 4);
switch (ch) {
case 1:
gb.insert(); //1. 회원가입
break;
case 2:
GBLogin.main(args); //2. 로그인
break;
case 3:
gb.deleteMember(); //3. 회원탈퇴
break;
case 4:
DBConn.close(); //4. 종료
System.exit(0);
}
}
} catch (Exception e) {
System.out.println(e.toString());
}
}
}