연락처 관리 프로그램 [ver.4.0]

4024 단어 projectJavaJava

연락처 관리 프로그램 ver.4.0

  • 데이터 모델 : name, phone, email
  • 기능 : 연락처 등록, 전체검색, 상세검색, 연락처 수정, 연락처 삭제
  • UI 구조 :

0.종료 | 1. 등록 | 2.전체검색 | 3.상세검색 | 4.수정 | 5. 삭제


  • 업그레이드 내용 : 연락처 등록/검색/수정/삭제 데이터를 datafile에 저장하기. int에 String 입력 시 예외처리하기

파일에 데이터를 저장할 땐 파일을 먼저 만들고 시작해야합니다. 프로그램이 실행되면서 저장하기위한 파일도 생성하면 되는데요, 이 프로그램은 시작하고 바로 인스턴스를 생성하기 때문에 생성자가 우선순위가 가장 높아요. 그래서 생성자에서 파일을 생성하도록 하겠습니다.

private ContactDAOImple() {
	initDataDir();
	initDataFile();
};

파일 저장을 사용했을 때의 흐름을 생각해볼까요? 데이터가 입력되면 데이터를 파일에 저장하고 데이터가 삭제되면 삭제처리가 된 데이터를 다시 파일에 저장합니다. 데이터를 검색하면 파일에 있는 데이터를 읽어오고 종료했을 땐 기존의 데이터가 유지되어야하기 때문에 다시 실행되었을 땐 기존의 데이터를 불러오면 됩니다

private void writeDataToFile() {
	OutputStream out=null;
	BufferedOutputStream bout=null;
	ObjectOutputStream oout=null;
		
	try {
		out=new FileOutputStream(dataFile);
		bout=new BufferedOutputStream(out);
		oout=new ObjectOutputStream(bout);
        
		oout.writeObject(list);
	} catch (Exception e) {
		e.printStackTrace();
	}finally {
		try {
			oout.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}//end writeDataToFile()
	
private void readDataFromFile() {
	InputStream in=null;
	BufferedInputStream bin=null;
	ObjectInputStream oin=null;
	
	try {
		in=new FileInputStream(dataFile);
		bin=new BufferedInputStream(in);
		oin=new ObjectInputStream(bin);		
		list=(ArrayList<ContactVO>) oin.readObject();
		
	} catch (Exception e) {
		e.printStackTrace();
	} finally {
		try {
			oin.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}//end readDataFromFile()

오류 발생!

  • 최초로 프로그램을 실행하고 데이터 저장없이 프로그램을 종료하면 다시 실행했을 때 에러가 발생했었어요. 데이터 파일은 생성되었지만 저장된 데이터가 아무것도 없었기 때문인데요.
private void initDataDir() {
	dataDir=new File(DATA_DIR);
	System.out.println("폴더 경로 : "+dataDir.getPath());
	System.out.println("절대 경로 : "+dataDir.getAbsolutePath());
		
	if(!dataDir.exists()) {
		if(dataDir.mkdir()) {
			System.out.println(">>폴더를 생성했습니다.");
		}else {
			System.out.println(">>폴더를 생성할 수 없습니다.");
		}
	}else {
		System.out.println(">>폴더가 이미 존재합니다.");
	}
	
}//end initDataDir()
	
private void initDataFile() {
	String filePath=DATA_DIR+File.separator+DATA_FILE;
	dataFile=new File(filePath);
	System.out.println("파일 경로 : "+dataFile.getPath());
	System.out.println("절대 경로 : "+dataFile.getAbsolutePath());
	
	if(!dataFile.exists()) { 
		try {
			if(dataFile.createNewFile()) {
				System.out.println(">>새로운 데이터 파일을 생성했습니다.");
				writeDataToFile();
				// list가 비어있어도 file에 저장하기
			}else {
				System.out.println(">>파일을 생성할 수 없습니다.");
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}else {
		System.out.println(">>기존 데이터가 존재합니다.");	
		readDataFromFile();
		// 시작하기 전 데이터를 불러오기
	}
}//end initDataFile()

writeDataToFile()메소드의 위치를 list에 들어갈 데이터가 없어도 file이 생성되면서 list가 저장되도록 했더니 빈데이터가 들어간 다음에도 실행했을 경우 정상적으로 작동했음을 확인할 수 있었어요!

if(list==null) {
	list = new ArrayList<ContactVO>();
}else {				
	readDataFromFile();
}

이 방식으로도 해봤었는데 안되는건 아니지만 코드 가독성이 떨어진다고 하셔서 아웃당했습니다.. 이렇게 배워가는거죠~🧐

그리고 새로운 데이터가 저장되어야하는 연락처 등록, 연락처 수정, 연락처 삭제 메소드에서 writeDataToFile()를 호출하도록 하면 됩니다.

기존에는 int값을 입력받아 메뉴 선택 및 인덱스 입력을 받았는데요. 문자형 숫자가 입력될 경우도 숫자로 인식할수 있도록 Integer.parseInt(sc.nextLine())로 입력받게 수정했으며
숫자가 아닌 다른 문자를 입력했을 경우 NumberFormatException 예외가 발생하는 모든 순간들을 try-catch로 예외처리해주었습니다.


향후 업데이트

UI를 콘솔화면이 아닌 gui로 제공하기

좋은 웹페이지 즐겨찾기