관리 메뉴

거니의 velog

230915_JDBC 2 본문

대덕인재개발원_자바기반 애플리케이션

230915_JDBC 2

Unlimited00 2023. 9. 15. 13:22

[jdbcTest06_2.java]

package kr.or.ddit.basic;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

import kr.or.ddit.util.DBUtil;

/*
 * 회원 관리를 하는 프로그램을 작성하시오.
 * (MYMEMBER 테이블 이용)
 * 
 * 아래의 메뉴를 구성하고 각 메뉴의 기능을 구현하시오. (CRUD 기능 구현하기)
 * 메뉴예시)
 * == 작업 선택 ==
 * 1. 자료 추가		==> Create (insert문)
 * 2. 자료 삭제		==> Delete (delete문)
 * 3. 자료 수정		==> Update (update문)
 * 4. 전체 자료 출력        ==> Read   (select문)
 * 0. 작업 끝.
 * ------------
 * 
 * 조건) 
 * 1) 자료 추가에서 '회원ID'는 중복되지 않는다. (중복되면 다시 입력 받는다.)
 * 2) 자료 삭제는 '회원ID'를 입력 받아서 처리한다.
 * 3) 자료 수정에서 '회원ID'는 변경되지 않는다.
 * 
 */
public class jdbcTest06_2 {
	
	private Scanner scan = new Scanner(System.in);
	
	public static void main(String[] args) {
		
		new jdbcTest06_2().StartMember();
		
	}
	
	// 시작 메서드
	public void StartMember() {
		while(true) {
			int choice = displayMenu();
			switch(choice) {
				case 1: // 추가
					insertMember(); break;
				case 2: // 삭제
					deleteMember(); break;
				case 3: // 수정 ==> 전체 항목 수정
					updateMember(); break;
				case 4: // 전체 출력
					displayAllMember(); break;
				case 5: // 수정2 ==> 원하는 항목 수정
					updateMember2(); break;
				case 0: // 작업 끝.
					System.out.println();
					System.out.println("작업을 마칩니다...");
					return;
				default:
					System.out.println();
					System.out.println("작업 번호를 잘못 입력했습니다.");
					System.out.println("다시 입력하세요...");
			}
		}
	}
	
	// 회원 정보를 수정하는 메서드 ==> 원하는 항목만 수정
	private void updateMember2() {
		Connection conn = null;
		PreparedStatement pstmt = null;
		
		System.out.println();
		System.out.println("수정할 회원 정보를 입력하세요...");
		System.out.print("수정할 회원ID >> ");
		String id = scan.nextLine();
		
		if(getMemIdCount(id) == 0) {
			System.out.println();
			System.out.println(id + "은(는) 없는 회원ID 입니다...");
			System.out.println("수정 작업을 마칩니다...");
			System.out.println();
			return;
		}
		
//		update mymember set mem_tel = '새로운 전화번호' where mem_id = '수정할 회원ID';
//		update mymember set mem_name = '새로운 이름' where mem_id = '수정할 회원ID';
//		...
		
		int num; // 수정 항목 선택 번호가 저장될 변수
		String updateField = null; // 수정할 컬럼명이 저장될 변수
		String updatetitle = null; // 수정할 데이터를 입력 받을 때 출력할 메시지
		do {
			System.out.println();
			System.out.println("수정할 항목을 선택하세요...");
			System.out.println("1. 비밀번호     2. 회원이름     3. 전화번호     4. 회원주소");
			System.out.println("--------------------------------------------");
			System.out.print("수정할 항목 선택 >> ");
			num = scan.nextInt();
			
			switch(num) {
				case 1: 
					updateField = "mem_pass"; updatetitle = "비밀번호"; break;
				case 2:
					updateField = "mem_name"; updatetitle = "회원이름"; break;
				case 3:
					updateField = "mem_tel"; updatetitle = "전화번호"; break;
				case 4:
					updateField = "mem_addr"; updatetitle = "회원주소"; break;
				default:
					System.out.println();
					System.out.println("수정할 항목을 잘못 선택했습니다.");
					System.out.println("다시 선택하세요...");
					System.out.println();
			}
			
		}while(num < 1 || num > 4);
		
		scan.nextLine(); // 버퍼 비우기
		System.out.println();
		System.out.print("새로운 " + updatetitle + " >> ");
		String updateData = scan.nextLine();
		
		try {
			conn = DBUtil.getConnection();
			
//			String sql = " update mymember set ? = ? where ? = ? ";
			// update mymember set 'mem_pass' = '3333' where 'mem_id' = '4444' ==> 컬럼명 자리가 String으로 바뀌면 에러 발생.
//			pstmt.setString(1, "mem_pass");
//			pstmt.setString(2, "3333");
//			pstmt.setString(3, "mem_id");
//			pstmt.setString(4, "4444");
			
			// update mymember set mem_pass = '3333' where mem_id = '4444' ==> 이렇게 쿼리가 나와야 함.
			String sql = " update mymember set " + updateField + " = ? where mem_id = ? ";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, updateData);
			pstmt.setString(2, id);
			
			int cnt = pstmt.executeUpdate();
			
			if(cnt > 0) {
				System.out.println();
				System.out.println(id + " 회원 정보 수정 완료!!!");
				System.out.println();
			}else {
				System.out.println();
				System.out.println(id + " 회원 정보 수정 실패~~~");
				System.out.println();
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			if(pstmt != null) try { pstmt.close(); } catch (SQLException e) {}
			if(conn != null) try { conn.close(); } catch (SQLException e) {}
		}
	}
	
