Notice
Recent Posts
Recent Comments
Link
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Archives
Today
Total
관리 메뉴

Everything has an expiration date

★★★ JDBC 20231120 [프로그래밍 소스] - Test007, MemberDTO, MemberMain, MemberDAO 본문

[JDBC]/Program source (JDBC)

★★★ JDBC 20231120 [프로그래밍 소스] - Test007, MemberDTO, MemberMain, MemberDAO

Jelly-fish 2023. 11. 21. 17:02

JDBC01 - com.test

Test007.java

/*================================
 	Test007.java
 	- DBConn 에 대한 단위 테스트
==================================*/

package com.test;

import java.sql.Connection;

import com.util.DBConn;

public class Test007
{

	public static void main(String[] args)
	{
		try
		{
			Connection conn = DBConn.getConnection();
			
			
			if (conn == null)
			{
				System.out.println("데이터베이스 연결 실패 ㅠ ㅠ");
			}
			else
			{
				System.out.println("데이터베이스 연결 성공~!!!");
			}
			
			
		} catch (Exception e)
		{
			System.out.println(e.toString());
		}
		
		finally
		{
			try
			{
				DBConn.close();
				
			} catch (Exception e)
			{
				System.out.println(e.toString());
			}
			
		}
		
	}
}

 

JDBC02 - com.test

 

MemberDTO.java

 

/*===========================
	   MemberDTO.java
============================*/

/*
○ TBL_MEMBER 테이블을 활용하여
   이름과 전화번호를 여러 건 입력받고, 전체 출력하는 프로그램을 구현한다.
   단, 데이터베이스 연동이 이루어져야 하고
   MemberDAO, MemberDTO 클래스를 활용해야 한다.
 
실행 예)

이름 전화번호 입력(2) : 임하성 010-2222-2222
>> 회원 정보 입력 완료~!!!
이름 전화번호 입력(3) : 김민지 010-3333-3333
>> 회원 정보 입력 완료~!!!
이름 전화번호 입력(4) : .

----------------------------------
전체 회원 수 : 3명
----------------------------------
번호	 이름	   전화번호
1		이윤수	010-1111-1111
2		임하성	010-2222-2222
3		김민지	010-3333-3333
----------------------------------
*/

package com.test;

public class MemberDTO
{
	// 주요 속성 구성
	private String sid, name, tel;
	
	// getter / setter 구성
	public String getSid()
	{
		return sid;
	}

	public void setSid(String sid)
	{
		this.sid = sid;
	}

	public String getName()
	{
		return name;
	}

	public void setName(String name)
	{
		this.name = name;
	}

	public String getTel()
	{
		return tel;
	}

	public void setTel(String tel)
	{
		this.tel = tel;
	}

	@Override
	public String toString()
	{
		return sid + "  " + name + "  " + tel;
	}
	
	

	
}

 

 

 

 

MemberDAO.java

 

/*=========================
       MemberDAO.java
===========================*/

// 데이터베이스에 엑세스 하는 기능
// → DBConn 활용 (전담 계층)

// 데이터를 입력하는 기능 → insert

// 인원 수 확인하는 기능
// 즉, 대상 테이블(TBL_MEMBER)의 레코드 카운팅 기능 → select

// 전체 리스트를 조회하는 기능
// 즉, 대상 테이블(TBL_MEMBER)의 데이터를 조회하는 기능 → select

/*
○ TBL_MEMBER 테이블을 활용하여
   이름과 전화번호를 여러 건 입력받고, 전체 출력하는 프로그램을 구현한다.
   단, 데이터베이스 연동이 이루어져야 하고
   MemberDAO, MemberDTO 클래스를 활용해야 한다.
 
실행 예)

이름 전화번호 입력(2) : 임하성 010-2222-2222
>> 회원 정보 입력 완료~!!!
이름 전화번호 입력(3) : 김민지 010-3333-3333
>> 회원 정보 입력 완료~!!!
이름 전화번호 입력(4) : .

----------------------------------
전체 회원 수 : 3명
----------------------------------
번호	 이름	   전화번호
1		이윤수	010-1111-1111
2		임하성	010-2222-2222
3		김민지	010-3333-3333
----------------------------------
*/


package com.test;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.ListIterator;
import java.util.Scanner;

