본문 바로가기

IT일반과목/JDBC

20180903 JDBC 코딩(다른방식의 코딩 여러가지)


1. controller부터 바꾸기


커밋과 롤백은 서비스에서 처리한다.


4번째는

Service 클래스에서 중복되는 코드를 제거 하도록 하겠음


 -> 드라이브 등록 코드

 -> DBMS 연결 코드(Connection)

 -> close 코드

 -> commit, rollback 코드




이거 해보겠다.



JDBC1 -> 기본적으로 만들기 statement

JDBC2 -> service없이 만들기 prestatement

JDBC3 -> service있게 만들기

JDBC4 -> new 남발하기 공통된거 없애기





JDBC1 -> 기본적으로 만들기 statement 사용하기!!!



package org.kh.member.controller;

import java.util.ArrayList;

import org.kh.member.dao.MemberDao;
import org.kh.member.model.vo.Member;

public class MemberController {

	// 컨트롤러 클래스의 역할
	// view에서 요청한 기능을 컨트롤러가 DAO와의 연결을 하는 역할

	// 회원 전체출력 메소드
	public void selectMemberAll() {
		MemberDao dao = new MemberDao();
		ArrayList<Member> list = dao.selectMemberAll(); // DAO의 회원 전체 조회 메소드 호출
		// 리턴한 list 결과 상황
		// 1. list 가 있을 때
		// 2. lost 가 없을 때

		if (!list.isEmpty())// .isEmpty =비어있따 // list가 있을 떄
		{

			// 결과출력
			System.out.println("\n----------------- 전체 회원 정보 조회 -----------------\n");
			System.out.println("아이디     비밀번호  이름   성별   나이   이메일   전화번호   주소   취미   가입일");


			//1번째 방식
			for(Member m : list) {
				System.out.println(m);//m만써도된다.
			}


			//2번째 방식
			/*
			for (Member m : list) {
				System.out.println(
						m.getMemberId() + "  " +
						m.getMemberPwd() + "  " +
						m.getMemberName() + "  "+ 
						m.getGender() + "  " +
						m.getAge() + "  " +
						m.getEmail() + "  " +
						m.getPhone()+ "  " +
						m.getAddress() + "  " +
						m.getHobby() + "  " +
						m.getEnrollDate());
			}
			 */


			//3번째 방식
			/*
			 * for (int i = 0; i < list.size(); i++) {
			 * System.out.println(list.get(i).getMemberId() + "  " +
			 * list.get(i).getMemberPwd() + "  " + list.get(i).getMemberName() + "  " +
			 * list.get(i).getGender() + "  " + list.get(i).getAge() + "  " +
			 * list.get(i).getEmail() + "  " + list.get(i).getMemberId() + "  " +
			 * list.get(i).getAddress() + "  " + list.get(i).getHobby() + "  " +
			 * list.get(i).getEnrollDate()); }
			 */

		} else// list가 없을 때
		{
			// 없다고 알려주는 코드
			System.out.println("회원 목록이 없습니다.");
		}

	}

	// 회원 아이디 검색 메소드
	public void selectMemberId(String userId) {//매개변수 낙타표기법으로 썼다.
		//System.out.println("입력받은 문자열 : "+userId);
		MemberDao dao=new MemberDao();
		dao.selectMemberId(userId);//dao를 그대로 dao한테줘서 그걸 DB한테그아이디로 검색하게끔 할것이다.
		Member m = dao.selectMemberId(userId);
		
		if(m!=null) //객체가 있을때(조회가 성공하였을때)
		{
			// 결과출력
			
			System.out.println("\n----------------- 전체 회원 정보 조회 -----------------\n");
			System.out.println("아이디     비밀번호  이름   성별   나이   이메일   전화번호   주소   취미   가입일");
			System.out.println(m);//하나일때는 굳이 m하나만 해주면 된다.
		}
		else //객체가 없을때(조회가 없어서 null이 리턴되었을때)
		{
			System.out.println("해당되는 ID를 가진 회원이 없습니다.");
		}
		
		
		

	}

	// 회원 이름 검색 메소드
	public void selectMemberName(String userName) {
		MemberDao dao = new MemberDao();
		dao.selectMemberName(userName);
		ArrayList<Member> list = dao.selectMemberName(userName); 
		
		if(!list.isEmpty()) {
			System.out.println("\n----------------- 전체 회원 정보 조회 -----------------\n");
			System.out.println("아이디     비밀번호  이름   성별   나이   이메일   전화번호   주소   취미   가입일");

			for(Member m:list) {
				System.out.println(m);
			}
		}else {
			System.out.println("누가없는거 찾으래!");
		}
	}

	// 회원 가입 메소드
	public void insertMember(Member m) {
		// TODO Auto-generated method stub
		MemberDao dao = new MemberDao();
		int result=dao.insertMember(m);
		
		if(result>0) {
			System.out.println("정상적으로 회원가입 되었습니다.");
		}
		else {
			System.out.println("회원 가입에 실패 하였습니다.");
		}
	}

	// 회원 정보 수정 메소드
	public void updateMember(String userId,Member m2) {
		MemberDao dao = new MemberDao();
		int result=dao.updatemember(userId,m2);
		if(result>0) {
			System.out.println("정보 수정이 정상 처리 되었습니다.");
		}else {
			System.out.println("회원 정보 수정이 실패 하였습니다.(관리자에게문의)");
		}
	}

	// 회원 탈퇴 메소드
		public void deleteMember(String userId) {
			MemberDao dao=new MemberDao();
			int result=dao.deleteMember(userId);
			
			if(result>0) {
				System.out.println("정상적으로 탈퇴 되었습니다.");
			}
			else {
				System.out.println("탈퇴가 실패 하였습니다.");
			}
			
		}

	public boolean searchUserId(String userId) {
		// TODO Auto-generated method stub
		//System.out.println("입력받은 문자열 : "+userId);
				MemberDao dao=new MemberDao();
				//dao.selectMemberId(userId);//dao를 그대로 dao한테줘서 그걸 DB한테그아이디로 검색하게끔 할것이다.
				Member m = dao.selectMemberId(userId);
				
				if(m!=null) //객체가 있을때(조회가 성공하였을때)
				{
					// 결과출력
					
					System.out.println("회원 조회가 완료되었습니다.");
					System.out.println("\n----------------- ["+userId+"]회원정보 -----------------\n");
					System.out.println("아이디     비밀번호  이름   성별   나이   이메일   전화번호   주소   취미   가입일");
					System.out.println(m);//하나일때는 굳이 m하나만 해주면 된다.
					return true;
				
				
				}
				else //객체가 없을때(조회가 없어서 null이 리턴되었을때)
				{
					System.out.println("해당되는 ID를 가진 회원이 없습니다.");
					return false;
				}
				
	}

	

}




package org.kh.member.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import org.kh.member.model.vo.Member;

public class MemberDao {
	
	//DBMS에 접근하는 전체 회원 조회 메소드
	public ArrayList<Member> selectMemberAll() {
		
		//필요한 레퍼런스 생성(Connection, Statement, ResultSet)
			
		//java.sql 패키지 import
		Connection conn = null; //Connection 레퍼런스 (객체 생성은 아직 안함)
		Statement stmt = null; //Statement 래퍼런스 (객체 생성은 아직 안함)
		ResultSet rset=null; //ResultSet 래퍼런스 (객체 생성은 아직 안함)

		ArrayList<Member> list=new ArrayList<Member>();
		
		//@ JDBC Coding 절차
		try {
			//1. Driver 등록
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			//2. DBMS와 연결 (Connection 사용)
			conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe"
					,"member", "member");
			//첫번째는 연결 정보(DB종류, 타입, IP주소, 포트 등등)
			//두번째는 연결하는 DB의 ID(아이디)
			//세번째는 연결하는 ID의 PW(비밀번호)
			//get으로 읽어오는것이므로 저장하는 것이다.conn에 저장하는 것이다.
			
			System.out.println(conn);
			// conn 레퍼런스 안에 있는 값을 출력시
			// DBMS에 정상연결 되었다면 hashCode 값(Connection 값)이 출력 되고
			// DBMS에 연결 실패 하였다면 null값을 리턴
			
			//3. Statement 생성 - 작성한 쿼리문을 전송할 객체를 생성 해야 함
			// Connection (conn) 객체를 이용하여 Statement 객체를 생성함
			stmt=conn.createStatement(); // Statement 객체 생성
				
			//4. SQL 전송
			// - Query 문이 있어야 전송합니다.
			String query = "select * from member";
			rset=stmt.executeQuery(query); // Statement 객체를 이용하여 쿼리문 실행
			//결과를 rset에 담는다.
			

			//5. 결과 처리
			// rset을 이용하여 결과를 처리함
			// rset.next() 메소드와 rset.set...() 메소드를 이용함
			// next 메소드는 각 행을 가리키는 메소드(작업시 마다 사용해야함)
			// set...() 메소드는 각 컬럼의 정보를 가져올때 사용함
			
			//rset.next()
			//rset.getString("member_id"); -> rset을 이용해스트링값갖고오는데 그컬럼명은 멤버아이디꺼갖고오라는 것이다.
			
			
			while(rset.next()) {
				Member m = new Member();
				
				//ID값 저장하기
				m.setMemberId(rset.getString("member_id"));
				m.setMemberPwd(rset.getString("member_pwd"));
				m.setMemberName(rset.getString("member_name"));
				m.setGender(rset.getString("gender").charAt(0));
				m.setAge(rset.getInt("age"));
				m.setEmail(rset.getString("email"));
				m.setAddress(rset.getString("address"));
				m.setPhone(rset.getString("phone"));
				m.setHobby(rset.getString("hobby"));
				m.setEnrollDate(rset.getDate("enroll_date"));

				list.add(m);
			}
			
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//오라클에 jdbc에 드라이버에 오라클드라이버를 등록하겠다.
		//이코드가 없어도 8버전부턴 가능하긴한데 넣어주는게 좋다.
		catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			//6. 연결된 리소스 닫기 (close 작업 - finally에서 작업)
			try {
				rset.close();
				stmt.close();
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}

		return list;
		
	}
	
