분류 전체보기 (135)

728x90

 + 코드블럭을 추가하면 한가지만 설정되는 것이 너무 거슬린다..SQL은 SQL, Java는 Java 이런 식으로 저장하고 싶은데 ㅠㅠ 


 

수업내용 정리 (Jdbc)

 

1. 과제

이전에 하던 전화번호부 프로젝트를 조건에 맞춰 완성하기
1. HashSet 대신 전화번호 리스트를 MySQL 서버 테이블에 저장
2. 저장 테이블(칼럼명): PHONEMEMBER(name,phone,major,year,company,kind)
 2-1. PK키: name, phone
 2-2. 자료형: VARCHAR(20) / 단, year은 int, kind(N,U,C)는 CHAR(1)로 한다.
3. 메뉴 입력 오류 시 예외처리
4. JDBC를 활용하여 DB 접속

등 이 외에도 전체 출력 시 AllayList 활용 등 조건이 있었지만 전부 작성하진 않았다.

 

 1-1) MySQL ㄱ 

더보기
create table PHONEMEMBER(
	PM_NO int unsigned auto_increment not null,
	NAME varchar(20),
	PHONE varchar(20),
	MAJOR varchar(20),
	YEAR tinyint unsigned,
	COMPANY varchar(20),
	KIND char(1) not null,
	constraint primary key PK_PM(PM_NO, NAME, PHONE)
);
desc phonemember;
  • DB 테이블
  • 조건에 맞춰 칼럼을 작성했고, 추가적으로 정렬할 때 전화번호를 입력한 순서대로 정렬하기 위해 자동으로 번호가 정렬되는 PM_NO 칼럼을 하나 더 작성했다.
  • auto_increment는 기본키에 사용할 수 있다고 떠서 PK가 조건인 NAME, PHONE과 묶었다. (PK키인데 not null을 붙인 이유는 PK를 붙이기 전에 적고 넘어갔기 때문이다..)
  • desc phonemember;는 phonemember 테이블에 대한 구조를 확인하는 코드다.

 

create or replace view pm_view
as select PM_NO, NAME, PHONE, MAJOR, YEAR, COMPANY, KIND
from phonemember order by pm_no;
  • select로 검색할 때 어느 테이블에서 무엇을 어떻게 검색할 것인지 적은 view 생성

 

-- 검색 수정 삭제용 더미데이터
insert into phonemember(name, phone, kind) values('a', '1234', 'N');
insert into phonemember(name, phone, major, year, kind) values('b', '2222', 'af', '1', 'U');
insert into phonemember(name, phone, company, kind) values('c', '3333', 'ge', 'C');

-- 연습용
delete from phonemember;
select*from pm_view;
select*from pm_view where name='a';
update phonemember set name='aa' where name='a';
  • Java에서 검색, 수정, 삭제할 때 사용할 더미데이터 및 문법 연습용 코드
  • 나중에 추가적으로 중복이름에 관해 코드를 엎을 때는 데이터를 새로 더 추가하고 사용했다.

 

commit;
rollback;

 

 

 1-2) Java - common (db 관련 자주 쓸 메소드 클래스) ㄱ

더보기
package common;

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