import com.util.DBConn;

public class MemberDAO
{
	// ★[선생님의 엄청난 해설]====================================================================================
	
	// 주요 속성 구성 → DB 연결 객체
	private Connection conn;

	/*
	public Connection getConn()
	{
		return conn;
	}

	public void setConn(Connection conn)
	{
		this.conn = conn;
	}
	*/
	
	// 생성자 정의(사용자 정의 생성자)
	public MemberDAO()
	{
		conn = DBConn.getConnection();
	}
	
	
	// 메소드 정의 → 데이터를 입력하는 기능
	public int add2(MemberDTO dto) throws SQLException
	{
		// 반환할 결과값을 담아낼 변수(적용된 행의 개수)
		int result = 0;
		
		// 작업 객체 생성
		Statement stmt = conn.createStatement();
		
		// 쿼리문 준비(insert)
		String sql = String.format("INSERT INTO TBL_MEMBER(SID, NAME, TEL)"
						+ "VALUES(MEMBERSEQ.NEXTVAL, '%s', '%s')"
						, dto.getName(), dto.getTel());
		
		// 작업 객체를 활용하여 쿼리문 실행(전달)
		result = stmt.executeUpdate(sql);
		
		// 사용한 리소스 반납
		
		stmt.close();
		
		// 최종 결과값 반환
		return result;
		
	}
	
	
	
	
	// 메소드 정의 → 전체 인원 수 확인하는 기능
	public int count2() throws SQLException
	{
		// 결과값으로 반환하게 될 변수 선언 및 초기화(인원 수)
		
		int result = 0;
		
		// 작업 객체 생성
		Statement stmt = conn.createStatement();
		
		// 쿼리문 준비(select)
		String sql = "SELECT COUNT(*) AS COUNT FROM TBL_MEMBER";
		
		// 생성된 작업 객체를 활용하여 쿼리문 실행
		// → select → executeQuary() → ResultSet 반환
		//           → 일반적으로 반복문 구성을 통한 ResultSet 처리
	
	
		ResultSet rs = stmt.executeQuery(sql);
		
		// ResultSet 처리 → 반복문 구성 → 결과값 수신
		
		while (rs.next()) 		// if (rs.next())
		{
			result = rs.getInt("COUNT"); // rs.getInt(1)
										//  ※ 컬럼 인덱스는 1 부터...
			
		}
	
		// 최종 결과값 반환
		return result;
	}
	
	
	
	
	
	
	
	// 메소드 정의 → 전체 리스트 조회하는 기능
	// 순서가 의미있는 ArrayList. 
	public ArrayList<MemberDTO> lists2() throws SQLException
	{
		// 결과값으로 반환할 변수 선언 및 초기화
		ArrayList<MemberDTO> result = new ArrayList<MemberDTO>();
		
		// 작업 객체 생성
		Statement stmt = conn.createStatement();
		
		
		// 쿼리문 준비(select)
		String sql = "SELECT SID, NAME, TEL FROM TBL_MEMBER ORDER BY SID";
		
		
		// 생성된 작업 객체를 활용하여 쿼리문 실행 
		// → select → executeQuery() → ResultSet 반환
		
		ResultSet rs = stmt.executeQuery(sql);
		
		// check~!!!
		// ResultSet 처리
		// ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
		while(rs.next())
		{
			MemberDTO dto = new MemberDTO();
			
			dto.setSid(rs.getString("SID"));
			dto.setName(rs.getString("NAME"));
			dto.setTel(rs.getString("TEL"));
			
			result.add(dto);
		}
		// ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
		
		// 리소스 반납 
		rs.close();
		stmt.close();
		
		// 최종 결과값 반환
		return result;
		
	}
	

	
	
	
	//※ [나의 글러먹은 풀이]=================================================================================

	
	
