YTCW

java MVC 패턴 본문

java

java MVC 패턴

YTCW 2024. 9. 10. 12:30

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

Model(모델), Controller(컨트롤러), View(뷰)

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

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

3. Controller(컨트롤러)
: 사용자의 입력을 처리하고 모델과 뷰 사이의 상호작용을 관리
: 사용자의 입력에 반응하여 모델을 업데이트하고, 필요한 경우 뷰를 새롭게 출력(재렌더링)

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

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

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

Spring Boot
: 자바 기반 통합 웹 개발 프레임워크
: Spring Boot(Spring MVC)

 

도서 관리 시스템

1. 새 도서 추가
2. 모든 도서 정보 출력
3. 도서 검색(도서 제목으로 검색)

Model (도서 정보를 담당)
- Book : 도서 정보(도서 제목, 저자, 출판사)

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 this.title;
	}
	public String getauthor() {
		return this.author;
	}
	public String getpublisher() {
		return this.publisher;
	}
	
	@Override
	public String toString() {
		return "Title :" + title + ", Author :" + author + ", publisher :" + publisher;
	}



View (사용자 인터페이스 UI를 담당)
- BookView : 사용자의 입력을 받아 Controller에게 전달
              , Controller에서 받은 정보를 출력

public class BookController {
	// 인스턴스 변수
	private List<Book> books; 
    // <Book type> import chapter12.model.Book; 받아와야 쓸수 있음
	
	// 생성자 - 생성자는 반환 타입이 없음
	public BookController() {
		this.books = new ArrayList<Book>(); 
        // 배열 생성은 new 생성자를 사용하여 배열을 생성하게 됨
	}
	
	// 메서드 - 책을 추가하는 기능
	public void addBook(String title, String author, String publisher) {
		Book newBook = new Book(title, author, publisher);
		books.add(newBook); // books 인스턴스 변수에 추가해줌 배열 내 객체 형태로 저장시켜줌
	}
	
	// 메서드 - 책의 리스트를 반환하는 기능
	public List<Book> getAllBooks(){ // 반환 타입을 List<Book> 형태로 적어줘야함
		return books;	// 전체 책 목록을 반환
	}
	
	public List<Book> searchBook(String title){
		List<Book> result = new ArrayList<Book>();
        // for - each문 
		// books 배열의 요소를 처음부터 끝까지 순환
		// 각각의 순환마다 해당 요소를 Book 타입의 book 변수에 할당
		for(Book book : books) {
			if(book.getTitle().contains(title)) {
				result.add(book);
			}
		}
		return result;
	}



Controller (사용자의 입력을 받아 Model과 View 사이에서 중재)
- BookController : 사용자의 입력에 따라 적절한 Model 메서드를 호출

 

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 book");
			System.out.println("3. Search for a book");
			System.out.println("4. Quit");
			System.out.println("메뉴를 선택해주세요 : ");
			
			// 사용자로부터 선택을 입력
			choice = sc.nextInt();
			sc.nextLine();	// 숫자 입력 후 엔터 키 처리
			
			// 사용자의 선택에 따라 적절한 메서드 호출
			switch(choice) {
			case 1:
				addBookView();
				break;
			case 2:
				showAllBooks();
				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 showAllBooks() {
		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());
	}
	
	
}
}

 

import chapter12.view.BookView;

public class Main {

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

'java' 카테고리의 다른 글

java singleton  (0) 2024.09.10
java lombok  (0) 2024.09.10
java Map  (0) 2024.09.10
java Set  (0) 2024.09.10
java ArrayList, LinkedList, List 차이점  (1) 2024.09.10