Java - MVC 패턴 적용해보기

Gloomy·2024년 3월 27일
0

이전 글에서 언급했던 제리님의 테코톡 영상을 참고해서 김영한님 자바 입문 강의에 있는 2차원 배열 문제와 풀이 3번 상품 관리 프로그램을 간략하게 구현해 보았다. 사실 Java를 이용한 프로그래밍 자체가 거의 처음인 수준이다 보니 제대로 이해했는지, 규칙에 맞게 구현했는지 스스로 판단할 수준이 되지 못해서 평가 자체가 어렵다.

문제 자체는 이렇다.



[출처: 김영한의 자바 입문 - 코드로 시작하는 자바 첫걸음]

강의에서는 기본적으로 배열 2개와 조건문, 반복문만을 이용해서 간단하게 구현한다. 그런데 문득 이 문제를 보는 순간 이전 글의 MVC 패턴이 생각났고, 해당 방법으로 구현해 보자는 생각이 들었다. 나는 프로그래밍 언어를 새로 배울 때 스스로 이것저것 만들어 보는 것이 가장 중요하다고 생각하는 사람이라 마음이 더 동했던 것 같다.

첫 번째로 구현한 부분은 Model이다. 이 프로그램은 말 그대로 상품 관리 프로그램이기 때문에 Model은 상품의 정보를 담고 있는 클래스여야한다고 생각했다. 따라서 다음과 같이 구현했다.

package product;

public class Product {
    private String name;
    private int price;

    public Product(String name, int price) {
        this.name = name;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public int getPrice() {
        return price;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setPrice(int price) {
        this.price = price;
    }
}

MVC 패턴의 1규칙인 'ModelControllerView에 의존하지 않아야 한다. 즉, Model내부에 ControllerView에 관련된 코드가 있으면 안 된다.'를 생각하며 작성한 코드이다.

다음은 View부분이다.

package product;

public class OutputView {
    public static void printProduct(Product product) {
        System.out.println(product.getName() + ": " + product.getPrice() + "원");
    }

    public static void printMenu() {
        System.out.println("1. 상품 등록 | 2. 상품 목록 | 3. 종료");
        System.out.print("메뉴를 선택하세요: ");
    }

    public static void printExit() {
        System.out.println("프로그램을 종료합니다.");
    }

    public static void printNoMoreProducts() {
        System.out.println("더 이상 상품을 등록할 수 없습니다.");
    }

    public static void printInputName() {
        System.out.print("상품 이름을 입력하세요: ");
    }

    public static void printInputPrice() {
        System.out.print("상품 가격을 입력하세요: ");
    }

    public static void printNoProducts() {
        System.out.println("등록된 상품이 없습니다.");
    }
}

ViewController에 의존하면 안 되기 때문에 Controller로부터 상품 정보를 넘겨받아 출력하는 부분과 기타 출력 부분을 구현하였다.

마지막으로 Controller부분이다.

package product;

import java.util.Scanner;

public class Controller {

    public static void main(String[] args) {
        Product[] products = new Product[10];
        Scanner scanner = new Scanner(System.in);
        // 상품 재고
        int inventory = 0;

        while (true) {
            int menu;

            OutputView.printMenu();
            menu = scanner.nextInt();
            if (menu == 3) { // 프로그램 종료
                OutputView.printExit();
                break;
            } else if (menu == 1) { // 상품 등록
                if (inventory == 10) { // 상품믈 더 이상 등록할 수 없는 경우
                    OutputView.printNoMoreProducts();
                } else {
                    OutputView.printInputName();
                    scanner.nextLine();
                    String name = scanner.nextLine();
                    OutputView.printInputPrice();
                    int price = scanner.nextInt();
                    products[inventory] = new Product(name, price);
                    inventory++;
                }
            } else { // 상품 목록
                if (inventory == 0) { // 등록된 상품이 없는 경우
                    OutputView.printNoProducts();
                } else {
                    for (int i = 0; i < inventory; i++) {
                        OutputView.printProduct(products[i]);
                    }
                }
            }
        }
    }
}

사실 규칙에 맞게 제대로 잘 구현했는지는 모르겠다. 하지만 이렇게 일종의 패턴을 지키려고 노력하면서 프로그래밍을 해본 경험은 처음인데 확실히 유지보수를 위해 쓰기 시작했다는 말이 무슨 뜻인지 알 것 같다.

명확하게 기능이 나뉘어있기 때문에 문제가 발생하는 부분을 특정하기도 쉽고 해당 부분만 수정하면 되기 때문이다. main함수의 길이가 너무 긴 것 같아서 나중에는 함수로 따로 빼서 구현해 보려고 한다.

Java자체는 C와 유사한 부분이 초반에는 좀 있어서 기본적인 부분은 빠르게 넘어간 것 같다. 대신, 객체 지향 프로그래밍과 클래스, 상속 등의 부분은 심도 있게 공부하려고 보고 있다.

profile
𝙋𝙤𝙨𝙨𝙤 𝙁𝙖𝙧𝙚!

0개의 댓글