Tiny Star

📚 CS [ComputerScience]

Computer Science - 디자인 패턴

청크 2023. 11. 8. 14:20

디자인 패턴

소프트웨어 개발에서 특정한 문제를 해결하기 위한 구조화된 방법론 또는 설계 템플릿 

 

즉, 프로그램이나 어떤 특정한 것을 개발하는 중에 발생했던 문제점들을 정리해서 상황에 따라 간편하게 적용해서 쓸 수 있는 것을 정리하여

특정한 "규약"을 통해 쉽게 쓸 수 있는 형태로 만든 것

 

-> 반복적으로 발생하는 소프트웨어의 디자인 문제를 해결하기 위한 검증된 솔루션을 제공하고

개발자들 간에 공통된 언어와 접근 방식을 통해 협업을 쉽게 할 수 있음

 

디자인 패턴을 사용하는 이유

디자인 패턴은 다양한 이점을 제공하는데,

 

1. 재사용성 : 이미 검증된 솔루션을 제공하므로 개발자들은 이를 재사용하여 빠르게 프로그래밍이 가능

2. 유지보수성 : 코드가 이미 구조화 되어 있기 때문에 패턴에 따라 코드를 작성하게 되므로 추후 코드의 수정/변경이 용이

3. 코드 가독성 : 일관성 있는 코드로 이해하기 쉽게 구성

4. 좋은 프랙티스 : 소프트웨어 엔지니어링에서의 좋은 프랙티스를 제공하며, 기존의 경험과 지식을 바탕으로 개선된 아키텍처를 구축하는데 도움

 

MVC

소프트웨어를 모델(Model), 뷰(View), 컨트롤러(Controller)로 나누는 아키텍처 패턴

- 모델(Model) : 데이터와 비즈니스 로직을 관리

- 뷰(View) : 사용자 인터페이스 표시

- 컨트롤러(Controller) : 모델-뷰의 상호작용을 조정

 

    ✅ 복잡한 애플리케이션에서는 컨트롤러가 비대해질 수 있고 이로 인하여 유지보수가 어려워 질 수 있음

     순환 종속성(Circular Dependency) 문제가 발생할 수 있음

 

순환 종속성(Circular Dependency)이란?소프트웨어 컴포넌트나 모듈 간에 서로 의존성이 발생하여 서로를 직접 또는 간접적으로 참조하는 상황

 

코드 간 의존성이 높아질수록 많은 문제가 발생

1. 컴파일 오류 : 모듈 간 순환 종속성이 있으면 컴파일 오류가 발생할 수 있음

2. 디버깅 어려움 : 프로그램의 실행 흐름을 이해하는데 어렵기 때문에 디버깅이 어려워짐

3. 모듈 독립성 손실 : 모듈이 서로 독립적으로 재사용 될 수 없기때문에 시스템의 모듈성과 확장성이 모두 손실 될 가능성이 있음

//Model
//Spring 사용 시
@Getter
@Setter
public class Model {
    private String data;

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }
}

// View
public class View {
    public void showData(String data) {
        System.out.println("Data: " + data);
    }
}

// Controller
//Spring 사용 시
@Controller
public class Controller {
    private Model model;
    private View view;

    public Controller(Model model, View view) {
        this.model = model;
        this.view = view;
    }

    public void updateData(String newData) {
        model.setData(newData);
        view.showData(model.getData());
    }
}

 

MVP

MVP 패턴은 MVC와 유사하지만, 뷰(View)와 모델(Model)은 직접 상호 작용하지 않고 프레젠터(Presenter)를 통해 통신하는 아키텍처 패턴

- 모델(Model) : 데이터와 비즈니스 로직을 관리

- 뷰(View) : 사용자 인터페이스 표시 및 이벤트 처리

- 프레젠터(Presenter)  : 뷰와 모델 사이의 중재자 역할을 하며, 뷰와 모델의 완전한 분리를 도움

 

     테스트 용이성이 높아짐

     MVC에 비하여 코드가 더 모듈화 되어있어 유지보수가 용이

     순환 종속성 문제를 해결할 수 있지만 디자인 패턴 자체가 MVC보다 약간 더 복잡함

// Model
public class Model {
    private String data;

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }
}

// View
public interface View {
    void showData(String data);
}

// Presenter
public class Presenter {
    private Model model;
    private View view;

    public Presenter(Model model, View view) {
        this.model = model;
        this.view = view;
    }

    public void updateData(String newData) {
        model.setData(newData);
        view.showData(model.getData());
    }
}

 

 

MVVM

MVVM 패턴은 뷰(View)와 모델(Model) 사이에 뷰 모델(ViewModel)을 사용하여 데이터와 비즈니스 로직을 분리하는 패턴으로

주로 웹 및 모바일 앱 개발에서 사용

- 뷰 모델(ViewModel) : 사용자 인터페이스와 상태 관리를 담당하며, 데이터 바인디을 통해 모델의 변경사항을 자동으로 반영

 

     테스트 용이성이 뛰어남

     복잡한 데이터 바인딩 로직을 구현하기 위한 학습 곡선이 있을 수 있고 일부 작업에서는 오버헤드가 발생 할 가능성이 높음

     기존 애플리케이션에 MVVM을 도입하는데 시간과 비용이 듬

// Model
public class Model {
    private String data;

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }
}

// View
public interface View {
    void showData(String data);
}

// Presenter
public class Presenter {
    private Model model;
    private View view;

    public Presenter(Model model, View view) {
        this.model = model;
        this.view = view;
    }

    public void updateData(String newData) {
        model.setData(newData);
        view.showData(model.getData());
    }
}