java - MVC 패 턴 Model View Controller

imjingu·2023년 8월 30일
0

개발공부

목록 보기
435/481

디자인 패턴의 일종으로 전체 프로그램의 구조와 관련된 디자인 패턴.
어느 정도 규모가 있는 프로그램을 만들어 나갈 때는 프로그램을 독립적인 부분으로 나누고, 이 부분들을 느슨하게 연결하는 구조화 작업을 병행해야함.
애플리케이션의 내부 데이터를 사용자에게 표시하는 정보와 분리.
애플리케이션의 구성요소를 세 가지 역할로 구분하여서 개발 프로세스에서 각각의 구성 요소에만 집중해서 개발할 수 있음.
재사용성과 확장성이 용이하다는 장점이 있어, 애플리케이션이 복잡해질수록 모델과 뷰의 관계가 복잡해지는 단점.

다음의 세 부분으로 나누어 만듬.

  • 모델 Model
    애플리케이션의 데이터인 데이터베이스, 상수, 변수를 뜻함.
    뷰에서 데이터를 생성하거나 수정하면 컨트롤러를 통해 모델을 생성하거나 갱신.
    응용 프로그램의 데이터와 그것을 처리하는 로직을 담당하는 부분.
    데이터 혹은 데이터를 처리하는 영역을 의미.
package chapter20230830.MVC;

public class Member {
	/*
	 모델 클래스 : 데이터 용도로 사용
	 데이터(필드) 위주의 클래스라서, 메서드의 경우 getter, setter, 생성자, toString 정도만 구현
	 */
	String memberId;
	String passwd;
	String name;
	
	
	public Member(String memberId, String passwd, String name) {
		this.memberId = memberId;
		this.passwd = passwd;
		this.name = name;
	}

	public String getMemberId() {
		return memberId;
	}

	public void setMemberId(String memberId) {
		this.memberId = memberId;
	}

	public String getPasswd() {
		return passwd;
	}

	public void setPasswd(String passwd) {
		this.passwd = passwd;
	}

	public String getName() {
		return name;
	}

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

}
  • 뷰 View
    input, checkbox, textarea 등 사용자 인터페이스 요소.
    즉 모델을 기반으로 사용자가 볼 수 있는 화면을 뜻함.
    모델이 가지고 있는 정보를 따로 저장하지 않아야 하면 단순히 화면에 표시하는 정보만 가지고 있어야 함.
    또한 변경이 일어나면 컨트롤러에 이를 전달.
    모델의 데이터나 데이터의 처리 결과를 사용자가 볼 수 있는 형태로 표현하는 부분 결과 화면을 만들어 내는 데 사용하는 자원을 의미.
package chapter20230830.MVC;
import java.util.*;
/*
 뷰 view
 사용자 인터페이스 요소
 즉 모델을 기반으로 사용자가 볼 수 있는 화면을 뜻함
 단순히 화면에 표시하는 정보만 가지고 있어야 함
 또한 변경이 일어나면 컨트롤러에 이를 전달
 모델의 데이터나 데이터의 처리 결과를 사용자가 볼 수 있는 형태로 표현하는 부분
 */
public class MemberView {

	public static void main(String[] args) {
		MemberController controller = new MemberController();
		Scanner stdIn = new Scanner(System.in);
		
		while(true) {
			printMenu();
			controller.printLoginState();
			System.out.print("선택 : ");
			int choice = stdIn.nextInt();
			switch(choice) {
				case 1:
					controller.addMember();
					break;
				case 2:
					controller.logIn();
					break;
				case 3:
					controller.logOut();
					break;
				case 4:
					System.out.println("종료합니다.");
					stdIn.close();
					break;
				case 5:
					System.out.println("잘못누르셨습니다. \n다시 선택해주세요.");
					break;
			}
		}
	}
	public static void printMenu() {
		System.out.println("====================Menu================");
		System.out.println("1. 회원가입");
		System.out.println("2. 로그인");
		System.out.println("3. 로그아웃");
		System.out.println("4. 종료");
		System.out.println();
	}

}
  • 컨트롤러 Controller
    하나 이상의 모델과 하나 이상의 뷰를 잇는 다리 역할을 하며 이벤트 등 메인로직을 담당.
    또한 모델과 뷰의 생명주기도 관리하며, 모델이나 뷰의 변경 통지를 받으면 이를 해석하여 각각의 구성 요소에 해당 내용에 대해 알려줌.
    사용자로 부터 입력받은 데이터를 모델에 메시지로 전달해서 프로그램을 제어하는 부분.
    요청(request)을 처리하는 존재로 뷰와 모델 사이의 중간 통신 역할.
    컨트롤러는 모델 계층과 연동해서 필요한 데이터를 처리하고, 결과를 뷰로 전송.