// jdbc 공통 메소드
public class JdbcUtil {
	static {
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	public static Connection getConnection() {
		try {
			Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "icia", "1234");
			return con;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public static void dbClose(ResultSet rs, PreparedStatement pstmt, Connection con) {
		try {
			if(rs!=null) rs.close();
			if(pstmt!=null) pstmt.close();
			if(con!=null) con.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	public static void txCommit(Connection con) {
		try {
			con.commit();
		} catch (SQLException e) {
			System.out.println("commit fail");
			e.printStackTrace();
		}
	}
	public static void txRollback(Connection con) {
		try {
			con.rollback();
		} catch (SQLException e) {
			System.out.println("rollback fail");
			e.printStackTrace();
		}
	}
}
  • db 관련 자주 쓸 메소드 클래스
  • 해당 프로젝트에서는 쓰지 않는 메소드(commit, rollback)도 있지만 Jdbc 공통 메소드 클래스로 사용하고 있기 때문에 따로 삭제는 하지 않았다.

 

 1-3) Java - exception (메뉴 예외 처리) ㄱ 

더보기
package exception;

public class MenuWrongException extends Exception {
	private int wrongMenuNum;
	
	public MenuWrongException(int menuNum) {
		this.wrongMenuNum = menuNum;
	}
	public void showWrongNumInfo() {
		System.out.println(" > "+wrongMenuNum+"에 해당하는 메뉴가 없습니다.");
	}
}
  • 메뉴 예외 처리 클래스
  • 메인 메뉴에서 설정한 번호가 아닌 다른 번호를 선택했을 시 해당 번호에 대한 메뉴가 없다는 메시지를 띄운다.

(서브 메뉴에 넣는 것을 잊어서 메인메뉴에만 존재한다..)

 

 1-4) Java - controller (메인 메뉴 / 메인 메뉴를 처리하는 메소드를 모아둔 클래스)

 메인메뉴 ㄱ 

더보기
package controller;

import java.util.InputMismatchException;
import java.util.Scanner;
import exception.MenuWrongException;

public class JdbcPBMain {
	public static Scanner sc = new Scanner(System.in);
	public static void main(String[] args) {
		
		while(true) {
			try {
				showMenu();
				int menu = sc.nextInt();
				if(menu < 0 || menu > 5) throw new MenuWrongException(menu);
				System.out.println();
				
				switch (menu) {
				case 1:
					System.out.println("===> 전화번호 입력");
					JdbcPBManager.inputData();
					break;

				case 2:
					System.out.println("===> 전화번호 검색");
					JdbcPBManager.serchData();
					break;
					
				case 3:
					System.out.println("===> 전화번호 수정");
					JdbcPBManager.updateData();
					break;

				case 4:
					System.out.println("===> 전화번호 삭제");
					JdbcPBManager.deletData();
					break;
					
				case 5:
					System.out.println("===> 전체 목록");
					JdbcPBManager.showAllData();
					break;
					
				case 0:
					System.out.println(" > 프로그램을 종료합니다.");
					return;

				default:

				}
			} catch (InputMismatchException e) {
				System.out.println(" > 문자를 입력하셨습니다.");
				sc.nextLine();
			} catch (MenuWrongException e) {
				e.showWrongNumInfo();
			}
			System.out.println();
		}
	}

	private static void showMenu() {
		System.out.println("===== 전화번호부 =====");
		System.out.println("""
				------------------
				 1. 전화번호 입력
				 2. 전화번호 검색
				 3. 전화번호 수정
				 4. 전화번호 삭제
				 5. 전체 목록 출력
				 0. 프로그램 종료
				------------------ """);
		System.out.print(" 메뉴선택> ");
	}
}
  • 메인메뉴
  • 메뉴 외의 숫자를 입력하면 throw를 통해 밑의 catch MenuWrongException으로 던져서 MenuWrongException 클래스의 메소드를 실행한다.
  • 숫자가 아닌 문자를 입력했을 경우엔 InputMismatchException으로 들어가서 문자를 입력했다는 문구를 출력한다.

 메인 메뉴를 처리하는 메소드를 모아둔 클래스 ㄱ 

더보기
package controller;

import dao.JdbcPBDAO;

public class JdbcPBManager {
	private static JdbcPBDAO dao = new JdbcPBDAO();
	public static void inputData() {
		System.out.print(" ✏️   이름 입력\t:  ");
		String name = JdbcPBMain.sc.next();
		System.out.print(" ✏️  전화번호 입력\t:  ");
		String phone = JdbcPBMain.sc.next();
		try {
			boolean flag = dao.insert(name, phone);
			if(flag) {
				System.out.println("\n 📃 전화번호 입력 완료!");
			}else {
				System.out.println("\n ❌ 전화번호 입력 실패 ❌");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void serchData() {
		System.out.print(" 📒 검색할 이름: ");
		String serchN = JdbcPBMain.sc.next();
		dao.select(serchN);
	}

	public static void updateData() {
		System.out.print(" ✏️ 수정할 이름: ");
		String corN = JdbcPBMain.sc.next();
		dao.update(corN);
	}

	public static void deletData() {
		System.out.print(" ✂️ 삭제할 이름: ");
		String delN = JdbcPBMain.sc.next();
		dao.delete(delN);
	}

	public static void showAllData() {
		dao.selectAll();
	}
}
  • 메인 메뉴에서 선택한 메뉴들에 해당하는 메소드
  • 처리하기 위해 각 필요한 값을 입력받고, db 작업이 필요한 때에 dao 클래스의 메소드를 호출했다.
  • insert에서 boolean 변수를 통해 입력이 되었다면 true가 반환될테니 입력 완료를 출력하고, 입력이 안 되었다면 false가 반환될테니 입력 실패를 출력한다.

 

 1-5) Java - been (db에서 가져온 정보를 담기 위한 클래스) ㄱ 

더보기
package been;

public class Member {
	String kind;
	String name;
	String phone;
	String major;
	int year;
	String company;
	
	public Member (String kind, String name, String phone) {
		this.kind = kind;
		this.name = name;
		this.phone = phone;
	}
	public Member (String kind, String name, String phone, String major, int year) {
		this(kind, name, phone);
		this.major = major;
		this.year = year;
	}
	public Member (String kind, String name, String phone, String company) {
		this(kind, name, phone);
		this.company = company;
	}
	
	public String getPH(){
		return phone;
	};
	
	public void sel() {
		if(major==null && company==null) {
			System.out.println(" +==================================+");
			System.out.println("   KIND\t  NAME\t  PHNUM");
			System.out.println("  -----\t  -----\t ------");
			System.out.println(" ✨ " + kind + "\t  " + name + "\t  " + phone);
			System.out.println(" +==================================+");
		}else if(company==null) {
			System.out.println(" +==================================+");
			System.out.println("   KIND\t  NAME\t  PHNUM\t MAJOR(YEAR)");
			System.out.println("  -----\t  -----\t ------\t -----------");
			System.out.println(" 🏫 " + kind + "\t  " + name + "\t  "+ phone
					+ "\t   " + major + "(" + year + ")");
			System.out.println(" +==================================+");
		}else if(major==null) {
			System.out.println(" +==================================+");
			System.out.println("   KIND\t  NAME\t  PHNUM\t  COMPANY");
			System.out.println("  -----\t  -----\t  ------  --------");
			System.out.println(" 💼 " + kind + "\t  " + name + "\t  "
					+ phone + "\t   " + company);
			System.out.println(" +==================================+");
		}
	}
	
	public String tS(int i) {
		String str;
		if(major==null && company==null) {
			str=(" "+i+" "+kind+"\t"+name+"\t "+phone);
		}else if(company==null) {
			str=(" "+i+" "+kind+"\t"+name+"\t "+phone+"\t  "+major+"("+year+")");
		}else if(major==null) {
			str=(" "+i+" "+kind+"\t"+name+"\t "+phone+"\t\t\t "+company);
		}else {
			str=null;
		}
		return str;
	}
	@Override
	public String toString() {
		String str;
		if(major==null && company==null) {
			str=(" ✨ "+kind+"\t"+name+"\t "+phone);
		}else if(company==null) {
			str=(" 🏫 "+kind+"\t"+name+"\t "+phone+"\t  "+major+"("+year+")");
		}else if(major==null) {
			str=(" 💼 "+kind+"\t"+name+"\t "+phone+"\t\t\t "+company);
		}else {
			str=null;
		}
		return str;
	}
}
  • ArrayList로 출력할 때 타입이 되어줄 Member 클래스
  • 값을 담아둘 필드들과 값을 받아올 생성자, phone 값을 리턴할 메소드를 제외하곤 거의 꾸밈용으로 인해 코드가 길어졌다..

 

 1-6) Java - dao (메인메뉴를 처리하는 메소드의 동작 / 실상 모든 동작)

(선생님이 따로 dao라는 패키지-클래스를 만들어서 하라고 하셔서 만들었지만, 아직 메소드를 모아둔 클래스에서 바로 처리하지 않는 이유를 잘 이해하지 못하겠다.)

 전체 코드 ㄱ 

더보기
package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import been.Member;
import common.JdbcUtil;
import controller.JdbcPBMain;

// db 작업 로직
public class JdbcPBDAO {
	Connection con;
	PreparedStatement pstmt;
	ResultSet rs;
	private String major;
	private int year;
	private String company;
	private ArrayList<Member> mList;
	private ArrayList<Member> serchList;

	public boolean insert(String name, String phone) {
		con = JdbcUtil.getConnection();
		String sql = "select*from pm_view where name=? and phone=?";
		try {
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, name);
			pstmt.setString(2, phone);
			rs = pstmt.executeQuery();
			if (!rs.next()) {
				plusAns();
				if (major == null && company == null) {
					sql = "insert into phonemember(name, phone, kind)" + " values(?, ?, ?)";
					pstmt = con.prepareStatement(sql);
					pstmt.setString(1, name);
					pstmt.setString(2, phone);
					pstmt.setString(3, "N");
				} else if (company == null) {
					sql = "insert into phonemember(name, phone, major, year, kind)" + " values(?, ?, ?, ?, ?)";
					pstmt = con.prepareStatement(sql);
					pstmt.setString(1, name);
					pstmt.setString(2, phone);
					pstmt.setString(3, major);
					pstmt.setInt(4, year);
					pstmt.setString(5, "U");
				} else if (major == null) {
					sql = "insert into phonemember(name, phone, company, kind)" + " values(?, ?, ?, ?)";
					pstmt = con.prepareStatement(sql);
					pstmt.setString(1, name);
					pstmt.setString(2, phone);
					pstmt.setString(3, company);
					pstmt.setString(4, "C");
				}
				pstmt.executeUpdate();
				return true;
			} else {
				System.out.println(" > 이미 입력된 정보입니다.");
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			JdbcUtil.dbClose(rs, pstmt, con);
		}
		return false;
	}

	
	public void selectAll() {
		addArray();
		print(mList);
	}
	
	public void select(String serchN) {
		addArray(serchN);
		if(serchList.size()==1) {
			serchList.get(0).sel();
		}else if(serchList.size()==0){
			System.out.println(" > 정보를 찾을 수 없습니다.");
		}else {
			print(serchList);
		}
	}
	
	
	public void update(String corN) {
		addArray(corN);
		if(serchList.size()==1) {
			update(corN, serchList.get(0).getPH());
		}else if(serchList.size()==0){
			System.out.println(" > 정보를 찾을 수 없습니다.");
		}else {
			print(serchList, 1);
			System.out.println(" ⚠️ 이름이 중복됩니다.\n > 수정할 번호를 선택해주세요.");
			System.out.print(" ✏️ 수정할 번호: ");
			int corNum = JdbcPBMain.sc.nextInt();
			String corPH = serchList.get(corNum-1).getPH();
			update(corN, corPH);
		}
	}
	
	
	public void delete(String delN) {
		addArray(delN);
		if(serchList.size()==1) {
			delete(delN, serchList.get(0).getPH());
		}else if(serchList.size()==0){
			System.out.println(" > 정보를 찾을 수 없습니다.");
		}else {
			print(serchList, 1);
			System.out.println(" ⚠️ 이름이 중복됩니다.\n > 삭제할 번호를 선택해주세요.");
			System.out.print(" ✂️ 삭제할 번호: ");
			int delNum = JdbcPBMain.sc.nextInt();
			String delPH = serchList.get(delNum-1).getPH();
			delete(delN, delPH);
		}
	}
	
	
	
	
	
	
	/* private
	 * 
	 * 
	 * 							private
	 * 
	 * 
	 * 														private */
	
	private void plusAns() {
		major = null;
		year = 0;
		company = null;
		System.out.println("\n > 추가로 입력하시겠습니까?");
		System.out.println("""
				------------------
				 0. 다른 번호 선택 시 입력을 종료합니다.
				 1. 대학
				 2. 회사
				------------------""");
		System.out.print(" 메뉴선택> ");
		int ans = JdbcPBMain.sc.nextInt();
		if(ans<0 || ans>2)
		if (ans == 1) {
			System.out.print("\n ✏️   전공 입력\t:  ");
			major = JdbcPBMain.sc.next();
			System.out.print("\n ✏️   학년 입력\t:  ");
			year = JdbcPBMain.sc.nextInt();
		} else if (ans == 2) {
			System.out.print("\n ✏️   회사 입력\t:  ");
			company = JdbcPBMain.sc.next();
		} else {
			System.out.println(" > 입력을 종료하셨습니다.");
		}
	}

	
	private void addArray() {	// 전체출력을 위한것
		con = JdbcUtil.getConnection();
		String sql = "select*from pm_view";
		try {
			pstmt = con.prepareStatement(sql);
			rs = pstmt.executeQuery();
			mList = new ArrayList<>();
			while (rs.next()) {
				Member m = null;
				if (rs.getString("MAJOR") == null && rs.getString("COMPANY") == null) {
					m = new Member(rs.getString("kind"), rs.getString("NAME"), rs.getString("PHONE"));
				} else if (rs.getString("COMPANY") == null) {
					m = new Member(rs.getString("kind"), rs.getString("NAME"), rs.getString("PHONE"),
							rs.getString("MAJOR"), rs.getInt("YEAR"));
				} else if (rs.getString("MAJOR") == null) {
					m = new Member(rs.getString("kind"), rs.getString("NAME"), rs.getString("PHONE"),
							rs.getString("COMPANY"));
				}
				mList.add(m);
			}
		} catch (SQLException e) {
			System.out.println(" > 정보 불러오기 실패");
			e.printStackTrace();
		} finally {
			JdbcUtil.dbClose(rs, pstmt, con);
		}
	}
	private void addArray(String name) {	// 중복된 이름을 위한 것
		con = JdbcUtil.getConnection();
		String sql = "select*from pm_view where name=?";
		try {
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, name);
			rs = pstmt.executeQuery();
			serchList = new ArrayList<>();
			while (rs.next()) {
				Member m = null;
				if (rs.getString("MAJOR") == null && rs.getString("COMPANY") == null) {
					m = new Member(rs.getString("kind"), rs.getString("NAME"), rs.getString("PHONE"));
				} else if (rs.getString("COMPANY") == null) {
					m = new Member(rs.getString("kind"), rs.getString("NAME"), rs.getString("PHONE"),
							rs.getString("MAJOR"), rs.getInt("YEAR"));
				} else if (rs.getString("MAJOR") == null) {
					m = new Member(rs.getString("kind"), rs.getString("NAME"), rs.getString("PHONE"),
							rs.getString("COMPANY"));
				}
				serchList.add(m);
			}
		} catch (SQLException e) {
			System.out.println(" > 정보 불러오기 실패");
			e.printStackTrace();
		} finally {
			JdbcUtil.dbClose(rs, pstmt, con);
		}
	}
	

	private void update(String corN, String corPH) {
		con = JdbcUtil.getConnection();
		String sql = "select*from pm_view where name = ? and phone = ?";
		try {
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, corN);
			pstmt.setString(2, corPH);
			rs = pstmt.executeQuery();
			if (rs.next()) {
				if (rs.getString("KIND").equals("N")) {
					selN(rs.getString("KIND"), rs.getString("NAME"), rs.getString("PHONE"));
					System.out.print(" ✏️   이름 수정\t:  ");
					String reName = JdbcPBMain.sc.next();
					System.out.print(" ✏️  전화번호 수정\t:  ");
					String rePhone = JdbcPBMain.sc.next();
					sql = "update phonemember set name=?, phone=? where name=? and phone=?";
					pstmt = con.prepareStatement(sql);
					pstmt.setString(1, reName);
					pstmt.setString(2, rePhone);
					pstmt.setString(3, corN);
					pstmt.setString(4, corPH);
					pstmt.executeUpdate();

				} else if (rs.getString("KIND").equals("U")) {
					selU(rs.getString("KIND"), rs.getString("NAME"), rs.getString("PHONE"), rs.getString("MAJOR"), rs.getInt("YEAR"));
					System.out.print(" ✏️   이름 수정\t:  ");
					String reName = JdbcPBMain.sc.next();
					System.out.print(" ✏️  전화번호 수정\t:  ");
					String rePhone = JdbcPBMain.sc.next();
					System.out.print(" ✏️   전공 수정\t:  ");
					String reMajor = JdbcPBMain.sc.next();
					System.out.print(" ✏️   학년 수정\t:  ");
					int reYear = JdbcPBMain.sc.nextInt();
					sql = "update phonemember set name=?, phone=?, major=?, year=? where name=? and phone=?";
					pstmt = con.prepareStatement(sql);
					pstmt.setString(1, reName);
					pstmt.setString(2, rePhone);
					pstmt.setString(3, reMajor);
					pstmt.setInt(4, reYear);
					pstmt.setString(5, corN);
					pstmt.setString(6, corPH);
					pstmt.executeUpdate();
					
				} else if (rs.getString("KIND").equals("C")) {
					selC(rs.getString("KIND"), rs.getString("NAME"), rs.getString("PHONE"), rs.getString("COMPANY"));
					System.out.print(" ✏️   이름 수정\t:  ");
					String reName = JdbcPBMain.sc.next();
					System.out.print(" ✏️  전화번호 수정\t:  ");
					String rePhone = JdbcPBMain.sc.next();
					System.out.print(" ✏️   회사 수정\t:  ");
					String reCompany = JdbcPBMain.sc.next();
					sql = "update phonemember set name=?, phone=?, company=? where name=? and phone=?";
					pstmt = con.prepareStatement(sql);
					pstmt.setString(1, reName);
					pstmt.setString(2, rePhone);
					pstmt.setString(3, reCompany);
					pstmt.setString(4, corN);
					pstmt.setString(5, corPH);
					pstmt.executeUpdate();
				}
				System.out.println("\n > 수정이 완료되었습니다!");
			}
		} catch (SQLException e) {
			System.out.println(" ❌ 수정 실패 ❌");
			e.printStackTrace();
		} finally {
			JdbcUtil.dbClose(rs, pstmt, con);
		}
	}

	
	private void delete(String delN, String delPH) {
		con = JdbcUtil.getConnection();
		String sql = "select*from pm_view where name = ? and phone = ?";
		try {
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, delN);
			pstmt.setString(2, delPH);
			rs = pstmt.executeQuery();
			if (rs.next()) {
				if (rs.getString("KIND").equals("N")) {
					selN(rs.getString("KIND"), rs.getString("NAME"), rs.getString("PHONE"));
				} else if (rs.getString("KIND").equals("U")) {
					selU(rs.getString("KIND"), rs.getString("NAME"), rs.getString("PHONE"), rs.getString("MAJOR"), rs.getInt("YEAR"));
				} else if (rs.getString("KIND").equals("C")) {
					selC(rs.getString("KIND"), rs.getString("NAME"), rs.getString("PHONE"), rs.getString("COMPANY"));
				}
				sql = "delete from phonemember where name=? and phone = ?";
				pstmt = con.prepareStatement(sql);
				pstmt.setString(1, delN);
				pstmt.setString(2, delPH);
				pstmt.executeUpdate();
				System.out.println("\n > 삭제가 완료되었습니다.");
			}

		} catch (SQLException e) {
			System.out.println(" ❌ 삭제 실패 ❌");
			e.printStackTrace();
		}
	}
	
	
	