	public Member selectMemberId(String userId) {
		
		Connection conn=null;//DBMS와 연결
		Statement stmt=null;//작성한 쿼리문을 전송할 객체를 생성 해야 함
		ResultSet rset=null;//SELECT 구문일 경우 ResultSet을 이용하여 정보를 객체에 담는 처리
		
		Member m = null; //멤버객체를 여기선 바깥에 만드는데 그 이유는?
		//결과가 조회되던안되던 리턴받을 것이다.
		
		try {
			
			//1. Driver 등록
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			//2. DBMS 연결
			conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "member", "member");
			//SQLException 에러 뜰수있기 때문에 catch로잡아줘야한다.
			
			//3. Statement 객체 생성
			// Connection (conn) 객체를 이용하여 Statement 객체를 생성함
			stmt=conn.createStatement();
			
			//4. SQL 전송
			// - Query 문이 있어야 전송합니다.
			String query="select * from member where member_id='"+userId+"'";
			rset=stmt.executeQuery(query);// Statement 객체를 이용하여 쿼리문 실행
			
			//5. 결과 처리
			// rset을 이용하여 결과를 처리함
			// rset.next() 메소드와 rset.set...() 메소드를 이용함
			// next 메소드는 각 행을 가리키는 메소드(작업시 마다 사용해야함)
			// set...() 메소드는 각 컬럼의 정보를 가져올때 사용함
			
			if(rset.next()) {//만약에 1명의 결과가 조회되었다면 진행하고 없다면 하지마라!
				
				m=new Member();//결과가 있으므로 정보를 저장할 VO 객체 생성
				m.setMemberId(rset.getString("member_id"));
				m.setMemberPwd(rset.getString("member_pwd"));
				m.setMemberName(rset.getString("member_name"));
				m.setGender(rset.getString("gender").charAt(0));
				m.setAge(rset.getInt("age"));
				m.setEmail(rset.getString("email"));
				m.setPhone(rset.getString("phone"));
				m.setAddress(rset.getString("address"));
				m.setHobby(rset.getString("hobby"));
				m.setEnrollDate(rset.getDate("enroll_date"));
			}
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			//6. 연결된 리소스 닫기 (close 작업 - finally에서 작업)
			try {
				rset.close();
				stmt.close();
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		return m; //m래퍼런스 안에 있는 값을 리턴(Member 객체 혹은 null)
		
		
		
		
		
	}

	public ArrayList<Member> selectMemberName(String userName) {
		// TODO Auto-generated method stub
		Connection conn=null;
		Statement stmt=null;
		ResultSet rset=null;
		
		//Member m=null;
		ArrayList<Member> list = new ArrayList<Member>();
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		
			conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe"
					,"member", "member");
			System.out.println(conn);
			stmt=conn.createStatement();
			
			String query="select * from member where member_name like '%"+userName+"%'";
			rset=stmt.executeQuery(query);
		
			while(rset.next()) {
				Member m = new Member();
				
				//ID값 저장하기
				m.setMemberId(rset.getString("member_id"));
				m.setMemberPwd(rset.getString("member_pwd"));
				m.setMemberName(rset.getString("member_name"));
				m.setGender(rset.getString("gender").charAt(0));
				m.setAge(rset.getInt("age"));
				m.setEmail(rset.getString("email"));
				m.setAddress(rset.getString("address"));
				m.setHobby(rset.getString("hobby"));
				m.setEnrollDate(rset.getDate("enroll_date"));
				
				list.add(m);
			}
			
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		try {
			rset.close();
			stmt.close();
			conn.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
		
		
		
	}
	//회원 가입용 메소드
	public int insertMember(Member m) {
		
		//래퍼런스 3종세트
		Connection conn=null;
		Statement stmt=null;
		//ResultSet rset=null; -> 이제 안만들어도된다. select가아니므로 결과값이 돌아올 필요가 없기 때문이다.
		int result=0; //결과를 숫자로 받을려고 한다.
		
		try {
			
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "member", "member");
			
			stmt = conn.createStatement();
			
			String query="insert into member values("+
			"'"+m.getMemberId()+"',"+
			"'"+m.getMemberPwd()+"',"+
			"'"+m.getMemberName()+"',"+
			"'"+m.getGender()+"',"+
			"'"+m.getAge()+"',"+
			"'"+m.getEmail()+"',"+
			"'"+m.getPhone()+"',"+
			"'"+m.getAddress()+"',"+
			"'"+m.getHobby()+"',"+"sysdate)";
			
			System.out.println(query);
			//stmt.executeQuery(sql) -> select 전용이다.
			
			//0이넘어오면 정상적으로되었다 하면되고 아니면 정상가입 안되었다고 하면된다.
			result=stmt.executeUpdate(query); //return 타입이 int형이다.
			
			//commit과 rollback가 없을경우 트랜잭션을 계속 잡고 있게 된다.
			if(result>0) {//정상처리되었을때
				conn.commit(); //적용
			}
			else {
				conn.rollback(); //되돌리기
			}
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				stmt.close();
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		
		return result;
	}

	public int updatemember(String userId, Member m2) {
		// TODO Auto-generated method stub
		Connection conn=null;
		Statement stmt=null;
		int result=0;
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "member", "member");
			stmt=conn.createStatement();
			
			String query="update member set "
			+"member_pwd ='"+m2.getMemberPwd()+"',"
			+"email='"+m2.getEmail()+"',"
			+"phone='"+m2.getPhone()+"',"
			+"address='"+m2.getAddress()+"',"
			+"hobby='"+m2.getHobby()+"'"		
			+"where member_id='"+userId+"'";
			
			System.out.println(query);
			result=stmt.executeUpdate(query);
			
			if(result>0) {
				conn.commit();
			}
			else {
				conn.rollback();
			}
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				stmt.close();
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		
		}
		return result;
	
		
		
	}
	public int deleteMember(String userId) {
		// TODO Auto-generated method stub
		//래퍼런스 3종세트
		Connection conn=null;
		Statement stmt=null;
		//ResultSet rset=null; -> 이제 안만들어도된다. select가아니므로 결과값이 돌아올 필요가 없기 때문이다.
		int result=0; //결과를 숫자로 받을려고 한다.

		try {

			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "member", "member");

			stmt = conn.createStatement();

			String query="delete from member where member_id='"+userId+"'";

			System.out.println(query);
			//stmt.executeQuery(sql) -> select 전용이다.

			//0이넘어오면 정상적으로되었다 하면되고 아니면 정상가입 안되었다고 하면된다.
			result=stmt.executeUpdate(query); //return 타입이 int형이다.

			//commit과 rollback가 없을경우 트랜잭션을 계속 잡고 있게 된다.
			if(result>0) {//정상처리되었을때
				conn.commit(); //적용
			}
			else {
				conn.rollback(); //되돌리기
			}

		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				stmt.close();
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

		return result;
	}

	
	
}



package org.kh.member.model.vo;

import java.sql.Date;

public class Member {
	//ID, PW
	private String memberId;
	private String memberPwd;
	private String memberName;
	private char gender;
	private int age;
	private String email;
	private String phone;
	private String address;
	private String hobby;
	private Date enrollDate; // java.sql.Date import
	
	public Member(String memberId, String memberPwd, String memberName, char gender, int age, String email,
			String phone, String address, String hobby, Date enrollDate) {
		super();
		this.memberId = memberId;
		this.memberPwd = memberPwd;
		this.memberName = memberName;
		this.gender = gender;
		this.age = age;
		this.email = email;
		this.phone = phone;
		this.address = address;
		this.hobby = hobby;
		this.enrollDate = enrollDate;
	}
	
	
	public Member() {
		super();
		// TODO Auto-generated constructor stub
	}

	
	//이렇게 해줄경우 컨트롤러에서 toString을 호출하게끔 할수 있다.
	@Override
	public String toString() {
		
		return 
				this.getMemberId() + "  " +
				this.getMemberPwd() + "  " +
				this.getMemberName() + "  "+ 
				this.getGender() + "  " +
				this.getAge() + "  " +
				this.getEmail() + "  " +
				this.getPhone()+ "  " +
				this.getAddress() + "  " +
				this.getHobby() + "  " +
				this.getEnrollDate();
	}
	
	

	//alt+shift+s
	public String getMemberId() {
		return memberId;
	}
	
	public void setMemberId(String memberId) {
		this.memberId = memberId;
	}
	public String getMemberPwd() {
		return memberPwd;
	}
	public void setMemberPwd(String memberPwd) {
		this.memberPwd = memberPwd;
	}
	public String getMemberName() {
		return memberName;
	}
	public void setMemberName(String memberName) {
		this.memberName = memberName;
	}
	public char getGender() {
		return gender;
	}
	public void setGender(char gender) {
		this.gender = gender;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public String getHobby() {
		return hobby;
	}
	public void setHobby(String hobby) {
		this.hobby = hobby;
	}
	public Date getEnrollDate() {
		return enrollDate;
	}
	public void setEnrollDate(Date enrollDate) {
		this.enrollDate = enrollDate;
	}
	
	
	
}




package org.kh.member.run;

import org.kh.member.view.MemberMgr;

public class RunMain {
	public static void main(String[] args) {
		MemberMgr mgr = new MemberMgr();
		mgr.mainMenu();
		
		
		//new MemberMgr().mainMenu(); //객체 만들자 마자 실행
		//한번만 만들어서 실행하는걸로 challenge방식으로 할 수도 있다.
	}
}




package org.kh.member.view;

import java.util.Scanner;

import org.kh.member.controller.MemberController;
import org.kh.member.model.vo.Member;

//회원 관리 메뉴를 보여주는 View Class
public class MemberMgr {
	private Scanner sc = new Scanner(System.in);
	
	private MemberController mCon = new MemberController();//컨트롤러 객체
	
	// 메인 메뉴 메소드
	public void mainMenu() {
		int choice; 
		do {
		System.out.println("\n= = = = = = = = = = 회원 관리 프로그램 = = = = = = ");
		System.out.println("1. 회원 정보 전체 조회");
		System.out.println("2. 회원 아이디 조회(1명)");
		System.out.println("3. 회원 이름으로 검색(다수)");
		System.out.println("4. 회원 가입");
		System.out.println("5. 회원 정보 변경");
		System.out.println("6. 회원 탈퇴");
		System.out.println("0. 프로그램 종료");
		System.out.print("선택 : ");
		choice = sc.nextInt(); //선택값 choice 변수에 저장

		switch(choice) {
		case 1:mCon.selectMemberAll(); break;
		case 2:
			System.out.print("검색할 ID를 입력 : ");
			mCon.selectMemberId(sc.next()); break;
		case 3:
			System.out.print("검색할 NAME을 입력 : ");
			mCon.selectMemberName(sc.next());
			break;
		case 4:
			Member m=joinMember();//입력받는 전용메소드
			mCon.insertMember(m);//Member m=joinMember();이거랑 같다.
			break;
		case 5:
			//해당 회원 정보 조회
			System.out.print("수정할 ID 입력 : ");
			String userId=sc.next();
			boolean result=mCon.searchUserId(userId);
			if(result) {//true가 리턴되었다면 회원이 있다는 의미가 되므로 수정 작업이 진행
			//비밀번호, 이메일, 폰번호, 주소, 취미
				Member m2=modifyMember();
				mCon.updateMember(userId,m2);
			}
			break;
		case 6:
			System.out.print("삭제할 ID를 입력 : ");//삭제할경우 기준을 ID로 잡았다.
			mCon.deleteMember(sc.next());
			break;
		}
		}while(choice!=0);//한번은 무조건 실행될 것이기 때문에 do while로 짰다.
		System.out.println("저희 프로그램을 이용해주셔서 감사합니다. 호구님!");
	}
	
	//회원 정보 수정 입력 메소드
	public Member modifyMember() {
		
		Member m= new Member();
		System.out.println("\n ---------- 수정될 회원 정보 입력 ----------\n");
		System.out.print("변경될 비밀번호 입력:");
		m.setMemberPwd(sc.next());
		System.out.print("변경될 이메일 입력:");
		m.setEmail(sc.next());
		System.out.print("변경될 폰번호 입력(-를제외):");
		m.setPhone(sc.next());
		System.out.print("변경될 주소 입력:");
		m.setAddress(sc.next());
		System.out.print("변경될 취미 입력(,로구분):");
		m.setHobby(sc.next());
		return m;
	
	}
	
	
	
	
	//회원 가입 정보 입력 메소드
		public Member joinMember() {
			System.out.println("- - - - - -회원 가입 정보 입력 ----");
			System.out.print("아이디 입력 : ");
			String userId=sc.next();
			System.out.print("비밀번호 입력 : ");
			String userPwd = sc.next();
			System.out.print("이름 입력 : ");
			String userName=sc.next();
			System.out.print("성별 입력 : ");
			char gender = sc.next().charAt(0);
			System.out.print("나이 입력 : ");
			int age = sc.nextInt();
			System.out.print("이메일 입력 : ");
			String email = sc.next();
			System.out.print("폰번호 입력(-빼고 입력) : ");
			String phone=sc.next();
			System.out.print("주소 입력 : ");
			sc.nextLine();
			String address = sc.nextLine();
			System.out.print("취미 입력(,로 구분 지어서 입력) : ");
			String hobby = sc.next();
			
			Member m = new Member();
			m.setMemberId(userId);
			m.setMemberPwd(userPwd);
			m.setMemberName(userName);
			m.setGender(gender);
			m.setAge(age);
			m.setEmail(email);
			m.setPhone(phone);
			m.setAddress(address);
			m.setHobby(hobby);
			return m;
		}
	
	
}






JDBC2 -> service 없이 만들기 prestatement



package org.kh.member.controller;

import java.util.ArrayList;

import org.kh.member.dao.MemberDao;
import org.kh.member.model.vo.Member;

public class MemberController {