	// 메소드 정의 → 데이터를 입력하는 기능
	public int add(MemberDTO dto) throws SQLException
	{
		// 반환할 결과값을 담아낼 변수 (적용된 행의 개수)
		int result = 0;
				
		if (conn != null)
		{
			
			try
			{
				// 작업 객체 생성(Statement)
				Statement stmt = conn.createStatement();
				
				
				// 쿼리문 구성(Insert 쿼리문)
				
				String sql = String.format("INSERT INTO TBL_MEMBER(SID, NAME, TEL) VALUES(MEMBERSEQ.NEXTVAL, '%s', '%s')", dto.getName(), dto.getTel());
				
				
				result =  stmt.executeUpdate(sql);
				
				// MemberDTO 값들을 다 넣어준다.
				// int result = stmt.executeUpdate(쿼리문)
				// (변경된 행의 개수 반환)
				
				
			} catch (Exception e)
			{
				System.out.println(e.toString());
			}
			
		}
		
		// 최종 결과값 반환
		return result;
		
	}
	
	// * 특정한 부서, 성별 등 다른 구성을 해야한다면 매개변수를 받겠지만
	//   현재는 테이블 전체의 인원수를 확인하는 것이므로 매개변수 없다!
	
	// ResultSet rs = stmt.executeQuery(조회 쿼리문)
	// 반복문 사용 안 해도 된다! 하나의 레코드만 넘어오므로...
	// 얻어낸 인원수 값을 단일값으로 반환하기만 하면 된다!
	
	// 결과값으로 반환하게 될 변수 선언 및 초기화 (인원 수)
	
	
	// 메소드 정의 → 전체 인원 수 확인하는 기능
	public int count() throws SQLException
	{
		
		int result = 0;
		
		if (conn != null)
		{
			
			try
			{
				 // 작업 객체 생성
				  Statement stmt = conn.createStatement();
				  
				  
				  // 쿼리문 생성 (조회 select 문)
				  String sql = "SELECT COUNT(*)"
				  			+ " FROM TBL_MEMBER";
				  
				  // 쿼리문 입력
				  
				  ResultSet rs = stmt.executeQuery(sql);
				  
				  
				  // while 문을 통한 출력
				  
				  while(rs.next())
				  {
					  result = rs.getInt("COUNT(*)");
				  }
				  
				
			} catch (Exception e)
			{
				System.out.println(e.toString());
			}
			
		}
		  

		
		// 최종 결과값 반환
		return result;
	}
	
	
	
	// 메소드 정의 → 전체 리스트 조회하는 기능
	// 순서가 의미있는 ArrayList. 
	public ArrayList<MemberDTO> lists() throws SQLException
	{
		
		
		ArrayList<MemberDTO> mdtoList = new ArrayList<MemberDTO>();
		// ResultSet rs = stmt.executeQuery(쿼리문 - 전체조회)
		
		
		if (conn != null)
		{
			// ArrayList<MemberDTO> 생성
			
			
			try
			{
				// 작업 객체 생성
				Statement stmt = conn.createStatement();

				
				// 전체 결과를 반환해야 한다.
				// MemberDTO '들' 이 되어야 한다. 단일값 X
				// ArrayList<MemberDTO>
				
				String sql = "SELECT SID, NAME, TEL"
							+ " FROM TBL_MEMBER";
				
				
				ResultSet rs = stmt.executeQuery(sql);
				
				while(rs.next())
				{
					MemberDTO mdto = new MemberDTO();
					
					String sid	= rs.getString("SID");
					String name = rs.getString("NAME");
					String tel = rs.getString("TEL");
					
					mdto.setSid(sid);
					mdto.setName(name);
					mdto.setTel(tel);
					
					mdtoList.add(mdto);
			
					//System.out.println(mdto.getSid() + mdto.getName() + mdto.getTel());
					
				}
				
				
			} catch (Exception e)
			{
				System.out.println(e.toString());
			}
		}
		
		// 최종 결과값 반환
		return mdtoList;
	}
	
	// 메소드 정의 → 데이터베이스 연결 종료
	
	public void close()
	{
		// ※ 주의!
		// conn.close(); 
		// Connection 객체가 갖고 있는 close() 메소드를 부르는 것!
		// DBConn.close() 를 하게 되면, 사용자 정의로
		// 생성했던 메소드가 호출됩니다!! 이거 주의해야 합니다!!
		DBConn.close();
	}


}

 

 

MemberMain.java

/*==========================
 	 MemberMain.java
============================*/

// 인텔리센스 : 자동 텍스트 완성
// * 『단위 테스트』 : 하나씩 클래스를 제작해 본 후 실험해 본 다음에 메인클래스에 합치는 것.


