● MVC(Model, View, Controller) 패턴
- 디자인 패턴 중 하나로 Model, View, Controller로 나누어 설계하는 방식
● Model
- 외부 저장소(데이터베이스)에서 필요한 데이터를 담아줄 객체
● View
- 사용자에게 보여지는 영역
● Controller
- 외부 저장소에 접근하는 기능을 담고 있는 영역
● MVC model
1. MVC model 1
- 유지보수가 어렵지만 설계가 쉽다.
2. MVC model 2
- 설계가 어렵지만 유지보수에 유리하다.
실습(영화 순위 관리 프로그램(4. 영화 검색하기 ~ 6. 나가기))
0. workspace에 1위부터 100위까지의 영화 순위를 가지고 있는 "movie.txt" 파일을 생성한다.
1. 외부 저장소에 접근하는 기능을 수행하는 메소드를 생성한다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class DBConnection {
public static BufferedReader read() throws IOException {
File f = new File("movie.txt");
FileReader fr = new FileReader(f);
BufferedReader br = new BufferedReader(fr);
return br;
}
public static BufferedWriter write() throws IOException{
File f = new File("movie.txt");
FileWriter fw = new FileWriter(f);
BufferedWriter bw = new BufferedWriter(fw);
return bw;
}
}
2. MovieDTO.java(Data Transfer Object) 파일을 생성한다.
public class MovieDTO {
private int rank;
private String title;
private String date;
private String revenue;
private String view;
private String screen;
public int getRank() {
return rank;
}
public void setRank(int rank) {
this.rank = rank;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getRevenue() {
return revenue;
}
public void setRevenue(String revenue) {
this.revenue = revenue;
}
public String getView() {
return view;
}
public void setView(String view) {
this.view = view;
}
public String getScreen() {
return screen;
}
public void setScreen(String screen) {
this.screen = screen;
}
}
3. View.java에서 실행할 항목을 입력받는 코드를 작성한다.
import java.io.IOException;
import java.util.Scanner;
import dao.MovieDAO;
public class View {
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
MovieDAO dao = new MovieDAO();
while(true) {
System.out.println("1. 영화 추가하기");
System.out.println("2. 영화 수정하기");
System.out.println("3. 영화 삭제하기");
System.out.println("4. 영화 검색하기");
System.out.println("5. 모든 영화보기");
System.out.println("6. 나가기");
System.out.print("입력 >> ");
int choice = Integer.parseInt(sc.nextLine());
}
}
}
4. 영화 검색하기
- MovieDAO.java(Data Access Object)에서 영화 정보를 검색하는 메소드를 생성한다.
(0) 마지막 영화 랭킹을 return하는 메소드
public int getLastRank() throws IOException{
BufferedReader br = DBConnection.read();
int rank = 0;
String line = "";
while((line = br.readLine()) != null) {
rank++;
}
br.close();
return rank;
}
(1) 랭킹으로 영화 검색
public MovieDTO selectByRank(int rank) throws IOException {
// 없는 랭킹을 입력했을 때 버그 잡아주기
if(rank < 1 || rank > getLastRank()) {
return null;
}
BufferedReader br = DBConnection.read();
String line = "";
for(int i = 0; i < rank; i++) {
line = br.readLine();
}
br.close();
// 반복문이 끝나고 나면 line에는 내가 필요한 영화 한줄이 들어있다
String[] temp = line.split("\t");
// 쪼갠 배열로 return 하여 view를 만드는 사람이 원하는대로 사용해도 된다.
MovieDTO dto = new MovieDTO();
dto.setRank(Integer.parseInt(temp[0]));
dto.setTitle(temp[1]);
dto.setScreen(temp[5]);
dto.setView(temp[4]);
dto.setDate(temp[2]);
dto.setRevenue(temp[3]);
return dto;
}
(2) 제목으로 영화 검색
public ArrayList<MovieDTO> selectByTitle(String title) throws IOException{
ArrayList<MovieDTO> list = new ArrayList<MovieDTO>();
BufferedReader br = DBConnection.read();
String line = "";
while((line = br.readLine()) != null) {
String[] temp = line.split("\t");
// 영화제목은 temp[1]에 들어있다
if(temp[1].equals(title)) {
// line에는 원하는 영화 정보가 들어있다.
MovieDTO dto = new MovieDTO();
dto.setRank(Integer.parseInt(temp[0]));
dto.setTitle(temp[1]);
dto.setDate(temp[2]);
dto.setRevenue(temp[3]);
dto.setView(temp[4]);
dto.setScreen(temp[5]);
list.add(dto);
}
}
br.close();
return list;
}
- View.java에서 "4. 영화 검색하기"를 실행하는 코드를 작성한다.
if(choice == 4) {
System.out.println("1. 랭킹으로 검색");
System.out.println("2. 영화제목으로 검색");
System.out.print("입력 >> ");
choice = Integer.parseInt(sc.nextLine());
if(choice == 1) {
System.out.print("랭킹 입력 >> ");
choice = Integer.parseInt(sc.nextLine());
MovieDTO res = dao.selectByRank(choice);
if(res == null) {
System.out.println("검색 실패 : 순위를 다시 입력하세요");
} else {
System.out.println("-----검색 결과-----");
System.out.println(res.getRank() + "위 영화");
System.out.println("제목 : " + res.getTitle());
System.out.println("개봉일 : " + res.getDate());
System.out.println("관객수 : " + res.getView());
System.out.println("상영관수 : " + res.getScreen());
System.out.println("수익 : " + res.getRevenue());
}
} else if(choice == 2) {
System.out.print("제목 입력 >> ");
String title = sc.nextLine();
System.out.println("-----검색 결과-----");
for(MovieDTO movie : dao.selectByTitle(title)) {
System.out.println("순위 : " + movie.getRank());
System.out.println("제목 : " + movie.getTitle());
System.out.println("개봉일 : " + movie.getDate());
System.out.println("관객수 : " + movie.getView());
System.out.println("상영관수 : " + movie.getScreen());
System.out.println("수익 : " + movie.getRevenue());
System.out.println("---------------");
}
} else {
System.out.println("잘못 입력했습니다");
}
}

