JAVA

[JAVA]MVC패턴

로돌씨 2024. 3. 21. 23:31
MVC 패턴이란?
Model , View , Controller 의 약자
view -> controller -> model의 요청
model -> view -> controller 의 응답

 

MVC를 이용해 도서 찾기 프로그램 만들기

필드 (vo -> 모델에 해당)

public class Book {
private int bNo;
private int category;
private String title;
private String author;

public Book() {}

//dto 부분 만들었음

public Book(int category, String title, String author) {
	super();
	this.category = category;
	this.title = title;
	this.author = author;
}

public int getbNo() {
	return bNo;
}

public void setbNo(int bNo) {
	this.bNo = bNo;
}

public int getCategory() {
	return category;
}

public void setCategory(int category) {
	this.category = category;
}

public String getTitle() {
	return title;
}

public void setTitle(String title) {
	this.title = title;
}

public String getAuthor() {
	return author;
}

public void setAuthor(String author) {
	this.author = author;
}

@Override
public String toString() {
	
	String str = " ";
	switch(category) {
	case 1:
		str="인문";
		break;
	case 2:
		str="자연과학";
		break;
	case 3:
		str="의료";
		break;	
	case 4:
		str="기타";
		break;
	} //필드 값 문자열 합친 후 리턴 category 분류 별로 출력 >>1: 인문 /2: 자연과학
    //3 : 의료 / 4 : 기타
	
	return "도서번호= " + bNo + ", 분류= " + str + ", 제목= " + title + ", 저자= " + author + "]";
}

}

 

view

import java.util.ArrayList;
import java.util.Scanner;

import com.collection.silsub1.Controller.BookManager;
import com.collection.silsub1.Model.vo.Book;

public class BookMenu {

	private Scanner sc = new Scanner(System.in);
	private BookManager bm = new BookManager();
	
	public BookMenu() {} //기본생성자 
	public void mainMenu() {
		while(true) {
			System.out.println("----도서 관리 프로그램----");
			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 num = sc.nextInt();
			sc.nextLine();
			switch(num) {
			case 1: 
				Book inBook = inputBook();
				bm.addBook(inBook);
				break;
			case 2:
				bm.printBookList(bm.sortedBookList());
				break;
			case 3:
			int res = bm.deleteBook(inputBookNo());
			if(res>0) {
				System.out.println("성공적으로 삭제되었습니다.");
			}else {System.out.println("삭제할 책이 존재하지않습니다.");}
			break; //삭제할책을 1로지정했으니 0보다 크면 삭제
			case 4:
				int index = bm.searchBook(inputBookTitle());
				if(index == -1) {
					System.out.println("조회한 책이 존재하지 않습니다.");
				}else {
					System.out.println(bm.selectBook(index));
					//인덱스랑일치하는 책을 선택해서 출력해라 
				}break;
			case 5:
				ArrayList<Book> list = bm.selectAll();
				if(list.isEmpty()) {
					System.out.println("도서가 없습니다.");
					
				}else {
					for(Book b: list) {
						System.out.println(b);
					}
				}break;
			case 6:
					System.out.println("프로그램을 종료합니다.");
					return;
		}
		}//도서관리 프로그램에 해당하는 메인 메뉴 출력, 각 메뉴에 해당 하는 BookManager 클래스의 
		//메소드 실행 반복 출력되게 함
		
		
		
	}
	
	public Book inputBook() {
		System.out.println("제목: ");
		String title = sc.nextLine();
		System.out.print("장르(1.인문/2.자연과학/3.의료/4.기타) 숫자로 입력: ");
		int category = sc.nextInt();
		System.out.print("저자: ");
		sc.nextLine();
		String author = sc.nextLine();
		
		
		return new Book(category, title , author);
   //Book 객체의 필드 값을 키보드 로 입력 받아 초기화 하고 객체 리턴
	}
	public int inputBookNo() {
		System.out.print("도서 번호: ");
		int no = sc.nextInt();
		sc.nextLine();
		return no;
  //삭제할 도서번호를 키보드로 입 력 받아 리턴
		
	}
	
	public String inputBookTitle() {
		System.out.println("도서 제목 : ");
		String title = sc.nextLine();
		return title;
	}//검색할 도서제목을 키보드로 입 력 받아 리턴
}

 

controller

import java.util.ArrayList;
import java.util.Scanner;

import com.collection.silsub1.Model.dao.BookDao;
import com.collection.silsub1.Model.vo.Book;

public class BookManager {
	private BookDao bd = new BookDao();
	private Scanner sc = new Scanner(System.in);

	// 입력받는 객채 , 메소드 실행 객체 생성

	public BookManager() { //기본생성자 
	}

	public void addBook(Book book) {

		try {
			book.setbNo(bd.getLastBookNo() + 1);
		} catch (IndexOutOfBoundsException e) {
			book.setbNo(1);
		}
		bd.addBook(book);

	}//전달받은 Book객체의 도서번호 를 setter메소드를 통해 설정 -> BookDao의 addBook()
   // 메소드로 해당 Book객체 전달