	private void print(ArrayList<Member> list) {
		if(list.size()!=0) {
			System.out.println(" > 입력한 순서대로 출력됩니다.");
			column();
			for (Member m : list) {
				if(mList.get(0) != m) {
					System.out.println(" |----\t-----\t------\t----------\t-------|");
				}
				System.out.println(m);
			}
			System.out.println(" +=============================================+");
		}else {
			System.out.println(" ⚠️ 저장된 정보가 없습니다.");
		}
	}
	private void print(ArrayList<Member> list, int i) {
		column();
		for (Member m : list) {
			if(list.get(0) != m) {
				System.out.println(" |----\t-----\t------\t----------\t-------|");
			}
			System.out.println(m.tS(i++));
		}
		System.out.println(" +=============================================+");
	}
	
	
	private void column() {
		System.out.println(" +=============================================+");
		System.out.println("  KIND\tNAME\tPHNUM\tMAJOR(YEAR)\tCOMPANY");
		System.out.println(" |=============================================|");
	}
	private void selN(String selK, String selN, String selPH) {
		System.out.println(" >---------------------+");
		System.out.println("   KIND\t  NAME\t  PHNUM");
		System.out.println(" >---------------------+");
		System.out.println(" ✨ " + selK + "\t  " + selN + "\t  " + selPH);
	}

	private void selU(String selK, String selN, String selPH, String selM, int selY) {
		System.out.println(" >----------------------------------+");
		System.out.println("   KIND\t  NAME\t  PHNUM\t MAJOR(YEAR)");
		System.out.println(" >----------------------------------+");
		System.out.println(" 🏫 " + selK + "\t  " + selN + "\t  " + selPH + "\t   " + selM + "(" + selY + ")\n");
	}

	private void selC(String selK, String selN, String selPH, String selC) {
		System.out.println(" >----------------------------------+");
		System.out.println("   KIND\t  NAME\t  PHNUM\t  COMPANY");
		System.out.println(" >----------------------------------+");
		System.out.println(" 💼 " + selK + "\t  " + selN + "\t  " + selPH + "\t   " + selC + "\n");
	}
}

 코드 설명 ㄱ 

더보기
package dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import been.Member;
import common.JdbcUtil;
import controller.JdbcPBMain;
  • package 및 import 정보

 

 

Connection con;
PreparedStatement pstmt;
ResultSet rs;
private String major;
private int year;
private String company;
private ArrayList<Member> mList;
private ArrayList<Member> serchList;
  • 필드
  • Connection: DB 연결
  • PreparedStatement: sql 문장 전달
  • ResultSet: DB에서 가져올 값 저장
  • String major, int year, String company: 잠깐 값을 저장해두기 위한 필드 변수
  • ArrayList<Member> mList: 전체출력을 위해 정보를 담아둘 ArrayList
  • ArrayList<Member> serchList: 동명이인이 있을 경우을 계산해서 동명이인 정보만 담아둘 ArrayList

 

 

public boolean insert(String name, String phone) {
	con = JdbcUtil.getConnection();
	String sql = "select*from pm_view where name=? and phone=?";
	try {
		pstmt = con.prepareStatement(sql);
		pstmt.setString(1, name);
		pstmt.setString(2, phone);
		rs = pstmt.executeQuery();
		if (!rs.next()) {
			plusAns();
			if (major == null && company == null) {
				sql = "insert into phonemember(name, phone, kind)" + " values(?, ?, ?)";
				pstmt = con.prepareStatement(sql);
				pstmt.setString(1, name);
				pstmt.setString(2, phone);
				pstmt.setString(3, "N");
			} else if (company == null) {
				sql = "insert into phonemember(name, phone, major, year, kind)" +
			 		" values(?, ?, ?, ?, ?)";
				pstmt = con.prepareStatement(sql);
				pstmt.setString(1, name);
				pstmt.setString(2, phone);
				pstmt.setString(3, major);
				pstmt.setInt(4, year);
				pstmt.setString(5, "U");
			} else if (major == null) {
				sql = "insert into phonemember(name, phone, company, kind)" +
					" values(?, ?, ?, ?)";
				pstmt = con.prepareStatement(sql);
				pstmt.setString(1, name);
				pstmt.setString(2, phone);
				pstmt.setString(3, company);
				pstmt.setString(4, "C");
			}
			pstmt.executeUpdate();
			return true;
		} else {
			System.out.println(" > 이미 입력된 정보입니다.");
		}
	} catch (SQLException e) {
		e.printStackTrace();
	} finally {
		JdbcUtil.dbClose(rs, pstmt, con);
	}
	return false;
}
private void plusAns() {
	major = null;
	year = 0;
	company = null;
	System.out.println("\n > 추가로 입력하시겠습니까?");
	System.out.println("""
			------------------
			 0. 다른 번호 선택 시 입력을 종료합니다.
			 1. 대학
			 2. 회사
			------------------""");
	System.out.print(" 메뉴선택> ");
	int ans = JdbcPBMain.sc.nextInt();
	if(ans<0 || ans>2)
	if (ans == 1) {
		System.out.print("\n ✏️   전공 입력\t:  ");
		major = JdbcPBMain.sc.next();
		System.out.print("\n ✏️   학년 입력\t:  ");
		year = JdbcPBMain.sc.nextInt();
	} else if (ans == 2) {
		System.out.print("\n ✏️   회사 입력\t:  ");
		company = JdbcPBMain.sc.next();
	} else {
		System.out.println(" > 입력을 종료하셨습니다.");
	}
}
  • insert (정보 입력)
  • Manager에서 입력받아온 매개변수를 통해 정보가 있는지 확인(이름과 전화번호가 같은지)하고 만약 정보가 없다면 plusAns 메소드를 통해 정보를 입력받을지(대학이나 회사) 물어보고 만약 입력한다면 정보를 입력받은 뒤 다시 돌아온다. (입력받지 않아도 돌아온다.)
  • 만약 필드 변수 major과 company가 null 값이라면, 그렇지 않고 필드 변수 company가 null 값이라면, 그렇지 않고 major이 null 값이라면. 세 경우에 따라 sql 문장을 달리해서 insert로 db에 값을 저장한다.
  • 저장이 성공적으로 완료되었다면 true를 return하고, 저장에 실패했다면 false를 return한다.

 

 

