MVC 패턴 예제 업그레이드
폴더를 만든 뒤 그 안에 날짜별 파일을 생성하고 일기를 쓰는 예제를 만들어보자.
- main
package com.main;
import com.controller.DiaryController;
public class MainClass {
public static void main(String[] args) {
DiaryController pc = new DiaryController();
pc.run();
}
}
- InOutClass
package com.view;
import java.util.Scanner;
public class InOutClass {
// 1. 키보드로부터 데이터를 입력
private Scanner scan = new Scanner(System.in);
// 문자열 입력 메소드
public String inStr(String str) {
// 입력 유도용 안내문구(str)을 출력하고 입력값을 받아서 넘김
onePrint(str);
String s = scan.nextLine();
return s;
}
// 정수 입력 메소드
public int inNum(String str) {
onePrint(str);
String s = scan.nextLine();
int num = -1;
// 아무것도 입력하지 않았을 때
if (s.equals("")) {
num = -1;
return num; // 메소드 종료
}
// 숫자가 아닌 문자가 입력됐을 때
try {
num = Integer.parseInt(s);
} catch (Exception e) {
twoPrint("잘못된 입력입니다. \n");
num = -1;
}
return num;
}
// 2. 모니터로 데이터를 출력
// 줄바꿈 안 하는 출력 메소드
public void onePrint(String str) {
System.out.print(str);
}
// 줄바꿈 하는 출력 메소드
public void twoPrint(String str) {
System.out.println(str);
}
}
main과 InOutClass는 이전 예제와 동일하다.
그러나 DiaryController는 다르다. 우선 DataClass는 전혀 필요가 없다.
- DiaryController
package com.controller;
import com.view.InOutClass;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
import java.io.IOException;
public class DiaryController {
// 입출력 장치 객체
private InOutClass io = new InOutClass();
File folder = new File("data");
Scanner sc = new Scanner((System.in));
BufferedWriter bw = null;
FileWriter fw = null;
FileReader fr = null;
BufferedReader br = null;
String title, weather, mood, content;
// 전체 제어 메소드
public void run() {
// 메뉴 번호 저장 변수
int menu = -1;
io.twoPrint("다이어리 관리 프로그램");
io.twoPrint("-------------------");
while(true) {
// 메뉴 출력
menuShow();
menu = io.inNum("입력 > ");
if (menu == 0) {
io.twoPrint("프로그램 종료");
break;
}
// 메뉴 번호에 따라 기능 처리
switch (menu) {
case 1: // 저장 메소드 실행
saveDate();
break;
case 2: // 읽기 메소드 실행
readData();
break;
case 3: // 수정 메소드 실행
updateData();
break;
case 4: // 삭제 메소드 실행
deleteData();
break;
default:
io.twoPrint("0~5번까지 입력하세요.");
}
} // while end
} // run end
// 메뉴 출력 메소드
private void menuShow() {
io.twoPrint("1. 일기 저장");
io.twoPrint("2. 일기 읽기");
io.twoPrint("3. 일기 수정");
io.twoPrint("4. 일기 삭제");
io.twoPrint("0. 종료");
}
// 저장 메소드
private void saveDate() {
io.twoPrint("-- 일기 저장 --");
io.twoPrint("--------------");
Date today = new Date();
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyyMMdd");
// 생성자를 사용할 경우 입력을 모두 받아둔다.
title = sdf1.format(today);
io.twoPrint("제목(오늘 날짜) : " + title);
weather = io.inStr("날씨 : ");
mood = io.inStr("기분 : ");
content = io.inStr("내용 : ");
try {
if (!folder.isDirectory()) { // 폴더가 없으면
folder.mkdir(); // 폴더를 만들자
}
File file = new File("data\\" + title + ".txt");
fw = new FileWriter(file, true);
bw = new BufferedWriter(fw);
bw.write(weather + "\n" + mood + "\n" + content + "\n" );
bw.flush(); // 남아있는 것이 없도록 해줌
io.twoPrint("저장 완료. \n");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
bw.close();
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 읽기 메소드
private void readData() {
io.twoPrint("-- 일기 읽기 --");
io.twoPrint("--------------");
// 읽을 데이터 검색
String sTitle = io.inStr("검색할 이름 : ");
try {
File file = new File("data\\" + sTitle + ".txt");
fr = new FileReader(file);
br = new BufferedReader(fr);
String str = null;
while ((str = br.readLine()) != null) {
System.out.println(str); // 각 라인을 읽음
}
io.twoPrint("--------------");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// fis.close();
br.close(); // 제거는 역순 => br을 먼저 제거
fr.close();
} catch (IOException e) { }
}
}
// 수정 메소드
private void updateData() {
io.twoPrint("-- 일기 수정 --");
io.twoPrint("--------------");
// 수정할 데이터 검색
String sTitle = io.inStr("수정할 일기 제목 : ");
File file = new File("data\\" + sTitle + ".txt");
int menu = -1;
io.twoPrint("1. 전체 수정");
io.twoPrint("2. 일부 수정");
menu = io.inNum("입력 > ");
switch (menu) {
case 1: // 전체 수정
try {
fw = new FileWriter(file);
bw = new BufferedWriter(fw);
weather = io.inStr("날씨 : ");
mood = io.inStr("기분 : ");
content = io.inStr("내용 : ");
bw.write(weather + "\n" + mood + "\n" + content + "\n" );
io.twoPrint("수정 완료.\n");
} catch (IOException ie) {
ie.printStackTrace();
} finally {
try {
bw.close(); // BufferedWriter 먼저 정리
fw.close(); // FileWriter 사용
} catch (IOException e) {
e.printStackTrace();
}
}
break;
// 일부 수정 코드 작업X
// case 2: // 일부 수정
// br = new BufferedReader(fr);
// String str = null;
//
// int idx = 1;
//
//
// int c_num = io.inNum("수정을 원하는 라인 넘버를 입력해주세요 > ");
//
// while((str = br.readLine()) != null) {
// if (idx == c_num && idx == 1) {
// weather = io.inStr("날씨 : ");
// } else if (idx == c_num && idx == 2) {
// mood = io.inStr("기분 : ");
// } else if (idx == c_num && idx == 3) {
// content = io.inStr("내용 : ");
// }
// }
//
// break;
default:
io.twoPrint("1~2번까지 입력하세요.");
}
} // updateData end
// 삭제 메소드
private void deleteData() {
io.twoPrint("-- 일기 삭제 --");
io.twoPrint("--------------");
String sTitle = io.inStr("삭제할 이름 : ");
File file = new File("data\\" + sTitle + ".txt");
if (file.exists()) {
String yn = io.inStr("삭제할까요?(y) ");
if(yn.equals("y")){ // 입력값이 "y"라면
file.delete();
io.twoPrint("파일 삭제 성공\n");
return;
} else {
System.out.println("파일 삭제 실패");
}
} else {
System.out.println("파일이 존재하지 않습니다.");
}
}
}