// 【DTO】	- Data Transfer Object
//  → 계층 간 데이터 전송을 위해 도메인 모델 대신 사용되는 객체
// 【DAO】	- Data Access Object


// ★ [선생님의 추가 설명 : 이젠 더 이상 설명 안 할 거예요...] *******************
//	◎『DTO』 : 달걀 10개를 수환이에게 전달하려고 해요...
//              왔다갔다 10번... 오고가고 하면 20번이니까 그렇게 하지 말고...
//              계란 10개를 적재해 둘 수 있는 통에다가 담으면 한꺼번에 전달할 수 있겠다!
//              안에 값이 들어있다 보니까, VTO랑 혼용하기도 함. (크게 구분 X)
//        		
//				▶ [한꺼번에 담아서 전달할 수 있도록 하는 통]
//

//  ◎『DAO』 : 실제 데이터에 엑세스하는 전용 계층.
//              길 건너 스타벅스가 거래처예요.
//              우리 지금 사무실에 22명의 인원이 각자 할 일을 처리하고 있는데
//              길 건너 스타벅스에서 문서를 가져오거나 보내주는건 은하의 업무로 하자고 약속하자는 거예요.
//              업무과정에서 스타벅스에서 뭔가를 가져오거나 보내야되는 상황일 때
//              은하의 업무로 두지 않을 경우, 민지, 동민 사원이 필요할 때마다 왔다갔다 해야 하기 때문에
//              상당히 번거롭겠죠...
//              스타벅스에서 뭔가를 가져오거나 전해줘야 할 경우 은하한테만 말하면 된다!
//              한 명의 업무가 되니까 일괄적으로 업무를 처리할 수 있게된다! (휴무여도 은하만 알면 됨)
//              은하가 곧 DAO 예요~!!!
//
//				▶ [업무를 처리하는 전담 계층(은하)]
// *******************************************************************************

/*
○ TBL_MEMBER 테이블을 활용하여
   이름과 전화번호를 여러 건 입력받고, 전체 출력하는 프로그램을 구현한다.
   단, 데이터베이스 연동이 이루어져야 하고
   MemberDAO, MemberDTO 클래스를 활용해야 한다.
 
실행 예)

이름 전화번호 입력(2) : 임하성 010-2222-2222
>> 회원 정보 입력 완료~!!!
이름 전화번호 입력(3) : 김민지 010-3333-3333
>> 회원 정보 입력 완료~!!!
이름 전화번호 입력(4) : .

----------------------------------
전체 회원 수 : 3명
----------------------------------
번호	 이름	   전화번호
1		이윤수	010-1111-1111
2		임하성	010-2222-2222
3		김민지	010-3333-3333
----------------------------------
*/

package com.test;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Scanner;

import com.util.DBConn;