package chapter20230830.MVC;

import java.util.Scanner;

public class MemberController {
    private Member member;
    private boolean isLogIn = false; // 로그인 상태인지
    private Scanner scanner = new Scanner(System.in);

    public void addMember() {
    	/* 회원 가입 */
    	String memberId;
    	String name;
    	String passwd;
    	
    	System.out.println("<<회원 가입>>");
    	System.out.print("아이디를 입력해 주세요. : ");
    	memberId = scanner.nextLine();
    	System.out.print("비밀번호를 입력해 주세요. : ");
    	passwd = scanner.nextLine();
    	System.out.print("이름을 입력해 주세요. : ");
    	name = scanner.nextLine();
    	
    	member = new Member(memberId, passwd, name);
 
    }

    public void logIn() {
    	/* 로그인 */
    	if (isLogIn) {
    		System.out.println("로그인 상태입니다. 로그아웃 후에 사용해 주십시오.");
    		return;
    	}
    	String memberId;
    	String passwd;
    	boolean isFlag = false;
    	
    	System.out.println("<<로그인>>");
    	System.out.print("아이디를 입력해 주세요. : ");
    	memberId = scanner.nextLine();
    	System.out.print("비밀번호를 입력해 주세요. : ");
    	passwd = scanner.nextLine();
    	
    	
    	isFlag = isMemeber(memberId, passwd);
    	if(isFlag) {
    		isLogIn = true;
    		System.out.println("로그인 되었습니다.");
    	}
    	else {
    		System.out.println("해당하는 회원 정보가 없습니다.");
    	}
    }

    private boolean isMemeber(String memberId, String passwd) {
        /* 로그인 처리 */
        boolean isFlag = false;
        if(member.getMemberId().equals(memberId) && member.getPasswd().equals(passwd)) {
        	isFlag = true;
        }
        return isFlag;
    }

    public void logOut() {
    	/* 로그아웃 */
    	isLogIn = false;
    	System.out.println("로그아웃 되었습니다.");
    }

    public void printLoginState() {
    	/* 로그인인지 로그아웃인지 보여줌 */
    	if (isLogIn) {
    		System.out.println(member.getMemberId() + " 아이디로 로그인 상태입니다.");
    	}
    	else {
    		System.out.println("로그인 상태가 아닙니다.");
    	}
    }
}

MVC 모델은 구현하는 방법은 다양하지만 제어흐름에는 전형적인 패턴이 있음
1) 사용자 입력을 컨트롤러가 받는다.
2) 컨트롤러는 모델의 메서드를 사용한다.
3) 모델의 메서드는 모델이 가진 상태를 바꾼다.
4) 모델은 상태의 변화를 뷰에 보고하고 뷰는 모델의 상태에 따라 표시 내용을 갱신한다.

이 흐름 속에서 컨트롤러는 모델과 뷰의 참조를 가지고 있으며 모델과 뷰를 갱신하고 제어할 수 있음.
또한 모델과 뷰는 가능한 한 독립적으로 설계해서 서로 느슨하게 결합하도록 만듬.
각 부분이 느슨하게 결합하면 각 부분을 독립적으로 유지 보수할 수 있어 기능 확장이 수월해 짐.

0개의 댓글