백앤드 개발일지/웹, 백앤드

[디자인 패턴] MVC MVP MVVM 싱글톤 프록시 패턴들

giron 2021. 12. 28. 18:04
728x90

MVC 패턴

Model + View + Controller

가장 흔하고 알려져 있는 패턴이다.

Model : 데이터와 데이터를 처리하는 부분

View : UI

Controller : 사용자의 입력(Action)을 받고 처리하는 부분

MVC 패턴의 동작 순서

MVC 패턴

  1. 모든 Input은 Controller로 전달됩니다.
  2. Controller는 Input을 확인하고 Model을 업데이트합니다.
  3. 업데이트 결과에 따라 View를 선택합니다.(하나의 Controller는 View를 선택할 수 있기 때문에 1:n 관계로, 여러 개의 View를 관리할 수 있습니다.)
  4. Controller는 Model을 나타내 줄 View를 선택만 할 뿐, 직접 업데이트하지는 않습니다.(View는 Controller를 알지 못합니다.)
  5. View는 Model을 이용하여 화면을 나타냅니다. View를 업데이트하는 방법들은 아래와 같습니다.
    1. View가 Model을 직접 이용하여 업데이트
    2. Model에서 View에게 Notify하여 업데이트
    3. View가 Polling하여 Model의 변화를 감지하여 업데이트

 

이때, Controller는 View를 선택만 하고 업데이트를 시켜주지 않기 때문에 View는 Model을 이용하여 업데이트하게 된다.

View가 업데이트 하는 방법으로는

  1. Model을 직접 사용한다.
  2. Model에서 VIew에게 Notify 해준다.
  3. View에서 Polling을 통해 Model의 변화를 알아채 업데이트한다.

MVC 패턴의 특징.

  • Controller와 View는 1:1 관계가 아닌 1:N 관계로, Controller가 여러 개의 View를 선택하여 Model을 나타낼 수 있다.
  • View와 Model 서로 간의의존성이 높다는 단점이 있다.

따라서, View와 Model 간의 의존성을 최대한 낮게 설계한 경우 좋은 MVC 패턴이라 할 수 있다.

MVC 패턴 정리

우아한 테코톡 - 제리

 

MVP 패턴

Model + View + Presenter

Model, View는 MVC와 동일

Presenter : View에서 요청한 정보를 Model로부터 가공하여 View로 전달한다. Model과 View의 다리 같은 역할.

MVP 패턴의 동작 순서

MVP 패턴

  1. 사용자의 Action을 View로 받는다.
  2. View에서 받은 이벤트를 Presenter에게 전달한다.
  3. Presenter에서 Model로 데이터를 요청한다.
  4. Model에서 Presenter로 요청에 따른 응답을 한다.
  5. Presenter에서 결과를 바인딩하여 View로 통보한다.
  6. 받은 정보를 토대로 View를 업데이트한다.

MVP 패턴의 특징

  • Presenter를 통해 Model과 View를 완벽히 분리해 주기 때문에, MVC 패턴에 있던 Model과 View 사이의 의존성을 해결하였다.
  • Presenter와 View는 1:1 관계이기 때문에 View와 Presenter 사이의 의존성이 매우 강하다.

즉, 기존의 MVC 패턴에서 문제가 되던 의존성을 없애고 새로운 의존성이 생겼다.

 

 

MVVM 패턴

Model + View + View Model

 

Model, View는 MVC와 동일

View Model : View를 나타내기 위한 Model. View 보다는 Model과 유사하게 디자인되며, View에 나타내기 위한 데이터를 처리한다.

command 패턴?

커맨드 패턴은 객체의 행위( 메서드 )를 클래스로 만들어 캡슐화 하는 패턴이다.

 

즉, 어떤 객체(A)에서 다른 객체(B)의 메서드를 실행하려면 그 객체(B)를 참조하고 있어야 하는 의존성이 발생한다.

하지만 커맨드 패턴을 적용하면 의존성을 제거할 수 있습니다.

 

MVVM 패턴의 동작 순서

  1. View에 사용자의 Action을 받는다.
  2. Command 패턴을 사용해 View Model에 이벤트를 전달한다.
  3. View Model은 필요한 데이터를 Model에 요청한다.
  4. Model은 View Model의 요청에 의해 필요한 데이터를 응답한다.
  5. View Model은 응답받은 데이터를 가공해서 저장한다.
  6. View는 View Model과 Data Binding 하여 화면을 갱신한다.

MVVM 패턴의 특징

  • Command 패턴과 Data Binding을 사용한다.
  • 위의 두 개를 사용함으로써 View Model과 View 사이의 의존성을 완벽히 없앴다.
  • View Model과 View는 1:N 관계이다.
  • MVC, MVP 패턴에 비해 설계가 어렵다.

 

싱글톤 패턴