	// 컨트롤러 클래스의 역할
	// view에서 요청한 기능을 컨트롤러가 DAO와의 연결을 하는 역할

	// 회원 전체출력 메소드
	public void selectMemberAll() {
		MemberDao dao = new MemberDao();
		ArrayList<Member> list = dao.selectMemberAll(); // DAO의 회원 전체 조회 메소드 호출
		// 리턴한 list 결과 상황
		// 1. list 가 있을 때
		// 2. lost 가 없을 때

		if (!list.isEmpty())// .isEmpty =비어있따 // list가 있을 떄
		{

			// 결과출력
			System.out.println("\n----------------- 전체 회원 정보 조회 -----------------\n");
			System.out.println("아이디     비밀번호  이름   성별   나이   이메일   전화번호   주소   취미   가입일");


			//1번째 방식
			for(Member m : list) {
				System.out.println(m);//m만써도된다.
			}


			//2번째 방식
			/*
			for (Member m : list) {
				System.out.println(
						m.getMemberId() + "  " +
						m.getMemberPwd() + "  " +
						m.getMemberName() + "  "+ 
						m.getGender() + "  " +
						m.getAge() + "  " +
						m.getEmail() + "  " +
						m.getPhone()+ "  " +
						m.getAddress() + "  " +
						m.getHobby() + "  " +
						m.getEnrollDate());
			}
			 */


			//3번째 방식
			/*
			 * for (int i = 0; i < list.size(); i++) {
			 * System.out.println(list.get(i).getMemberId() + "  " +
			 * list.get(i).getMemberPwd() + "  " + list.get(i).getMemberName() + "  " +
			 * list.get(i).getGender() + "  " + list.get(i).getAge() + "  " +
			 * list.get(i).getEmail() + "  " + list.get(i).getMemberId() + "  " +
			 * list.get(i).getAddress() + "  " + list.get(i).getHobby() + "  " +
			 * list.get(i).getEnrollDate()); }
			 */

		} else// list가 없을 때
		{
			// 없다고 알려주는 코드
			System.out.println("회원 목록이 없습니다.");
		}

	}

	// 회원 아이디 검색 메소드
	public void selectMemberId(String userId) {//매개변수 낙타표기법으로 썼다.
		//System.out.println("입력받은 문자열 : "+userId);
		MemberDao dao=new MemberDao();
		dao.selectMemberId(userId);//dao를 그대로 dao한테줘서 그걸 DB한테그아이디로 검색하게끔 할것이다.
		Member m = dao.selectMemberId(userId);
		
		if(m!=null) //객체가 있을때(조회가 성공하였을때)
		{
			// 결과출력
			
			System.out.println("\n----------------- 전체 회원 정보 조회 -----------------\n");
			System.out.println("아이디     비밀번호  이름   성별   나이   이메일   전화번호   주소   취미   가입일");
			System.out.println(m);//하나일때는 굳이 m하나만 해주면 된다.
		}
		else //객체가 없을때(조회가 없어서 null이 리턴되었을때)
		{
			System.out.println("해당되는 ID를 가진 회원이 없습니다.");
		}
		
		
		

	}

	// 회원 이름 검색 메소드
	public void selectMemberName(String userName) {
		MemberDao dao = new MemberDao();
		dao.selectMemberName(userName);
		ArrayList<Member> list = dao.selectMemberName(userName); 
		
		if(!list.isEmpty()) {
			System.out.println("\n----------------- 전체 회원 정보 조회 -----------------\n");
			System.out.println("아이디     비밀번호  이름   성별   나이   이메일   전화번호   주소   취미   가입일");

			for(Member m:list) {
				System.out.println(m);
			}
		}else {
			System.out.println("누가없는거 찾으래!");
		}
	}

	// 회원 가입 메소드
	public void insertMember(Member m) {
		// TODO Auto-generated method stub
		MemberDao dao = new MemberDao();
		int result=dao.insertMember(m);
		
		if(result>0) {
			System.out.println("정상적으로 회원가입 되었습니다.");
		}
		else {
			System.out.println("회원 가입에 실패 하였습니다.");
		}
	}

	// 회원 정보 수정 메소드
	public void updateMember(String userId,Member m2) {
		MemberDao dao = new MemberDao();
		int result=dao.updatemember(userId,m2);
		if(result>0) {
			System.out.println("정보 수정이 정상 처리 되었습니다.");
		}else {
			System.out.println("회원 정보 수정이 실패 하였습니다.(관리자에게문의)");
		}
	}

	// 회원 탈퇴 메소드
		public void deleteMember(String userId) {
			MemberDao dao=new MemberDao();
			int result=dao.deleteMember(userId);
			
			if(result>0) {
				System.out.println("정상적으로 탈퇴 되었습니다.");
			}
			else {
				System.out.println("탈퇴가 실패 하였습니다.");
			}
			
		}

	public boolean searchUserId(String userId) {
		// TODO Auto-generated method stub
		//System.out.println("입력받은 문자열 : "+userId);
				MemberDao dao=new MemberDao();
				//dao.selectMemberId(userId);//dao를 그대로 dao한테줘서 그걸 DB한테그아이디로 검색하게끔 할것이다.
				Member m = dao.selectMemberId(userId);
				
				if(m!=null) //객체가 있을때(조회가 성공하였을때)
				{
					// 결과출력
					
					System.out.println("회원 조회가 완료되었습니다.");
					System.out.println("\n----------------- ["+userId+"]회원정보 -----------------\n");
					System.out.println("아이디     비밀번호  이름   성별   나이   이메일   전화번호   주소   취미   가입일");
					System.out.println(m);//하나일때는 굳이 m하나만 해주면 된다.
					return true;
				
				
				}
				else //객체가 없을때(조회가 없어서 null이 리턴되었을때)
				{
					System.out.println("해당되는 ID를 가진 회원이 없습니다.");
					return false;
				}
				
	}

	

}





package org.kh.member.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import org.kh.member.model.vo.Member;

public class MemberDao {
	
	//DBMS에 접근하는 전체 회원 조회 메소드
	public ArrayList<Member> selectMemberAll() {
		
		//필요한 레퍼런스 생성(Connection, Statement, ResultSet)
			
		//java.sql 패키지 import
		Connection conn = null; //Connection 레퍼런스 (객체 생성은 아직 안함)
		Statement stmt = null; //Statement 래퍼런스 (객체 생성은 아직 안함)
		ResultSet rset=null; //ResultSet 래퍼런스 (객체 생성은 아직 안함)

		ArrayList<Member> list=new ArrayList<Member>();
		
		//@ JDBC Coding 절차
		try {
			//1. Driver 등록
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			//2. DBMS와 연결 (Connection 사용)
			conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe"
					,"member", "member");
			//첫번째는 연결 정보(DB종류, 타입, IP주소, 포트 등등)
			//두번째는 연결하는 DB의 ID(아이디)
			//세번째는 연결하는 ID의 PW(비밀번호)
			//get으로 읽어오는것이므로 저장하는 것이다.conn에 저장하는 것이다.
			
			System.out.println(conn);
			// conn 레퍼런스 안에 있는 값을 출력시
			// DBMS에 정상연결 되었다면 hashCode 값(Connection 값)이 출력 되고
			// DBMS에 연결 실패 하였다면 null값을 리턴
			
			//3. Statement 생성 - 작성한 쿼리문을 전송할 객체를 생성 해야 함
			// Connection (conn) 객체를 이용하여 Statement 객체를 생성함
			stmt=conn.createStatement(); // Statement 객체 생성
				
			//4. SQL 전송
			// - Query 문이 있어야 전송합니다.
			String query = "select * from member";
			rset=stmt.executeQuery(query); // Statement 객체를 이용하여 쿼리문 실행
			//결과를 rset에 담는다.
			

			//5. 결과 처리
			// rset을 이용하여 결과를 처리함
			// rset.next() 메소드와 rset.set...() 메소드를 이용함
			// next 메소드는 각 행을 가리키는 메소드(작업시 마다 사용해야함)
			// set...() 메소드는 각 컬럼의 정보를 가져올때 사용함
			
			//rset.next()
			//rset.getString("member_id"); -> rset을 이용해스트링값갖고오는데 그컬럼명은 멤버아이디꺼갖고오라는 것이다.
			
			
			while(rset.next()) {
				Member m = new Member();
				
				//ID값 저장하기
				m.setMemberId(rset.getString("member_id"));
				m.setMemberPwd(rset.getString("member_pwd"));
				m.setMemberName(rset.getString("member_name"));
				m.setGender(rset.getString("gender").charAt(0));
				m.setAge(rset.getInt("age"));
				m.setEmail(rset.getString("email"));
				m.setAddress(rset.getString("address"));
				m.setPhone(rset.getString("phone"));
				m.setHobby(rset.getString("hobby"));
				m.setEnrollDate(rset.getDate("enroll_date"));

				list.add(m);
			}
			
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		//오라클에 jdbc에 드라이버에 오라클드라이버를 등록하겠다.
		//이코드가 없어도 8버전부턴 가능하긴한데 넣어주는게 좋다.
		catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			//6. 연결된 리소스 닫기 (close 작업 - finally에서 작업)
			try {
				rset.close();
				stmt.close();
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}

		return list;
		
	}
	