public void selectAll() {
	addArray();
	print(mList);
}
private void addArray() {	// 전체출력을 위한것
	con = JdbcUtil.getConnection();
	String sql = "select*from pm_view";
	try {
		pstmt = con.prepareStatement(sql);
		rs = pstmt.executeQuery();
		mList = new ArrayList<>();
		while (rs.next()) {
			Member m = null;
			if (rs.getString("MAJOR") == null && rs.getString("COMPANY") == null) {
				m = new Member(rs.getString("kind"), rs.getString("NAME"), rs.getString("PHONE"));
			} else if (rs.getString("COMPANY") == null) {
				m = new Member(rs.getString("kind"), rs.getString("NAME"), rs.getString("PHONE"),
						rs.getString("MAJOR"), rs.getInt("YEAR"));
			} else if (rs.getString("MAJOR") == null) {
				m = new Member(rs.getString("kind"), rs.getString("NAME"), rs.getString("PHONE"),
						rs.getString("COMPANY"));
			}
			mList.add(m);
		}
	} catch (SQLException e) {
		System.out.println(" > 정보 불러오기 실패");
		e.printStackTrace();
	} finally {
		JdbcUtil.dbClose(rs, pstmt, con);
	}
}
private void print(ArrayList<Member> list) {
	if(list.size()!=0) {
		System.out.println(" > 입력한 순서대로 출력됩니다.");
		column();
		for (Member m : list) {
			if(mList.get(0) != m) {
				System.out.println(" |----\t-----\t------\t----------\t-------|");
			}
			System.out.println(m);
		}
		System.out.println(" +=============================================+");
	}else {
		System.out.println(" ⚠️ 저장된 정보가 없습니다.");
	}
}
private void column() {
	System.out.println(" +=============================================+");
	System.out.println("  KIND\tNAME\tPHNUM\tMAJOR(YEAR)\tCOMPANY");
	System.out.println(" |=============================================|");
}
  • selectAll (DB의 모든 정보 출력)
  • addArray 메소드를 통해 DB의 모든 값을 Member 객체에 저장한 후 ArrayList(mList)에 하나씩 추가한다. Member 객체에 저장할 때, 타입(kind)에 따라 저장하는 값을 다르게 했다.
  • addArray 메소드가 끝나고 selectAll 메소드로 돌아오면 print(ArrayList<Member>) 메소드를 통해 모든 멤버를 출력하도록 했다.
  • column 메소드는 꾸밈용 메소드다.

 

 

public void select(String serchN) {
	addArray(serchN);
	if(serchList.size()==1) {
		serchList.get(0).sel();
	}else if(serchList.size()==0){
		System.out.println(" > 정보를 찾을 수 없습니다.");
	}else {
		print(serchList);
	}
}
private void addArray(String name) {	// 중복된 이름을 위한 것
	con = JdbcUtil.getConnection();
	String sql = "select*from pm_view where name=?";
	try {
		pstmt = con.prepareStatement(sql);
		pstmt.setString(1, name);
		rs = pstmt.executeQuery();
		serchList = new ArrayList<>();
		while (rs.next()) {
			Member m = null;
			if (rs.getString("MAJOR") == null && rs.getString("COMPANY") == null) {
				m = new Member(rs.getString("kind"), rs.getString("NAME"), rs.getString("PHONE"));
			} else if (rs.getString("COMPANY") == null) {
				m = new Member(rs.getString("kind"), rs.getString("NAME"), rs.getString("PHONE"),
						rs.getString("MAJOR"), rs.getInt("YEAR"));
			} else if (rs.getString("MAJOR") == null) {
				m = new Member(rs.getString("kind"), rs.getString("NAME"), rs.getString("PHONE"),
						rs.getString("COMPANY"));
			}
			serchList.add(m);
		}
	} catch (SQLException e) {
		System.out.println(" > 정보 불러오기 실패");
		e.printStackTrace();
	} finally {
		JdbcUtil.dbClose(rs, pstmt, con);
	}
}
private void print(ArrayList<Member> list) {
	if(list.size()!=0) {
		System.out.println(" > 입력한 순서대로 출력됩니다.");
		column();
		for (Member m : list) {
			if(mList.get(0) != m) {
				System.out.println(" |----\t-----\t------\t----------\t-------|");
			}
			System.out.println(m);
		}
		System.out.println(" +=============================================+");
	}else {
		System.out.println(" ⚠️ 저장된 정보가 없습니다.");
	}
}
  • select (검색)
  • 다른 것들보다 검색이 쉬울 것 같아서 검색부터 진행했다.
  • addArray(String) 메소드를 통해 DB에서 매개변수로 받아온 이름과 중복된 이름이 있다면 Member 객체에 저장한 후, 새로운 ArrayList(serchList)에 하나씩 추가했다. 이때, 전체 출력과 마찬가지로 타입(kind)에 따라 저장하는 값을 다르게 했다.
  • select로 돌아오면 serchList의 길이(size)에 따라 if문으로 나눴다.
  • 만약 serchList의 길이가 1이라면 그대로 출력한다.
  • 그렇지 않고 serchList의 길이가 0이라면 정보를 찾을 수 없다는 문구를 출력한다.
  • 전부 아니라면 print(ArrayList<Member>) 메소드를 통해 serchList의 값을 출력한다.

 

 

