YTCW
java MVC 패턴 본문
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 |