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;
}
}