public void update(String corN) {
	addArray(corN);
	if(serchList.size()==1) {
		update(corN, serchList.get(0).getPH());
	}else if(serchList.size()==0){
		System.out.println(" > 정보를 찾을 수 없습니다.");
	}else {
		print(serchList, 1);
		System.out.println(" ⚠️ 이름이 중복됩니다.\n > 수정할 번호를 선택해주세요.");
		System.out.print(" ✏️ 수정할 번호: ");
		int corNum = JdbcPBMain.sc.nextInt();
		String corPH = serchList.get(corNum-1).getPH();
		update(corN, corPH);
	}
}
private void addArray(String name) {	// 중복된 이름을 위한 것
	con = JdbcUtil.getConnection();
	String sql = "select*from pm_view where name=?";
	try {
		pstmt = con.prepareStatement(sql);
		pstmt.setString(1, name);
		rs = pstmt.executeQuery();
		serchList = new ArrayList<>();
		while (rs.next()) {
			Member m = null;
			if (rs.getString("MAJOR") == null && rs.getString("COMPANY") == null) {
				m = new Member(rs.getString("kind"), rs.getString("NAME"), rs.getString("PHONE"));
			} else if (rs.getString("COMPANY") == null) {
				m = new Member(rs.getString("kind"), rs.getString("NAME"), rs.getString("PHONE"),
						rs.getString("MAJOR"), rs.getInt("YEAR"));
			} else if (rs.getString("MAJOR") == null) {
				m = new Member(rs.getString("kind"), rs.getString("NAME"), rs.getString("PHONE"),
						rs.getString("COMPANY"));
			}
			serchList.add(m);
		}
	} catch (SQLException e) {
		System.out.println(" > 정보 불러오기 실패");
		e.printStackTrace();
	} finally {
		JdbcUtil.dbClose(rs, pstmt, con);
	}
}
private void print(ArrayList<Member> list, int i) {
	column();
	for (Member m : list) {
		if(list.get(0) != m) {
			System.out.println(" |----\t-----\t------\t----------\t-------|");
		}
		System.out.println(m.tS(i++));
	}
	System.out.println(" +=============================================+");
}
private void print(ArrayList<Member> list, int i) {
	column();
	for (Member m : list) {
		if(list.get(0) != m) {
			System.out.println(" |----\t-----\t------\t----------\t-------|");
		}
		System.out.println(m.tS(i++));
	}
	System.out.println(" +=============================================+");
}
private void update(String corN, String corPH) {
	con = JdbcUtil.getConnection();
	String sql = "select*from pm_view where name = ? and phone = ?";
	try {
		pstmt = con.prepareStatement(sql);
		pstmt.setString(1, corN);
		pstmt.setString(2, corPH);
		rs = pstmt.executeQuery();
		if (rs.next()) {
			if (rs.getString("KIND").equals("N")) {
				selN(rs.getString("KIND"), rs.getString("NAME"), rs.getString("PHONE"));
				System.out.print(" ✏️   이름 수정\t:  ");
				String reName = JdbcPBMain.sc.next();
				System.out.print(" ✏️  전화번호 수정\t:  ");
				String rePhone = JdbcPBMain.sc.next();
				sql = "update phonemember set name=?, phone=? where name=? and phone=?";
				pstmt = con.prepareStatement(sql);
				pstmt.setString(1, reName);
				pstmt.setString(2, rePhone);
				pstmt.setString(3, corN);
				pstmt.setString(4, corPH);
				pstmt.executeUpdate();
                
				} else if (rs.getString("KIND").equals("U")) {
				selU(rs.getString("KIND"), rs.getString("NAME"), rs.getString("PHONE"), rs.getString("MAJOR"), rs.getInt("YEAR"));
				System.out.print(" ✏️   이름 수정\t:  ");
				String reName = JdbcPBMain.sc.next();
				System.out.print(" ✏️  전화번호 수정\t:  ");
				String rePhone = JdbcPBMain.sc.next();
				System.out.print(" ✏️   전공 수정\t:  ");
				String reMajor = JdbcPBMain.sc.next();
				System.out.print(" ✏️   학년 수정\t:  ");
				int reYear = JdbcPBMain.sc.nextInt();
				sql = "update phonemember set name=?, phone=?, major=?, year=? where name=? and phone=?";
				pstmt = con.prepareStatement(sql);
				pstmt.setString(1, reName);
				pstmt.setString(2, rePhone);
				pstmt.setString(3, reMajor);
				pstmt.setInt(4, reYear);
				pstmt.setString(5, corN);
				pstmt.setString(6, corPH);
				pstmt.executeUpdate();
				
			} else if (rs.getString("KIND").equals("C")) {
				selC(rs.getString("KIND"), rs.getString("NAME"), rs.getString("PHONE"), rs.getString("COMPANY"));
				System.out.print(" ✏️   이름 수정\t:  ");
				String reName = JdbcPBMain.sc.next();
				System.out.print(" ✏️  전화번호 수정\t:  ");
				String rePhone = JdbcPBMain.sc.next();
				System.out.print(" ✏️   회사 수정\t:  ");
				String reCompany = JdbcPBMain.sc.next();
				sql = "update phonemember set name=?, phone=?, company=? where name=? and phone=?";
				pstmt = con.prepareStatement(sql);
				pstmt.setString(1, reName);
				pstmt.setString(2, rePhone);
				pstmt.setString(3, reCompany);
				pstmt.setString(4, corN);
				pstmt.setString(5, corPH);
				pstmt.executeUpdate();
			}
			System.out.println("\n > 수정이 완료되었습니다!");
		}
	} catch (SQLException e) {
		System.out.println(" ❌ 수정 실패 ❌");
		e.printStackTrace();
	} finally {
		JdbcUtil.dbClose(rs, pstmt, con);
	}
}
  • updata (수정)
  • updata(String,String) 코드 줄이기를 안 한 상태이다.
  • select(검색)처럼 addArray(String) 메소드를 통해 중복된 이름은 serchList에 저장했다.
  • updata로 돌아오면 serchList의 사이즈가 1이면 바로 매개변수와 serchList에 저장된 번호를 updata(String, String)의 매개변수로 적는다.
  • serchList의 사이즈가 0이면 정보를 찾을 수 없다고 출력한다.
  • serchList의 사이즈가 1, 0 둘 다 아니라면 print(ArrayList<Member>, int) 메소드를 통해 중복된 이름의 정보들을 출력한 후, 이름이 중복된다고 출력한다. 수정할 번호를 입력받아 해당 번호의 1을 뺀 인덱스에 저장된 번호와 매개변수를 updata(String, String)의 매개변수로 적는다. 이때, int는 출력 순서의 시작 번호이기 때문에 고정값 1을 적는다.  출력이 모두 끝나고 다시 돌아오면 수정할 번호를 입력받고, updata(String,String) 메소드에 매개변수와 serchList의 입력받은 수정할 번호에서 1을 뺀 인덱스에 저장된 번호를 적는다.
  •  updata(String, String)에서 입력받은 매개변수들을 통해 정보를 select(검색)해오고 kind 값에 따라 if문으로 나누어 수정하게 했다. 

 

 

public void delete(String delN) {
	addArray(delN);
	if(serchList.size()==1) {
		delete(delN, serchList.get(0).getPH());
	}else if(serchList.size()==0){
		System.out.println(" > 정보를 찾을 수 없습니다.");
	}else {
		print(serchList, 1);
		System.out.println(" ⚠️ 이름이 중복됩니다.\n > 삭제할 번호를 선택해주세요.");
		System.out.print(" ✂️ 삭제할 번호: ");
		int delNum = JdbcPBMain.sc.nextInt();
		String delPH = serchList.get(delNum-1).getPH();
		delete(delN, delPH);
	}
}
private void addArray(String name) {	// 중복된 이름을 위한 것
	con = JdbcUtil.getConnection();
	String sql = "select*from pm_view where name=?";
	try {
		pstmt = con.prepareStatement(sql);
		pstmt.setString(1, name);
		rs = pstmt.executeQuery();
		serchList = new ArrayList<>();
		while (rs.next()) {
			Member m = null;
			if (rs.getString("MAJOR") == null && rs.getString("COMPANY") == null) {
				m = new Member(rs.getString("kind"), rs.getString("NAME"), rs.getString("PHONE"));
			} else if (rs.getString("COMPANY") == null) {
				m = new Member(rs.getString("kind"), rs.getString("NAME"), rs.getString("PHONE"),
						rs.getString("MAJOR"), rs.getInt("YEAR"));
			} else if (rs.getString("MAJOR") == null) {
				m = new Member(rs.getString("kind"), rs.getString("NAME"), rs.getString("PHONE"),
						rs.getString("COMPANY"));
			}
			serchList.add(m);
		}
	} catch (SQLException e) {
		System.out.println(" > 정보 불러오기 실패");
		e.printStackTrace();
	} finally {
		JdbcUtil.dbClose(rs, pstmt, con);
	}
}
private void delete(String delN, String delPH) {
	con = JdbcUtil.getConnection();
	String sql = "select*from pm_view where name = ? and phone = ?";
	try {
		pstmt = con.prepareStatement(sql);
		pstmt.setString(1, delN);
		pstmt.setString(2, delPH);
		rs = pstmt.executeQuery();
		if (rs.next()) {
			if (rs.getString("KIND").equals("N")) {
				selN(rs.getString("KIND"), rs.getString("NAME"), rs.getString("PHONE"));
			} else if (rs.getString("KIND").equals("U")) {
				selU(rs.getString("KIND"), rs.getString("NAME"), rs.getString("PHONE"), rs.getString("MAJOR"), rs.getInt("YEAR"));
			} else if (rs.getString("KIND").equals("C")) {
				selC(rs.getString("KIND"), rs.getString("NAME"), rs.getString("PHONE"), rs.getString("COMPANY"));
			}
			sql = "delete from phonemember where name=? and phone = ?";
			pstmt = con.prepareStatement(sql);
			pstmt.setString(1, delN);
			pstmt.setString(2, delPH);
			pstmt.executeUpdate();
			System.out.println("\n > 삭제가 완료되었습니다.");
		}
	} catch (SQLException e) {
		System.out.println(" ❌ 삭제 실패 ❌");
		e.printStackTrace();
	}
}
  • delete (삭제)
  • delete(String,String) 코드 줄이기를 안 한 상태이다.
  • select(검색), updata(수정)처럼 addArray(String) 메소드를 통해 중복된 이름은 serchList에 저장했다.
  • 돌아오면 serchList의 사이즈가 1이면 바로 매개변수와 serchList에 저장된 번호를 delete(String, String)의 매개변수로 적는다.
  • serchList의 사이즈가 0이면 정보를 찾을 수 없다고 출력한다.
  • serchList의 사이즈가 1, 0 둘 다 아니라면 print(ArrayList<Member>, int) 메소드를 통해 중복된 이름의 정보들을 출력한 후, 이름이 중복된다고 출력한다. 수정할 번호를 입력받아 해당 번호의 1을 뺀 인덱스에 저장된 번호와 매개변수를 delete(String, String)의 매개변수로 적는다. 이때, int는 출력 순서의 시작 번호이기 때문에 고정값 1을 적는다.  출력이 모두 끝나고 다시 돌아오면 수정할 번호를 입력받고, delete(String,String) 메소드에 매개변수와 serchList의 입력받은 수정할 번호에서 1을 뺀 인덱스에 저장된 번호를 적는다.
  • delete(String, String)에서 입력받은 매개변수들을 통해 정보를 한 번 더 select(검색)해오고 kind 값에 따라 if문으로 나누어 출력을 한 번 해준 후, 삭제를 진행했다.

 

 


  • 밑은 꾸밈용 메소드