	// 회원 정보를 수정하는 메서드 ==> 전체 항목 수정
	private void updateMember() {
		Connection conn = null;
		PreparedStatement pstmt = null;
		
		System.out.println();
		System.out.println("수정할 회원 정보를 입력하세요...");
		System.out.print("수정할 회원ID >> ");
		String id = scan.nextLine();
		
		if(getMemIdCount(id) == 0) {
			System.out.println();
			System.out.println(id + "은(는) 없는 회원ID 입니다...");
			System.out.println("수정 작업을 마칩니다...");
			System.out.println();
			return;
		}
		
		System.out.print("새로운 비밀번호 입력 >> ");
		String newPass = scan.next();
		
		System.out.print("새로운 회원이름 입력 >> ");
		String newName = scan.next();
		
		System.out.print("새로운 전화번호 입력 >> ");
		String newTel = scan.next();
		
		scan.nextLine(); // 버퍼 비우기
		
		System.out.print("새로운 회원주소 입력 >> ");
		String newAddr = scan.nextLine();
		
		try {
			conn = DBUtil.getConnection();
			String sql = " update mymember set mem_pass = ?, mem_name = ?, "
					+ " mem_tel = ?, mem_addr = ? where mem_id = ? ";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, newPass);
			pstmt.setString(2, newName);
			pstmt.setString(3, newTel);
			pstmt.setString(4, newAddr);
			pstmt.setString(5, id);
			
			int cnt = pstmt.executeUpdate();
			
			if(cnt > 0) {
				System.out.println();
				System.out.println(id + " 회원 정보 수정 완료!!!");
				System.out.println();
			}else {
				System.out.println();
				System.out.println(id + " 회원 정보 수정 실패~~~");
				System.out.println();
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			if(pstmt != null) try { pstmt.close(); } catch (SQLException e) {}
			if(conn != null) try { conn.close(); } catch (SQLException e) {}
		}
	}
	
	// 회원 정보를 삭제하는 메서드
	private void deleteMember() {
		Connection conn = null;
		PreparedStatement pstmt = null;
		
		System.out.println();
		System.out.println("삭제할 회원 정보를 입력하세요...");
		System.out.print("삭제할 회원ID >> ");
		String id = scan.nextLine();
		
		if(getMemIdCount(id) == 0) {
			System.out.println();
			System.out.println(id + "은(는) 없는 회원ID 입니다...");
			System.out.println("삭제 작업을 마칩니다...");
			System.out.println();
			return;
		}
		
		try {
			conn = DBUtil.getConnection();
			String sql = " delete from mymember where mem_id = ? ";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, id);
			
			int cnt = pstmt.executeUpdate();
			
			if(cnt > 0) {
				System.out.println();
				System.out.println(id + " 회원 정보 삭제 성공!!!");
				System.out.println();
			}else {
				System.out.println();
				System.out.println(id + " 회원 정보 삭제 실패~~~");
				System.out.println();
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			if(pstmt != null) try { pstmt.close(); } catch (SQLException e) {}
			if(conn != null) try { conn.close(); } catch (SQLException e) {}
		}
	}
	