	public int deleteBook(int no) {

		return bd.deleteBook(no);
	}//전달받은 도서 번호를 BookDao 의 deleteBook() 메소드로 전달하고 그 결과 값을 리턴

	public int searchBook(String title) {

		return bd.searchBook(title);

	}//전달받은 도서 제목을 BookDao 의 searchBook() 메소드로 전달 하고 그 결과 값
   //(해당 도서 인덱 스) 리턴

	public Book selectBook(int index) {
		return bd.selectBook(index);
	}//전달받은 인덱스를 BookDao의 selectBook() 
  //메소드로 전달하고 그 결과 값(해당 도서 객체) 리턴

	public ArrayList<Book> selectAll() {

		return bd.selectAll();
	}//BookDao의 selectAll() 메소드를 통해 전달 받은 도서 전체 리스 트를 리턴

	public Book[] sortedBookList() {
		ArrayList<Book> list = bd.sortedBookList();
		Book[] bk = new Book[list.size()];
		for (int i = 0; i < bk.length; i++) {
			bk[i] = list.get(i);
		}

		return bk;

	}//BookDao의 sortedBookList() 메 소드를 통해 전달 받은 정렬된 도서 전체 리스트를
   // for문을 통 해 Book[] 배열에 넣고 리턴

	public void printBookList(Book[] br) {
		for (Book tmp : br)
			System.out.println(tmp);
	}
} // 전달 받은 Book[] 배열을 for each문을 이용하여 출력

 

Model(dao)

import java.util.ArrayList;

import com.collection.silsub1.Model.comparator.AscCategory;
import com.collection.silsub1.Model.vo.Book;

public class BookDao {
	private ArrayList<Book> bookList;
	
	public BookDao() {
		bookList = new ArrayList<Book>();
	}//기본 생성자 bookList 객체 생성함

	public BookDao(ArrayList<Book> bookList) {
		super();
		this.bookList = bookList;
	}//매개변수 생성자 , 다른 리스트를 전달 받아 bookList의 초기값으로 사용함
	
	public int getLastBookNo() {
		
		return bookList.get(bookList.size()-1).getbNo();
				//마지막책의 번호를 가져오겠다. 
	}
	//새 도서 추가
	
	public void addBook(Book book) {
		bookList.add(book);
	}//전달받은 도서 객체 bookList에 추가
	//도서 삭제 
	public int deleteBook(int no) {
		int res = 0; //결과 값 저장 
		for (int i = 0; i <bookList.size(); i++) {
			if (bookList.get(i).getbNo() == no) {
				bookList.remove(i);
				res = 1;
				break;
			} //책의 번호를 다 뒤져보고 , 메뉴에서 입력한 번호와 숫자가같으면 res를 1 로 처리하겠다.
		}
		
		return res;
	}
	//도서 검색
	public int searchBook(String title) {
		//제목이 일치하는 책의 인덱스를 찾기 
		int index = -1;
		for(int i =0; i < bookList.size(); i ++) {
			if(bookList.get(i).getTitle().equals(title)) {
				index = i ;
				break;
			}
		}
		return index;
	}//전달받은 도서 제목을 포함하는 bookList의 인덱스 리턴

	//인덱스값에 해당하는 book객체를 arratlist에서 찾아 리턴 
	public Book selectBook(int index) {
		return bookList.get(index);
	}

	//전체 출력 
	public ArrayList<Book> selectAll(){
		return bookList;
		
	}
	//정렬 후 list 리턴 
	public ArrayList<Book> sortedBookList(){
		bookList.sort(new AscCategory());
		return bookList;
	}
}

 

DAO DTO VO?

  • DAO : Data Access Object 의 약자로 DB에 접근하기 위한 객체
  • DTO : Data transfer Object 의 약자로 계층간 데이터 교환을 위한 Java Bean 을 의미 , getter setter 메소드만 가진 클래스
  • VO : Value Object 의 약자로 Read-Only 속성을가진 . 값오브젠트이다 . 단순이 값 타입을 표현하기 위한 클래스이기에 getter 기능만 존재한다. 

DTO vs VO

dto 는 가변의 성격을 가진 클래스이며 , 데이터 전송을 위해 존재함 , 따라서 getter와 setter기능을 모두 가지고있다.

vo는 값 자체의 의미를가진 불변클래스를 의미한다. 따라서 getter기능만 존재한다 .

 

실행

import com.collection.silsub1.view.BookMenu;

public class Run {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new BookMenu().mainMenu();
	}

} //BookMenu 클래스객체 생성하고 mainMenu 메소드 실행

 

 

'JAVA' 카테고리의 다른 글

[JAVA] JDBC #2  (0) 2024.04.17
[JAVA] JDBC #1  (0) 2024.04.16
[JAVA]네트워크  (0) 2024.03.08
[JAVA]Thread  (0) 2024.03.05
[JAVA] Collection(List , set , Map)  (1) 2024.02.27