private void column() {
	System.out.println(" +=============================================+");
	System.out.println("  KIND\tNAME\tPHNUM\tMAJOR(YEAR)\tCOMPANY");
	System.out.println(" |=============================================|");
}
private void selN(String selK, String selN, String selPH) {
	System.out.println(" >---------------------+");
	System.out.println("   KIND\t  NAME\t  PHNUM");
	System.out.println(" >---------------------+");
	System.out.println(" ✨ " + selK + "\t  " + selN + "\t  " + selPH);
}
private void selU(String selK, String selN, String selPH, String selM, int selY) {
	System.out.println(" >----------------------------------+");
	System.out.println("   KIND\t  NAME\t  PHNUM\t MAJOR(YEAR)");
	System.out.println(" >----------------------------------+");
	System.out.println(" 🏫 " + selK + "\t  " + selN + "\t  " + selPH + "\t   " + selM + "(" + selY + ")\n");
}
private void selC(String selK, String selN, String selPH, String selC) {
	System.out.println(" >----------------------------------+");
	System.out.println("   KIND\t  NAME\t  PHNUM\t  COMPANY");
	System.out.println(" >----------------------------------+");
	System.out.println(" 💼 " + selK + "\t  " + selN + "\t  " + selPH + "\t   " + selC + "\n");
}

 


 

전체 피드백

  • 테이블은 하나이든 셋이든 상관이 없다고 하셨는데 나는 DB는 내 길이 아닌지 너무 어려워서 비교적 간단한 하나로 진행했다.
  • 과제에서 메인 메뉴 부분을 이전에 만들었던 것으로 재활용했다가 서브 메뉴들에서 메뉴 입력 오류 시 예외처리 하는 것을 잊고 제출해버렸다. 처음부터 끝까지 직접 짰면 하지 않았다는 것을 기억했을텐데, 하는 아쉬움이 남았지만 간단하지만 조금 귀찮은 부분을 타이핑하느라 시간을 보내기 싫었던 탓이라 나중에는 조금 더 꼼꼼히 확인해야겠다.
  • 코드를 줄이고 싶어서 메소드를 생성해두고 메소드 안에서 그 메소드를 사용하는 식으로 했는데 너무 메소드 안에 메소드인가 싶어지기도 해서 고민이 많았다.
  • 제출하고 나니 자꾸 아쉬운 부분이 보여서 슬펐다.

 

  • VSCode로 html도 잠깐 배웠는데 내일 함께 정리해서 올릴 예정이다.

 


728x90
728x90

 

수업내용 정리 (Java)

 

1. 수업일지 29일차 1-3 문제 변형

로그인할때 틀리면 계속 입력을 받아서 로그인에 성공하면 멈추도록 하기(boolean으로 반환받기)
위와 동일하지만 boolean이 아니라 Member 변수로 반환받기로 변형

 1-1) 메인 ㄱ 

더보기
import java.util.Scanner;
import been.Member;
import service.MemberService;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		// 회원서비스 비지니스로직(업무코드)
		MemberService mSer = new MemberService();
		while(true) {
			System.out.print(" 아이디 입력> ");
			String id = sc.next();
			System.out.print(" 비밀번호 입력> ");
			String pw = sc.next();
			Member member = mSer.login(id, pw);
			if(member != null) {
				System.out.println(" > "+id+"님의 회원정보");
				member.showInfo();
				break;
			}else {
				System.out.println(" > id 또는 pw가 틀렸습니다.\n");
			}
		}
		System.out.println(" > 프로그램 종료");
	}
}
  • member가 null일 경우를 대비하여 if문을 입력하였다.

 

 1-2) Member 클래스 ㄱ 

더보기
public class Member {
	private String id;
	private String pw;
	private String name;
	private int age;
	private String birth;
	
	public Member(String id, String pw, String name, int age, String birth) {
		this.id=id;
		this.pw=pw;
		this.name=name;
		this.age=age;
		this.birth=birth;
	}

	public void showInfo() {
		System.out.println(" ‖ 아이디\t: "+id);
		System.out.println(" ‖  이름\t: "+name+"님");
		System.out.println(" ‖  나이\t: "+age+"살");
		System.out.println(" ‖  생일\t: "+birth);
	}
	@Override
	public String toString() {
		String str=(" ‖ 아이디\t: "+id+"\n ‖  이름\t: "+name+"님"
				+ "\n ‖  나이\t: "+age+"살"+"\n ‖  생일\t: "+birth);
		return str;
	}
}
  • 모든 동작은 서비스 클래스에서 할 것이기 때문에 생성자와 출력 메소드만 만들었다.
  • showInfo랑 toString 둘 다 동일하게 회원 정보를 출력하는 것이다.

 

 1-3) 서비스(동작) ㄱ 

더보기
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import common.JdbcUtil;
import been.Member;

// 회원관리 서비스
public class MemberService {
	Connection con;
	PreparedStatement pstmt;
	ResultSet rs;
	public Member login(String id, String pw) {
		con=JdbcUtil.getConnection();
		String sql = "select*from member where id=? and pw=?";
		try {
			pstmt=con.prepareStatement(sql);
			pstmt.setString(1, id);
			pstmt.setString(2, pw);
			rs = pstmt.executeQuery();
			if(rs.next()) {
				System.out.println(" > "+id+"님 로그인 성공");
				Member m = new Member(id, pw, rs.getString("name"),
						rs.getInt("age"), rs.getString("birth"));
				return m;
			}
		} catch (SQLException e) {
		} finally {
			JdbcUtil.dbClose(rs, pstmt, con);
		}
		return null;
	}
}
  • 입력받은 매개변수를 db에서 찾고, db에 있다면 해당 정보를 가져와서 Member 변수 m에 저장하고 m을 return한다.
  • id, pw 값도 db 값과 동일하니 Member m에 입력할 때 매개변수 값으로 해도 되지만 db 값이 진짜 값이니 id, pw 또한 db에서 가져오는 것도 나쁘지 않다. (나는 코드가 길어지니 줄였다.)
  • 정보 찾기와 입력이 끝났다면 finally를 통해 db를 닫아준다.

 

 

2. 수업일지 29일차 1-3 문제 변형2

로그인할때 틀리면 계속 입력을 받아서 로그인에 성공하면 멈추도록 하기(Member 객체로 반환받기)
위와 동일하지만 Member가 아니라 ArrayList<Member>로 반환받기
admin(관리자) 계정일 경우에는 모든 멤버 정보를 출력하고,
admin(관리자) 계정이 아닐 경우에는 본인의 정보만 출력
  • Member 클래스는 위의 1-2와 동일하게 사용한다.

 2-1) 메인 ㄱ 

더보기
import java.util.ArrayList;
import java.util.Scanner;
import been.Member;
import service.MemberService;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		// 회원서비스 비지니스로직(업무코드)
		MemberService mSer = new MemberService();
		
		while(true) {
			System.out.print(" 아이디 입력> ");
			String id = sc.next();
			System.out.print(" 비밀번호 입력> ");
			String pw = sc.next();
			ArrayList<Member> mList = mSer.login(id, pw);
			if(mList != null) {
				if(mList.size() == 1) {
					System.out.println(" > "+id+"님의 회원정보");
					System.out.println(" >----------+");
					System.out.println(mList.get(0));
					System.out.println(" >----------+");
				}else {
					System.out.println(" > 회원 정보 출력");
					mSer.showMemberList();
				}
				break;
			}else {
				System.out.println(" > id 또는 pw가 틀렸습니다.\n");
			}
		}
		System.out.println(" > 프로그램 종료");
	}
}
  • 위의 1-1과 비슷하지만 Member가 아닌 ArrayList로 변경했다.
  • 그리고 관리자 계정과 아닌 계정을 구분하여 정보를 출력해야 하기 때문에 if문을 사용했다.
  • 첫번째로 mList가 null인지 아닌지 구분하여 로그인이 되었는지 아닌지 확인한다.
  • 두번째로 mList가 null이 아닐 경우, mList의 길이가 1인지 그 이상인지 확인하여 로그인한 계정이 관리자 계정인지 아닌지 구분한다. 관리자 계정이 아닐 경우에는 로그인한 계정의 회원 정보를 출력하고, 관리자 계정인 경우에는 관리자 계정을 제외한 Member 회원 정보를 전부 출력한다.

 

 2-2) 서비스(동작) ㄱ 

더보기
// 전체 코드 
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import common.JdbcUtil;
import been.Member;

// 회원관리 서비스
public class MemberService {
	Connection con;
	PreparedStatement pstmt;
	ResultSet rs;
	public ArrayList<Member> login(String id, String pw) {
		ArrayList<Member> mList = null;
		con=JdbcUtil.getConnection();
		String sql = "select*from member where id=? and pw=?";
		try {
			pstmt=con.prepareStatement(sql);
			pstmt.setString(1, id);
			pstmt.setString(2, pw);
			rs = pstmt.executeQuery();
			if(rs.next()) {
				mList = new ArrayList<Member>();
				if(id.equals("ADMIN") || id.equals("admin")) {
					System.out.println(" > 관리자 로그인 성공");
					sql = "select*from member where id!=?";
					pstmt=con.prepareStatement(sql);
					pstmt.setString(1, id);
					rs = pstmt.executeQuery();
					while(rs.next()) {
						Member m = new Member(rs.getString("id"),
							rs.getString("pw"), rs.getString("name"),
							rs.getInt("age"), rs.getString("birth"));
						mList.add(m);
					}
				}else {
					System.out.println(" > "+id+"님 로그인 성공");
					Member m = new Member(id, pw, rs.getString("name"),
							rs.getInt("age"), rs.getString("birth"));
					mList.add(m);
				}
			}
		} catch (SQLException e) {
		} finally {
			JdbcUtil.dbClose(rs, pstmt, con);
		}
		return mList;
	}

