목차
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;
}
}
}
}
- 고객 정보를 입력받아 저장, 조회, 삭제 하는 기능을 가진 프로그램
- 고객 정보 저장 : 이름, 나이, 연락처, 주소를 입력받는다. 연락처를 이용하여 중복체크를 한 후 없다면 등록, 있다면 메시지를 보내고 처음으로 돌아간다.
- 고객 정보 조회 : 연락처를 입력받아 저장된 고객 명단에서 확인 후 있다면 정보를 출력, 없다면 처음으로 돌아간다.
- 고객 정보 삭제 : 연락처를 입력받아 저장된 고객 명단에 있다면 삭제, 없다면 처음으로 돌아간다.
- 프로그램 종료
마치며...
뷰와 컨트롤러와 모델의 종속성의 최대한 줄이기 위한 코딩을 했다.
간단한 프로그램을 구현함에 있어서도 각 구성요소의 역할을 구분하는게 여간 복잡한게 아니다.
무작정 코딩보다는 제대로 된 모델링과 각 구성요소의 기능정리를 한 후 진행한다면 조금 더 매끄러운 코딩을 진행할 수 있을것이다.
'프로그래밍 > Java' 카테고리의 다른 글
[Java] 날씨 정보 가져오기(위도/경도 포함) (0) | 2023.12.20 |
---|---|
[Java] 엑셀(Excel) 파일 읽기 (Feat.poi) (2) | 2023.11.19 |
[Java] 다형성의 이해와 활용 (0) | 2023.11.15 |
[Java] 추상클래스(abstract)와 인터페이스(interface) (0) | 2023.11.14 |