	public Member selectMemberId(String userId) {
		
		Connection conn=null;//DBMS와 연결
		PreparedStatement pstmt=null;//작성한 쿼리문을 전송할 객체를 생성 해야 함
		ResultSet rset=null;//SELECT 구문일 경우 ResultSet을 이용하여 정보를 객체에 담는 처리
		
		Member m = null; //멤버객체를 여기선 바깥에 만드는데 그 이유는?
		//결과가 조회되던안되던 리턴받을 것이다.
		
		try {
			
			//1. Driver 등록
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			//2. DBMS 연결
			conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "member", "member");
			//SQLException 에러 뜰수있기 때문에 catch로잡아줘야한다.
			
			//3. Statement 객체 생성
			// Connection (conn) 객체를 이용하여 Statement 객체를 생성함
			//stmt=conn.createStatement();
			
			//4. SQL 전송
			// - Query 문이 있어야 전송합니다.
			
			//쿼리문을 만든다음 값을 넣는 것이다.
			String query="select * from member where member_id=?";
			pstmt=conn.prepareStatement(query);
			pstmt.setString(1, userId);
			
			
			//쿼리를 아까 담았기 때문에 굳이 여기에 담을 필요가 없다.
			rset=pstmt.executeQuery();// Statement 객체를 이용하여 쿼리문 실행
			
			//5. 결과 처리
			// rset을 이용하여 결과를 처리함
			// rset.next() 메소드와 rset.set...() 메소드를 이용함
			// next 메소드는 각 행을 가리키는 메소드(작업시 마다 사용해야함)
			// set...() 메소드는 각 컬럼의 정보를 가져올때 사용함
			
			if(rset.next()) {//만약에 1명의 결과가 조회되었다면 진행하고 없다면 하지마라!
				
				m=new Member();//결과가 있으므로 정보를 저장할 VO 객체 생성
				m.setMemberId(rset.getString("member_id"));
				m.setMemberPwd(rset.getString("member_pwd"));
				m.setMemberName(rset.getString("member_name"));
				m.setGender(rset.getString("gender").charAt(0));
				m.setAge(rset.getInt("age"));
				m.setEmail(rset.getString("email"));
				m.setPhone(rset.getString("phone"));
				m.setAddress(rset.getString("address"));
				m.setHobby(rset.getString("hobby"));
				m.setEnrollDate(rset.getDate("enroll_date"));
			}
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			//6. 연결된 리소스 닫기 (close 작업 - finally에서 작업)
			try {
				rset.close();
				pstmt.close();
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		return m; //m래퍼런스 안에 있는 값을 리턴(Member 객체 혹은 null)
		
		
		
		
		
	}

	public ArrayList<Member> selectMemberName(String userName) {
		// TODO Auto-generated method stub
		Connection conn=null;
		PreparedStatement pstmt=null;
		ResultSet rset=null;
		
		//Member m=null;
		ArrayList<Member> list = new ArrayList<Member>();
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
		
			conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe"
					,"member", "member");
			System.out.println(conn);
			
			
			String query="select * from member where member_name like '%'||?||'%'";
			//member_name like (?)";
			//pstmt.setString(1,"%"+userName+"%")
			pstmt=conn.prepareStatement(query);
			System.out.println(query);
			
			pstmt.setString(1, userName);
			rset=pstmt.executeQuery();
		
			while(rset.next()) {
				Member m = new Member();
				
				//ID값 저장하기
				m.setMemberId(rset.getString("member_id"));
				m.setMemberPwd(rset.getString("member_pwd"));
				m.setMemberName(rset.getString("member_name"));
				m.setGender(rset.getString("gender").charAt(0));
				m.setAge(rset.getInt("age"));
				m.setEmail(rset.getString("email"));
				m.setAddress(rset.getString("address"));
				m.setHobby(rset.getString("hobby"));
				m.setEnrollDate(rset.getDate("enroll_date"));
				
				list.add(m);
			}
			
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		try {
			rset.close();
			pstmt.close();
			conn.close();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
		
		
		
	}
	//회원 가입용 메소드
	public int insertMember(Member m) {
		
		//래퍼런스 3종세트
		Connection conn=null;
		PreparedStatement pstmt=null;
		//ResultSet rset=null; -> 이제 안만들어도된다. select가아니므로 결과값이 돌아올 필요가 없기 때문이다.
		int result=0; //결과를 숫자로 받을려고 한다.
		
		try {
			
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "member", "member");
			
			//pstmt = conn.createStatement();
			
//			String query="insert into member values("+
//			"'"+m.getMemberId()+"',"+
//			"'"+m.getMemberPwd()+"',"+
//			"'"+m.getMemberName()+"',"+
//			"'"+m.getGender()+"',"+
//			"'"+m.getAge()+"',"+
//			"'"+m.getEmail()+"',"+
//			"'"+m.getPhone()+"',"+
//			"'"+m.getAddress()+"',"+
//			"'"+m.getHobby()+"',"+"sysdate)";
//			
			String query="insert into member values ((?), (?), (?), (?), (?), (?),(?),(?),(?),sysdate)";
			
			
			
			pstmt = conn.prepareStatement(query);
			System.out.println(query);
			pstmt.setString(1, m.getMemberId());
			pstmt.setString(2, m.getMemberPwd());
			pstmt.setString(3, m.getMemberName());
			pstmt.setString(4,""+m.getGender());
			pstmt.setInt(5, m.getAge());
			pstmt.setString(6, m.getEmail());
			pstmt.setString(7, m.getPhone());
			pstmt.setString(8, m.getAddress());
			pstmt.setString(9, m.getHobby());
			//stmt.executeQuery(sql) -> select 전용이다.
			
			//0이넘어오면 정상적으로되었다 하면되고 아니면 정상가입 안되었다고 하면된다.
			result=pstmt.executeUpdate(); //return 타입이 int형이다.
			
			//commit과 rollback가 없을경우 트랜잭션을 계속 잡고 있게 된다.
			if(result>0) {//정상처리되었을때
				conn.commit(); //적용
			}
			else {
				conn.rollback(); //되돌리기
			}
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				pstmt.close();
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		
		return result;
	}

	public int updatemember(String userId, Member m2) {
		// TODO Auto-generated method stub
		Connection conn=null;
		PreparedStatement pstmt=null;
		int result=0;
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "member", "member");
			
			
//			String query="update member set "
//			+"member_pwd ='"+m2.getMemberPwd()+"',"
//			+"email='"+m2.getEmail()+"',"
//			+"phone='"+m2.getPhone()+"',"
//			+"address='"+m2.getAddress()+"',"
//			+"hobby='"+m2.getHobby()+"'"		
//			+"where member_id='"+userId+"'";
			
			String query="update member set member_pwd=?, email=?,phone=?,address=?,hobby=? where member_id=?";
			pstmt = conn.prepareStatement(query);
			
			pstmt.setString(1, m2.getMemberPwd());
			pstmt.setString(2, m2.getEmail());
			pstmt.setString(3, m2.getPhone());
			pstmt.setString(4, m2.getAddress());
			pstmt.setString(5, m2.getHobby());
			pstmt.setString(6, userId);
			
			
			
			
			
			
			System.out.println(query);
			result=pstmt.executeUpdate();
			
			if(result>0) {
				conn.commit();
			}
			else {
				conn.rollback();
			}
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				pstmt.close();
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		
		}
		return result;
	
		
		
	}
	public int deleteMember(String userId) {
		// TODO Auto-generated method stub
		//래퍼런스 3종세트
		Connection conn=null;
		PreparedStatement pstmt=null;
		//ResultSet rset=null; -> 이제 안만들어도된다. select가아니므로 결과값이 돌아올 필요가 없기 때문이다.
		int result=0; //결과를 숫자로 받을려고 한다.

		try {

			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "member", "member");

			

			//String query="delete from member where member_id='"+userId+"'";
			String query="delete from member where member_id=?";
			pstmt = conn.prepareStatement(query);
			
			pstmt.setString(1, userId);
			System.out.println(query);
			//stmt.executeQuery(sql) -> select 전용이다.

			//0이넘어오면 정상적으로되었다 하면되고 아니면 정상가입 안되었다고 하면된다.
			result=pstmt.executeUpdate(); //return 타입이 int형이다.

			//commit과 rollback가 없을경우 트랜잭션을 계속 잡고 있게 된다.
			if(result>0) {//정상처리되었을때
				conn.commit(); //적용
			}
			else {
				conn.rollback(); //되돌리기
			}

		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				pstmt.close();
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

		return result;
	}

	
	
}




package org.kh.member.model.vo;

import java.sql.Date;

public class Member {
	//ID, PW
	private String memberId;
	private String memberPwd;
	private String memberName;
	private char gender;
	private int age;
	private String email;
	private String phone;
	private String address;
	private String hobby;
	private Date enrollDate; // java.sql.Date import
	
	public Member(String memberId, String memberPwd, String memberName, char gender, int age, String email,
			String phone, String address, String hobby, Date enrollDate) {
		super();
		this.memberId = memberId;
		this.memberPwd = memberPwd;
		this.memberName = memberName;
		this.gender = gender;
		this.age = age;
		this.email = email;
		this.phone = phone;
		this.address = address;
		this.hobby = hobby;
		this.enrollDate = enrollDate;
	}
	
	
	public Member() {
		super();
		// TODO Auto-generated constructor stub
	}

	
	//이렇게 해줄경우 컨트롤러에서 toString을 호출하게끔 할수 있다.
	@Override
	public String toString() {
		
		return 
				this.getMemberId() + "  " +
				this.getMemberPwd() + "  " +
				this.getMemberName() + "  "+ 
				this.getGender() + "  " +
				this.getAge() + "  " +
				this.getEmail() + "  " +
				this.getPhone()+ "  " +
				this.getAddress() + "  " +
				this.getHobby() + "  " +
				this.getEnrollDate();
	}
	
	

	//alt+shift+s
	public String getMemberId() {
		return memberId;
	}
	
	public void setMemberId(String memberId) {
		this.memberId = memberId;
	}
	public String getMemberPwd() {
		return memberPwd;
	}
	public void setMemberPwd(String memberPwd) {
		this.memberPwd = memberPwd;
	}
	public String getMemberName() {
		return memberName;
	}
	public void setMemberName(String memberName) {
		this.memberName = memberName;
	}
	public char getGender() {
		return gender;
	}
	public void setGender(char gender) {
		this.gender = gender;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public String getHobby() {
		return hobby;
	}
	public void setHobby(String hobby) {
		this.hobby = hobby;
	}
	public Date getEnrollDate() {
		return enrollDate;
	}
	public void setEnrollDate(Date enrollDate) {
		this.enrollDate = enrollDate;
	}
	
	
	
}




package org.kh.member.run;

import org.kh.member.view.MemberMgr;

public class RunMain {
	public static void main(String[] args) {
		MemberMgr mgr = new MemberMgr();
		mgr.mainMenu();
		
		
		//new MemberMgr().mainMenu(); //객체 만들자 마자 실행
		//한번만 만들어서 실행하는걸로 challenge방식으로 할 수도 있다.
	}
}




package org.kh.member.view;

import java.util.Scanner;

import org.kh.member.controller.MemberController;
import org.kh.member.model.vo.Member;

//회원 관리 메뉴를 보여주는 View Class
public class MemberMgr {
	private Scanner sc = new Scanner(System.in);
	
	private MemberController mCon = new MemberController();//컨트롤러 객체
	
	// 메인 메뉴 메소드
	public void mainMenu() {
		int choice; 
		do {
		System.out.println("\n= = = = = = = = = = 회원 관리 프로그램 = = = = = = ");
		System.out.println("1. 회원 정보 전체 조회");
		System.out.println("2. 회원 아이디 조회(1명)");
		System.out.println("3. 회원 이름으로 검색(다수)");
		System.out.println("4. 회원 가입");
		System.out.println("5. 회원 정보 변경");
		System.out.println("6. 회원 탈퇴");
		System.out.println("0. 프로그램 종료");
		System.out.print("선택 : ");
		choice = sc.nextInt(); //선택값 choice 변수에 저장

		switch(choice) {
		case 1:mCon.selectMemberAll(); break;
		case 2:
			System.out.print("검색할 ID를 입력 : ");
			mCon.selectMemberId(sc.next()); break;
		case 3:
			System.out.print("검색할 NAME을 입력 : ");
			mCon.selectMemberName(sc.next());
			break;
		case 4:
			Member m=joinMember();//입력받는 전용메소드
			mCon.insertMember(m);//Member m=joinMember();이거랑 같다.
			break;
		case 5:
			//해당 회원 정보 조회
			System.out.print("수정할 ID 입력 : ");
			String userId=sc.next();
			boolean result=mCon.searchUserId(userId);
			if(result) {//true가 리턴되었다면 회원이 있다는 의미가 되므로 수정 작업이 진행
			//비밀번호, 이메일, 폰번호, 주소, 취미
				Member m2=modifyMember();
				mCon.updateMember(userId,m2);
			}
			
			
			
			break;
		case 6:
			System.out.print("삭제할 ID를 입력 : ");//삭제할경우 기준을 ID로 잡았다.
			mCon.deleteMember(sc.next());
			break;
		}
		}while(choice!=0);//한번은 무조건 실행될 것이기 때문에 do while로 짰다.
		System.out.println("저희 프로그램을 이용해주셔서 감사합니다. 호구님!");
	}
	