	public void showMemberList() {
		con=JdbcUtil.getConnection();
		String sql = "select*from member where id!=?";
		try {
			pstmt=con.prepareStatement(sql);
			pstmt.setString(1, "admin");
			rs = pstmt.executeQuery();
			System.out.println(" >------------------------+");
			System.out.println("ID\tNAME\tBIRTH");
			while(rs.next()) {
				System.out.println(" >--------------+");
				System.out.println(rs.getString("ID")+"\t"+rs.getString("NAME")+
				"\t"+rs.getString("BIRTH"));
			}
			System.out.println(" >------------------------+");
		} catch (SQLException e) {
			System.out.println(" > 정보 불러오기 실패");
			e.printStackTrace();
		} finally {
			JdbcUtil.dbClose(rs, pstmt, con);
		}
	}
}

 

// login 메소드
public ArrayList<Member> login(String id, String pw) {
	ArrayList<Member> mList = null;
	con=JdbcUtil.getConnection();
	String sql = "select*from member where id=? and pw=?";
	try {
		pstmt=con.prepareStatement(sql);
		pstmt.setString(1, id);
		pstmt.setString(2, pw);
		rs = pstmt.executeQuery();
		if(rs.next()) {
			mList = new ArrayList<Member>();
			if(id.equals("ADMIN") || id.equals("admin")) {
				System.out.println(" > 관리자 로그인 성공");
				sql = "select*from member where id!=?";
				pstmt=con.prepareStatement(sql);
				pstmt.setString(1, id);
				rs = pstmt.executeQuery();
				while(rs.next()) {
					Member m = new Member(rs.getString("id"),
						rs.getString("pw"), rs.getString("name"),
						rs.getInt("age"), rs.getString("birth"));
					mList.add(m);
				}
			}else {
				System.out.println(" > "+id+"님 로그인 성공");
				Member m = new Member(id, pw, rs.getString("name"),
						rs.getInt("age"), rs.getString("birth"));
				mList.add(m);
			}
		}
	} catch (SQLException e) {
	} finally {
		JdbcUtil.dbClose(rs, pstmt, con);
	}
	return mList;
}
  • retrun을 한 번만 하기 위해 메소드를 시작할 때 ArrayList<Member> mList를 생성해 null값을 넣어둔다. (null 값을 넣으면 새로 값을 집어넣지 않는 이상 mList를 반환해도 null 값을 반환한 것이 된다.)
  • 매개변수로 받아온 id와 pw가 db에서 확인이 되었다면 id가 admin(관리자)인지 확인하고 맞을 경우, 다시 db에 검색을 해서 id가 admin인 계정을 제외한 계정을 검색해서 m에 저장 후 mList에 저장한다.
  • id가 admin(관리자)가 아닌 경우, 검색된 계정을 m에 저장 후 mList에 저장한다.
  • 마지막에 mList를 반환한다.

 

// showMemberList 메소드
public void showMemberList() {
	con=JdbcUtil.getConnection();
	String sql = "select*from member where id!=?";
	try {
		pstmt=con.prepareStatement(sql);
		pstmt.setString(1, "admin");
		rs = pstmt.executeQuery();
		System.out.println(" >------------------------+");
		System.out.println("ID\tNAME\tBIRTH");
		while(rs.next()) {
			System.out.println(" >--------------+");
			System.out.println(rs.getString("ID")+"\t"+rs.getString("NAME")+
			"\t"+rs.getString("BIRTH"));
		}
		System.out.println(" >------------------------+");
	} catch (SQLException e) {
		System.out.println(" > 정보 불러오기 실패");
		e.printStackTrace();
	} finally {
		JdbcUtil.dbClose(rs, pstmt, con);
	}
}
  • admin(관리자)만 제외하고 출력했다.

 

 

3. Transaction (TX)

 3-1) MySQL ㄱ 

더보기
-- 주문 결제 TX
create table PURCHASE(
PC_NO int auto_increment primary key,				-- 주문번호
PC_MID varchar(10) not null,					-- 주문자 ID
PC_PID varchar(10) not null					-- 상품 ID
);

create table PAY(
	PY_NO int auto_increment primary key,			-- 결제번호
	PY_COST int not null,					-- 결제금액
	PY_PCNO int not null references PURCHASE(PC_NO)		-- 주문번호
);

 

 3-2) TxMain ㄱ 

더보기
import service.ShoppingService;

public class TxMain {
	// 쇼핑 서비스
	public static void main(String[] args) {
		ShoppingService ss = new ShoppingService();
		
		boolean flag = ss.order();
		if(flag) {
			System.out.println(" > 주문 완료");
		}else {
			System.out.println(" > 주문 실패");
		}
	}
}

 

 3-3) JdbcUtil (자주 쓰는 메소드 클래스) ㄱ 

더보기
  • 기본적으로 같지만 수동적으로 commit 하기 위해 getConnection 메소드에서 auto commit만 false로 바꿨다.
public static Connection getConnection() {
	try {
		Connection con = DriverManager.getConnection
        					("jdbc:mysql://localhost:3306/mydb", "icia", "1234");
		con.setAutoCommit(false);	// auto commit 해제. 수동으로 commit 해야함
//		con.setAutoCommit(true); // < 기본 값
		return con;
	} catch (SQLException e) {
		e.printStackTrace();
	}
	return null;
}

 

 3-4) 서비스(동작) ㄱ 

더보기
// 전체 코드
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import common.JdbcUtil;

public class ShoppingService {
	Connection con;
	PreparedStatement pstmt;
	ResultSet rs;
	
	public boolean order() {
		con=JdbcUtil.getConnection();
		String sql="insert into purchase(pc_mid, pc_pid) values(?, ?)";
		try {
			pstmt = con.prepareStatement(sql);	// sql 파싱(컴파일)
			pstmt.setString(1, "B");
			pstmt.setString(2, "컴퓨터");
			int result = pstmt.executeUpdate();	// sql 실행
			if(result>0) {
				System.out.println(" > 상품 주문 성공");
				sql = "insert into pay(py_cost, py_pcno) values(2000000, 2)";
				pstmt = con.prepareStatement(sql);
				result = pstmt.executeUpdate();
				if(result>0) {
					System.out.println(" > 결제 성공");
//					con.commit();
					JdbcUtil.txCommit(con);
					return true;
				}else {
					System.out.println(" > 결제 실패");
//					con.rollback();
					JdbcUtil.txRollback(con);
				}
			}else {
				System.out.println(" > 상품 주문 실패, 결제TX 실패");
			}
		} catch (SQLException e) {
			System.out.println("order 예외");
			e.printStackTrace();
		}
		return false;
	}
}
  • int result에 pstmt.executeUpdate()를 담는다. (문장을 전달해서 값을 받아오는 것에 성공하면 1, 실패하면 0)
  • result 값이 1 이상이라면 다시 db에 문장을 전달하고 값을 받아와서 result에 받는다.
  • result 값이 두 번 모두 1 이상이라면 JdbcUtil 클래스에 만들어둔 txCommit 메소드를 사용하여 db에서 commit해준다. (con.commit: 자바에서 만들어둔 메소드)
  • result 값이 1 이상이었다가 두번째에서 아니게 됐다면 db에서 rollback해준다. (con.rollback: 자바에서 만들어둔 메소드)

 


 

전체 피드백

  • 주말에 수업일지 읽으면서 복습하는 것이 아니라 예제 비슷하게 내고 코드를 만들어보면서 코드(영어!)와 친해져야 할 것 같다.
  • 나는 db보다 자바가 더 잘맞는 것 같다. 자바로 돌아오니까 재밌다..

 


728x90
728x90

 

수업내용 정리 (Java)

 

1. Jdbc

 

  • MySQL ㄱ 
더보기
-- test table
Create table member(
	ID varchar(20) PRIMARY KEY,
	PW varchar(20) NOT NULL,
	NAME varchar(20) NOT NULL,
	AGE tinyint unsigned NOT NULL,
	BIRTH date default (current_DATE)
);
select*FROM MEMBER;
-- test data
INSERT INTO MEMBER VALUES('A','1111','에이', 20, DEFAULT);
INSERT INTO MEMBER VALUES('B','2222','비비', 21, '2023-10-31');
INSERT INTO MEMBER VALUES('C','3333','씨씨', 22, DEFAULT);
INSERT INTO MEMBER VALUES('D','4444','디디', 30, DEFAULT);
INSERT INTO MEMBER VALUES('E','5555','이이', 32, DEFAULT);

 

 

더보기
Connection con;
PreparedStatement pstmt;
ResultSet rs;
  • Connection con: db 접속을 위한 객체 생성
  • PreparedStatement pstmt: sql 문장과 db 전달
  • ResultSet rs: select 결과 저장

 

 

public static void main(String[] args) {
	JdbcConnectionTest conTest=new JdbcConnectionTest();
	conTest.connect();
       
	// select, insert, ...
	conTest.select();
	conTest.select(30, "에이");
	conTest.insert("L", "101010", "엘", 34, "2010-10-10");
	
	conTest.dbClose();
}

 

