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 |