5. 모든 영화보기
- MovieDAO.java(Data Access Object)에서 모든 영화 정보를 가져오는 메소드를 생성한다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.util.ArrayList;
import dto.MovieDTO;
public class MovieDAO {
public ArrayList<MovieDTO> selectAll() throws IOException {
ArrayList<MovieDTO> list = new ArrayList<>();
BufferedReader br = DBConnection.read();
String line = "";
while((line = br.readLine()) != null) {
// line에는 영화 한 편에 대한 정보가 들어있다
String[] temp = line.split("\t");
MovieDTO dto = new MovieDTO();
dto.setRank(Integer.parseInt(temp[0]));
dto.setTitle(temp[1]); // dto.title = temp[1];
dto.setDate(temp[2]);
dto.setRevenue(temp[3]);
dto.setView(temp[4]);
dto.setScreen(temp[5]);
list.add(dto);
}
br.close();
return list;
}
}
- View.java에서 "5. 모든 영화보기"를 실행하는 코드를 작성한다.
if(choice == 5) {
ArrayList<MovieDTO> list = dao.selectAll();
System.out.println("-----전체 영화 정보-----");
for (MovieDTO dto : list) {
System.out.println("[" + dto.getRank() + "]--" + dto.getTitle());
System.out.println("|개봉일 : " + dto.getDate());
System.out.println("|순수익 : " + dto.getRevenue());
System.out.println("|관객수 : " + dto.getView());
System.out.println("|상영관 : " + dto.getScreen());
System.out.println("---------------");
}
}

6. 나가기
- View.java에서 "6. 나가기"를 실행하는 코드를 작성한다.
if(choice == 6) {
break;
}