본문 바로가기

Java

[Java] 38

​● 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("잘못 입력했습니다");
	}
					
}

 

4. 영화 검색하기 결과

 

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("---------------");
	}
	
}

 

5. 모든 영화보기 결과

 

​​

6. 나가기

- View.java에서 "6. 나가기"를 실행하는 코드를 작성한다.

if(choice == 6) {
	break;
}

 

'Java' 카테고리의 다른 글

[Java] 39  (0) 2022.02.13
[Java] 37  (0) 2022.02.10
[Java] 36  (0) 2022.02.08
[Java] 35  (0) 2022.02.06
[Java] 34  (0) 2022.02.05