20-DAO/DTO



DAO/DAO


  • singleton dao dto

한 개(ex. main)에 너무 많은 코드들이 들어가있으면 코드 분석에 좋지 않고, 따라서수정 위치가 어디인지 분석하고, 수정 코드를 추가하는 것이 쉽게 해야 한다.


DTO = Data Transfer Object 클래스( = VO(Value Object 클래스)

  • 데이터베이스의 데이터를 저장할 클래스
    • 임시로 파일을 저장했다가 이 파일을 통해 데이터를 가져가는 형식으로. 처리과정에 필요한 것을 가져온다.
    • 데이터베이스에 있는 변수명과 동일하게 생성하며, getter setter를 사용.

DAO = Data Access Object 클래스

  • 데이터 직접 접근 객체 = 파일 입출력/ DB 입출력
    • 데이터베이스에 연동해서 작업해야 하는 모든 작업(연결, 사용, 해제)하는 부분만을 소유한 클래스

Controller = 제어 클래스

  • Controller 클래스는 하나만 생성 - singleton pattern을 사용

  • 처리과정과 입력과정을 연결해주는 역할. 데이터 사이를 ‘제어’하는 역할. 다른 DAO, VO로 전달 할 수 있다. 즉 입력된 것의 후속처리를 교통정리해주는 역할.



예제) DAO

package Template;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;

public class EmployeeDAO {
	 void insert(EmployeeVO vo) {
		//파일 저장-->EmployeeDAO
		 /* day10/employee.txt 파일에 vo객체의 id, name, salary  3 변수 내용을  1줄에 출력 */
		 try {
		 FileWriter fw = new FileWriter("employee.txt", true);
		 fw.write(vo.toString() + "\n"); // id+"|"+name+"|"+salary
		 fw.close();
		 }
		 catch(IOException ex) {	ex.printStackTrace(); }
	 }
	 

		 ArrayList<EmployeeVO> getAll() {
				ArrayList<EmployeeVO> list = new ArrayList();
			 try {
				 FileReader fr = new FileReader("employee.txt");
				 Scanner sc = new Scanner(fr);
				 while(sc.hasNextLine()) {
				 String line = sc.nextLine();
				 String items[] = line.split("\\|");
				 
				 int id = Integer.parseInt(items[0]);
				 String name = items[1];
				 double salary = Double.parseDouble(items[2]);				 
				 
	
				 list.add(new EmployeeVO(id, name, salary));
			
			}
		    sc.close();
			fr.close();
			 }catch(IOException e) { e.printStackTrace();}
			
			 
		 return list;
	 }


		private int Integer(String string) {
			// TODO Auto-generated method stub
			return 0;
		}
}

예제) VO

package Template;

public class EmployeeVO {
	private int id;
	private String name;
	private double salary;
	
	public EmployeeVO(int id, String name, double salary) {
		super();
		this.id = id;
		this.name = name;
		this.salary = salary;
	}



	public int getId() {
		return id;
	}

	public String getName() {
		return name;
	}

	public double getSalary() {
		return salary;
	}

	public void setId(int id) {
		this.id = id;
	}

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

	public void setSalary(double salary) {
		this.salary = salary;
	}
	
	@Override
	public String toString() {
		return id + "|" + name + "|" + salary;
	}
	
}

예제) Controller

package Template;

import java.util.ArrayList;

public class Controller {
	//Singleton pattern
	
	//자기 자신의 변수 생성, static praivate
	static private Controller con = new Controller(); //con 변수 또한 외부에서 호출 안 됨. 여기에서만 객체 생성, 그리고 객체 생성은 단 한 번밖에 안 됨. 
	
	//private 생성자 
	private Controller(){}
	
	//공유식의 getInstance 메소드를 만들 것. static 
	public static Controller getInstance() {
		return con;
	}
//사원 등록 제어 부분 
	void insert(int id, String name, double salary) {
		// 어떤 VO를 저장하고, 어떤 DAO 메소드를 호출할 것인가 
		EmployeeVO x = new EmployeeVO(id, name, salary); // 임시저장 
		EmployeeDAO dao = new EmployeeDAO();
		dao.insert(x);
	}
	