	//회원 정보 수정 입력 메소드
	public Member modifyMember() {
		
		Member m= new Member();
		System.out.println("\n ---------- 수정될 회원 정보 입력 ----------\n");
		System.out.print("변경될 비밀번호 입력:");
		m.setMemberPwd(sc.next());
		System.out.print("변경될 이메일 입력:");
		m.setEmail(sc.next());
		System.out.print("변경될 폰번호 입력(-를제외):");
		m.setPhone(sc.next());
		System.out.print("변경될 주소 입력:");
		m.setAddress(sc.next());
		System.out.print("변경될 취미 입력(,로구분):");
		m.setHobby(sc.next());
		return m;
	
	}
	
	
	
	
	//회원 가입 정보 입력 메소드
		public Member joinMember() {
			System.out.println("- - - - - -회원 가입 정보 입력 ----");
			System.out.print("아이디 입력 : ");
			String userId=sc.next();
			System.out.print("비밀번호 입력 : ");
			String userPwd = sc.next();
			System.out.print("이름 입력 : ");
			String userName=sc.next();
			System.out.print("성별 입력 : ");
			char gender = sc.next().charAt(0);
			System.out.print("나이 입력 : ");
			int age = sc.nextInt();
			System.out.print("이메일 입력 : ");
			String email = sc.next();
			System.out.print("폰번호 입력(-빼고 입력) : ");
			String phone=sc.next();
			System.out.print("주소 입력 : ");
			sc.nextLine();
			String address = sc.nextLine();
			System.out.print("취미 입력(,로 구분 지어서 입력) : ");
			String hobby = sc.next();
			
			Member m = new Member();
			m.setMemberId(userId);
			m.setMemberPwd(userPwd);
			m.setMemberName(userName);
			m.setGender(gender);
			m.setAge(age);
			m.setEmail(email);
			m.setPhone(phone);
			m.setAddress(address);
			m.setHobby(hobby);
			return m;
		}
	
	
}






JDBC3 -> service 있게 만들기



package org.kh.member.controller;

import java.security.Provider.Service;
import java.sql.Connection;
import java.util.ArrayList;

import org.kh.member.dao.MemberDao;
import org.kh.member.model.service.MemberService;
import org.kh.member.model.vo.Member;

public class MemberController {

	// 컨트롤러 클래스의 역할
	// view에서 요청한 기능을 컨트롤러가 DAO와의 연결을 하는 역할

	// -> Controller Service Dao 로 해서 코드 짜보겠다.

	// 회원 전체출력 메소드 -> 오늘 수정하는것  -> 바꾼것
	public void selectMemberAll() {
		MemberService service = new MemberService();
		ArrayList<Member> list = service.selectMemberAll();

		if(!list.isEmpty()) {
			System.out.println("\n----------------- 전체 회원 정보 조회 -----------------\n");
			System.out.println("아이디     비밀번호  이름   성별   나이   이메일   전화번호   주소   취미   가입일");
			for(Member m : list) {
				System.out.println(m);
			}
		}else {
			System.out.println("회원이 등록되지 않았습니다.");
		}

	}

	// 회원 아이디 검색 메소드
	public void selectMemberId(String userId) {//매개변수 낙타표기법으로 썼다.
		//System.out.println("입력받은 문자열 : "+userId);
		
		MemberService service = new MemberService();
		Member m = service.selectMemberId(userId);

		
		
		
		if(m!=null) //객체가 있을때(조회가 성공하였을때)
		{
			// 결과출력

			System.out.println("\n----------------- 전체 회원 정보 조회 -----------------\n");
			System.out.println("아이디     비밀번호  이름   성별   나이   이메일   전화번호   주소   취미   가입일");
			System.out.println(m);//하나일때는 굳이 m하나만 해주면 된다.
		}
		else //객체가 없을때(조회가 없어서 null이 리턴되었을때)
		{
			System.out.println("해당되는 ID를 가진 회원이 없습니다.");
		}




	}

	// 회원 이름 검색 메소드
	public void selectMemberName(String userName) {
		
		MemberService service = new MemberService();
		ArrayList<Member> list = service.selectMemberName(userName); 
		//ArrayList<Member> list = new MemberService().selectMemberName(userName);
		
		if(!list.isEmpty()) {
			System.out.println("\n----------------- 전체 회원 정보 조회 -----------------\n");
			System.out.println("아이디     비밀번호  이름   성별   나이   이메일   전화번호   주소   취미   가입일");

			for(Member m:list) {
				System.out.println(m);
			}
		}else {
			System.out.println("누가없는거 찾으래!");
		}
	}

	// 회원 가입 메소드 -> 바꾼것
	public void insertMember(Member m) {
		/*MemberService service = new MemberService();
		service.insertMember(m);
		 */
		//체이닝 기법
		int result=new MemberService().insertMember(m);
		if(result>0) {
			System.out.println("회원 가입이 성공하였습니다.");
		}
		else {
			System.out.println("회원 가입이 실패하였습니다.");
		}
	}

	// 회원 정보 수정 메소드
	public void updateMember(String userId,Member m2) {
		MemberService service = new MemberService();
		//Connection conn=null;
		int result=service.updateMember(userId, m2);
		if(result>0) {
			System.out.println("정보 수정이 정상 처리 되었습니다.");
		}else {
			System.out.println("회원 정보 수정이 실패 하였습니다.(관리자에게문의)");
		}
	}

	// 회원 탈퇴 메소드
	public void deleteMember(String userId) {
		
		MemberService service = new MemberService();
		
		int result = service.deleteMember(userId);
		if(result>0) {
			System.out.println("정상적으로 탈퇴 되었습니다.");
		}
		else {
			System.out.println("탈퇴가 실패 하였습니다.");
		}

	}

	public boolean searchUserId(String userId) {
		// TODO Auto-generated method stub
		//System.out.println("입력받은 문자열 : "+userId);
		
		MemberService service = new MemberService();
		//dao.selectMemberId(userId);//dao를 그대로 dao한테줘서 그걸 DB한테그아이디로 검색하게끔 할것이다.
		//Member m = dao.selectUserId(userId);
		Member m = service.selectMemberId(userId);

		if(m!=null) //객체가 있을때(조회가 성공하였을때)
		{
			// 결과출력

			System.out.println("회원 조회가 완료되었습니다.");
			System.out.println("\n----------------- ["+userId+"]회원정보 -----------------\n");
			System.out.println("아이디     비밀번호  이름   성별   나이   이메일   전화번호   주소   취미   가입일");
			System.out.println(m);//하나일때는 굳이 m하나만 해주면 된다.
			return true;


		}
		else //객체가 없을때(조회가 없어서 null이 리턴되었을때)
		{
			System.out.println("해당되는 ID를 가진 회원이 없습니다.");
			return false;
		}

	}



}




package org.kh.member.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import org.kh.member.model.vo.Member;

public class MemberDao {
	