public class MemberMain
{
	
	
//	 public static void main(String[] args) throws SQLException 
//	  { 
//	  		MemberDAO md = new MemberDAO(); 
//	  		MemberDTO mt = new MemberDTO(); 
//	  		Scanner sc = new Scanner(System.in);
//	  
//	  // 인원 수 변수 
//	  		int memberCnt = md.count();
//	  
//	  // 입력단 숫자 변경 변수 
//	  		int cnt = 1;
//	  
//	  // 이름, 전화번호 변수 
//	  		String name, tel;
//	  
//	  
//	  do {
//	  
//	  System.out.printf("이름 전화번호 입력(%d) : ", memberCnt + cnt); name = sc.next();
//	  
//	  if (name.equals(".")) { break; }
//	  
//	  tel = sc.next();
//	  
//	  // 입력한 값 MemberDTO 객체에 저장 mt.setSid(String.valueOf(memberCnt + cnt));
//	  mt.setName(name); mt.setTel(tel);
//	  
//	  // 입력한 값으로 데이터베이스에 저장.
//	  
//	  md.add(mt);
//	  
//	  
//	  
//	  cnt++; } while (true);
//	  
//	  
//	  ArrayList<MemberDTO> mdtoList = md.lists();
//	  
//	  System.out.println(mdtoList);
//	  
//	  
//	  }
	 
	 
	 public static void main(String[] args)
		{
			Scanner sc = new Scanner(System.in);
			MemberDAO dao;
			
			// DBConn : 왜 필요가 없나? -> 은하(DAO)가 혼자 하면 되니까...
			//          멤버 메인에서 필요가 없다.
			
			
			try
			{
				dao = new MemberDAO();
				
				int count = dao.count();
				
				
				do
				{
					System.out.printf("이름 전화번호 입력(%d) : ", ++count);	// 임하성 010-2222-2222
					String name = sc.next();
					
					// 반복의 조건을 무너뜨리는 코드 구성
					if (name.equals("."))
						break;
					
					String tel = sc.next();
					
					// ※ 여기까지의 과정을통해 이름과 전화번호를 사용자로부터 입력받은 이유는
					//    입력받은 데이터를 데이터베이스에 입력하기 위함.
					//    데이터 입력을 위해서는 dao 의 add() 메소드 호출 필요.
					//    add() 메소드를 호출하기 위해서는 MemberDTO 를 넘겨주는 과정이 필요.
					//    MemberDTO 를 넘겨주기 위해서는 객체의 속성값을 구성한느 과정이 필요.
					
					// MemberDTO 객체 생성
					MemberDTO dto = new MemberDTO();
					
					// 속성값 구성
					dto.setName(name);
					dto.setTel(tel);
					
					// 데이터베이스에 데이터 입력하는 메소드 호출 → add()
					
					//dao.add2(dto);
					// DAO 의 add 메소드 내부에서 쓰는 DTO 객체의 속성은 Name, Tel만 사용하므로
					// SID 는 Set 해 주지 않아도 된다.
					
					int result = dao.add(dto);
					if (result > 0)
						System.out.println(">> 회원 정보 입력 완료~!!!");
					
				}while(true);
				
				System.out.println("");
				System.out.println("---------------------------------------------");
				//System.out.println("전체 회원 수 : " + dao.count() + "명");
				System.out.printf("전체 회원 수 : %d명\n",  dao.count2());
				System.out.println("---------------------------------------------");
				System.out.println("번호	 이름	   전화번호");
				
				// 전체 회원 목록 가져와 출력
				// dao.lists();
				for (MemberDTO obj : dao.lists())
				{
					System.out.printf("%3s %7s %12s\n", obj.getSid(), obj.getName(), obj.getTel());
				}
				dao.lists();
				
				
				System.out.println("---------------------------------------------");
				
			} catch (Exception e)
			{
				System.out.println(e.toString());
			}
			finally 
			{
				try
				{	
					DBConn.close();
					//dao.close();
					System.out.println(">> 데이터베이스 연결 닫힘~!!!");
					System.out.println(">> 프로그램 종료됨~!!!");
					
				} catch (Exception e)
				{
					System.out.println(e.toString());
				}
			}
			
			
		}
	 
}

 

 

 

 

 

JDBC02 - com.util

DBConn.java (실수로 try~catch로 구성함... 그냥 던졌어야 됐는데...( ̄_ ̄|||))

/*=====================
   dbConn.java
   - 예외 처리 throws
=======================*/
package com.util;

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

public class DBConn
{
	private static Connection dbConn;
	
	public static Connection getConnection()
	{
		
		if (dbConn == null)
		{
			try
			{
				String url = "jdbc:oracle:thin:@localhost:1521:xe";
				String user = "scott";
				String pwd = "tiger";
				
				Class.forName("oracle.jdbc.driver.OracleDriver");
				dbConn = DriverManager.getConnection(url, user, pwd);
				
			} catch (Exception e)
			{
				System.out.println(e.toString());
			}
			
			
		}
		
		
		return dbConn;
		
	}
	
	public static Connection getConnection(String url, String user, String pwd)
	{
		
		if (dbConn == null)
		{
			try
			{
				Class.forName("oracle.jdbc.driver.OracleDriver");
				dbConn = DriverManager.getConnection(url, user, pwd);
			
			} catch (Exception e)
			{
				System.out.println(e.toString());
			}
			
		}
		
		return dbConn;
	}
	
	
	public static void close()
	{
		if (dbConn != null)
		{
			try
			{
				if (!dbConn.isClosed())
				{
					dbConn.close();
				}
				
				
				
			} catch (Exception e)
			{
				System.out.println(e.toString());
			}
			
			
		}
		
		dbConn = null;
		
		
	}
}