Java - 9. MVC모델과 싱글톤패턴

갓김치·2020년 10월 5일
2

고급자바

목록 보기
28/47
post-custom-banner

MVC 모델

  • 소프트웨어 설계에서 세 가지 구성 요소인 모델(Model), 뷰(View), 컨트롤러(Controller)를 이용한 설계 방식

구성요소

Model 모델

  • 소프트웨어 내 데이터
  • The model represents data and the rules that govern access to and updates of this data. In enterprise software, a model often serves as a software approximation of a real-world process. (Oracle)
    • 데이터 및 데이터 접근과 업데이트에 관한 규칙을 나타냄
    • 기업형 소프트웨어에서 주로 현실에서의 과정을 소프트웨어적으로 비슷하게 풀어낸 것
  • Model represents an object or JAVA POJO carrying data. It can also have logic to update controller if its data changes. (tutorialspoint)
    • 객체 즉 데이터를 갖고 있는 POJO(Plain Old Java Object, 오래된 방식의 간단한 자바 오브젝트. 비종속적)를 나타냄
    • 데이터가 바뀌면 컨트롤러를 업데이트할 수 있는 로직을 가지고 있음.

View 뷰

  • 사용자에게 보이는 화면 내용=UI
  • The view renders the contents of a model. It specifies exactly how the model data should be presented. If the model data changes, the view must update its presentation as needed. This can be achieved by using a push model, in which the view registers itself with the model for change notifications, or a pull model, in which the view is responsible for calling the model when it needs to retrieve the most current data. (Oracle)
    • 모델의 컨텐츠를 보여주는 역할.
    • 모델의 데이터가 바뀌면 뷰의 모습도 함께 바뀌어야함
    • push model, pull model?
  • View represents the visualization of the data that model contains. (tutorialspoint)
    • 모델이 가진 데이터를 시각적으로 보여주는 역할

Controller 컨트롤러

  • 모델과 뷰의 상호 작용을 관리
  • The controller translates the user's interactions with the view into actions that the model will perform. In a stand-alone GUI client, user interactions could be button clicks or menu selections, whereas in an enterprise web application, they appear as GET and POST HTTP requests. Depending on the context, a controller may also select a new view -- for example, a web page of results -- to present back to the user. (Oracle)
    • 독립적 GUI 클라이언트: 버튼을 클릭하거나 메뉴를 고르는 것
    • 기업형 웹 어플리케이션: GET, POST HTTP 리퀘스트
    • 상황에 따라 컨트롤러는 새로운 뷰를 만들 수 있다
  • Controller acts on both model and view. It controls the data flow into model object and updates the view whenever data changes. It keeps view and model separate. (tutorialspoint)
    • 컨트롤러는 모델과 뷰에서 작동할 수 있다.

순서

  • 사용자의 입력이 컨트롤러로 들어옴
  • 컨트롤러는 모델에서 데이터를 불러옴
  • 해당 데이터를 뷰를 통해 화면으로 출력함

특징

  • 모델, 뷰, 컨트롤러가 기능별로 독립적으로 분리
    • 여러 명의 개발자가 동시에 각각의 기능 개발 가능
    • 일부 기능이 추가될 경우도 기존의 구성요소를 재사용 가능 (코드 재사용성 향상)

예시

  • 웹 애플리케이션에 쉽게 적용할 수 있는 라이브러리 예시
    • AngularJS (앵귤러자바스크립트)
    • EmberJS (엠버자바스크립트)
    • JavaScriptMVC
    • BackboneJS

변형 형태

  • MVC 유형에서 뷰와 모델은 정확히 분리되지만, 컨트롤러가 뷰의 구성에 상당 부분 관여하는 경우가 있어 각각의 독립성이 다소 떨어지는 문제가 발생할 수 있다.
  • 이를 해결하기 위해 MVP와 MVVM 등장!

MVP (Model-View-Presenter)

  • 컨트롤러의 뷰 구성기능은 모두 뷰 자체에 맡기고 프리젠터(presenter)가 모델과 뷰 사이의 인터페이스 역할만을 하도록 하는 것

MVVM (Model-View-ViewModel)

  • 데이터 바인딩 기반으로 뷰가 뷰모델과 인터페이스하도록 제한을 두는 것

구현

1단계: Create Model.

Student.java

public class Student {
   private String rollNo; //학번
   private String name; //이름
   
   //getter, setter
   public String getRollNo() {
      return rollNo;
   }
   
   public void setRollNo(String rollNo) {
      this.rollNo = rollNo;
   }
   
   public String getName() {
      return name;
   }
   
   public void setName(String name) {
      this.name = name;
   }
}

2단계: Create View.

StudentView.java