	// 새로운 회원 정보를 추가하는 메서드
	private void insertMember() {
		Connection conn = null;
		PreparedStatement pstmt = null;
		
		System.out.println();
		System.out.println("새롭게 추가할 회원 정보를 입력하세요...");
		
		int count = 0;
		String id = null; // 입력한 회원 ID가 저장될 변수
		do {
			System.out.print("회원 ID 입력 >> ");
			id = scan.next();
			scan.nextLine();
			
			count = getMemIdCount(id);
			
			if(count > 0) {
				System.out.println(id + "은(는) 이미 등록된 회원ID 입니다.");
				System.out.println("다른 회원ID를 입력하세요...");
				System.out.println();
			}
			
		}while(count > 0);
		
		System.out.print("비밀번호 입력 >> ");
		String pass = scan.next();
		
		System.out.print("회원이름 입력 >> ");
		String name = scan.next();
		
		System.out.print("전화번호 입력 >> ");
		String tel = scan.next();
		
		scan.nextLine(); // 버퍼 비우기
		
		System.out.print("주     소 입력 >> ");
		String addr = scan.nextLine();
		
		try {
			conn = DBUtil.getConnection();
			String sql = " insert into mymember (mem_id, mem_pass, mem_name, mem_tel, mem_addr) ";
			sql += " values(?, ?, ?, ?, ?) ";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, id);
			pstmt.setString(2, pass);
			pstmt.setString(3, name);
			pstmt.setString(4, tel);
			pstmt.setString(5, addr);
			
			int cnt = pstmt.executeUpdate();
			
			if(cnt > 0) {
				System.out.println();
				System.out.println(id + "회원 정보 추가 완료!!!");
				System.out.println();
			}else {
				System.out.println();
				System.out.println(id + "회원 정보 추가 실패~~~");
				System.out.println();
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			if(pstmt != null) try { pstmt.close(); } catch (SQLException e) {}
			if(conn != null) try { conn.close(); } catch (SQLException e) {}
		}
		
	}
	
	// 회원ID를 매개변수로 받아서 해당 회원ID의 개수를 반환하는 메서드
	private int getMemIdCount(String memId) {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		int count = 0; // 검색한 회원ID의 개수가 저장될 변수
		try {
			conn = DBUtil.getConnection();
			String sql = " select count(*) as cnt from mymember where mem_id = ? ";
			pstmt = conn.prepareStatement(sql);
			pstmt.setString(1, memId);
			
			rs = pstmt.executeQuery();
			
			if(rs.next()) {
				count = rs.getInt("cnt");
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			if(rs != null) try { rs.close(); } catch (SQLException e) {}
			if(pstmt != null) try { pstmt.close(); } catch (SQLException e) {}
			if(conn != null) try { conn.close(); } catch (SQLException e) {}
		}
		
		return count;
	}
	
	// 전체 회원 정보를 출력하는 메서드
	private void displayAllMember() {
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		System.out.println();
		System.out.println("-----------------------------------------");
		System.out.println(" ID\t 비밀번호\t 이름\t 전화번호\t 주소");
		System.out.println("-----------------------------------------");
		
		try {
			conn = DBUtil.getConnection();
			String sql = " select * from mymember ";
			pstmt = conn.prepareStatement(sql);
			rs = pstmt.executeQuery();
			
			int cnt = 0; // 출력한 데이터 개수가 저장될 변수
			while(rs.next()) {
				cnt++;
				String memId = rs.getString("mem_id");
				String memPass = rs.getString("mem_pass");
				String memName = rs.getString("mem_name");
				String memTel = rs.getString("mem_tel");
				String memAddr = rs.getString("mem_addr");
				
				System.out.println(memId + "\t" + memPass + "\t" + memName + "\t" + memTel + "\t" + memAddr);
			}
			
			if(cnt == 0) {
				System.out.println(" \t등록된 회원이 하나도 없습니다... ");
			}
			
			System.out.println("-----------------------------------------");
			System.out.println();
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			if(rs != null) try { rs.close(); } catch (SQLException e) {}
			if(pstmt != null) try { pstmt.close(); } catch (SQLException e) {}
			if(conn != null) try { conn.close(); } catch (SQLException e) {}
		}
	}
	
	// 메뉴를 출력하고 입력받은 선택 번호를 반환하는 메서드
	private int displayMenu() {
		System.out.println("=== 작업 선택 ===");
		System.out.println("1. 자료 추가");
		System.out.println("2. 자료 삭제");
		System.out.println("3. 자료 수정");
		System.out.println("4. 전체 자료 출력");
		System.out.println("5. 자료 수정 2");
		System.out.println("0. 작업 끝");
		System.out.println("--------------");
		System.out.print("작업 선택 >> ");
		return Integer.parseInt(scan.nextLine());
	}

}


[dbinfo.properties]

# 이 줄은 주석 처리 줄 입니다...
# 이 properties 파일을 작성하는 방법은
# 'key값=value값' 과 같은 모양으로 작성합니다.

driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:xe
user=pc_09
password=java

[PropertiesTest.java]

package kr.or.ddit.basic;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;

public class PropertiesTest {

