회원만이 방명록에 글을 올릴수 있고 회원이 아니면 글을 볼수 없는 프로그램 만들기
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 ()); } } }