최초 한 번만 메모리를 할당하고 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴.

싱글톤 패턴을 사용하는 이유

  • 고정된 메모리 영역을 얻어 사용하며, 최초의 한번만 인스턴스를 만들어 사용하기 때문에 메모리 낭비를 방지.
  • Static으로 인스턴스를 생성하기 때문에 어디에서든 참조할 수 있어 데이터 공유가 편리하다.

싱글톤 패턴의 문제점

  • 싱글톤 인스턴스를 사용하는 다른 객체 간의 결합도가 높아져 객체 지향 설계 원칙에 어긋나게 된다.
  • 멀티 쓰레드 환경에서 동기화 처리 등의 문제가 발생할 가능성이 있다.

멀티 쓰레드 환경에서는 경합 상태가 발생할 수 있다.

경합 상태란 동일한 자원을 2개 이상의 스레드가 동시에 이용하려고 경합하는 상태이다.

이때, 인스턴스가 1개 이상 생성되는 경우가 발생할 수 있다.

  1. A 스레드가 인스턴스의 존재 여부를 체크한다.
  2. A 스레드가 인스턴스를 생성하기 전에 B 스레드가 인스턴스의 존재 여부를 체크한다.
  3. A 스레드는 체크 결과 인스턴스가 존재하지 않음을 확인하여 인스턴스를 생성한다.
  4. B 스레드 또한 존재하지 않음을 확인하여 인스턴스를 생성한다.
  5. 2개의 인스턴스가 생성된다.

싱글톤 패턴 예시

public class Singleton {
	//static으로 선언하여 공유 메모리 성질을 갖게된다.
    private static Singleton instance = new Singleton();
    
    private Singleton() {
        // 생성자는 외부에서 호출하지 못하도록 private 으로 지정해야 한다.
    }

    public static Singleton getInstance() {
        return instance;
    }

    public void say() {
        System.out.println("hi, there");
    }
}

 

프록시 패턴

프록시 객체는 원래 객체를 감싸고 있는 객체이다. 원래 객체와 타입은 동일하다.

프록시 객체가 원래 객체를 감싸서 client의 요청을 처리하게 하는 패턴이다.

간단히, 기존 코드를 건들지 않고 부가 기능을 추가할 수 있다.

프록시 패턴 사용하는 이유

  1. 프록시 패턴을 쓰는 이유는 접근을 제어하고 싶거나, 부가 기능을 추가하고 싶을 때 사용한다.
  2. 결합도를 낮출수 있다. (부가 기능까지 덕지덕지 안 붙일 수 있으므로)
  3. 따라서 의존성을 낮출 수가 있다.

대표적으로 AOP가 있다.

프록시 패턴 예시

public interface BookService {
    void rent(Book book);
}

/* 프록시 */
public class BookServiceProxy implements BookService {

    // 프록시는 리얼 서브젝트를 가지고 있어야 한다.
    private final RealBookService realBookService;
	// 생성자 주입
    public BookServiceProxy(RealBookService realBookService) {
        this.realBookService = realBookService;
    }

    // 프록시에서 부가기능을 추가
    @Override
    public void rent(Book book) {
        System.out.println("트랜잭션 처리");
        realBookService.rent(book); // 프록시 -> 리얼 서브젝트
        System.out.println("로깅");
    }
}

/* 리얼 서브젝트 역할 */
@Service
public class RealBookService implements BookService {

    /*
     rent(): 책을 빌리는(핵심 기능) 메소드
     책을 빌리기 전 후 트랜잭션 & 로깅(부가 기능) 추가
    */
    public void rent(Book book) {
        System.out.println("rent: " + book.getTitle());
    }
}

/* 클라이언트 */
public class Client {
    public static void main(String[] args) {
        BookService bookService = new BookServiceProxy(new RealBookService());
        bookService.rent(new Book());
    }
}

 

Reference

 

Spring AOP - (1) 프록시 패턴, 데코레이터 패턴

📎 글또 6기 포스팅 1. 미치도록 더웠던 7월의 회고 2. 사용자가 게시물을 작성할 때의 트랜잭션 처리 3. Spring AOP - (1) 프록시 패턴, 데코레이터 패턴 4. [MySQL] - 트랜잭션의 격리 수준(Isolati

zzang9ha.tistory.com

 

싱글톤(Singleton) 패턴이란?

이번 글에서는 디자인 패턴의 종류 중 하나인 싱글톤 패턴에 대해 알아보자. 싱글톤 패턴이 무엇인지, 패턴 구현 시 주의할 점은 무엇인지에 대해 알아보는 것만으로도 많은 도움이 될 것이라

tecoble.techcourse.co.kr

  • https://www.youtube.com/watch?v=ogaXW6KPc8I&list=PLgXGHBqgT2TvpJ_p9L_yZKPifgdBOzdVH&index=86
728x90