	public static void main(String[] args) {
		
		// 읽어온 파일 정보를 저장할 Properties 객체 생성
		Properties prop = new Properties();
		
		// 읽어올 파일 정보를 이용한 File 객체 생성
		File f = new File("res/kr/or/ddit/jdbc/config/dbinfo.properties");
		FileInputStream fin = null;
		
		try {
			// 파일 내용을 읽어올 스트림 객체 생성
			fin = new FileInputStream(f);
			
			// 입력 스트림을 이용하여 파일 내용을 읽어와 Properties 객체에 저장하기
			
			prop.load(fin); // 파일 내용을 읽어와 key값과 value값을 분류한 후 
							// 분류된 자료를 Properties 객체에 추가한다.
			
			// 읽어온 정보 출력해 보기
			System.out.println("driver : " + prop.getProperty("driver"));
			System.out.println("url : " + prop.getProperty("url"));
			System.out.println("user : " + prop.getProperty("user"));
			System.out.println("password : " + prop.getProperty("password"));
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if(fin != null) try { fin.close(); } catch (IOException e) {}
		}
		
	}

}


[DBUtil2.java]

package kr.or.ddit.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;

// JDBC드라이버를 로딩하고 
// Connection객체를 생성해서 반환하는 메서드로 구성된 class

// (dbinfo.properties 파일의 내용을 이용하여 설정하기)
// ==> Properties 객체 이용하기

public class DBUtil2 {
	
	static Properties prop; // Properties객체 변수 선언
	
	static {
		
		prop = new Properties(); // Properties객체 생성
		File f = new File("res/kr/or/ddit/jdbc/config/dbinfo.properties");
		FileInputStream fin = null;
		
		try {
			fin = new FileInputStream(f);
			prop.load(fin);
			
//			Class.forName("oracle.jdbc.driver.OracleDriver");
			Class.forName(prop.getProperty("driver"));
			
		} catch (ClassNotFoundException e) {
			System.out.println("드라이버 로딩 실패~~~");
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if(fin != null) try { fin.close(); } catch (IOException e) {}
		}
		
	}
	
	public static Connection getConnection() {
		
		Connection conn = null;
		
//		String url = "jdbc:oracle:thin:@localhost:1521:xe";
//		String user = "pc_09";
//		String password = "java";
		
		String url = prop.getProperty("url");
		String user = prop.getProperty("user");
		String password = prop.getProperty("password");
		
		try {
			conn = DriverManager.getConnection(url, user, password);
		} catch (SQLException e) {
			System.out.println("DB 연결 실패~~~");
			e.printStackTrace();
		}
		return conn;
		
	}

}

[jdbcTest06_2.java]

package kr.or.ddit.basic;

import java.sql.Connection;
...

public class jdbcTest06_2 {
	
	...
	
	// 전체 회원 정보를 출력하는 메서드
	private void displayAllMember() {
    	...
		
		try {
        	...
			conn = DBUtil2.getConnection(); // 여기를 바꿔서 실행되면 성공
            ...
	}

}


[ResourceBundleTest.java]

package kr.or.ddit.basic;

import java.util.ResourceBundle;

/*
 * ResourceBundle객체 ==> 파일의 확장자가 '.properties'인 파일의 내용을 읽어와
 * 						key값과 value값을 분리해서 정보를 갖고 있는 객체
 */
public class ResourceBundleTest {

	public static void main(String[] args) {
		
		// ResourceBundle 객체를 이용하여 '.properties' 파일 읽어오기
		
		// ResourceBundle 객체 생성
		//  ==> 읽어올 파일을 지정할 때 '패키지명.파일명'만 지정하고
		//		확장자는 지정하지 않는다.
		ResourceBundle bundle = ResourceBundle.getBundle("kr.or.ddit.jdbc.config.dbinfo");
		
		// 읽어온 내용 출력하기
		System.out.println("driver : " + bundle.getString("driver"));
		System.out.println("url : " + bundle.getString("url"));
		System.out.println("user : " + bundle.getString("user"));
		System.out.println("password : " + bundle.getString("password"));
		
	}

}


[DBUtil3.java]

package kr.or.ddit.util;

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

// JDBC드라이버를 로딩하고 
// Connection객체를 생성해서 반환하는 메서드로 구성된 class

//(dbinfo.properties 파일의 내용을 이용하여 설정하기)
//==> ResourceBundle 객체 이용하기

public class DBUtil3 {
	