// conTest.connect();
public void connect() {	/* java and db 연결 */
	try {
		con=DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "icia", "1234");
		System.out.println("db 접속 성공");
	} catch (SQLException e) {
		System.out.println("db 접속 실패");
		e.printStackTrace();
	}
}
  • db 접속을 위해 만들어둔 con 객체에 getConnection 메소드를 통해 db 접속
  • getConnection("db 주소", "id", "pw") 구조로 적는다.
  • localhost: ip적는곳 / 현재 컴퓨터에 있는 db를 사용한다면 localhost를 통해 접근이 가능하다.
  • db 접속에 실패할 수도 있으므로 try-catch문을 이용하여 작성해야 한다.

 

// conTest.dbClose();
private void dbClose() {	/* java and db 연결 종료 */
	try {
		con.close();
		System.out.println("db 종료 성공");
	} catch (SQLException e) {
		System.out.println("db 종료 실패");
		e.printStackTrace();
	}
}
  • con 객체에 close 메소드를 통해 db 연결 해제
  • 연결 해제에 실패할 때를 대비하여 try-catch문을 이용하여 작성한다.

 

// conTest.select();
private void select() {
	String sql="select*from member";
	try {
		pstmt=con.prepareStatement(sql);
		rs=pstmt.executeQuery(); // executeQuery는 select만
		while(rs.next()) {
			System.out.println("아이디: "+rs.getString("ID")); // ID 칼럼에 있는 값을 반환
			System.out.println("비밀번호: "+rs.getString("PW"));
			System.out.println("이름: "+rs.getString("NAME"));
			System.out.println("나이: "+rs.getInt("AGE"));
			System.out.println("생일: "+rs.getDate("BIRTH"));
			System.out.println(" -----:");
		}
	} catch (SQLException e) {
		System.out.println("select 예외 발생");
		e.printStackTrace();
	}
	System.out.println("select 완료");
}
  • String sql="~"; : sql에서 실행할 문장을 적는다.
  • pstmt=con.prepareStatement(sql); : sql 문장을 db에 전달 파싱(분석) / 컴파일과 비슷하다고 생각해도 된다.
  • rs=pstmt.executeQuery(); : db에서 select문을 실행한다.
  • while문: 조건에 rs.next()를 넣어 rs의 다음 값이 있는지 확인하고  다음 값이 없으면 while문을 종료한다. sysout을 통해 rs에 담긴 값을 받아와 출력한다.
  • 에러가 날 수 있으므로 try-catch문을 이용하여 작성한다.

 

// conTest.select(30, "에이");
private void select(int age, String name) {
	String sql="select*from member where AGE>=? OR NAME=?";
	try {
		pstmt=con.prepareStatement(sql);
		pstmt.setInt(1, age);
		pstmt.setString(2, name);
		rs=pstmt.executeQuery(); // executeQuery는 select만
		while(rs.next()) {
			System.out.println("아이디: "+rs.getString("ID")); // ID 칼럼에 있는 값을 반환
			System.out.println("비밀번호: "+rs.getString("PW"));
			System.out.println("이름: "+rs.getString("NAME"));
			System.out.println("나이: "+rs.getInt("AGE"));
			System.out.println("생일: "+rs.getDate("BIRTH"));
			System.out.println(" -----:");
		}
	} catch (SQLException e) {
		System.out.println("select 예외 발생");
		e.printStackTrace();
	}
	System.out.println("select 완료");
}
  • 전체적인 구조는 위와 같지만, 조건이 있기 때문에 조금 다르다.
  • sql문을 작성할 때 매개변수를 바로 작성할 수 있으나 붙여주기 까다로우니 물음표(?)로 대체해주고 밑에서 pstmt.set~(n,m)을 이용하여 작성해준다.
  • pstmt.set~(n,m): ~은 타입을 적고, n은 물음표(?)의 위치(왼쪽부터 순서대로 1~), m은 물음표(?)에 넣고 싶은 매개변수를 적는다.

 

// conTest.insert("L", "101010", "엘", 34, "2010-10-10");
private void insert(String id, String pw, String name, int age, String birth) {
	String sql="insert into member(id, pw, name, age, birth) "
			+ "values(?, ?, ?, ?, ?)";
	try {
		pstmt = con.prepareStatement(sql);
		pstmt.setString(1, id);
		pstmt.setString(2, pw);
		pstmt.setString(3, name);
		pstmt.setInt(4, age);
		pstmt.setString(5, birth);
		pstmt.executeUpdate();	// insert, updqte, delete 실행
	} catch (SQLException e) {
		System.out.println("insert 예외 발생");
		e.printStackTrace();
	}
}
  • 매개변수로 받아온 값들을 물음표(?) 위치에 맞게 집어넣고, executeUpdqte(insert, update, delete 실행) 메소드를 통해 실행한다.
  • 마찬가지로 오류가 날 수 있으니 try-catch문을 이용한다.

 

 

 

// 문제1 회원 G 삭제
conTest.delete("쥐");
// 문제2 회원 A의 나이를 50살로 변경
conTest.update("A", 50);
private void update(String id, int age) {
	String sql="update member set age=? where id=?";
	try {
		pstmt = con.prepareStatement(sql);
		pstmt.setInt(1, age);
		pstmt.setString(2, id);
		pstmt.executeUpdate();	// insert, updqte, delete 실행
	} catch (SQLException e) {
		System.out.println("insert 예외 발생");
		e.printStackTrace();
	}
}

private void delete(String id) {
	String sql="delete from member where id=?";
	try {
		pstmt = con.prepareStatement(sql);
		pstmt.setString(1, id);
		pstmt.executeUpdate();	// insert, updqte, delete 실행
	} catch (SQLException e) {
		System.out.println("insert 예외 발생");
		e.printStackTrace();
	}
}
  • delete와 updqte 모두 insert를 할 때처럼 비슷하게 매개변수를 받고 물음표 위치에 따라 맞는 매개변수를 입력한다.
  • executeUpdate를 사용하여 실행한다.
  • 마찬가지로 오류가 날 수 있으므로 try-catch문을 이용한다.

 

 

 1-2) 자주 쓸 메소드 (클래스로 빼두기) ㄱ 

더보기
package common;

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

public class JdbcUtil {
	static {
		try {
			Class.forName("com.mysql.cj.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	public static Connection getConnection() {
		try {
			Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "icia", "1234");
			return con;
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	public static void dbClose(ResultSet rs, PreparedStatement pstmt, Connection con) {
		try {
			if(rs!=null) rs.close();
			if(pstmt!=null) pstmt.close();
			if(con!=null) con.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
    
	public static void txCommit(Connection con) {
		try {
			con.commit();
		} catch (SQLException e) {
			System.out.println("commit fail");
			e.printStackTrace();
		}
	}
	public static void txRollback(Connection con) {
		try {
			con.rollback();
		} catch (SQLException e) {
			System.out.println("rollback fail");
			e.printStackTrace();
		}
	}
}

 

 

2. 문제

로그인할때 틀리면 계속 입력을 받아서 로그인에 성공하면 멈추도록 하기(boolean으로 반환받기)
회원 전체 출력하기

 2-1) 메인 ㄱ 

더보기
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		// 회원서비스 비지니스로직(업무코드)
		MemberService mSer = new MemberService();
		
		while(true) {
			System.out.print(" 아이디 입력> ");
			String id = sc.next();
			System.out.print(" 비밀번호 입력> ");
			String pw = sc.next();
			boolean result = mSer.login(id, pw);
			if(result) {
				break;
			}else {
				System.out.println(" > id 또는 pw가 틀렸습니다.\n");
			}
		}
		mSer.showMemberList(); // 회원 전체 출력
		System.out.println(" > 프로그램 종료");
	}
}

 

 2-2) 서비스 ㄱ 

더보기
// 회원관리 서비스
public class MemberService {
	Connection con;
	PreparedStatement pstmt;
	ResultSet rs;

	public boolean login(String id, String pw) {
		con=JdbcUtil.getConnection();
		String sql = "select*from member where id=? and pw=?";
		try {
			pstmt=con.prepareStatement(sql);
			pstmt.setString(1, id);
			pstmt.setString(2, pw);
			rs = pstmt.executeQuery();
			if(rs.next()) {
				System.out.println(" > "+id+"님 로그인 성공");
				return true;
			}
		} catch (SQLException e) {
		} finally {
			JdbcUtil.dbClose(rs, pstmt, con);
		}
		return false;
	}

	public void showMemberList() {
		con=JdbcUtil.getConnection();
		String sql = "select*from member";
		try {
			pstmt=con.prepareStatement(sql);
			rs = pstmt.executeQuery();
			System.out.println("ID\tNAME");
			System.out.println(" >-----+");
			while(rs.next()) {
				System.out.println(rs.getString("ID")+"\t"+rs.getString("NAME"));
				System.out.println(" >-----+");
			}
		} catch (SQLException e) {
			System.out.println(" > 정보 불러오기 실패");
			e.printStackTrace();
		} finally {
			JdbcUtil.dbClose(rs, pstmt, con);
		}
	}
}
  • try로 들어가든 catch로 들어가든 무조건 finally문을 실행하기 때문에 db 연결을 해제하는 메소드는 finally문에 넣었다.

 

로그인
회원 전체 출력

 

 


 

질문한 내용이나 어려웠던 점 메모

  • 영어가 너무 익숙하지 않다...

 


 

 + 빨리 프론트엔드도 배워보고싶다..!

728x90
1 ··· 6 7 8 9 10 11 12 ··· 45