	//DBMS에 접근하는 전체 회원 조회 메소드
	public ArrayList<Member> selectMemberAll(Connection conn) {
		Statement stmt =null;
		ResultSet rset = null;
		
		ArrayList<Member> list = new ArrayList<Member>();
		
		try {
			stmt = conn.createStatement();
			
			String query = "select * from member";
			
			rset = stmt.executeQuery(query);
			
			while(rset.next()) {
				Member m=new Member();//결과가 있으므로 정보를 저장할 VO 객체 생성
				m.setMemberId(rset.getString("member_id"));
				m.setMemberPwd(rset.getString("member_pwd"));
				m.setMemberName(rset.getString("member_name"));
				m.setGender(rset.getString("gender").charAt(0));
				m.setAge(rset.getInt("age"));
				m.setEmail(rset.getString("email"));
				m.setPhone(rset.getString("phone"));
				m.setAddress(rset.getString("address"));
				m.setHobby(rset.getString("hobby"));
				m.setEnrollDate(rset.getDate("enroll_date"));
				
				list.add(m);
			}
			
			
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				rset.close();
				stmt.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		

		return list;

		
	}
	
	public Member selectMemberId(String userId,Connection conn) {
			
		PreparedStatement pstmt=null;
		ResultSet rset=null;
		
		Member m=null;
		
		String query="select * from member where member_id=?";
		try {
			pstmt=conn.prepareStatement(query);
			pstmt.setString(1, userId);
			rset=pstmt.executeQuery();
			
			if(rset.next()) {//만약에 1명의 결과가 조회되었다면 진행하고 없다면 하지마라!
				
				m=new Member();//결과가 있으므로 정보를 저장할 VO 객체 생성
				m.setMemberId(rset.getString("member_id"));
				m.setMemberPwd(rset.getString("member_pwd"));
				m.setMemberName(rset.getString("member_name"));
				m.setGender(rset.getString("gender").charAt(0));
				m.setAge(rset.getInt("age"));
				m.setEmail(rset.getString("email"));
				m.setPhone(rset.getString("phone"));
				m.setAddress(rset.getString("address"));
				m.setHobby(rset.getString("hobby"));
				m.setEnrollDate(rset.getDate("enroll_date"));
			}
			
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				rset.close();
				pstmt.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		return m;
		
		
		
	}

	public ArrayList<Member> selectMemberName(String userName,Connection conn) {
		// TODO Auto-generated method stub
		
		PreparedStatement pstmt=null;
		ResultSet rset=null;
		
	
		ArrayList<Member> list = new ArrayList<Member>();
		
		try {
			
			String query="select * from member where member_name like '%'||?||'%'";
	
			pstmt=conn.prepareStatement(query);
			pstmt.setString(1, userName);
			rset=pstmt.executeQuery();
		
			while(rset.next()) {
				Member m = new Member();
				
				//ID값 저장하기
				m.setMemberId(rset.getString("member_id"));
				m.setMemberPwd(rset.getString("member_pwd"));
				m.setMemberName(rset.getString("member_name"));
				m.setGender(rset.getString("gender").charAt(0));
				m.setAge(rset.getInt("age"));
				m.setEmail(rset.getString("email"));
				m.setAddress(rset.getString("address"));
				m.setHobby(rset.getString("hobby"));
				m.setEnrollDate(rset.getDate("enroll_date"));
				
				list.add(m);
			}
			
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		try {
			rset.close();
			pstmt.close();
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
		
		
		
	}
	//회원 가입용 메소드
	public int insertMember(Member m,Connection conn) {
		PreparedStatement pstmt = null;
		
		int result = 0;
		
		String query = "insert into member values (?,?,?,?,?,?,?,?,?,sysdate)";
		
		try {
			pstmt=conn.prepareStatement(query);
			pstmt.setString(1, m.getMemberId());
			pstmt.setString(2, m.getMemberPwd());
			pstmt.setString(3, m.getMemberName());
			pstmt.setString(4, String.valueOf(m.getGender()));
			pstmt.setInt(5, m.getAge());
			pstmt.setString(6, m.getEmail());
			pstmt.setString(7, m.getPhone());
			pstmt.setString(8, m.getAddress());
			pstmt.setString(9, m.getHobby());
			
			result=pstmt.executeUpdate();//위에서 쿼리 담았기 때문에 안담는다.
			//System.out.println(query);
			
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				pstmt.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return result;
	}

	public int updatemember(String userId,Member m2,Connection conn) {
		// TODO Auto-generated method stub
		
		PreparedStatement pstmt=null;
		int result=0;
		try {
		
			String query="update member set member_pwd=?, email=?,phone=?,address=?,hobby=? where member_id=?";
			pstmt = conn.prepareStatement(query);
			
			pstmt.setString(1, m2.getMemberPwd());
			pstmt.setString(2, m2.getEmail());
			pstmt.setString(3, m2.getPhone());
			pstmt.setString(4, m2.getAddress());
			pstmt.setString(5, m2.getHobby());
			pstmt.setString(6, userId);
			
			
			
			
			
			
			System.out.println(query);
			result=pstmt.executeUpdate();
			
			if(result>0) {
				conn.commit();
			}
			else {
				conn.rollback();
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				pstmt.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		
		}
		return result;
	
		
		
	}
	public int deleteMember(String userId,Connection conn) {
		// TODO Auto-generated method stub
		//래퍼런스 3종세트
		
		PreparedStatement pstmt=null;
		//ResultSet rset=null; -> 이제 안만들어도된다. select가아니므로 결과값이 돌아올 필요가 없기 때문이다.
		int result=0; //결과를 숫자로 받을려고 한다.

		try {


			//String query="delete from member where member_id='"+userId+"'";
			String query="delete from member where member_id=?";
			pstmt = conn.prepareStatement(query);
			
			pstmt.setString(1, userId);
			System.out.println(query);
			//stmt.executeQuery(sql) -> select 전용이다.

			//0이넘어오면 정상적으로되었다 하면되고 아니면 정상가입 안되었다고 하면된다.
			result=pstmt.executeUpdate(); //return 타입이 int형이다.

			//commit과 rollback가 없을경우 트랜잭션을 계속 잡고 있게 된다.
			

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				pstmt.close();
				
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

		return result;
	}


	


	
	
}




package org.kh.member.model.service;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;

import org.kh.member.dao.MemberDao;
import org.kh.member.model.vo.Member;

public class MemberService {
	
	
	// 서비스 클래스의 역할
	// 기존에는 DAO가 DBMS와 연결하고 커밋과 롤백시에도 직접 처리 하였음
	// DAO는 DBMS에 접근하여 데이터를 가져오는게 핵심 역할일뿐
	// 실제 DBMS에 연결하거나 커밋, 롤백 작업을 하는 것은 확장성 문제가 발생할 수 있음
	// 그렇기 때문에 이제는 서비스에서 DBMS와의 연결 작업 (드라이브 등록 및 Connection)을
	// 진행하고, 트랜잭션 관리를 처리하는 역할을 함
	// Service에서 연결을 한 후 연결 정보를 다 insert나 delete로 준다. 
	
	public ArrayList<Member> selectMemberAll() {
		//서비스는 DB에 연결하는 역할
		Connection conn = null;
		ArrayList<Member> list=null;
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "member", "member");
			System.out.println("연결 정보 : "+conn);
			
			MemberDao dao = new MemberDao();
			list = dao.selectMemberAll(conn);
			
			
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		return list;
		
	}
	
	//회원 가입 메소드
	public int insertMember(Member m) {
		//서비스역할 드라이버 등록
		Connection conn=null;
		
		int result=0;
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "member", "member");
			//테이블의 변화가 있을 수 있으니 commit랑 rollback를 해줘야한다.
			//그런데 오토커밋을 하는경우가 있는데 자동으로 commit가 되있는 것이다. 이걸 꺼버리자.
			conn.setAutoCommit(false);//오토커밋을 끄고 트랜젝션 제가 제어하겠습니다.
			result = new MemberDao().insertMember(m,conn);//커넥션정보도 같이 보내줘야 한다.
			
			if(result>0) {
				conn.commit();
			}else {
				conn.rollback();
			}
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return result; //최종 결과값으로 컨트롤러에게 전달
	}
	
	//회원아이디검색
	public Member selectMemberId(String userId) {
		//서비스는 DB에 연결하는 역할
				Connection conn = null;
				Member m =null;
				try {
					Class.forName("oracle.jdbc.driver.OracleDriver");
					conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "member", "member");
					System.out.println("연결 정보 : "+conn);
					
					MemberDao dao = new MemberDao();
					m=dao.selectMemberId(userId,conn);
					
					
					
				} catch (ClassNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}finally {
					try {
						conn.close();
					} catch (SQLException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
				
			return m;
	}
	
	
	
	//회원 이름검색
	public ArrayList<Member> selectMemberName(String userName) {
		Connection conn = null;
		ArrayList<Member> list=null;
		Member m = new Member();
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "member", "member");
			
			MemberDao dao = new MemberDao();
			list = dao.selectMemberName(userName,conn);
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return list;
		
	}
	
	//회원 정보 수정 메소드
	public int updateMember(String userId,Member m) {
		Connection conn = null;
		int result=0;
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "member", "member");
			
			MemberDao dao = new MemberDao();
			result=dao.updatemember(userId,m,conn);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		return result;
	}
	
	//회원 삭제 메소드
	public int deleteMember(String userId) {
		Connection conn = null;
		int result=0;
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "member", "member");
			MemberDao dao = new MemberDao();
			result=dao.deleteMember(userId,conn);
			
			if(result>0) {
				conn.commit();
			}else {
				conn.rollback();
			}
			
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return result;
	
	}
	
}




package org.kh.member.model.vo;

import java.sql.Date;

public class Member {
	//ID, PW
	private String memberId;
	private String memberPwd;
	private String memberName;
	private char gender;
	private int age;
	private String email;
	private String phone;
	private String address;
	private String hobby;
	private Date enrollDate; // java.sql.Date import
	
	public Member(String memberId, String memberPwd, String memberName, char gender, int age, String email,
			String phone, String address, String hobby, Date enrollDate) {
		super();
		this.memberId = memberId;
		this.memberPwd = memberPwd;
		this.memberName = memberName;
		this.gender = gender;
		this.age = age;
		this.email = email;
		this.phone = phone;
		this.address = address;
		this.hobby = hobby;
		this.enrollDate = enrollDate;
	}
	
	
	public Member() {
		super();
		// TODO Auto-generated constructor stub
	}

	
	//이렇게 해줄경우 컨트롤러에서 toString을 호출하게끔 할수 있다.
	@Override
	public String toString() {
		
		return 
				this.getMemberId() + "  " +
				this.getMemberPwd() + "  " +
				this.getMemberName() + "  "+ 
				this.getGender() + "  " +
				this.getAge() + "  " +
				this.getEmail() + "  " +
				this.getPhone()+ "  " +
				this.getAddress() + "  " +
				this.getHobby() + "  " +
				this.getEnrollDate();
	}
	
	

	//alt+shift+s
	public String getMemberId() {
		return memberId;
	}
	
	public void setMemberId(String memberId) {
		this.memberId = memberId;
	}
	public String getMemberPwd() {
		return memberPwd;
	}
	public void setMemberPwd(String memberPwd) {
		this.memberPwd = memberPwd;
	}
	public String getMemberName() {
		return memberName;
	}
	public void setMemberName(String memberName) {
		this.memberName = memberName;
	}
	public char getGender() {
		return gender;
	}
	public void setGender(char gender) {
		this.gender = gender;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public String getHobby() {
		return hobby;
	}
	public void setHobby(String hobby) {
		this.hobby = hobby;
	}
	public Date getEnrollDate() {
		return enrollDate;
	}
	public void setEnrollDate(Date enrollDate) {
		this.enrollDate = enrollDate;
	}
	
	
	
}




package org.kh.member.run;

import org.kh.member.view.MemberMgr;

public class RunMain {
	public static void main(String[] args) {
		MemberMgr mgr = new MemberMgr();
		mgr.mainMenu();
		
		
		//new MemberMgr().mainMenu(); //객체 만들자 마자 실행
		//한번만 만들어서 실행하는걸로 challenge방식으로 할 수도 있다.
	}
}




package org.kh.member.view;

import java.util.Scanner;

import org.kh.member.controller.MemberController;
import org.kh.member.model.vo.Member;

//회원 관리 메뉴를 보여주는 View Class
public class MemberMgr {
	private Scanner sc = new Scanner(System.in);
	
	private MemberController mCon = new MemberController();//컨트롤러 객체
	
	// 메인 메뉴 메소드
	public void mainMenu() {
		int choice; 
		do {
		System.out.println("\n= = = = = = = = = = 회원 관리 프로그램 = = = = = = ");
		System.out.println("1. 회원 정보 전체 조회");
		System.out.println("2. 회원 아이디 조회(1명)");
		System.out.println("3. 회원 이름으로 검색(다수)");
		System.out.println("4. 회원 가입");
		System.out.println("5. 회원 정보 변경");
		System.out.println("6. 회원 탈퇴");
		System.out.println("0. 프로그램 종료");
		System.out.print("선택 : ");
		choice = sc.nextInt(); //선택값 choice 변수에 저장

		switch(choice) {
		case 1:mCon.selectMemberAll(); break;
		case 2:
			System.out.print("검색할 ID를 입력 : ");
			mCon.selectMemberId(sc.next()); break;
		case 3:
			System.out.print("검색할 NAME을 입력 : ");
			mCon.selectMemberName(sc.next());
			break;
		case 4:
			Member m=joinMember();//입력받는 전용메소드
			mCon.insertMember(m);//Member m=joinMember();이거랑 같다.
			break;
		case 5:
			//해당 회원 정보 조회
			System.out.print("수정할 ID 입력 : ");
			String userId=sc.next();
			boolean result=mCon.searchUserId(userId);
			if(result) {//true가 리턴되었다면 회원이 있다는 의미가 되므로 수정 작업이 진행
			//비밀번호, 이메일, 폰번호, 주소, 취미
				Member m2=modifyMember();
				mCon.updateMember(userId,m2);
			}
			
			
			
			break;
		case 6:
			System.out.print("삭제할 ID를 입력 : ");//삭제할경우 기준을 ID로 잡았다.
			mCon.deleteMember(sc.next());
			break;
		}
		}while(choice!=0);//한번은 무조건 실행될 것이기 때문에 do while로 짰다.
		System.out.println("저희 프로그램을 이용해주셔서 감사합니다. 호구님!");
	}
	
	//회원 정보 수정 입력 메소드
	public Member modifyMember() {
		
		Member m= new Member();
		System.out.println("\n ---------- 수정될 회원 정보 입력 ----------\n");
		System.out.print("변경될 비밀번호 입력:");
		m.setMemberPwd(sc.next());
		System.out.print("변경될 이메일 입력:");
		m.setEmail(sc.next());
		System.out.print("변경될 폰번호 입력(-를제외):");
		m.setPhone(sc.next());
		System.out.print("변경될 주소 입력:");
		m.setAddress(sc.next());
		System.out.print("변경될 취미 입력(,로구분):");
		m.setHobby(sc.next());
		return m;
	
	}
	
	
	
	
	//회원 가입 정보 입력 메소드
		public Member joinMember() {
			System.out.println("- - - - - -회원 가입 정보 입력 ----");
			System.out.print("아이디 입력 : ");
			String userId=sc.next();
			System.out.print("비밀번호 입력 : ");
			String userPwd = sc.next();
			System.out.print("이름 입력 : ");
			String userName=sc.next();
			System.out.print("성별 입력 : ");
			char gender = sc.next().charAt(0);
			System.out.print("나이 입력 : ");
			int age = sc.nextInt();
			System.out.print("이메일 입력 : ");
			String email = sc.next();
			System.out.print("폰번호 입력(-빼고 입력) : ");
			String phone=sc.next();
			System.out.print("주소 입력 : ");
			sc.nextLine();
			String address = sc.nextLine();
			System.out.print("취미 입력(,로 구분 지어서 입력) : ");
			String hobby = sc.next();
			
			Member m = new Member();
			m.setMemberId(userId);
			m.setMemberPwd(userPwd);
			m.setMemberName(userName);
			m.setGender(gender);
			m.setAge(age);
			m.setEmail(email);
			m.setPhone(phone);
			m.setAddress(address);
			m.setHobby(hobby);
			return m;
		}
	
	
}







JDBC4 -> 같은걸 JDBCTemplate로 빼기 !! 그렇게 되면 new를 남발하게 된다.



package org.kh.common;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

// JDBCTemplate 클래스는 공통적으로 사용되는 코드를 작성해놓은 클래스
// 코드의 중복을 줄일 수 있음

public class JDBCTemplate {

		public JDBCTemplate() {} //디폴트 생성자

		public Connection getConnection() {
			Connection conn = null;
			
			try {
				Class.forName("oracle.jdbc.driver.OracleDriver");
				
				conn=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "member", "member");
			
				conn.setAutoCommit(false);
				
				
			
			
			} catch (ClassNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			return conn;
			
			
		}
		
		//커넥션 객체가 null이아니거나 이미 종료된게 아니라면 닫아라.
		public void close(Connection conn) {
			try {
				if(conn!=null && !conn.isClosed()) {
					conn.close();
				}
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		//commit에 대한 것
		public void commit(Connection conn) {
			try {
				if(conn != null && conn.isClosed()) {
					conn.commit();
				}
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
		//rollback에 대한것
		public void rollback(Connection conn) {
			try {
				if(conn != null && !conn.isClosed()) {
					conn.rollback();
				}
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	
		
}




package org.kh.member.controller;

import java.security.Provider.Service;
import java.sql.Connection;
import java.util.ArrayList;

import org.kh.member.dao.MemberDao;
import org.kh.member.model.service.MemberService;
import org.kh.member.model.vo.Member;

public class MemberController {

	// 컨트롤러 클래스의 역할
	// view에서 요청한 기능을 컨트롤러가 DAO와의 연결을 하는 역할

	// -> Controller Service Dao 로 해서 코드 짜보겠다.

	// 회원 전체출력 메소드 -> 오늘 수정하는것  -> 바꾼것
	public void selectMemberAll() {
		MemberService service = new MemberService();
		ArrayList<Member> list = service.selectMemberAll();

		if(!list.isEmpty()) {
			System.out.println("\n----------------- 전체 회원 정보 조회 -----------------\n");
			System.out.println("아이디     비밀번호  이름   성별   나이   이메일   전화번호   주소   취미   가입일");
			for(Member m : list) {
				System.out.println(m);
			}
		}else {
			System.out.println("회원이 등록되지 않았습니다.");
		}

	}

	// 회원 아이디 검색 메소드
	public void selectMemberId(String userId) {//매개변수 낙타표기법으로 썼다.
		//System.out.println("입력받은 문자열 : "+userId);
		
		MemberService service = new MemberService();
		Member m = service.selectMemberId(userId);

		
		
		
		if(m!=null) //객체가 있을때(조회가 성공하였을때)
		{
			// 결과출력

			System.out.println("\n----------------- 전체 회원 정보 조회 -----------------\n");
			System.out.println("아이디     비밀번호  이름   성별   나이   이메일   전화번호   주소   취미   가입일");
			System.out.println(m);//하나일때는 굳이 m하나만 해주면 된다.
		}
		else //객체가 없을때(조회가 없어서 null이 리턴되었을때)
		{
			System.out.println("해당되는 ID를 가진 회원이 없습니다.");
		}




	}

	// 회원 이름 검색 메소드
	public void selectMemberName(String userName) {
		
		MemberService service = new MemberService();
		ArrayList<Member> list = service.selectMemberName(userName); 
		//ArrayList<Member> list = new MemberService().selectMemberName(userName);
		
		if(!list.isEmpty()) {
			System.out.println("\n----------------- 전체 회원 정보 조회 -----------------\n");
			System.out.println("아이디     비밀번호  이름   성별   나이   이메일   전화번호   주소   취미   가입일");

			for(Member m:list) {
				System.out.println(m);
			}
		}else {
			System.out.println("누가없는거 찾으래!");
		}
	}

	// 회원 가입 메소드 -> 바꾼것
	public void insertMember(Member m) {
		/*MemberService service = new MemberService();
		service.insertMember(m);
		 */
		//체이닝 기법
		int result=new MemberService().insertMember(m);
		if(result>0) {
			System.out.println("회원 가입이 성공하였습니다.");
		}
		else {
			System.out.println("회원 가입이 실패하였습니다.");
		}
	}

	// 회원 정보 수정 메소드
	public void updateMember(String userId,Member m2) {
		MemberService service = new MemberService();
		//Connection conn=null;
		int result=service.updateMember(userId, m2);
		if(result>0) {
			System.out.println("정보 수정이 정상 처리 되었습니다.");
		}else {
			System.out.println("회원 정보 수정이 실패 하였습니다.(관리자에게문의)");
		}
	}

	// 회원 탈퇴 메소드
	public void deleteMember(String userId) {
		
		MemberService service = new MemberService();
		
		int result = service.deleteMember(userId);
		if(result>0) {
			System.out.println("정상적으로 탈퇴 되었습니다.");
		}
		else {
			System.out.println("탈퇴가 실패 하였습니다.");
		}

	}

	public boolean searchUserId(String userId) {
		// TODO Auto-generated method stub
		//System.out.println("입력받은 문자열 : "+userId);
		
		MemberService service = new MemberService();
		//dao.selectMemberId(userId);//dao를 그대로 dao한테줘서 그걸 DB한테그아이디로 검색하게끔 할것이다.
		//Member m = dao.selectUserId(userId);
		Member m = service.selectMemberId(userId);

		if(m!=null) //객체가 있을때(조회가 성공하였을때)
		{
			// 결과출력

			System.out.println("회원 조회가 완료되었습니다.");
			System.out.println("\n----------------- ["+userId+"]회원정보 -----------------\n");
			System.out.println("아이디     비밀번호  이름   성별   나이   이메일   전화번호   주소   취미   가입일");
			System.out.println(m);//하나일때는 굳이 m하나만 해주면 된다.
			return true;


		}
		else //객체가 없을때(조회가 없어서 null이 리턴되었을때)
		{
			System.out.println("해당되는 ID를 가진 회원이 없습니다.");
			return false;
		}

	}



}




package org.kh.member.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;

import org.kh.member.model.vo.Member;

public class MemberDao {
	
	//DBMS에 접근하는 전체 회원 조회 메소드
	public ArrayList<Member> selectMemberAll(Connection conn) {
		Statement stmt =null;
		ResultSet rset = null;
		
		ArrayList<Member> list = new ArrayList<Member>();
		
		try {
			stmt = conn.createStatement();
			
			String query = "select * from member";
			
			rset = stmt.executeQuery(query);
			
			while(rset.next()) {
				Member m=new Member();//결과가 있으므로 정보를 저장할 VO 객체 생성
				m.setMemberId(rset.getString("member_id"));
				m.setMemberPwd(rset.getString("member_pwd"));
				m.setMemberName(rset.getString("member_name"));
				m.setGender(rset.getString("gender").charAt(0));
				m.setAge(rset.getInt("age"));
				m.setEmail(rset.getString("email"));
				m.setPhone(rset.getString("phone"));
				m.setAddress(rset.getString("address"));
				m.setHobby(rset.getString("hobby"));
				m.setEnrollDate(rset.getDate("enroll_date"));
				
				list.add(m);
			}
			
			
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				rset.close();
				stmt.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		

		return list;

		
	}
	
	public Member selectMemberId(String userId,Connection conn) {
			
		PreparedStatement pstmt=null;
		ResultSet rset=null;
		
		Member m=null;
		
		String query="select * from member where member_id=?";
		try {
			pstmt=conn.prepareStatement(query);
			pstmt.setString(1, userId);
			rset=pstmt.executeQuery();
			
			if(rset.next()) {//만약에 1명의 결과가 조회되었다면 진행하고 없다면 하지마라!
				
				m=new Member();//결과가 있으므로 정보를 저장할 VO 객체 생성
				m.setMemberId(rset.getString("member_id"));
				m.setMemberPwd(rset.getString("member_pwd"));
				m.setMemberName(rset.getString("member_name"));
				m.setGender(rset.getString("gender").charAt(0));
				m.setAge(rset.getInt("age"));
				m.setEmail(rset.getString("email"));
				m.setPhone(rset.getString("phone"));
				m.setAddress(rset.getString("address"));
				m.setHobby(rset.getString("hobby"));
				m.setEnrollDate(rset.getDate("enroll_date"));
			}
			
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				rset.close();
				pstmt.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}
		return m;
		
		
		
	}

	public ArrayList<Member> selectMemberName(String userName,Connection conn) {
		// TODO Auto-generated method stub
		
		PreparedStatement pstmt=null;
		ResultSet rset=null;
		
	
		ArrayList<Member> list = new ArrayList<Member>();
		
		try {
			
			String query="select * from member where member_name like '%'||?||'%'";
	
			pstmt=conn.prepareStatement(query);
			pstmt.setString(1, userName);
			rset=pstmt.executeQuery();
		
			while(rset.next()) {
				Member m = new Member();
				
				//ID값 저장하기
				m.setMemberId(rset.getString("member_id"));
				m.setMemberPwd(rset.getString("member_pwd"));
				m.setMemberName(rset.getString("member_name"));
				m.setGender(rset.getString("gender").charAt(0));
				m.setAge(rset.getInt("age"));
				m.setEmail(rset.getString("email"));
				m.setAddress(rset.getString("address"));
				m.setHobby(rset.getString("hobby"));
				m.setEnrollDate(rset.getDate("enroll_date"));
				
				list.add(m);
			}
			
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		try {
			rset.close();
			pstmt.close();
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
		
		
		
	}
	//회원 가입용 메소드
	public int insertMember(Member m,Connection conn) {
		PreparedStatement pstmt = null;
		
		int result = 0;
		
		String query = "insert into member values (?,?,?,?,?,?,?,?,?,sysdate)";
		
		try {
			pstmt=conn.prepareStatement(query);
			pstmt.setString(1, m.getMemberId());
			pstmt.setString(2, m.getMemberPwd());
			pstmt.setString(3, m.getMemberName());
			pstmt.setString(4, String.valueOf(m.getGender()));
			pstmt.setInt(5, m.getAge());
			pstmt.setString(6, m.getEmail());
			pstmt.setString(7, m.getPhone());
			pstmt.setString(8, m.getAddress());
			pstmt.setString(9, m.getHobby());
			
			result=pstmt.executeUpdate();//위에서 쿼리 담았기 때문에 안담는다.
			//System.out.println(query);
			
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				pstmt.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		return result;
	}

	public int updatemember(String userId,Member m2,Connection conn) {
		// TODO Auto-generated method stub
		
		PreparedStatement pstmt=null;
		int result=0;
		try {
		
			String query="update member set member_pwd=?, email=?,phone=?,address=?,hobby=? where member_id=?";
			pstmt = conn.prepareStatement(query);
			
			pstmt.setString(1, m2.getMemberPwd());
			pstmt.setString(2, m2.getEmail());
			pstmt.setString(3, m2.getPhone());
			pstmt.setString(4, m2.getAddress());
			pstmt.setString(5, m2.getHobby());
			pstmt.setString(6, userId);
			
			
			
			
			
			
			System.out.println(query);
			result=pstmt.executeUpdate();
			
			if(result>0) {
				conn.commit();
			}
			else {
				conn.rollback();
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				pstmt.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		
		}
		return result;
	
		
		
	}
	public int deleteMember(String userId,Connection conn) {
		// TODO Auto-generated method stub
		//래퍼런스 3종세트
		
		PreparedStatement pstmt=null;
		//ResultSet rset=null; -> 이제 안만들어도된다. select가아니므로 결과값이 돌아올 필요가 없기 때문이다.
		int result=0; //결과를 숫자로 받을려고 한다.

		try {


			//String query="delete from member where member_id='"+userId+"'";
			String query="delete from member where member_id=?";
			pstmt = conn.prepareStatement(query);
			
			pstmt.setString(1, userId);
			System.out.println(query);
			//stmt.executeQuery(sql) -> select 전용이다.

			//0이넘어오면 정상적으로되었다 하면되고 아니면 정상가입 안되었다고 하면된다.
			result=pstmt.executeUpdate(); //return 타입이 int형이다.

			//commit과 rollback가 없을경우 트랜잭션을 계속 잡고 있게 된다.
			

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				pstmt.close();
				
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}

		}

		return result;
	}


	


	
	
}




package org.kh.member.model.service;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.ArrayList;

import org.kh.common.JDBCTemplate;
import org.kh.member.dao.MemberDao;
import org.kh.member.model.vo.Member;

public class MemberService {


	// 서비스 클래스의 역할
	// 기존에는 DAO가 DBMS와 연결하고 커밋과 롤백시에도 직접 처리 하였음
	// DAO는 DBMS에 접근하여 데이터를 가져오는게 핵심 역할일뿐
	// 실제 DBMS에 연결하거나 커밋, 롤백 작업을 하는 것은 확장성 문제가 발생할 수 있음
	// 그렇기 때문에 이제는 서비스에서 DBMS와의 연결 작업 (드라이브 등록 및 Connection)을
	// 진행하고, 트랜잭션 관리를 처리하는 역할을 함
	// Service에서 연결을 한 후 연결 정보를 다 insert나 delete로 준다. 

	public ArrayList<Member> selectMemberAll() {
		//서비스는 DB에 연결하는 역할
		Connection conn = new JDBCTemplate().getConnection();
		ArrayList<Member> list=null;
		list = new MemberDao().selectMemberAll(conn);
		//	MemberDao dao = new MemberDao();
		//list = dao.selectMemberAll(conn);
		
		new JDBCTemplate().close(conn);


		return list;

	}

	//회원 가입 메소드
	public int insertMember(Member m) {
		//서비스역할 드라이버 등록
		Connection conn=new JDBCTemplate().getConnection();

		int result=0;
		result = new MemberDao().insertMember(m,conn);//커넥션정보도 같이 보내줘야 한다.
	
		if(result>0) {
			new JDBCTemplate().commit(conn);
		}
		else {
			new JDBCTemplate().rollback(conn);
		}
		
		new JDBCTemplate().close(conn);
		
		return result; //최종 결과값으로 컨트롤러에게 전달
	}

	//회원아이디검색
	public Member selectMemberId(String userId) {
		//서비스는 DB에 연결하는 역할
		Connection conn=new JDBCTemplate().getConnection();
		Member m =null;
		m= new MemberDao().selectMemberId(userId, conn);
		
		new JDBCTemplate().close(conn);
		

		return m;
	}



	//회원 이름검색
	public ArrayList<Member> selectMemberName(String userName) {
		Connection conn=new JDBCTemplate().getConnection();
		ArrayList<Member> list=null;
		Member m = new Member();
//		MemberDao dao = new MemberDao();
//		list = dao.selectMemberName(userName,conn);
		list=new MemberDao().selectMemberName(userName, conn);

		new JDBCTemplate().close(conn);

		return list;

	}

	//회원 정보 수정 메소드
	public int updateMember(String userId,Member m) {
		Connection conn=new JDBCTemplate().getConnection();
		int result=0;
//		MemberDao dao = new MemberDao();
//		result=dao.updatemember(userId,m,conn);
		result=new MemberDao().updatemember(userId, m, conn);
		
		
		
		if(result>0) {
			new JDBCTemplate().commit(conn);
		}
		else {
			new JDBCTemplate().rollback(conn);
		}
		
		
		new JDBCTemplate().close(conn);

		return result;
	}

	//회원 삭제 메소드
	public int deleteMember(String userId) {
		Connection conn=new JDBCTemplate().getConnection();
		int result=0;

		MemberDao dao = new MemberDao();
		result=dao.deleteMember(userId,conn);

		if(result>0) {
			new JDBCTemplate().commit(conn);
		}
		else {
			new JDBCTemplate().rollback(conn);
		}

		new JDBCTemplate().close(conn);



		return result;

	}

}




package org.kh.member.model.vo;

import java.sql.Date;

public class Member {
	//ID, PW
	private String memberId;
	private String memberPwd;
	private String memberName;
	private char gender;
	private int age;
	private String email;
	private String phone;
	private String address;
	private String hobby;
	private Date enrollDate; // java.sql.Date import
	
	public Member(String memberId, String memberPwd, String memberName, char gender, int age, String email,
			String phone, String address, String hobby, Date enrollDate) {
		super();
		this.memberId = memberId;
		this.memberPwd = memberPwd;
		this.memberName = memberName;
		this.gender = gender;
		this.age = age;
		this.email = email;
		this.phone = phone;
		this.address = address;
		this.hobby = hobby;
		this.enrollDate = enrollDate;
	}
	
	
	public Member() {
		super();
		// TODO Auto-generated constructor stub
	}

	
	//이렇게 해줄경우 컨트롤러에서 toString을 호출하게끔 할수 있다.
	@Override
	public String toString() {
		
		return 
				this.getMemberId() + "  " +
				this.getMemberPwd() + "  " +
				this.getMemberName() + "  "+ 
				this.getGender() + "  " +
				this.getAge() + "  " +
				this.getEmail() + "  " +
				this.getPhone()+ "  " +
				this.getAddress() + "  " +
				this.getHobby() + "  " +
				this.getEnrollDate();
	}
	
	

	//alt+shift+s
	public String getMemberId() {
		return memberId;
	}
	
	public void setMemberId(String memberId) {
		this.memberId = memberId;
	}
	public String getMemberPwd() {
		return memberPwd;
	}
	public void setMemberPwd(String memberPwd) {
		this.memberPwd = memberPwd;
	}
	public String getMemberName() {
		return memberName;
	}
	public void setMemberName(String memberName) {
		this.memberName = memberName;
	}
	public char getGender() {
		return gender;
	}
	public void setGender(char gender) {
		this.gender = gender;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String getEmail() {
		return email;
	}
	public void setEmail(String email) {
		this.email = email;
	}
	public String getPhone() {
		return phone;
	}
	public void setPhone(String phone) {
		this.phone = phone;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public String getHobby() {
		return hobby;
	}
	public void setHobby(String hobby) {
		this.hobby = hobby;
	}
	public Date getEnrollDate() {
		return enrollDate;
	}
	public void setEnrollDate(Date enrollDate) {
		this.enrollDate = enrollDate;
	}
	
	
	
}




package org.kh.member.run;

import org.kh.member.view.MemberMgr;

public class RunMain {
	public static void main(String[] args) {
		MemberMgr mgr = new MemberMgr();
		mgr.mainMenu();
		
		
		//new MemberMgr().mainMenu(); //객체 만들자 마자 실행
		//한번만 만들어서 실행하는걸로 challenge방식으로 할 수도 있다.
	}
}




package org.kh.member.view;

import java.util.Scanner;

import org.kh.member.controller.MemberController;
import org.kh.member.model.vo.Member;

//회원 관리 메뉴를 보여주는 View Class
public class MemberMgr {
	private Scanner sc = new Scanner(System.in);
	
	private MemberController mCon = new MemberController();//컨트롤러 객체
	
	// 메인 메뉴 메소드
	public void mainMenu() {
		int choice; 
		do {
		System.out.println("\n= = = = = = = = = = 회원 관리 프로그램 = = = = = = ");
		System.out.println("1. 회원 정보 전체 조회");
		System.out.println("2. 회원 아이디 조회(1명)");
		System.out.println("3. 회원 이름으로 검색(다수)");
		System.out.println("4. 회원 가입");
		System.out.println("5. 회원 정보 변경");
		System.out.println("6. 회원 탈퇴");
		System.out.println("0. 프로그램 종료");
		System.out.print("선택 : ");
		choice = sc.nextInt(); //선택값 choice 변수에 저장

		switch(choice) {
		case 1:mCon.selectMemberAll(); break;
		case 2:
			System.out.print("검색할 ID를 입력 : ");
			mCon.selectMemberId(sc.next()); break;
		case 3:
			System.out.print("검색할 NAME을 입력 : ");
			mCon.selectMemberName(sc.next());
			break;
		case 4:
			Member m=joinMember();//입력받는 전용메소드
			mCon.insertMember(m);//Member m=joinMember();이거랑 같다.
			break;
		case 5:
			//해당 회원 정보 조회
			System.out.print("수정할 ID 입력 : ");
			String userId=sc.next();
			boolean result=mCon.searchUserId(userId);
			if(result) {//true가 리턴되었다면 회원이 있다는 의미가 되므로 수정 작업이 진행
			//비밀번호, 이메일, 폰번호, 주소, 취미
				Member m2=modifyMember();
				mCon.updateMember(userId,m2);
			}
			
			
			
			break;
		case 6:
			System.out.print("삭제할 ID를 입력 : ");//삭제할경우 기준을 ID로 잡았다.
			mCon.deleteMember(sc.next());
			break;
		}
		}while(choice!=0);//한번은 무조건 실행될 것이기 때문에 do while로 짰다.
		System.out.println("저희 프로그램을 이용해주셔서 감사합니다. 호구님!");
	}
	
	//회원 정보 수정 입력 메소드
	public Member modifyMember() {
		
		Member m= new Member();
		System.out.println("\n ---------- 수정될 회원 정보 입력 ----------\n");
		System.out.print("변경될 비밀번호 입력:");
		m.setMemberPwd(sc.next());
		System.out.print("변경될 이메일 입력:");
		m.setEmail(sc.next());
		System.out.print("변경될 폰번호 입력(-를제외):");
		m.setPhone(sc.next());
		System.out.print("변경될 주소 입력:");
		m.setAddress(sc.next());
		System.out.print("변경될 취미 입력(,로구분):");
		m.setHobby(sc.next());
		return m;
	
	}
	
	
	
	
	//회원 가입 정보 입력 메소드
		public Member joinMember() {
			System.out.println("- - - - - -회원 가입 정보 입력 ----");
			System.out.print("아이디 입력 : ");
			String userId=sc.next();
			System.out.print("비밀번호 입력 : ");
			String userPwd = sc.next();
			System.out.print("이름 입력 : ");
			String userName=sc.next();
			System.out.print("성별 입력 : ");
			char gender = sc.next().charAt(0);
			System.out.print("나이 입력 : ");
			int age = sc.nextInt();
			System.out.print("이메일 입력 : ");
			String email = sc.next();
			System.out.print("폰번호 입력(-빼고 입력) : ");
			String phone=sc.next();
			System.out.print("주소 입력 : ");
			sc.nextLine();
			String address = sc.nextLine();
			System.out.print("취미 입력(,로 구분 지어서 입력) : ");
			String hobby = sc.next();
			
			Member m = new Member();
			m.setMemberId(userId);
			m.setMemberPwd(userPwd);
			m.setMemberName(userName);
			m.setGender(gender);
			m.setAge(age);
			m.setEmail(email);
			m.setPhone(phone);
			m.setAddress(address);
			m.setHobby(hobby);
			return m;
		}
	
	
}


Oracle SQL Developer


ID : member

PW : member


---------------------------------------------------

desc member;


select * from member;