- 직렬화를 사용한 데이터 영속화
1. domain에 Serializable 구현
- domain : class Student
package domain;
import java.io.Serializable;
import lombok.Getter;
import lombok.Setter;
// VO : Value Object : 값을 저장할 목적의 객체
// source generate
@Getter @Setter
public class Student implements Serializable { // Serializable 구현
// 필드 : 학번, 이름, 국어, 영어, 수학
private String no;
private String name;
private int kor;
private int eng;
private int mat;
// 이하 생략
}
2. 데이터 영속화 코드 추가
- class StudentServiceImpl
@SuppressWarnings("unchecked")
public class StudentServiceImpl implements StudentService {
// Student[] students = new Student[10]; // 학생들
List<Student> students = new ArrayList<Student>();
{ // 초기화 블럭을 통한 데이터 불러오기
try {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("students.ser"));
students = (List<Student>) ois.readObject();
System.out.println("파일 불러오기 완료");
ois.close();
} catch (FileNotFoundException e) {
String[] names = { "김경보", "김동엽", "김상현", "김승종", "김예찬", "김경보", "김태윤" };
for (int i = 0; i < names.length; i++) {
students.add(new Student(22000 + i + 1 + "", names[i]));
}
System.out.println("임시 데이터 초기화 완료");
} catch (IOException e) {
e.printStackTrace();
System.exit(0); // vo에 하나 추가해버렸을 때 시스템 종료
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/* 코드 생략 */
// 데이터 저장
private void save() {
ObjectOutputStream oos;
try {
oos = new ObjectOutputStream(new FileOutputStream("students.ser"));
oos.writeObject(students);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
}
// 기존 CUD 코드에 save 메서드 추가
public void register() { // 등록 기능 구현
System.out.println("등록 기능 구현");
// 한 줄로 변경
students.add(new Student(nextLine("학번 >"), nextLine("이름 >", true),
nextInt("국어 >"), nextInt("영어 >"), nextInt("수학 >")));
System.out.println("정상 등록 되었습니다.");
save();
}
public void modify() { // 수정 기능 구현
System.out.println("수정 기능 구현");
// 학번으로 학생을 탐색 후 학생 데이터 중 이름, 국어, 영어, 수학점수를 수정
Student student = findBy(nextLine("수정할 학생의 학번 >"));
if (student == null) {
System.out.println("존재하지 않는 학번입니다");
return;
}
student.setName(nextLine("이름 >", true));
student.setKor(nextInt("국어 >"));
student.setEng(nextInt("영어 >"));
student.setMat(nextInt("수학 >"));
System.out.println("수정 완료 되었습니다.");
save();
}
public void remove() {
System.out.println("삭제 기능 구현");
students.remove(findIndexBy(nextLine("삭제할 학생의 학번 >")));
System.out.println("삭제 완료 되었습니다.");
save();
}