Java

[Java] MVC 패턴

wwxs 2024. 9. 23. 17:44

MVC 패턴

  • 사용자 인터페이스를 설계하는 소프트웨어 디자인 패턴 중 하나
  • 세 가지 구성 요소로 나누어(역할을 분담하여) 개발을 진행

1. Model(모델)

  • 애플리케이션의 데이터와 비즈니스 로직을 담당
  • 데이터베이스, 파일 시스템, 외부 서비스와 통신을 통해 데이터를 저장하고 검색
  • 상태 변경에 대해 뷰와 컨트롤러에게 알릴 수 있는 매커니즘 제공
  • 뷰와 컨트롤러의 구현 세부사항으로부터 독립적

2. View(뷰)

  • 사용자에게 데이터를 표시하는 방법을 정의
  • Model의 정보를 표시, 사용자의 액션을 Controller에게 전달
  • 모델이 가진 정보를 사용자가 이해할 수 있는 형태로 변환

3. Controller(컨트롤러)

  • 사용자의 입력을 처리하고 모델과 뷰 사이의 상호작용을 관리
  • 사용자의 입력에 반응하여 모델을 업데이트하고, 필요한 경우 뷰를 새롭게 출력(재랜데링)

 

MVC 패턴의 장점

  • 관심사를 분리: 각 구성 요소는 독립적인 기능과 책임 > 코드의 관리와 확장이 용이
  • 유지보수의 용이성: 애플리케이션의 비즈니스 로직과 사용자 인터페이스가 분리되어 유지보수가 용이

MVC 패턴의 단점

  • 복잡성 증가: 간단한 애플리케이션 구현에는 MVC 패턴의 구조가 복잡성을 증가
  • 학습 곡선 높음: 이해하고 사용하기 까지 일정한 학습이 필요

 

MVC 패턴의 작동 원리

  • V > C > M > C> V
  • 사용자 인터랙션: 뷰를 통해 상호작용
  • 컨트롤러 처리: 사용자의 행동이 컨트롤러로 전달
  • 모델 업데이트: 컨트롤러는 모델을 업데이트 하거나 조회하여 필요한 데이터를 얻음
  • 뷰 업데이트: 컨트롤러는 새로운 데이터와 함께 업데이트를 하라고 지시
  • 사용자에게 표시: 뷰는 업데이트 된 데이터를 표시

 

(예제 코드)

더보기
더보기

(Main)

package chapter12;

import chapter12.view.BookView;

public class Main {
	public static void main(String[] args) {
		BookView bookView = new BookView();
		bookView.showMenu();
	}
}

 

(Controller)

package chapter12.controller;

import java.util.ArrayList;
import java.util.List;

import chapter12.model.Book;

// Book 데이터를 사용하여 기능 정의

public class BookController {
	// 인스턴스 변수
	private List<Book> books;
	
	// 생성자
	// >> 책(객체)을 담을 리스트 생성
	public BookController() {
		this.books = new ArrayList<Book>();
	}
	
	// 1. 책을 추가하는 기능
	public void addBook(String title, String author, String publisher) {
		Book newBook = new Book(title, author, publisher);
		books.add(newBook);
	}
	
	// 2. 책 리스트 반환
	public List<Book> getAllBooks(){
		return books;
	}
	
	// 3. 도서 검색 기능
	public List<Book> searchBook(String title){
		// 검색 된 도서를 담을 리스트
		List<Book> result = new ArrayList<Book>();
		
		// books 배열을 순환하여 각 순환마다 해당 요소를 Book 타입의 변수에 반환
		// >> for-each문
		for(Book book: books) {
			if(book.getTitle().contains(title)) {
				result.add(book);
			}
		}
		return result;
	}
}

 

(View)

package chapter12.view;

import java.util.List;
import java.util.Scanner;

import chapter12.controller.BookController;
import chapter12.model.Book;

public class BookView {
	// 인스턴스 변수
	private Scanner sc;
	// BookController 객체를 저장하기 위한 변수
	private BookController bookController;
	
	// 생성자
	public BookView() {
		this.sc = new Scanner(System.in);
		bookController = new BookController();
	}
	
	// 사용자에게 메뉴를 표시하고 입력을 처리하는 메서드
	public void showMenu() {
		int choice = 0;
		while(choice != 4) {
			// 책 추가, 모든 책 조회, 책 검색, 서비스 중단
			System.out.println("1. Add a Book");
			System.out.println("2. Show all Books");
			System.out.println("3. Search for a Book");
			System.out.println("4. Quit");
			System.out.print("메뉴를 선택해주세요: ");
			
			// 사용자로부터 선택을 입력받기
			choice = sc.nextInt();
			sc.nextLine();	// 숫자 입력 후 엔터 키(개행문자) 처리
			
			// 사용자의 선택에 따라 적절한 메서드 호출
			switch(choice) {
			case 1:
				addBookView();
				break;
			case 2:
				showAllView();
				break;
			case 3:
				searchBookView();
				break;
			default:
				System.out.println("종료하겠습니다.");
				break;
			}
		}
	}
	
	private void addBookView() {
		System.out.println("책의 제목을 입력해주세요.");
		String title = sc.nextLine();
		
		System.out.println("책의 저자를 입력해주세요.");
		String author = sc.nextLine();
		
		System.out.println("책의 출판사를 입력해주세요.");
		String publisher = sc.nextLine();
		
		bookController.addBook(title, author, publisher);
	}
	
	private void showAllView() {
		List<Book> allBooks = bookController.getAllBooks();
		for (Book book: allBooks) {
			System.out.println(book.toString());
		}
	}
	
	private void searchBookView() {
		System.out.println("책을 검색해주세요.");
		String title = sc.nextLine();
		
		List<Book> foundBooks = bookController.searchBook(title);
		for(Book book: foundBooks) {
			System.out.println(book.toString());
		}
	}
	
}

 

(Model)

package chapter12.model;

// 순수한 클래스 (실행 main 메서드 X)

// 책 객체를 정의하는 클래스
// : 제목, 저자, 출판사
public class Book {
	// 인스턴스 변수
	private String title;
	private String author;
	private String publisher;
	
	// 생성자
	public Book(String title, String author, String publisher) {
		this.title = title;
		this.author = author;
		this.publisher = publisher;
	}
	
	// getter 메서드
	public String getTitle() {
		return title;
	}
	public String getAuthor() {
		return author;
	}
	public String getPublisher() {
		return publisher;
	}
	
	@Override
	public String toString() {
		return "Title: " + title + " Author: " + author + " Publisher: " + publisher;
	}
	
}

'Java' 카테고리의 다른 글

[Java] Singleton 패턴  (0) 2024.09.23
[Java] 제네릭  (0) 2024.09.23
[Java] Map  (0) 2024.09.23
[Java] Set  (0) 2024.09.23
[Java] List  (0) 2024.09.23