본문 바로가기

수업내용

[Day30][JDBC] 회원관리 및 글쓰기 / 글조회 / 글변경 / 글삭제

회원관리 및 글쓰기/글조회/글변경/글삭제 프로그램을 만들어 보자.

 

(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;