본문 바로가기
프로그래밍/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. 프로그램 종료

 

마치며...

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

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

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