    void getAll() {
        EmployeeDAO dao = new EmployeeDAO();
       dao.getAll();
       ArrayList<EmployeeVO> ab = dao.getAll();
        for(EmployeeVO one : ab) {
        	System.out.println(one);
        }

    }
	//추가: getAll(){ EmployeeDAO 생성, 메소드 가져오기,  }
	
}
//다른 클래스에서는 아래와 같이 딱 한 번만 객체를 생성할 수 있다. (공유)
//Controller c = Controller.getInstance();

예제) Process

package Template;

import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

public class InsertProcess {
  void process() {
	 
	 Scanner key = new Scanner(System.in);
	  
	//사원등록 추가 입력 - InsertProcess 
		System.out.println("사번 입력: ");
	    int id = key.nextInt();
		System.out.println("이름 입력: ");
	    String name = key.next();
	    System.out.println("급여 입력: ");
	    double salary = key.nextDouble();
	    
	    Controller c = Controller.getInstance();
	    c.insert(id, name, salary);
	    
	    //Controller 입력 내용 전달
	    //EmployeeVO x = new EmployeeVO(id, name, salary);
	    //EmployeeDAO ??? 메소드 호출

  }
}

-----------------------------------------------------------------------------
  
package Template;

import java.util.ArrayList;

public class ViewProcess {
	//Controller 싱글톤 생성 
	//Controller getAll() 호출
	void process(){
		
	System.out.println("사원정보 조회를 선택하셨습니다.");
	Controller c = Controller.getInstance();
	c.getAll();
	

	}
	
	
}

예제) Main Method

package Template;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;

public class MenuTest {

	public static void main(String[] args) {
		
	    Scanner key = new Scanner(System.in);
	  //  ArrayList<Employee2> list = new ArrayList<Employee2>();
	  //  파일이나 db -- > 영구 저장
	     
	    while(true) {
			System.out.println("===다음과 같은 메뉴 이용 가능합니다===\n" + 
					"1.사원등록\n" + 
					"2.사원정보조회\n" + 
					"3.사원정보수정\n" + 
					"4.사원탈퇴\n" + 
					"5.프로그램종료");
			int menu = key.nextInt();
			
			if(menu == 1) {
					InsertProcess p = new InsertProcess();
					p.process();
				
			}else if(menu == 2) {
		
		/*	    for(Employee2 em : list ) {
			    	System.out.println(em);
			    }
			 */	   
				ViewProcess view = new ViewProcess();
				 view.process();
				 
				
		
			}else if(menu == 3) {
				System.out.println("사원정보 수정을 선택하셨습니다.");
			
	
			System.out.println("수정 사번 입력: ");
			String inputId = key.next();

			System.out.println("수정 항목 입력: ");
		     key.next(); // name 을 읽어오는 것 
		     String inputName = key.next();
		     
  
		     try {
				 FileReader fr = new FileReader("employee.txt");
				 Scanner sc = new Scanner(fr);
				 
				ArrayList<String> list = new ArrayList<String>();
				
			while(sc.hasNextLine()) {
				 String line = sc.nextLine();
				 String items[] = line.split("\\|");
				 String salary = items[2];
				 String id = items[0];
				 String name = items[1];
				 if(id.equals(inputId)){
				   name = inputName;
				 }
			
				 list.add(id + "|" + name + "|" + salary); // 다시 저장하는 것 
				 }
			
			sc.close();
			fr.close();
			
			FileWriter fw = new FileWriter("employee.txt");
			for(String one : list) {
				fw.write(one+ "\n");
			} // 다시 출력 
			fw.close();
			} catch(IOException e) { e.printStackTrace();}
			
				
			}else if(menu == 4) {
				 System.out.println("사원탈퇴 조회를 선택하셨습니다.");
				 //퇴사한 사번 입력: 100
				 //100 사번; list에서 삭제 
				 //분리해서 id까지는 만들어놓고, 그 때 같을 때, list에서 삭제, 그리고 다시 저장, 출력.
				 //list.remove(1) //1번 인덱스 삭제
				 
				 System.out.println("탈퇴 사번 입력: ");
					String inputId = key.next();
				      
			}else if(menu == 5) {
				 System.out.println("프로그램 종료합니다.");
				 break;
			}else {
				System.out.println("해당 기능의 메뉴는 존재하지 않습니다.");
			}
	    }

	}

	

	private static int Integer(String id2) {
		// TODO Auto-generated method stub
		return 0;
	}

}