	static ResourceBundle bundle; // ResourceBundle객체 변수 선언
	
	static {
		
		// 객체 생성
		bundle = ResourceBundle.getBundle("kr.or.ddit.jdbc.config.dbinfo");
		
		try {
//			Class.forName("oracle.jdbc.driver.OracleDriver");
			Class.forName(bundle.getString("driver"));
		} catch (ClassNotFoundException e) {
			System.out.println("드라이버 로딩 실패~~~");
			e.printStackTrace();
		}
		
	}
	
	public static Connection getConnection() {
		
		Connection conn = null;
		
//		String url = "jdbc:oracle:thin:@localhost:1521:xe";
//		String user = "pc_09";
//		String password = "java";
		
		String url = bundle.getString("url");
		String user = bundle.getString("user");
		String password = bundle.getString("password");
		
		try {
			conn = DriverManager.getConnection(url, user, password);
		} catch (SQLException e) {
			System.out.println("DB 연결 실패~~~");
			e.printStackTrace();
		}
		return conn;
		
	}

}

[jdbcTest06_2.java]

package kr.or.ddit.basic;

import java.sql.Connection;
...

public class jdbcTest06_2 {
	
	...
	
	// 전체 회원 정보를 출력하는 메서드
	private void displayAllMember() {
    	...
		
		try {
        	...
			conn = DBUtil3.getConnection(); // 여기를 바꿔서 실행되면 성공
            ...
	}

}


[JavaDocTest.java]

package kr.or.ddit.basic;

// JavaDoc 문서 파일 만들기 예제

/**
 * 
 * @author 홍길동
 * @version 1.0
 * 
 * <p>
 * 		파일명 : JavaDocTest.java <br />
 * 		설   명 : JavaDoc문서 작성 연습을 위한 연습용 interface <br /><br />
 * 		변경 이력 <br />
 * 		----------------------------------<br />
 * 		변경일자 : 2023-09-15 <br />
 * 		변경자 : 홍길동 <br />
 * 		변경내용 : 최초 작성 <br />
 * 		----------------------------------<br />
 * </p>
 *
 */
public interface JavaDocTest {

	/**
	 * 메서드명 : methodTest <br />
	 * 설   명 : 반환값이 없는 메서드 <br />
	 * 
	 * @param a 첫번째 매개변수(정수형)
	 * @param b 두번째 매개변수(정수형)
	 */
	public void methodTest(int a, int b);
	
	/**
	 * 메서드명 : methodAdd <br />
	 * 설   명 : 반환값이 있는 메서드 <br />
	 * 
	 * @param x 정수형 첫번째 매개변수
	 * @param y 정수형 두번째 매개변수
	 * 
	 * @return 처리된 결과를 정수형으로 반환한다.
	 */
	public int methodAdd(int x, int y);
	
	/**
	 * 메서드명 : methodSub <br />
	 * 설   명 : 매개변수가 없고 반환값이 있는 메서드 <br />
	 * 
	 * @return 정수형으로 반환한다.
	 */
	public int methodSub();
	
}

 

* VM options에 반드시 포함되어야 할 문자

-charset utf-8 -encoding utf-8


[DocTest.java]

package kr.or.ddit.basic;

public class DocTest {

	public static void main(String[] args) {
		
		System.out.println("test");
		
		JavaDocTest test = null;
		
		test.methodAdd(1, 2);
		test.methodSub();
		test.methodTest(1, 2);
		
		// MVC패턴에서 사용하는 클래스들
		// 1) VO 또는 DTO 객체
		// 2) DAO 객체
		// 3) Service 객체
		// 위 객체들의 역할(쓰임새)에 대하여 공부하기
		
	}

}

* 메서드 위에 마우스를 올리거나 test. 을 쳐서 메서드를 부를 때 작성해 놓은 설명이 한글로 뜬다.

'대덕인재개발원_자바기반 애플리케이션' 카테고리의 다른 글

230919_MVC 2  (0) 2023.09.18
230918_MVC 1  (0) 2023.09.15
230914_JDBC 2  (0) 2023.09.14
230913_JDBC 1  (0) 2023.09.12
230912_입출력 6  (0) 2023.09.11