public class StudentView {
   public void printStudentDetails(String studentName, String studentRollNo){
      System.out.println("Student: ");
      System.out.println("Name: " + studentName);
      System.out.println("Roll No: " + studentRollNo);
   }
}

3단계: Create Controller.

StudentController.java

public class StudentController {
   private Student model; //모델
   private StudentView view; //뷰

   //생성자
   public StudentController(Student model, StudentView view){
      this.model = model;
      this.view = view;
   }

   //getter, setter: 모델의 데이터를 get,set
   public void setStudentName(String name){
      model.setName(name);		
   }

   public String getStudentName(){
      return model.getName();		
   }

   public void setStudentRollNo(String rollNo){
      model.setRollNo(rollNo);		
   }

   public String getStudentRollNo(){
      return model.getRollNo();		
   }

   public void updateView(){ // view를 업데이트
      view.printStudentDetails(model.getName(), model.getRollNo());
   }	
}

4단계: Use the StudentController methods to demonstrate MVC design pattern usage.

MVCPatternDemo.java

public class MVCPatternDemo {
   public static void main(String[] args) {

      //fetch student record based on his rollno from the database
      //db에서 학생정보 불러오기
      Student model  = retriveStudentFromDatabase();

      //Create a view : to write student details on console
      //콘솔에 출력하기 위해 뷰 생성
      StudentView view = new StudentView();
      
      //위에서 만든 모델과 뷰를 매개변수로 받아 컨트롤러 객체 생성
      StudentController controller = new StudentController(model, view);
      
      //컨트롤러 메서드로 뷰 내용 업데이트
      controller.updateView();

      //update model data
      //모델 데이터 업데이트
      controller.setStudentName("John");

      controller.updateView();
   }

   private static Student retriveStudentFromDatabase(){
      Student student = new Student();
      student.setName("Robert");
      student.setRollNo("10");
      return student;
   }
}

5단계: Verity the output.

  • 이렇게 출력될 것임

MVC 설명 출처

싱글톤 패턴

  • Singleton
    • 정확히 하나의 요소만 갖는 집합
    • 단독 개체, 독신자
  • Singleton Pattern
    • 객체의 생성과 관련된 패턴
    • 특정 클래스의 객체가 오직 한 개만 존재하도록 보장
    • 클래스의 객체를 하나로 제한
    • one of the simplest design patterns in Java
    • comes under creational pattern as this pattern provides one of the best ways to create an object
    • involves a single class which is resposible to create an object while making sure that only single object gets created.
      • This class provides a way to access its only object which can be accessed directly without need to instantiate the object of the class. (이 클래스는 인스턴스화를 하지않고도 객체에 접근할 수 있는 경로를 제공해준다.)

예시

  • 프린터 드라이버
    • 여러 컴퓨터에서 프린터 한대를 공유하는 경우
    • 하나를 끝내고 다음 작업을 하는 것이 아닌 동시에 섞여 나오면 안될 것임.
    • Singleton 패턴: 여러 클라이언트(컴퓨터)가 동일 객체(공유 프린터)를 사용하지만 한 개의 객체(프린트 명령을 받은 출력물)가 유일하도록 상위 객체가 보장하도록 하는 것
    • 동일한 자원이나 데이터를 처리하는 객체가 불필요하게 여러 개 만들어질 필요가 없는 경우에 주로 사용

구현

1단계: Create a Singleton Class.

SingleObject.java

public class SingleObject {

   //create an object of SingleObject
   //객체 생성, 접근제어자: private
   private static SingleObject instance = new SingleObject();

   //make the constructor private so that this class cannot be
   //instantiated
   //생성자 접근제어자: private -> 객체생성될 수 없도록
   private SingleObject(){}

   //Get the only object available
   //미리 만들어 놓은 object를 반환하는 getter
   public static SingleObject getInstance(){
      return instance;
   }

   public void showMessage(){
      System.out.println("Hello World!");
   }
}

2단계: Get the only object from the singleton class.

SingletonPatternDemo.java

public class SingletonPatternDemo {
   public static void main(String[] args) {

      //illegal construct
      //Compile Time Error: The constructor SingleObject() is not visible
      //SingleObject object = new SingleObject();
      //접근제어자 private인 생성자를 이용해 객체를 생성하려고 하니 컴파일 오류가 뜸
      
      //Get the only object available
      //getter를 이용해 객체 얻어오기 (getter의 접근제어자는 public이고 static이어야 객체생성없이 쓸수있다)
      SingleObject object = SingleObject.getInstance();

      //show the message
      //인스턴스 메서드 호출하기
      object.showMessage();
   }
}

3단계: Verify the output.

  • Hello World! 라고 출력창에 뜰 것임

싱글톤패턴 설명 출처

profile
갈 길이 멀다
post-custom-banner

0개의 댓글