본문 바로가기
프로그래밍/Java

[Java] MVC 패턴의 이해

by 코딩중독 2023. 11. 17.

목차

    MVC 패턴이란?

    유지보수에 용이하고 가독성이 좋은 디자인 패턴중의 하나로써 Model-View-Controller 의 약어이다.

    화면과 데이터 처리의 종속성을 줄이고 각자의 역할을 명확하게 한다.

     

    다음 예제를 통해 MVC패턴에 대해 자세히 알아보도록 한다.

    예제는 고객정보관리시스템으로 진행한다.

     

    Model

    모델(Model)은 데이터 처리를 담당

    public class Customer {
        private String name;
        private int age;
        private String phoneNumber;
        private String address;
    
        public Customer() {
        }
    
        public Customer(String name, int age, String phoneNumber, String address) {
            this.name = name;
            this.age = age;
            this.phoneNumber = phoneNumber;
            this.address = address;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        public String getPhoneNumber() {
            return phoneNumber;
        }
    
        public void setPhoneNumber(String phoneNumber) {
            this.phoneNumber = phoneNumber;
        }
    
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    
        @Override
        public String toString() {
            return "Customer{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", phoneNumber='" + phoneNumber + '\'' +
                    ", address='" + address + '\'' +
                    '}';
        }
    }

     

    • 고객의 이름, 나이, 연락처, 주소를 받는 4개의 변수 생성
    • 생성자 2개 생성(기본생성자와 변수 4종을 파라미터로 받는 생성자 오버로딩)
    • 데이터 처리를 위한 Getter/Setter
    • 데이터 확인을 위한 toString 메서드 재정의(Override)

     

    View

    Controller에서 전달된 데이터를 출력하여 사용자에서 보여지는 화면(User Interface)

    public class ConsoleView {
        private Scanner scanner = new Scanner(System.in);
    
        public String getPhoneNumber() {
            System.out.print("연락처를 입력하세요: ");
            return scanner.nextLine();
        }
    
        public Customer getCustomerInfo() {
            System.out.println("신규 고객 정보를 입력하세요.");
            System.out.print("이름: ");
            String name = scanner.nextLine();
            System.out.print("나이: ");
            int age = scanner.nextInt();
            scanner.nextLine();
            System.out.print("연락처: ");
            String phoneNumber = scanner.nextLine();
            System.out.print("주소: ");
            String address = scanner.nextLine();
            return new Customer(name, age, phoneNumber, address);
        }
    
        public void printMessage(String message) {
            System.out.println(message);
        }
    }

     

    • 고객의 유니크키로 사용할 연락처를 입력 받을 getPhoneNumber() 메서드
    • 신규 고객의 정보를 입력 받을 getCustomerInfo() 메서드
    • 화면에 출력해 줄 printMessage() 메서드

    Controller

    작업을 수행하기 위해 사용자에게 입력(요청)받은 내용을 전달하는 역할

    public class CustomerController {
        private List<Customer> customers;
    
        public CustomerController() {
            this.customers = new ArrayList<>();
        }
    
        public void addCustomer(Customer customer) {
            customers.add(customer);
        }
    
        public void removeCustomer(String phoneNumber) {
            for (int i = 0; i < customers.size(); i++) {
                if (customers.get(i).getPhoneNumber().equals(phoneNumber)) {
                    customers.remove(i);
                    break;
                }
            }
        }
    
        public Customer findCustomer(String phoneNumber) {
            for (Customer customer : customers) {
                if (customer.getPhoneNumber().equals(phoneNumber)) {
                    return customer;
                }
            }
            return null;
        }
    
        public boolean isCustomerExist(String phoneNumber) {
            for (Customer customer : customers) {
                if (customer.getPhoneNumber().equals(phoneNumber)) {
                    return true;
                }
            }
            return false;
        }
    }

     

    • CustomerController의 생성자에서 고객의 명단을 비어있는 리스트로 초기화
    • 고객 명단에 입력받은 고객의 정보를 추가하는 addCustomer() 메서드
    • 고객의 유니크키인 연락처를 입력받아 고객 명단에 있는지 확인한 후 삭제하는 removeCustomer() 메서드
    • 고객의 유니크키인 연락처를 입력받아 고객 정보를 조회하는 findCustomer() 메서드
    • 고객의 유니크키인 연락처를 입력받아  이미 저장된 고객인지를 체크하는 isCustomerExist() 메서드

     

    실행(Run)

    public class CustomerMain {
        public static void main(String[] args) {
            CustomerController customerController = new CustomerController();
            ConsoleView view = new ConsoleView();
            while (true) {
                System.out.println("=====고객 정보 관리 시스템=====");
                System.out.println("1. 고객 정보 저장");
                System.out.println("2. 고객 정보 조회");
                System.out.println("3. 고객 정보 삭제");
                System.out.println("4. 종료");
                System.out.print("원하는 기능을 선택하세요: ");
    
                Scanner scanner = new Scanner(System.in);
                int choice = scanner.nextInt();
                switch (choice) {
                    case 1:
                        Customer newCustomer = view.getCustomerInfo();  // 고객 정보를 입력
                        String phoneNumber = newCustomer.getPhoneNumber();  // 중복체크를 위한 연락처 변수
                        if (customerController.isCustomerExist(phoneNumber)) {
                            view.printMessage("이미 등록된 고객입니다.");
                            continue;
                        }
                        customerController.addCustomer(newCustomer);
                        view.printMessage("고객 정보가 저장 되었습니다.");
                        break;
                    case 2:
                        phoneNumber = view.getPhoneNumber();
                        Customer customer = customerController.findCustomer(phoneNumber);
                        if (customer == null) {
                            view.printMessage("일치하는 고객 정보가 없습니다.");
                            break;
                        }
                        view.printMessage(customer.toString());
                        break;
                    case 3:
                        phoneNumber = view.getPhoneNumber();
                        customer = customerController.findCustomer(phoneNumber);
                        if (customer == null) {
                            view.printMessage("일치하는 고객 정보가 없습니다.");
                            break;
                        }
                        customerController.removeCustomer(phoneNumber);
                        view.printMessage("고객 정보가 삭제 되었습니다.");
                        break;
                    case 4:
                        System.out.println("종료합니다.");
                        return;
                    default:
                        System.out.println("잘못된 선택입니다.");
                        break;
                }
            }
        }
    }

     

    • 고객 정보를 입력받아 저장, 조회, 삭제 하는 기능을 가진 프로그램
    1. 고객 정보 저장 : 이름, 나이, 연락처, 주소를 입력받는다. 연락처를 이용하여 중복체크를 한 후 없다면 등록, 있다면 메시지를 보내고 처음으로 돌아간다.
    2. 고객 정보 조회 : 연락처를 입력받아 저장된 고객 명단에서 확인 후 있다면 정보를 출력, 없다면 처음으로 돌아간다.
    3. 고객 정보 삭제 : 연락처를 입력받아 저장된 고객 명단에 있다면 삭제, 없다면 처음으로 돌아간다.
    4. 프로그램 종료

     

    마치며...

    뷰와 컨트롤러와 모델의 종속성의 최대한 줄이기 위한 코딩을 했다.

    간단한 프로그램을 구현함에 있어서도 각 구성요소의 역할을 구분하는게 여간 복잡한게 아니다.

    무작정 코딩보다는 제대로 된 모델링과 각 구성요소의 기능정리를 한 후 진행한다면 조금 더 매끄러운 코딩을 진행할 수 있을것이다.