회원관리 및 글쓰기/글조회/글변경/글삭제 프로그램을 만들어 보자.
(SQL)JDBC_MYORAUSER
create table jdbc_tbl_member
(no number
,userid varchar2(20) not null
,passwd varchar2(20) not null
,name varchar2(40) not null
,adress varchar2(200)
,birthday varchar2(20) -- 생년월일
,gender number(1) -- 1 : 남 / 2 : 여
,registerday date default sysdate
,point number default 0 -- 글쓰기를 1개 할 때마다 point는 10점씩 증가
,status number(1) default 1 -- 1 : 회원이 가입된 상태 / 2 : 회원이 탈퇴된 상태
,constraint PK_jdbc_tbl_member_no primary key(no)
,constraint UK_jdbc_tbl_member_userid unique(userid)
,constraint CK_jdbc_tbl_member_point check(point >= 0)
,constraint CK_jdbc_tbl_member_gender check(gender in (1, 2))
,constraint CK_jdbc_tbl_member_status check(status in(0,1))
);
create sequence seq_jdbc_tbl_member
start with 1
increment by 1
nomaxvalue
nominvalue
nocycle
nocache;
▷결과
Table JDBC_TBL_MEMBER이(가) 생성되었습니다.
Sequence SEQ_JDBC_TBL_MEMBER이(가) 생성되었습니다.
-- JAVA Package(jdbc.day03.memberNboard.mainApp)와 Class(MemberNBoardMainApp, main method 포함)를 생성
-- MVC(Model View Controller) 패턴
▷ Model : 데이터베이스와 관련된 업무를 담당하는 클래스
· DTO(Data Transfer Object) == VO(Value Object)
→ 데이터베이스 Table의 행(ROW)
insert / select 할 때 데이터의 전송/수신(운반) 단위
· DAO(Database Access Object)
→ 데이터베이스 서버에 접근하여 작업(DDL, DML, DQL(select))을 처리해 주는 클래스
▷ View : 결과물을 보여주는 곳
(console이라면 main() 메소드가 있는 클래스
→ System.out.println();
Web 브라우저를 사용하는 것이라면
→ *.jsp JSP란? HTML상에 Java코드가 들어가 있는 것)
▷ Controller : 사용자가 어떤 요구를 했을 때 그 요구에 대한 응답을 처리해 주도록 하는 클래스
-- 메뉴 메소드(menu)와 main method 안에 스캐너, 메뉴선택 할 수 있는 switch case 문을 만든다.
(Eclipse) MemberNBoardMainApp
package jdbc.day03.memberNboard.mainApp;
import java.util.*;
public class MemberNBoardMainApp {
// 메뉴
public static void menu() {
System.out.println("================ >> 메뉴 << =================");
System.out.println("1. 회원가입 2. 로그인 3. 로그아웃 \n" + "100. 종료");
System.out.println("===========================================");
System.out.print("\n ▷ 메뉴번호 선택 : ");
} // end of static void menu() --------------------
public static void main(String[] args) {
// 스캐너
Scanner sc = new Scanner(System.in);
// 메뉴선택 switch case 100을 입력하면 종료한다.
String strMenuNo = "";
do {
MemberNBoardMainApp.menu();
strMenuNo = sc.nextLine();
switch (strMenuNo) {
case "1": // 회원가입
break;
case "2": // 로그인
break;
case "3": // 로그아웃
break;
case "100": // 프로그램 종료
break;
default:
System.out.println(">> 메뉴에 없는 번호를 선택하셨습니다. \n");
break;
}
} while (!"100".equals(strMenuNo));
System.out.println(">>> 프로그램을 종료합니다. <<<");
sc.close();
}
}
-- Package(jdbc.day03.member.controller)와 Interface(InterMemberCtrl)를 생성
-- 동일 Package(jdbc.day03.member.controller)에 Class(MemberCtrl)를 생성하고 Class에 Interface(InterMemberCtrl)를 추가한다.
1. 회원가입
(Eclipse)package jdbc.day03.member.controller;
import java.util.Scanner;
public interface InterMemberCtrl {
// 1. 회원가입
int insertMember(Scanner sc);
}
(Eclipse)package jdbc.day03.member.controller;
import java.util.Scanner;
public class MemberCtrl implements InterMemberCtrl {
// 1. 회원가입(insert)을 해 주는 메소드 생성하기
@Override
public int insertMember(Scanner sc) {
int result = 0;
System.out.println("▷ 사용자ID : ");
String userid= sc.nextLine();
System.out.println("▷ 암호 : ");
String passwd = sc.nextLine();
System.out.println("▷ 성명 : ");
String name = sc.nextLine();
System.out.println("▷ 주소 : ");
String address = sc.nextLine();
System.out.println("▷ 생년월일(예 : 19971004) : ");
String birthday = sc.nextLine();
System.out.println("▷ 성별(1.남 / 2.여) : ");
String gender = sc.nextLine();
return result;
}
}
-- 변수는 컬럼명과 똑같이 해야 한다.
-- Package(jdbc.day03.member.model)와 Class(MemberDTO) 생성
(Eclipse)package jdbc.day03.member.model;
public class MemberDTO {
private int no;
private String userid;
private String passwd;
private String name;
private String address;
private String birthday;
private int gender;
private String registerday;
private int point;
private int status;
}
-- Generate Getters and Setters - Select All
(Eclipse) class MemberCtrl의 insertMember()
MemberDTO mbrdto = new MemberDTO();
mbrdto.setUserid(userid);
mbrdto.setPasswd(passwd);
mbrdto.setName(name);
mbrdto.setAddress(address);
mbrdto.setBirthday(birthday);
mbrdto.setGender(Integer.parseInt(gender));
-- DB로 보내기 위해 사용자가 입력한 내용을 mbrdto에 담는다.
-- Package(jdbc.day03.member.model)에 Interface(InterMemberDAO) 생성
(Eclipse) InterMemberDAO
package jdbc.day03.member.model;
import java.util.Scanner;
public interface InterMemberDAO {
// 1. 회원가입
int insertMember(MemberDTO mbrdto, Scanner sc);
}
-- Package(jdbc.day03.member.model)에 Class(MemberDAO) 생성하고 Interface(InterMemberDAO) 추가
(Eclipse) MemberDAO
package jdbc.day03.member.model;
import java.sql.*;
import java.util.Scanner;
public class MemberDAO implements InterMemberDAO {
private Connection conn = null;
private PreparedStatement pstmt = null;
private ResultSet rs = null;
// 1. 회원가입을 해 주는 메소드 생성하기
@Override
public int insertMember(MemberDTO mbrdto, Scanner sc) {
int result = 0;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "myorauser", "eclass");
conn.setAutoCommit(false);
String sql = " insert into jdbc_tbl_member(no, userid, passwd, name, address, birthday, gender, registerday, point, status) "
+ " values(seq_jdbc_tbl_member.nextval, ?, ?, ?, ?, ?, ?, default, default, default) ";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, mbrdto.getUserid());
pstmt.setString(2, mbrdto.getPasswd());
pstmt.setString(3, mbrdto.getName());
pstmt.setString(4, mbrdto.getAddress());
pstmt.setString(5, mbrdto.getBirthday());
pstmt.setInt(6, mbrdto.getGender());
result = pstmt.executeUpdate();
do {
System.out.print(">> 정말로 회원 가입을 하시겠습니까? [Y/N]");
String yn = sc.nextLine();
if (result == 1 && ("Y".equals(yn) || "y".equals(yn))) {
conn.commit();
break;
} else if (result == 1 && ("N".equals(yn) || "n".equals(yn))) {
conn.rollback();
result = 0;
break;
}
} while (true);
} catch (ClassNotFoundException e) {
System.out.println(">> ojdbc6.jar 파일이 없습니다. <<");
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (pstmt != null) pstmt.close();
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return result;
}
}
(Eclipse) MemberCtrl
result = mbrdao.insertMember(mbrdto, sc);
(Eclipse) MemberNBoardMainApp switch case "1"
String msg = (n==1)?">> 회원가입 성공!! <<":">> 회원가입 취소 또는 실패!! <<";
System.out.println("\n"+msg+"\n");
2. 로그인
(Eclipse)InterMemberCtrl
MemberDTO login(Scanner sc);
-- 추상 메소드를 생성하였으므로 Class(MemberCtrl)에서 메소드 재정의를 해 주어야 한다.
(Eclipse)MemberCtrl
@Override
public MemberDTO login(Scanner sc) {
MemberDTO loginuser = null;
System.out.println("▷ ID : ");
String userid = sc.nextLine();
System.out.println("▷ 암호 : ");
String passwd = sc.nextLine();
Map<String, String> paraMap = new HashMap<String, String>();
paraMap.put("userid", userid);
paraMap.put("passwd", passwd);
loginuser = mbrdao.login(paraMap);
return loginuser;
}
(Eclipse)InterMemberDAO
MemberDTO login(Map<String, String> paraMap);
(Eclipse)MemberDAO
@Override
public MemberDTO login(Map<String, String> paraMap) {
MemberDTO mbrdto = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "myorauser", "eclass");
String sql = "select no, userid, passwd, name, address\n"+
" , substr(birthday, 1, 4) || '-' || substr(birthday, 5, 2) || '-' || substr(birthday, 7) AS birthday\n"+
" , to_char(registerday, 'yyyy-mm-dd hh24:mi:ss') AS registerday\n"+
" , gender, point\n"+
"from jdbc_tbl_member\n"+
"where status = 1 and\n"+
" userid = ? and\n"+
" passwd = ? ";
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, paraMap.get("userid")); // hashMap에 잇는 userid, passwd를 ? 에 대입
pstmt.setString(2, paraMap.get("passwd"));
rs = pstmt.executeQuery();
if(rs.next()) {
int no = rs.getInt("no");
String userid = rs.getString("userid");
String passwd = rs.getString("passwd");
String name = rs.getString("name");
String address = rs.getString("address");
String birthday = rs.getString("birthday");
String registerday = rs.getString("registerday");
int gender = rs.getInt("gender");
int point = rs.getInt("point");
mbrdto = new MemberDTO();
mbrdto.setNo(no);
mbrdto.setUserid(userid);
mbrdto.setPasswd(passwd);
mbrdto.setName(name);
mbrdto.setAddress(address);
mbrdto.setBirthday(birthday);
mbrdto.setRegisterday(registerday);
mbrdto.setGender(gender);
mbrdto.setPoint(point);
}
} catch (ClassNotFoundException e) {
System.out.println(">> ojdbc6.jar 파일이 없습니다. <<");
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
if (rs != null) rs.close();
if (pstmt != null) pstmt.close();
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return mbrdto;
}
(Eclipse)MemberNBoardMainApp switch case "2"
case "2":
loginuser = mbrCtrl.login(sc);
msg = (loginuser != null)?">> 로그인 성공!! <<":">> 로그인 실패!! <<";
System.out.println("\n"+msg+"\n");
break;
3. login 성공 시 메뉴 위에 "[name]님 현재 로그인 중" 이라고 보여주기
(Eclipse)MemberNBoardMainApp do ~ while
if(loginuser != null) {
System.out.println("==== >> "+loginuser.getName()+"님 현재 로그인 중... << ====");
}
3. 로그아웃
(Eclipse)MemberNBoardMainApp switch case "3"
if(loginuser != null) {
loginuser = null;
System.out.println(">> 로그아웃 되었습니다. <<\n");
} else {
System.out.println(">> 현재 로그인 중이 아닙니다. << \n");
}
4. 내 정보 보기
-- 이미 로그인 상태이므로 MemberDTO에서 정보를 조회하는 메소드만 생성하여 호출하면 되지만 interface를 사용하는 방법에 대해서 알아보자.
▷ Interface 사용하는 방법
-- Package(jdbc.day03.member.model)에 Interface(InterMemberDTO) 생성
-- Class(MemberDTO)에 Interface(InterMemberDTO)를 implements 해 준다.
(Eclipse)InterMemberDTO
String showMemberInfo();
(Eclipse)MemberDTO
@Override
public String showMemberInfo() {
StringBuilder sb = new StringBuilder();
// 현재 나이
Calendar currentDate = Calendar.getInstance();
int currentYear = currentDate.get(Calendar.YEAR);
int age = currentYear - Integer.parseInt(birthday.substring(0, 4)) + 1;
// 성별 int -> String
String strGender = "";
if(gender == 1)
strGender = "남자";
else
strGender = "여자";
sb.append("=== 나의 정보 === \n");
sb.append("1. 아이디 : "+userid+"\n");
sb.append("2. 암호 : "+passwd+"\n");
sb.append("3. 성명 : "+name+"\n");
sb.append("4. 주소 : "+address+"\n");
sb.append("5. 가입일자 : " +registerday.substring(0, 10)+ "\n");
sb.append("6. 생년월일 : "+birthday+"\n");
sb.append("7. 나이 : "+age+"\n");
sb.append("8. 성별 : "+gender+"\n");
sb.append("9. 포인트 : "+point+"\n");
return sb.toString();
}
(Eclipse)MemberNBoardMainApp switch case "4"
if(loginuser != null)
System.out.println(loginuser.showMemberInfo());
else
System.out.println(">> 먼저 로그인 하세요. <<\n");
break;